Compare commits

...

2 Commits

Author SHA1 Message Date
chyoo 0b26613f6e version up! 2026-07-08 11:43:03 +09:00
chyoo 72180e0ea1 remove polling 2026-07-08 11:09:17 +09:00
4 changed files with 8 additions and 36 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "lms", "name": "lms",
"version": "1.0.15", "version": "1.0.18",
"description": "Autonomy Studio LMS Electron app", "description": "Autonomy Studio LMS Electron app",
"main": "./out/main/index.js", "main": "./out/main/index.js",
"author": { "author": {
+5 -11
View File
@@ -655,8 +655,6 @@ function LocalPcWorkspaceMockup({
const studentSlug = makeStudentSlug(studentEmail) const studentSlug = makeStudentSlug(studentEmail)
const clonePathPreview = makePlatformWorkspaceRoot(configuredWorkspaceRoot, studentSlug, weekNumber, platformKey) const clonePathPreview = makePlatformWorkspaceRoot(configuredWorkspaceRoot, studentSlug, weekNumber, platformKey)
const remoteRuntimeRoot = `/tmp/autonomy-studio/sessions/${`${platformId}-${studentSlug}-week-${weekNumber}`.replace(/[^a-zA-Z0-9_.-]+/g, '-')}` const remoteRuntimeRoot = `/tmp/autonomy-studio/sessions/${`${platformId}-${studentSlug}-week-${weekNumber}`.replace(/[^a-zA-Z0-9_.-]+/g, '-')}`
const draftClonePathPreview = makePlatformWorkspaceRoot(configuredDraftWorkspaceRoot, studentSlug, weekNumber, platformKey)
const draftGiteaRepositoryPreview = `${sourceSettingsDraft.giteaBaseUrl.replace(/\/+$/, '')}/${sourceSettingsDraft.giteaOwner}/${studentSlug}-week-${weekNumber}.git`
const { const {
visualizationStacks, visualizationStacks,
visualizationStack, visualizationStack,
@@ -1415,8 +1413,8 @@ function LocalPcWorkspaceMockup({
workspaceRoot: remoteWorkspace workspaceRoot: remoteWorkspace
? platformSourceSettingsDefaults.workspaceRoot ? platformSourceSettingsDefaults.workspaceRoot
: sourceSettingsDraft.workspaceRoot.trim() || defaultStudioSourceSettings.workspaceRoot, : sourceSettingsDraft.workspaceRoot.trim() || defaultStudioSourceSettings.workspaceRoot,
giteaBaseUrl: sourceSettingsDraft.giteaBaseUrl.trim().replace(/\/+$/, '') || defaultStudioSourceSettings.giteaBaseUrl, giteaBaseUrl: sourceSettings.giteaBaseUrl,
giteaOwner: sourceSettingsDraft.giteaOwner.trim() || defaultStudioSourceSettings.giteaOwner, giteaOwner: sourceSettings.giteaOwner,
gpuEnabled: sourceSettingsDraft.gpuEnabled, gpuEnabled: sourceSettingsDraft.gpuEnabled,
rosDomainId: sourceSettingsDraft.rosDomainId.trim() || defaultStudioSourceSettings.rosDomainId rosDomainId: sourceSettingsDraft.rosDomainId.trim() || defaultStudioSourceSettings.rosDomainId
}) })
@@ -2418,8 +2416,6 @@ function LocalPcWorkspaceMockup({
configuredDraftWorkspaceRoot={configuredDraftWorkspaceRoot} configuredDraftWorkspaceRoot={configuredDraftWorkspaceRoot}
sourceSettingsDraft={sourceSettingsDraft} sourceSettingsDraft={sourceSettingsDraft}
platformSourceSettingsDefaults={platformSourceSettingsDefaults} platformSourceSettingsDefaults={platformSourceSettingsDefaults}
draftClonePathPreview={draftClonePathPreview}
draftGiteaRepositoryPreview={draftGiteaRepositoryPreview}
onUpdateSourceSetting={updateSourceSetting} onUpdateSourceSetting={updateSourceSetting}
onResetSourceSettings={setSourceSettingsDraft} onResetSourceSettings={setSourceSettingsDraft}
onSaveSourceSettings={saveSourceSettings} onSaveSourceSettings={saveSourceSettings}
@@ -3013,8 +3009,9 @@ export default function App(): React.JSX.Element {
useEffect(() => { useEffect(() => {
if (!courseSelectionVisible) return if (!courseSelectionVisible) return
if (studentCoursesLoaded || studentCoursesLoading) return
void loadStudentCourses({ autoSelectSingle: false }) void loadStudentCourses({ autoSelectSingle: false })
}, [courseSelectionVisible, loadStudentCourses]) }, [courseSelectionVisible, loadStudentCourses, studentCoursesLoaded, studentCoursesLoading])
const loadCurriculum = useCallback(async (): Promise<void> => { const loadCurriculum = useCallback(async (): Promise<void> => {
if (!authReady || !studentCoursesLoaded || courseSelectionVisible || !selectedCourseId) return if (!authReady || !studentCoursesLoaded || courseSelectionVisible || !selectedCourseId) return
@@ -4068,10 +4065,7 @@ export default function App(): React.JSX.Element {
activeLearningStep={activeLearningStep} activeLearningStep={activeLearningStep}
allowFutureLearningSteps={publicGuideCourseActive} allowFutureLearningSteps={publicGuideCourseActive}
onLearningStepSelect={publicGuideCourseActive ? setActiveLearningStep : undefined} onLearningStepSelect={publicGuideCourseActive ? setActiveLearningStep : undefined}
onSubmissionRecorded={() => { onSubmissionRecorded={() => undefined}
setCurriculumRefreshSignal((current) => current + 1)
void loadStudentCourses({ autoSelectSingle: false })
}}
/> />
</div> </div>
)} )}
+1 -1
View File
@@ -87,7 +87,7 @@ const LAUNCHER_API_BASE_URL = NOTIFICATION_API_BASE_URL.replace(/\/api$/, '')
const LMS_AUTH_SESSION_STORAGE_KEY = 'autonomy-studio.lms.auth-session' const LMS_AUTH_SESSION_STORAGE_KEY = 'autonomy-studio.lms.auth-session'
const NOTIFICATION_DROPDOWN_LIMIT = 10 const NOTIFICATION_DROPDOWN_LIMIT = 10
const NOTIFICATION_MODAL_PAGE_SIZE = 8 const NOTIFICATION_MODAL_PAGE_SIZE = 8
const NOTIFICATION_REFRESH_INTERVAL_MS = 10_000 const NOTIFICATION_REFRESH_INTERVAL_MS = 60_000
const normalizeNotification = (notification: NotificationMessage): NotificationMessage => ({ const normalizeNotification = (notification: NotificationMessage): NotificationMessage => ({
...notification, ...notification,
@@ -10,8 +10,6 @@ type Props = {
configuredDraftWorkspaceRoot: string configuredDraftWorkspaceRoot: string
sourceSettingsDraft: StudioSourceSettings sourceSettingsDraft: StudioSourceSettings
platformSourceSettingsDefaults: StudioSourceSettings platformSourceSettingsDefaults: StudioSourceSettings
draftClonePathPreview: string
draftGiteaRepositoryPreview: string
onUpdateSourceSetting: <Key extends keyof StudioSourceSettings>(key: Key, value: StudioSourceSettings[Key]) => void onUpdateSourceSetting: <Key extends keyof StudioSourceSettings>(key: Key, value: StudioSourceSettings[Key]) => void
onResetSourceSettings: (settings: StudioSourceSettings) => void onResetSourceSettings: (settings: StudioSourceSettings) => void
onSaveSourceSettings: () => void onSaveSourceSettings: () => void
@@ -26,8 +24,6 @@ function WorkspaceSettingsView({
configuredDraftWorkspaceRoot, configuredDraftWorkspaceRoot,
sourceSettingsDraft, sourceSettingsDraft,
platformSourceSettingsDefaults, platformSourceSettingsDefaults,
draftClonePathPreview,
draftGiteaRepositoryPreview,
onUpdateSourceSetting, onUpdateSourceSetting,
onResetSourceSettings, onResetSourceSettings,
onSaveSourceSettings onSaveSourceSettings
@@ -50,7 +46,7 @@ function WorkspaceSettingsView({
<div className={['mt-5 rounded-lg border p-4', dark ? 'border-white/10 bg-[#1f1f1f]' : 'border-[#e1e6ef] bg-[#f8fafc]'].join(' ')}> <div className={['mt-5 rounded-lg border p-4', dark ? 'border-white/10 bg-[#1f1f1f]' : 'border-[#e1e6ef] bg-[#f8fafc]'].join(' ')}>
<p className={['text-[13px] font-black', textStrong].join(' ')}>공용 플랫폼 환경</p> <p className={['text-[13px] font-black', textStrong].join(' ')}>공용 플랫폼 환경</p>
<p className={['mt-2 text-[12px] font-semibold leading-relaxed', textMid].join(' ')}> <p className={['mt-2 text-[12px] font-semibold leading-relaxed', textMid].join(' ')}>
원격 플랫폼의 워크스페이스와 저장소 설정은 강사/관리자 설정을 사용합니다. 원격 플랫폼의 워크스페이스 설정은 강사/관리자 설정을 사용합니다.
</p> </p>
<div className="mt-4 grid gap-2 text-[12px] font-semibold"> <div className="mt-4 grid gap-2 text-[12px] font-semibold">
<div className={['rounded-md px-3 py-2', dark ? 'bg-white/[0.05] text-white/62' : 'bg-white text-[#4f596b]'].join(' ')}> <div className={['rounded-md px-3 py-2', dark ? 'bg-white/[0.05] text-white/62' : 'bg-white text-[#4f596b]'].join(' ')}>
@@ -76,12 +72,6 @@ function WorkspaceSettingsView({
onChange={(value) => onUpdateSourceSetting('rosDomainId', value.replace(/[^\d]/g, '').slice(0, 3))} onChange={(value) => onUpdateSourceSetting('rosDomainId', value.replace(/[^\d]/g, '').slice(0, 3))}
dark={dark} dark={dark}
/> />
<StudioSettingsField
label="Gitea 주소"
value={sourceSettingsDraft.giteaBaseUrl}
onChange={(value) => onUpdateSourceSetting('giteaBaseUrl', value)}
dark={dark}
/>
<StudioSettingsSwitch <StudioSettingsSwitch
label="GPU 가속" label="GPU 가속"
description="ON이면 Docker 실행 시 NVIDIA GPU를 사용합니다." description="ON이면 Docker 실행 시 NVIDIA GPU를 사용합니다."
@@ -91,18 +81,6 @@ function WorkspaceSettingsView({
/> />
</div> </div>
<div className={['mt-5 rounded-lg border p-4', dark ? 'border-white/10 bg-[#1f1f1f]' : 'border-[#e1e6ef] bg-[#f8fafc]'].join(' ')}>
<p className={['text-[12px] font-black', textMid].join(' ')}>저장소</p>
<div className="mt-3 grid gap-2 font-mono text-[12px]">
<div className={['rounded-md px-3 py-2', dark ? 'bg-white/[0.05] text-white/68' : 'bg-white text-[#4f596b]'].join(' ')}>
clone path: {draftClonePathPreview}
</div>
<div className={['rounded-md px-3 py-2', dark ? 'bg-white/[0.05] text-white/68' : 'bg-white text-[#4f596b]'].join(' ')}>
repository: {draftGiteaRepositoryPreview}
</div>
</div>
</div>
<div className="mt-5 flex justify-end gap-2"> <div className="mt-5 flex justify-end gap-2">
<button <button
type="button" type="button"