vibe64 0.1.32 → 0.1.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/run.js +1717 -1648
- package/bin/server.js +81 -68
- package/bin/upgrade-state.js +5438 -5189
- package/dist/assets/{GithubBrowserTabs-2bEGbRAs.js → GithubBrowserTabs-DO5PHon-.js} +1 -1
- package/dist/assets/GithubMarkdown-BQ6MfCDJ.js +3 -0
- package/dist/assets/GithubMarkdown-U7-j-qNI.css +1 -0
- package/dist/assets/StudioErrorNotice-sQfmeR-z.js +1 -0
- package/dist/assets/VAlert-P256xaE0.js +1 -0
- package/dist/assets/VAutocomplete-BDb95qJX.js +1 -0
- package/dist/assets/VAvatar-9ilDR2r2.css +1 -0
- package/dist/assets/VAvatar-DPzqDH4r.js +1 -0
- package/dist/assets/VBtn-B2MBK2DL.js +1 -0
- package/dist/assets/VCard-mXy0k4aS.js +1 -0
- package/dist/assets/VCheckbox-C7A1ZW4D.js +1 -0
- package/dist/assets/VChip-CcI-Oo2J.js +1 -0
- package/dist/assets/VDialog-Bu3EfKb1.js +1 -0
- package/dist/assets/VDivider-BMEqUoAB.js +1 -0
- package/dist/assets/VExpansionPanels-Dgjrop0V.js +1 -0
- package/dist/assets/VMenu-C_x18lwb.js +1 -0
- package/dist/assets/VOverlay-CeMZurIN.js +1 -0
- package/dist/assets/VRadioGroup-CUu2-KIP.js +1 -0
- package/dist/assets/VRow-Cpw7OHQV.js +1 -0
- package/dist/assets/{VSelect-DY-ZuBJJ.js → VSelect-DL3HaA5m.js} +1 -1
- package/dist/assets/VSheet-DZWsu0kL.js +1 -0
- package/dist/assets/VSkeletonLoader-CttxM1tw.js +1 -0
- package/dist/assets/VSpacer-Dhmsvk4t.js +1 -0
- package/dist/assets/{VSwitch-Bm1bwl2V.js → VSwitch-BRHeDJkH.js} +1 -1
- package/dist/assets/VTextField-BR2eZeFT.js +1 -0
- package/dist/assets/VTextarea-DbqamXJd.js +1 -0
- package/dist/assets/Vibe64AsyncModuleState-Dx7YKRPp.js +1 -0
- package/dist/assets/Vibe64DashboardBackButton-DD9UR77P.css +1 -0
- package/dist/assets/Vibe64DashboardBackButton-yE6cyYg2.js +1 -0
- package/dist/assets/Vibe64DashboardPageHeader-BXQR00HK.js +1 -0
- package/dist/assets/Vibe64DashboardPageHeader-Gm1IvlHx.css +1 -0
- package/dist/assets/Vibe64DashboardShell-CuCVMhOc.js +1 -0
- package/dist/assets/Vibe64DashboardShell-MBkUHjs-.css +1 -0
- package/dist/assets/Vibe64DatabaseWorkspace-BONJdxBS.js +18 -0
- package/dist/assets/{Vibe64DatabaseWorkspace-C39Jvver.css → Vibe64DatabaseWorkspace-CR4pzzcf.css} +1 -1
- package/dist/assets/Vibe64OutputControls-DAAmA09l.js +8 -0
- package/dist/assets/{Vibe64OutputControls-CsZFv12r.css → Vibe64OutputControls-DPBsyDZM.css} +1 -1
- package/dist/assets/{Vibe64RepositoryWorkspace-ebUaYOU4.js → Vibe64RepositoryWorkspace-ByQlZbyO.js} +2 -2
- package/dist/assets/{Vibe64RepositoryWorkspace-Cqm6TOFk.css → Vibe64RepositoryWorkspace-CVHcT93M.css} +1 -1
- package/dist/assets/Vibe64SessionFiles-B0u9HKdF.js +107 -0
- package/dist/assets/Vibe64SessionFiles-NjOMVwPR.css +1 -0
- package/dist/assets/Vibe64TemporaryAiFixAction-BGlcrq4d.js +1 -0
- package/dist/assets/Vibe64UiStoryboardView-3WXph5bz.css +1 -0
- package/dist/assets/Vibe64UiStoryboardView-Brlwdvqi.js +7 -0
- package/dist/assets/Vibe64UnavailableSessions-zwlWlcZD.js +1 -0
- package/dist/assets/_sessionId_-CvOkQbVy.js +1 -0
- package/dist/assets/{_sessionTool_-B39BIzzZ.js → _sessionTool_-Dwod5ns9.js} +1 -1
- package/dist/assets/_slug_-B31c15cc.css +1 -0
- package/dist/assets/_slug_-Dy35qLo1.js +1 -0
- package/dist/assets/access-BVu5XYm2.js +1 -0
- package/dist/assets/app-DRXCcv05.css +1 -0
- package/dist/assets/app-zt7HwQKT.js +1 -0
- package/dist/assets/assistantRouting-CwbwfkwB.js +3 -0
- package/dist/assets/{changes-ByjS7QGx.js → changes-olY8cnFK.js} +1 -1
- package/dist/assets/{client-C-tpoG6F.js → client-BrV4QPwG.js} +1 -1
- package/dist/assets/createSimpleFunctional-CZTGuNuR.js +1 -0
- package/dist/assets/dashboard-BnXD-H4R.js +1 -0
- package/dist/assets/definitions-DaOPIkyB.js +1 -0
- package/dist/assets/env-DJhnLOH7.css +1 -0
- package/dist/assets/env-DN0vW4EI.js +1 -0
- package/dist/assets/{error-DFKtZBJ8.js → error-DgrgRbJJ.js} +1 -1
- package/dist/assets/{error-DE4zo8Lk.js → error-Dug56can.js} +1 -1
- package/dist/assets/health-7oIQODer.css +1 -0
- package/dist/assets/health-Z6m96GDr.js +1 -0
- package/dist/assets/history-BOwbCRQP.css +1 -0
- package/dist/assets/history-BxlpB-YH.js +1 -0
- package/dist/assets/incoming-BOxRVlOM.js +2 -0
- package/dist/assets/incoming-DWDrmxyH.css +1 -0
- package/dist/assets/index-BUq-MczL.js +86 -0
- package/dist/assets/{index-D4MsP3dq.css → index-DtmBqE3h.css} +1 -1
- package/dist/assets/{integrations-B4txOZfY.js → integrations-BFltGDVI.js} +1 -1
- package/dist/assets/issues-1iS5zoed.js +1 -0
- package/dist/assets/issues-XnpGgdmn.css +1 -0
- package/dist/assets/layout-BkWVNT37.js +1 -0
- package/dist/assets/lazy-NHSwD9FS.js +1 -0
- package/dist/assets/mdi-C54lQ0i_.js +1 -0
- package/dist/assets/{pages-BW2l8fNe.js → pages-DuMgH61T.js} +1 -1
- package/dist/assets/{placement-JxzrmUR3.js → placement-CwTqWLQH.js} +1 -1
- package/dist/assets/placement-DLsU3pCW.js +1 -0
- package/dist/assets/pull-requests-BJOwNL4k.js +1 -0
- package/dist/assets/pull-requests-CdbhyFOv.css +1 -0
- package/dist/assets/{repository-BTC3lkrh.js → repository-JWLVST3D.js} +1 -1
- package/dist/assets/{VAvatar-CAFvgSUo.js → ripple-BVltMmyV.js} +2 -2
- package/dist/assets/ripple-DqhAt1Ze.css +1 -0
- package/dist/assets/runtime-core.esm-bundler-DGXg_mpN.js +3 -0
- package/dist/assets/{session-CG-TUCJt.css → session-5qADMzDP.css} +1 -1
- package/dist/assets/session-C5Nj8Dlq.js +1 -0
- package/dist/assets/settings-BopLnpB0.css +1 -0
- package/dist/assets/settings-c273Ikrm.js +1 -0
- package/dist/assets/ssrBoot-Rlh6kLbD.js +1 -0
- package/dist/assets/{studioGateApi-C0GvzVlt.js → studioGateApi-DhA9IJGZ.js} +1 -1
- package/dist/assets/{studioUrls-CIab-Axb.js → studioUrls-Dj8rXeXO.js} +1 -1
- package/dist/assets/{useApi-BPuI6ZR9-Dr8wK_Co.js → useApi-BPuI6ZR9-CFWU1m37.js} +1 -1
- package/dist/assets/useArchivedVibe64Sessions-CVZx2Rtm.js +1 -0
- package/dist/assets/useCommand-DWuxfAV0.js +1 -0
- package/dist/assets/useEndpointResource-MWVNfmMa.js +1 -0
- package/dist/assets/{usePaths-DVTieF_G.js → usePaths-Db88-HOm.js} +1 -1
- package/dist/assets/{useUiFeedback-Tzi-PRlX.js → useUiFeedback-0FqKuZRP.js} +1 -1
- package/dist/assets/useVibe64ConversationLog-8cKh1eDm.js +1 -0
- package/dist/assets/useVibe64DatabaseTools-BcRG1s3i.js +1 -0
- package/dist/assets/useVibe64LearningMode-Bl0dGdCh.js +28 -0
- package/dist/assets/useVibe64LearningMode-C3PcXdVg.css +1 -0
- package/dist/assets/useVibe64ProjectScope-DOEVkBqX.js +1 -0
- package/dist/assets/useVibe64SessionData-DFTyLzci.js +1 -0
- package/dist/assets/useVibe64SessionSelection-j9lsllx4.js +1 -0
- package/dist/assets/useVibe64SystemGraph-tNkIwSBQ.js +1 -0
- package/dist/assets/{useVibe64Terminal-C2XJ9Y1K.js → useVibe64Terminal-BPnN25WH.js} +1 -1
- package/dist/assets/vibe64AssistantHost-DdE_-lZF.js +1 -0
- package/dist/assets/vibe64LessonDashboard-DlKYjisq.js +1 -0
- package/dist/assets/vibe64ProjectScope.local-DqT6e5un.js +1 -0
- package/dist/assets/vibe64RepositoryRealtime-DXk0Jai3.js +1 -0
- package/dist/assets/vibe64SessionFocus-OJ2toBd9.css +1 -0
- package/dist/assets/vibe64SessionFocus-kqPOPaOH.js +1 -0
- package/dist/assets/{vibe64SessionInfo-D8l22MFm.js → vibe64SessionInfo-BHxtTrLX.js} +1 -1
- package/dist/assets/vibe64SessionToolDefinitions-NfLd1HZI.js +1 -0
- package/dist/assets/vue-flow-core-BlVEnES8.js +26 -0
- package/dist/index.html +51 -48
- package/docs/colleague-usage/account-profile-and-appearance.md +29 -0
- package/docs/colleague-usage/ai-accounts-and-routing.md +23 -4
- package/docs/colleague-usage/ai-balance-and-allowance.md +4 -0
- package/docs/colleague-usage/architecture-explanations.md +99 -0
- package/docs/colleague-usage/auto-workflow.md +49 -11
- package/docs/colleague-usage/coding-agent-failures.md +94 -0
- package/docs/colleague-usage/coding-agent-goal-pause.md +110 -0
- package/docs/colleague-usage/coding-agent-goals.md +140 -38
- package/docs/colleague-usage/coding-agent-history.md +20 -2
- package/docs/colleague-usage/coding-agent-recovery.md +136 -0
- package/docs/colleague-usage/coding-agents.md +138 -150
- package/docs/colleague-usage/colleague-recovery.md +28 -5
- package/docs/colleague-usage/colleague-upgrade-recovery.md +4 -0
- package/docs/colleague-usage/colleague-watches.md +84 -0
- package/docs/colleague-usage/colleague.md +18 -34
- package/docs/colleague-usage/connected-contributions.md +196 -0
- package/docs/colleague-usage/connected-projects.md +196 -0
- package/docs/colleague-usage/conversation-context.md +67 -1
- package/docs/colleague-usage/dashboard-navigation.md +79 -5
- package/docs/colleague-usage/database.md +11 -0
- package/docs/colleague-usage/developing-vibe64.md +137 -0
- package/docs/colleague-usage/development-copies.md +20 -0
- package/docs/colleague-usage/development-env.md +34 -0
- package/docs/colleague-usage/file-interfaces.md +156 -0
- package/docs/colleague-usage/github-work.md +88 -1
- package/docs/colleague-usage/health-checks.md +32 -0
- package/docs/colleague-usage/incoming-changes.md +94 -0
- package/docs/colleague-usage/learning-chat-retention.md +11 -2
- package/docs/colleague-usage/learning-code-questions.md +55 -0
- package/docs/colleague-usage/learning-course-catalogue.md +118 -0
- package/docs/colleague-usage/learning-diagrams-and-voice.md +97 -0
- package/docs/colleague-usage/learning-history.md +17 -9
- package/docs/colleague-usage/learning-lesson-watch.md +95 -0
- package/docs/colleague-usage/learning-mode-ui.md +187 -85
- package/docs/colleague-usage/learning-native-session.md +12 -10
- package/docs/colleague-usage/learning-practical-exercises.md +71 -0
- package/docs/colleague-usage/learning-practical-gestures.md +18 -1
- package/docs/colleague-usage/learning-practice-projects.md +55 -4
- package/docs/colleague-usage/learning-session-creation.md +7 -7
- package/docs/colleague-usage/learning-teacher-guide.md +52 -0
- package/docs/colleague-usage/learning-with-colleague.md +59 -80
- package/docs/colleague-usage/lesson-authoring.md +12 -4
- package/docs/colleague-usage/lesson-practical-assessment.md +3 -1
- package/docs/colleague-usage/managed-app-access.md +6 -0
- package/docs/colleague-usage/message-delivery-recovery.md +56 -0
- package/docs/colleague-usage/plans.md +14 -7
- package/docs/colleague-usage/preview-browser-checks.md +61 -0
- package/docs/colleague-usage/preview-lesson-presentation.md +56 -0
- package/docs/colleague-usage/preview-starting-application.md +92 -0
- package/docs/colleague-usage/preview.md +70 -96
- package/docs/colleague-usage/project-architecture.md +229 -0
- package/docs/colleague-usage/project-language-tools.md +31 -0
- package/docs/colleague-usage/project-messages.md +106 -0
- package/docs/colleague-usage/project-settings.md +22 -0
- package/docs/colleague-usage/project-setup.md +29 -2
- package/docs/colleague-usage/session-terminal.md +42 -0
- package/docs/colleague-usage/sessions.md +122 -52
- package/docs/colleague-usage/teaching-content.md +12 -6
- package/docs/colleague-usage/temporary-chat-context.md +29 -0
- package/docs/colleague-usage/temporary-chats.md +95 -2
- package/docs/colleague-usage/voice-chat.md +10 -43
- package/docs/colleague-usage/voice-face-and-speaking-voice.md +73 -0
- package/docs/colleague-usage/workspace-preparation.md +89 -0
- package/docs/training-content.md +208 -7
- package/node_modules/@jskit-ai/assistant-core/package.json +1 -1
- package/node_modules/@jskit-ai/assistant-runtime/README.md +29 -0
- package/node_modules/@jskit-ai/assistant-runtime/package.json +1 -1
- package/node_modules/@jskit-ai/assistant-voice/package.json +1 -1
- package/node_modules/@jskit-ai/connector-google-calendar/package.json +1 -1
- package/node_modules/@jskit-ai/connectors-catalog/package.json +1 -1
- package/node_modules/@jskit-ai/connectors-core/package.json +1 -1
- package/node_modules/@jskit-ai/http-runtime/package.json +1 -1
- package/node_modules/@jskit-ai/kernel/package.json +1 -1
- package/node_modules/@jskit-ai/payments-core/package.json +1 -1
- package/node_modules/@jskit-ai/realtime/package.json +1 -1
- package/node_modules/@jskit-ai/resource-core/package.json +1 -1
- package/node_modules/@jskit-ai/resource-crud-core/package.json +1 -1
- package/node_modules/@jskit-ai/uploads-runtime/package.json +1 -1
- package/node_modules/@local/vibe64-core/package.json +1 -0
- package/node_modules/@local/vibe64-execution/src/host/execHelper.js +280 -272
- package/node_modules/@local/vibe64-genesis/README.md +15 -0
- package/node_modules/@local/vibe64-genesis/bin/vibe64-genesis-host-context +879 -1225
- package/node_modules/@local/vibe64-genesis/package.json +2 -1
- package/node_modules/@local/vibe64-genesis/src/server/index.js +496 -418
- package/node_modules/@local/vibe64-genesis/src/server/promptContext.js +165 -146
- package/node_modules/@local/vibe64-runtime/src/server/agentSessionCommandHook.js +8 -8
- package/node_modules/@local/vibe64-runtime/src/server/codexAppServerProcess.js +128 -129
- package/node_modules/@local/vibe64-system-graph/README.md +136 -6
- package/node_modules/@local/vibe64-terminals/package.json +3 -0
- package/node_modules/@local/vibe64-terminals/src/server/sessionWorkOperationCommand.js +1527 -1326
- package/node_modules/@local/vibe64-training/package.json +6 -1
- package/node_modules/@local/vibe64-voice/package.json +1 -0
- package/package.json +16 -16
- package/server.bundle.mjs +42853 -40268
- package/dist/assets/StudioErrorNotice-Ccjvcn9C.js +0 -1
- package/dist/assets/VAlert-B7ciJKQL.js +0 -1
- package/dist/assets/VAutocomplete-QjMk5d_j.js +0 -1
- package/dist/assets/VAvatar-nHaK192T.css +0 -1
- package/dist/assets/VBtn-Kl_qcBsy.js +0 -1
- package/dist/assets/VCard-nrJPeo91.js +0 -1
- package/dist/assets/VCheckbox-DTRAWOIf.js +0 -1
- package/dist/assets/VChip-Dfs5jX0f.js +0 -1
- package/dist/assets/VDialog-Dt1VjJg1.js +0 -1
- package/dist/assets/VDivider-DFsS0OTx.js +0 -1
- package/dist/assets/VExpansionPanels-CYKU0cAr.js +0 -1
- package/dist/assets/VMenu-BLxobsuU.js +0 -1
- package/dist/assets/VOverlay-BvFVZKNS.js +0 -1
- package/dist/assets/VRadioGroup-DzQzpCfg.js +0 -1
- package/dist/assets/VRow-BR2RMCM1.js +0 -1
- package/dist/assets/VSheet-BA95RNmA.js +0 -1
- package/dist/assets/VSkeletonLoader-hpJqr0HL.js +0 -1
- package/dist/assets/VSpacer-B1l1hVvU.js +0 -1
- package/dist/assets/VTextField-CA_p3N4d.js +0 -1
- package/dist/assets/VTextarea-NyCqY4h5.js +0 -1
- package/dist/assets/Vibe64AsyncModuleState-DEFlqJ97.js +0 -1
- package/dist/assets/Vibe64DashboardShell-BNv2I-P8.js +0 -1
- package/dist/assets/Vibe64DashboardShell-w20wNTGW.css +0 -1
- package/dist/assets/Vibe64DatabaseWorkspace-CuY5lN1o.js +0 -43
- package/dist/assets/Vibe64OutputControls-D2JuYlYU.js +0 -8
- package/dist/assets/Vibe64SessionFiles-C-rWehq_.js +0 -34
- package/dist/assets/Vibe64SessionFiles-Dsr6KQNP.css +0 -1
- package/dist/assets/Vibe64SubsystemsView-BvdU_o6H.css +0 -1
- package/dist/assets/Vibe64SubsystemsView-DJCjSzQM.js +0 -1
- package/dist/assets/Vibe64SystemWorldView-B91ioQaO.js +0 -4312
- package/dist/assets/Vibe64SystemWorldView-BXiQ7_Qb.css +0 -1
- package/dist/assets/Vibe64UnavailableSessions-OvnoD3ZB.js +0 -1
- package/dist/assets/_sessionId_-JTvMh54L.js +0 -1
- package/dist/assets/_slug_-DP_heCDa.js +0 -1
- package/dist/assets/_slug_-DmBZGb0q.css +0 -1
- package/dist/assets/access-C8GQIS19.js +0 -1
- package/dist/assets/app-B83lF61Y.js +0 -1
- package/dist/assets/app-ByLIQ3SB.css +0 -1
- package/dist/assets/assistantRouting-TDtryU6o.js +0 -1
- package/dist/assets/createSimpleFunctional-DPIT6zsT.js +0 -1
- package/dist/assets/dashboard-CWGFPojJ.js +0 -1
- package/dist/assets/definitions-BeLcvOW3.js +0 -1
- package/dist/assets/display-BLmcO-5p.js +0 -1
- package/dist/assets/env-7bqFyF_E.css +0 -1
- package/dist/assets/env-BVwxNL8M.js +0 -1
- package/dist/assets/health-BzNhp7r8.js +0 -1
- package/dist/assets/health-DoHTXTGx.css +0 -1
- package/dist/assets/history-BPeZGofK.js +0 -1
- package/dist/assets/history-iMQxp5AR.css +0 -1
- package/dist/assets/httpClient-BaaZuFvF.js +0 -1
- package/dist/assets/index-5sKwLHOH.js +0 -86
- package/dist/assets/issues-DCEhGlfn.css +0 -1
- package/dist/assets/issues-wby50y9b.js +0 -3
- package/dist/assets/layout-YCn17mK1.js +0 -1
- package/dist/assets/lazy-CvQfXeLg.js +0 -1
- package/dist/assets/mdi-C31_SZp-.js +0 -1
- package/dist/assets/placement-C4R2t6rl.js +0 -1
- package/dist/assets/pull-requests-BNK6mq2u.css +0 -1
- package/dist/assets/pull-requests-lNQAigaC.js +0 -1
- package/dist/assets/runtime-core.esm-bundler-DMrccYS5.js +0 -3
- package/dist/assets/session-D38nzG41.js +0 -1
- package/dist/assets/settings-CFyUJ_kR.js +0 -1
- package/dist/assets/settings-vWsAEoE9.css +0 -1
- package/dist/assets/useArchivedVibe64Sessions-C2DSq2Z4.js +0 -1
- package/dist/assets/useCommand-BzThFLYP.js +0 -1
- package/dist/assets/useEndpointResource-C2KD4Ub_.js +0 -1
- package/dist/assets/useVibe64ConversationLog-CMUlXJtU.js +0 -1
- package/dist/assets/useVibe64DatabaseTools-DBcKhm6B.js +0 -1
- package/dist/assets/useVibe64LearningMode-BPRWM5Rp.js +0 -28
- package/dist/assets/useVibe64LearningMode-PJUv0O25.css +0 -1
- package/dist/assets/useVibe64SessionData-CdtJbAIx.js +0 -1
- package/dist/assets/useVibe64SessionSelection-aR0f6xVT.js +0 -1
- package/dist/assets/useVibe64SystemGraph-DeTPBn0e.js +0 -1
- package/dist/assets/vibe64AssistantHost-Dgyz4TrT.js +0 -1
- package/dist/assets/vibe64ProjectScope.local-GOSMVDRi.js +0 -1
- package/dist/assets/vibe64RepositoryRealtime-t5Al8BlU.js +0 -1
- package/dist/assets/vibe64SessionFocus-CcN6Grgw.js +0 -1
- package/dist/assets/vibe64SessionFocus-ChabllPA.css +0 -1
- package/dist/assets/vibe64SessionToolDefinitions-BaO1DEup.js +0 -1
- /package/dist/assets/{vibe64RepositoryRealtime-D_mq1dFE.css → Vibe64TemporaryAiFixAction-D_mq1dFE.css} +0 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Assistant face and speaking voice
|
|
2
|
+
|
|
3
|
+
This is part of [Voice chat with Colleague or a project agent](voice-chat.md).
|
|
4
|
+
|
|
5
|
+
## Choose the assistant's face
|
|
6
|
+
|
|
7
|
+
Colleague and the project agent show an illustrated face that blinks, moves and
|
|
8
|
+
animates its mouth while listening, thinking and speaking. Colleague starts with
|
|
9
|
+
**Merc · male**; project agents, including the Learning teacher, start with
|
|
10
|
+
**Yu · female**. To change one, open that assistant's **Voice settings** cog
|
|
11
|
+
beside the microphone and speaker controls (below its face when expanded) and
|
|
12
|
+
choose **Avatar**. Colleague and project agents keep separate choices. A project
|
|
13
|
+
agent's cog works without starting voice; Colleague shows its cog once its voice
|
|
14
|
+
controls are active (tap **Talk**). The face changes immediately, in the header
|
|
15
|
+
button, chat and voice window. On a phone the cog sits in the same row below
|
|
16
|
+
the face. Colleague can explain this but cannot choose for you: pick the
|
|
17
|
+
avatar yourself. In standalone Vibe64 the choice is saved in this browser only
|
|
18
|
+
(**Saved in this browser for this assistant type.**); another browser, a private
|
|
19
|
+
window or cleared site data starts again from the defaults. If browser storage
|
|
20
|
+
is blocked, the choice lasts until the page reloads.
|
|
21
|
+
|
|
22
|
+
## Choose a speaking voice
|
|
23
|
+
|
|
24
|
+
Open the same **Voice settings** cog and choose **Speaking voice**.
|
|
25
|
+
Opening settings loads the installed choices without recording. The
|
|
26
|
+
change applies to the next spoken reply. In standalone Vibe64 it lasts for the
|
|
27
|
+
current voice session; a host with saved speech preferences can replace this
|
|
28
|
+
selector and retain the choice across sessions. Vibe64 Online saves your avatar
|
|
29
|
+
and voice personally, separately for Colleague and coding assistants across
|
|
30
|
+
projects. Its Management → **Speech and Colleague** page changes only the shared
|
|
31
|
+
Colleague name; use each assistant's cog for your own avatar and voice.
|
|
32
|
+
The personal cog's **Speak replies** choice controls output for that target.
|
|
33
|
+
In Vibe64 Online, older browser-only speaker choices are not copied into personal
|
|
34
|
+
settings; check **Speak replies** when first using your personal controls.
|
|
35
|
+
While that choice saves, the speaker control briefly waits; microphone capture
|
|
36
|
+
and typed chat remain available.
|
|
37
|
+
For coding assistants, **Read thinking**, **Read progress** and **Thinking sounds**
|
|
38
|
+
also select optional thinking, interim work and a short sound while working.
|
|
39
|
+
These activities use the same speaker and queue as answers. New messages wait
|
|
40
|
+
for the current message to finish; arriving progress or an answer does not cut off
|
|
41
|
+
spoken text. Repeated updates do not restart a message. The optional thinking
|
|
42
|
+
sound yields to a real answer. **Stop speaking**, turning off spoken replies and
|
|
43
|
+
switching voice targets still cancel playback.
|
|
44
|
+
Thinking and interim speech default off; thinking sounds default on. They follow
|
|
45
|
+
only the exact current, accessible Main view while the page is visible; hiding
|
|
46
|
+
the avatar does not disable them. Loading history primes the narrator rather
|
|
47
|
+
than replaying old activity. Turning off spoken replies silences all narration.
|
|
48
|
+
Choices and defaults come from the installed model pack and may include male and
|
|
49
|
+
female voices. If only one voice is installed it is shown but cannot be changed.
|
|
50
|
+
Server model setup is an operator task.
|
|
51
|
+
|
|
52
|
+
Loading **Speaking voice** performs a read-only, authorized catalogue check. It
|
|
53
|
+
does not start the microphone, open an audio connection or send an assistant
|
|
54
|
+
message. The app rechecks your current sign-in before showing installed choices.
|
|
55
|
+
If the catalogue cannot be loaded, sign in again if prompted, then close and
|
|
56
|
+
reopen **Voice settings** after the speech service has recovered; typed chat
|
|
57
|
+
remains available.
|
|
58
|
+
|
|
59
|
+
Answers start speaking in short phrases before completion; code and dense tables
|
|
60
|
+
remain in chat. Spoken answers use up to 4,000 characters after removing code and
|
|
61
|
+
formatting from the first 8,000 characters of the answer. A long code block within
|
|
62
|
+
that window leaves room to speak the explanation after it. Read the chat for the
|
|
63
|
+
rest of a longer answer; reaching the speech limit does not mean the agent has
|
|
64
|
+
finished. Existing history is not replayed when the window opens. Spoken
|
|
65
|
+
“Stop talking”, “Stop speaking” or “Be quiet” stops audio locally in either live
|
|
66
|
+
mode. Other wording is an ordinary message, so use the explicit button if recognition
|
|
67
|
+
is wrong. Pause detection and echo cancellation depend on the recording environment.
|
|
68
|
+
Use push-to-talk or review when pauses/noise make hands-free unreliable.
|
|
69
|
+
The default service preserves native handling of quiet input. An operator may
|
|
70
|
+
configure an input floor; if quiet words then fail to appear, move closer to the
|
|
71
|
+
microphone and ask the operator to review that setting. **Pause** retains captured
|
|
72
|
+
audio and finishes the final word; review the displayed words before retrying a
|
|
73
|
+
message that was already sent.
|
|
@@ -9,6 +9,25 @@ Select **Prepare workspace**. The notice shows progress while those steps run.
|
|
|
9
9
|
Use **Expand** to inspect output, or **Dismiss** to hide an inactive notice.
|
|
10
10
|
Preparation does not publish the project.
|
|
11
11
|
|
|
12
|
+
To rerun preparation after success, select **Prepare workspace** (the wrench)
|
|
13
|
+
in the session header. On narrow screens, open **Session actions** (three dots)
|
|
14
|
+
and select **Prepare workspace**. This stays available after dismissing the
|
|
15
|
+
preparation notice. It runs the complete current recipe, including declared
|
|
16
|
+
database steps and connected-source Prepare/Verify commands. It is unavailable
|
|
17
|
+
while another assistant or repository operation is active, or for archived sessions.
|
|
18
|
+
|
|
19
|
+
A new session with connected projects starts preparation automatically. Its
|
|
20
|
+
first step, **Preparing connected projects**, creates or reuses each connected
|
|
21
|
+
project's contribution session at the same time and lists the ones still in
|
|
22
|
+
progress, then **Linking connected sources** and **Checking connected sources**
|
|
23
|
+
while it rechecks access to each one. If one fails, the notice names that repository; earlier prepared
|
|
24
|
+
sources are kept and **Retry** reuses them instead of copying them again.
|
|
25
|
+
|
|
26
|
+
A successful result records the previous recipe execution. It does not prove
|
|
27
|
+
that custom compiled outputs still match later source or script edits. Rerun
|
|
28
|
+
preparation explicitly after those edits when the project needs rebuilt outputs;
|
|
29
|
+
Vibe64 does not automatically rebuild custom connections.
|
|
30
|
+
|
|
12
31
|
An actual failed command or failure to start preparation still displays an error
|
|
13
32
|
and its diagnostic. Use the available retry or **Fix it with AI** action to deal
|
|
14
33
|
with that failure; do not assume a required preparation step has already failed.
|
|
@@ -17,6 +36,55 @@ Colleague can explain the notice and, when explicitly asked, use the session's
|
|
|
17
36
|
authorized workspace-preparation operation. It should inspect the current
|
|
18
37
|
result before saying preparation succeeded.
|
|
19
38
|
|
|
39
|
+
## Missing project-owned Stack sections
|
|
40
|
+
|
|
41
|
+
**Project setup needs attention** can report a missing section such as
|
|
42
|
+
`## Connected development` after the installed Stack catalog changes. This is
|
|
43
|
+
a declaration problem; repeatedly retrying dependency installation will not
|
|
44
|
+
repair it.
|
|
45
|
+
|
|
46
|
+
For an older Genesis project format, follow the diagnostic's `genesis migrate`
|
|
47
|
+
instruction first. If the missing-section diagnostic remains after migration,
|
|
48
|
+
explicitly reconcile the selected component as described below. A format upgrade
|
|
49
|
+
does not necessarily add newer catalog proposals, and migration on a
|
|
50
|
+
current-format project does not add them. Use **Fix it with AI** or ask your
|
|
51
|
+
coding assistant to inspect
|
|
52
|
+
`genesis/stack.md` and reconcile the missing section with the actual application.
|
|
53
|
+
If `nodejs` is already listed under **Components**, the existing explicit repair
|
|
54
|
+
is `genesis stack add nodejs`. Use the project's installed Genesis command
|
|
55
|
+
(`npm exec --no -- genesis stack add nodejs` when it declares `genesis-compiler`).
|
|
56
|
+
Do not select Node or another technology merely to dismiss a warning.
|
|
57
|
+
|
|
58
|
+
The command preserves existing complete project sections and adds missing
|
|
59
|
+
proposals. Review its returned preparation instructions and the source diff;
|
|
60
|
+
keep the application's real setup, launch and database commands. Node's default
|
|
61
|
+
`Connected development` declaration selects `npm` treatment only; it adds no
|
|
62
|
+
connected repositories and performs no dependency installation by itself.
|
|
63
|
+
|
|
64
|
+
After the declaration is repaired, select **Recheck setup**. If workspace
|
|
65
|
+
preparation is still required, **Prepare workspace** or **Retry** runs the
|
|
66
|
+
declared recipe; inspect it before rerunning database or installation steps.
|
|
67
|
+
The same recovery applies on desktop and mobile. Colleague can explain the
|
|
68
|
+
warning and offer the supported repair flow; source edits and terminal commands
|
|
69
|
+
belong to the coding assistant or the person, not Colleague.
|
|
70
|
+
|
|
71
|
+
## Competing Stack proposals
|
|
72
|
+
|
|
73
|
+
When two selected technologies propose different bodies for the same section,
|
|
74
|
+
for example Node and Python both proposing `## Connected development`, Genesis
|
|
75
|
+
leaves that heading unwritten and reports `STACK_SECTION_AMBIGUOUS` until the
|
|
76
|
+
project chooses. **Project setup needs attention** shows Genesis's message,
|
|
77
|
+
which quotes each proposal; workspace preparation shows **Workspace setup needs
|
|
78
|
+
a choice** with the same text. Vibe64 never picks a proposal for you, and
|
|
79
|
+
retrying preparation alone does not resolve it.
|
|
80
|
+
|
|
81
|
+
Chat stays available: use **Fix it with AI** or ask your coding assistant to
|
|
82
|
+
author one complete project-owned section in `genesis/stack.md` that fits the
|
|
83
|
+
application (a multi-language project chooses one `Default package type`).
|
|
84
|
+
Then select **Recheck setup** and **Prepare workspace** or **Retry**. Skill
|
|
85
|
+
refresh waits until the section is decided. Colleague can explain the choice;
|
|
86
|
+
the source edit belongs to the coding assistant or the person.
|
|
87
|
+
|
|
20
88
|
## Locally installed command-line tools
|
|
21
89
|
|
|
22
90
|
When you open a directory with the local Vibe64 editor, start Vibe64 from the
|
|
@@ -29,3 +97,24 @@ works in that terminal, then restart the local editor after correcting the
|
|
|
29
97
|
installation or shell path. Hosted workspaces use their host's prepared tools.
|
|
30
98
|
Colleague can explain this recovery; installing a local tool and restarting the
|
|
31
99
|
local editor require the person to use their terminal.
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
## Resource recovery after a daemon restart
|
|
103
|
+
|
|
104
|
+
When the host supports database preservation checks, reopening a previously
|
|
105
|
+
prepared session can restore its managed environment without repeating unchanged
|
|
106
|
+
Workspace setup commands. Vibe64 requires the same successful recipe and resource
|
|
107
|
+
identity, and the host must verify that its databases already existed. Recreated,
|
|
108
|
+
changed or unverified resources run the full recipe, including application database
|
|
109
|
+
initialization. An older successful setup without that identity runs once to
|
|
110
|
+
establish it; existing session metadata is not guessed or rewritten on opening.
|
|
111
|
+
|
|
112
|
+
**Retry** still runs the declared setup again. If resource recovery fails, inspect
|
|
113
|
+
the preparation error before retrying. Colleague can inspect that result and retry
|
|
114
|
+
when asked; it should not call an unchanged setup successful merely because saved
|
|
115
|
+
database connection settings exist. The controls are the same on desktop and mobile.
|
|
116
|
+
|
|
117
|
+
If someone manually drops and recreates a database under the same name outside
|
|
118
|
+
Vibe64's preparation, use **Retry** to rerun the application's setup. Preservation
|
|
119
|
+
checks cover Vibe64's own provisioning; they do not inspect or reconstruct an
|
|
120
|
+
application schema changed outside that operation.
|
package/docs/training-content.md
CHANGED
|
@@ -49,14 +49,94 @@ An assessment declares `id`, `kind` (`answer` or `practical`), `required` and
|
|
|
49
49
|
`rubric`. Use an explicit `<a id="assessment-id"></a>` line in the teaching
|
|
50
50
|
document and refer to it as `lesson.md#assessment-id`. Answer assessments use
|
|
51
51
|
the admitted learner answer and that rubric. Practical assessments also declare
|
|
52
|
-
`evidence: {producer, operation, check?, explanationRequired?}`. Supported producers
|
|
53
|
-
are `workspace`, `colleague` and `
|
|
54
|
-
and a declared check; other producers cannot execute checks. Declare checks as
|
|
55
|
-
`checks: [{id,file,assets?}]`. Declare auxiliary check inputs in `assets`, relative to the lesson descriptor.
|
|
52
|
+
`evidence: {producer, operation, check?, explanationRequired?, files?}`. Supported producers
|
|
53
|
+
are `workspace`, `colleague`, `exercise` and `code`. Exercise and code evidence
|
|
54
|
+
require an exercise and a declared check; other producers cannot execute checks. Declare checks as
|
|
55
|
+
`checks: [{id,file,assets?,kind?,timeoutSeconds?}]`. Declare auxiliary check inputs in `assets`, relative to the lesson descriptor.
|
|
56
56
|
The validator includes these files but never executes them.
|
|
57
57
|
The managed application execution owner will run approved pinned checks; teaching
|
|
58
58
|
tools do not gain arbitrary shell access. Demonstrations cannot earn learner passes.
|
|
59
59
|
|
|
60
|
+
An exercise lesson may optionally declare the practice app's data-changing routes
|
|
61
|
+
so a Learning watch can name a failed request the learner started:
|
|
62
|
+
`appRoutes: [{method, path}]`, at most 16 unique entries. `method` is `POST`,
|
|
63
|
+
`PUT`, `PATCH` or `DELETE`; `path` starts with `/`, has no query, fragment or
|
|
64
|
+
trailing slash, and each segment is a literal or `:id` (the Preview replaces
|
|
65
|
+
numeric and UUID segments with `:id`). For the notes exercise:
|
|
66
|
+
`"appRoutes": [{ "method": "POST", "path": "/api/notes" }]`. A failed request on
|
|
67
|
+
any other path is still reported, as `other`, so route segments that might carry
|
|
68
|
+
typed text never leave the learner's browser. Routes only label watch hints; they
|
|
69
|
+
never grade, and a lesson without an exercise cannot declare them.
|
|
70
|
+
|
|
71
|
+
### Authoring a code question
|
|
72
|
+
|
|
73
|
+
A `code` practical asks the learner to change exercise code in the lesson
|
|
74
|
+
Dashboard's **Code** tab and press **Check my code**. Declare it like this
|
|
75
|
+
(the test fixture `tests/fixtures/training/code-practical/` is a complete,
|
|
76
|
+
validating example):
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
"exercise": { "kind": "bundled", "source": "app", "reuse": "attempt" },
|
|
80
|
+
"checks": [{ "id": "notes-title-required", "file": "checks/notes/title.mjs",
|
|
81
|
+
"kind": "code", "timeoutSeconds": 15 }],
|
|
82
|
+
"assessments": [{ "id": "require-note-title", "kind": "practical", "required": true,
|
|
83
|
+
"rubric": "lesson.md#require-note-title",
|
|
84
|
+
"evidence": { "producer": "code", "operation": "edit-and-check",
|
|
85
|
+
"check": "notes-title-required", "files": ["notes.mjs"],
|
|
86
|
+
"explanationRequired": true } }]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- `files` lists 1–8 exercise-relative paths the learner edits. Each must be an
|
|
90
|
+
ordinary bundled exercise file (no `..`, absolute path, `.git`,
|
|
91
|
+
`node_modules` or `.genesis` segment) and may appear once. Only `code`
|
|
92
|
+
evidence may name files.
|
|
93
|
+
- The check must declare `kind: "code"`; a code check can only be named by
|
|
94
|
+
`code` evidence and an `exercise` check must not be a code check. Omitted
|
|
95
|
+
`kind` means the existing `response` kind. `timeoutSeconds` (1–60, default
|
|
96
|
+
15) is allowed only on a code check. The operation is any lesson ID.
|
|
97
|
+
- `reuse:"attempt"` is the supported exercise mode; sequence-reused baselines
|
|
98
|
+
are not part of this first slice.
|
|
99
|
+
- The rubric should ask for the learner's own explanation. The check alone
|
|
100
|
+
never passes: the existing tool-free grading Helper grades the explanation
|
|
101
|
+
against the rubric with the check result.
|
|
102
|
+
|
|
103
|
+
The check runs with Node in the managed execution owner on a private copy laid
|
|
104
|
+
out like the topic: the pinned exercise at its topic path, with only the
|
|
105
|
+
declared files replaced by the learner's saved bytes, plus the pinned check and
|
|
106
|
+
its assets. Its working directory is the exercise copy, its environment is
|
|
107
|
+
empty, output is limited to 4 KiB and it has no dependency installation, so an
|
|
108
|
+
exercise and its check must need no packages. Import learner code relative to
|
|
109
|
+
the check (for example `new URL("../../app/notes.mjs", import.meta.url)`); the
|
|
110
|
+
same command works in the topic checkout. The check reads one JSON object on
|
|
111
|
+
stdin, `{check, filesHash, files:[{path,sha256}]}`, and prints exactly one JSON
|
|
112
|
+
line echoing `check` and `filesHash`:
|
|
113
|
+
|
|
114
|
+
- exit 0 and `{check, filesHash, outcome:"verified"}` — the code is correct;
|
|
115
|
+
- exit 1 and `{check, filesHash, outcome:"incomplete", reason}` (reason at most
|
|
116
|
+
256 characters) — shown to the learner as "Not yet: …".
|
|
117
|
+
|
|
118
|
+
A different `filesHash` or any other success-shaped output is rejected as an
|
|
119
|
+
invalid check result. A check stopped by its timeout, or learner code that
|
|
120
|
+
crashes the check before it prints a result, is "not yet passed" with a fixed
|
|
121
|
+
explanation. stderr is ignored. Use plain `node:assert`-style logic rather than
|
|
122
|
+
`node --test`, whose reporter writes to stdout.
|
|
123
|
+
|
|
124
|
+
Authorship: when Main prepares a code question, Vibe64 records the SHA-256 of
|
|
125
|
+
each declared file in the live practice project as the question's starting
|
|
126
|
+
point. Each save from the learner's lesson Dashboard Files section is recorded server-side
|
|
127
|
+
with its base hash, intended hash and saved hash. At **Check my code** the chain
|
|
128
|
+
from the starting point through those saves must reach the current bytes
|
|
129
|
+
exactly; otherwise the check is not run and the question is automatically not
|
|
130
|
+
passed with "needs an independent attempt: other edits detected in `<file>`".
|
|
131
|
+
In a practice lesson Main is also the learner's agent, but while a code
|
|
132
|
+
question is open the teaching brief instructs Main not to write that question's
|
|
133
|
+
declared files (even when asked) or send solution code, and to warn the learner
|
|
134
|
+
that an agent edit there voids the attempt. The ledger above enforces this; there
|
|
135
|
+
is no technical write-deny for agents in this slice. Teacher chat
|
|
136
|
+
is not shared with the grader. The check is learner-run code on the learner's
|
|
137
|
+
own machine and has no network isolation: for hosted use, sandboxing and network
|
|
138
|
+
denial of the check job are an open gap.
|
|
139
|
+
|
|
60
140
|
An optional exercise uses `{kind:"bundled", source, reuse:"attempt"}`. Continued
|
|
61
141
|
work uses `reuse:"sequence"`, `sequenceId` and `sequenceMode:"create"|"continue"`.
|
|
62
142
|
One creation precedes continuations in topic order, with the same source directory.
|
|
@@ -102,6 +182,12 @@ A `course.json` declares schema version 1, `courseId`, `title`, an exact three-p
|
|
|
102
182
|
`release`, `status` (`preview` or `released`) and ordered `topics` containing
|
|
103
183
|
`{topicId,release}`. A course selects whole topics; lesson selection or reordering
|
|
104
184
|
is rejected. A released course requires released topics with no required drafts.
|
|
185
|
+
A preview course is for the workspace owner to review: `lesson.start` admits its
|
|
186
|
+
published lessons only when the actor is the workspace owner (on local Vibe64,
|
|
187
|
+
the OS user), and refuses everyone else with `VIBE64_TRAINING_COURSE_PREVIEW`.
|
|
188
|
+
`courses.list` reports `canTryPreviews`, and Courses shows the owner **Try
|
|
189
|
+
preview**. The started attempt is an ordinary saved lesson. Releasing the course
|
|
190
|
+
offers **Start** to everyone; draft lessons and disabled courses stay refused.
|
|
105
191
|
|
|
106
192
|
Run `vibe64 training publish-manifest <course.json> <committed-topic-directory...>`
|
|
107
193
|
with one canonical repository root for each selected topic. Each topic's package
|
|
@@ -119,6 +205,26 @@ ordered lesson identities. If a topic changes during generation, commit the
|
|
|
119
205
|
intended content and retry. This command generates local release material only;
|
|
120
206
|
it does not push Git, create a remote release, install content or enable a course.
|
|
121
207
|
|
|
208
|
+
### Lesson 0 is supplied by each installation
|
|
209
|
+
|
|
210
|
+
Local and hosted Vibe64 are set up very differently, so "Set yourself up"
|
|
211
|
+
(Lesson 0) is not part of the shared topic. Each installation supplies its own
|
|
212
|
+
Lesson 0 topic and lists it first in the same course, followed by the shared,
|
|
213
|
+
installation-agnostic topic:
|
|
214
|
+
|
|
215
|
+
```json
|
|
216
|
+
{ "schemaVersion": 1, "courseId": "vibe64-getting-started-local", "title": "Getting started with local Vibe64",
|
|
217
|
+
"release": "0.1.0", "status": "preview",
|
|
218
|
+
"topics": [{ "topicId": "vibe64-local-setup", "release": "0.1.0" },
|
|
219
|
+
{ "topicId": "vibe64-getting-started", "release": "0.1.12" }] }
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Local Vibe64 uses `learn-vibe64-local-setup` (V64-SETUP-00). It checks the
|
|
223
|
+
machine through the real **Dashboard → Health** checks and **Account settings**,
|
|
224
|
+
which Colleague can also read for the person. A hosted service keeps its own
|
|
225
|
+
Lesson 0 topic in its own repository. Every later lesson stays in the shared
|
|
226
|
+
topic and must work the same way on both.
|
|
227
|
+
|
|
122
228
|
## Server reads of installed snapshots
|
|
123
229
|
|
|
124
230
|
This release provides a read-only server API at
|
|
@@ -236,8 +342,8 @@ The exact schema-version-1 pin contains `topicId`, `release`, canonical `reposit
|
|
|
236
342
|
40-character `commit` and trusted `topicHash`, as well as `schemaVersion`. Map the
|
|
237
343
|
course lock's topic `manifestHash` to `topicHash` at that owning operation.
|
|
238
344
|
This low-level service does not authenticate callers, fetch Git repositories,
|
|
239
|
-
enable courses or grant access.
|
|
240
|
-
|
|
345
|
+
enable courses or grant access. Its callers are the operator `install-topic`
|
|
346
|
+
command, the owner author trial and the official catalogue installer below.
|
|
241
347
|
|
|
242
348
|
Installation reuses the clean committed-source proof, original bundle command
|
|
243
349
|
and installed reader. It checks the approved identity before and after bundling,
|
|
@@ -271,6 +377,8 @@ runs no authored exercise, check or visual controller.
|
|
|
271
377
|
`enableCourse({course,lock,expectedRevision})` and
|
|
272
378
|
`disableCourse({courseId,release,expectedRevision})`. These are internal server
|
|
273
379
|
facilities, with explicit local operator commands documented below and no browser control or Colleague tool.
|
|
380
|
+
The one exception is `createCourse({title,topics,expectedRevision})`, described
|
|
381
|
+
under [Custom courses](#custom-courses).
|
|
274
382
|
An admitted owner caller supplies the approved course and its exact lock together;
|
|
275
383
|
the store does not authenticate objects or discover/fetch repositories.
|
|
276
384
|
|
|
@@ -306,12 +414,45 @@ exercise execution is introduced. This projection can be reconstructed only by
|
|
|
306
414
|
an explicit owner operation from the same approved definitions/pins; it is not a
|
|
307
415
|
backup of learner state.
|
|
308
416
|
|
|
309
|
-
The
|
|
417
|
+
The authenticated `lesson.start` action chooses an enabled exact entry from a fresh
|
|
310
418
|
read. That read admits the start; a later disable blocks future admissions but
|
|
311
419
|
does not revoke work already admitted or a saved attempt. This store does not
|
|
312
420
|
serialize its lock with reservation writes or add an action/authentication layer.
|
|
313
421
|
Resume continues through the saved learner pin independently of the catalogue.
|
|
314
422
|
|
|
423
|
+
### Custom courses
|
|
424
|
+
|
|
425
|
+
The workspace owner can create a custom course from Learning → **Courses** →
|
|
426
|
+
**New course**, or through the owner-only `vibe64.training.courses.create` action
|
|
427
|
+
(`POST /api/vibe64/training/courses` with `{title,topics,expectedRevision}`).
|
|
428
|
+
`courses.list` reports `canCreateCourses` for the signed-in person and each
|
|
429
|
+
course's ordered `topics` with their installed titles. On local Vibe64 the OS user
|
|
430
|
+
is the owner; on hosted Vibe64 only the workspace owner may create one, through
|
|
431
|
+
the existing `ownerRequired` action check.
|
|
432
|
+
|
|
433
|
+
`createCourse` adds no storage and no new record format. It accepts 1–32
|
|
434
|
+
different whole topics, each an exact `topicId`/`release` already pinned by an
|
|
435
|
+
**enabled released** catalogue course, and resolves them through those existing
|
|
436
|
+
lock pins and the installed snapshots. It builds an ordinary course definition
|
|
437
|
+
`{courseId:"custom-<name-slug>",title,release:"1.0.0",status:"released",topics}`,
|
|
438
|
+
generates its lock with the original `createCourseLock` and saves it with the
|
|
439
|
+
original `enableCourse` (same lock, revision check, 16-release limit and atomic
|
|
440
|
+
writer). The entry is therefore immutable like any other release and is verified
|
|
441
|
+
on every catalogue read. Lessons keep their exact code and hash, so saved passes
|
|
442
|
+
count in every course containing them; lesson content never changes. An identical
|
|
443
|
+
retry returns `changed:false`; the same name with a different definition returns
|
|
444
|
+
`VIBE64_TRAINING_COURSE_EXISTS`. Other refusals are
|
|
445
|
+
`VIBE64_TRAINING_COURSE_INVALID`, `VIBE64_TRAINING_COURSE_TOPIC_UNAVAILABLE`,
|
|
446
|
+
`VIBE64_TRAINING_COURSE_LIMIT` and the original catalogue revision/busy/save
|
|
447
|
+
errors. To retire a custom course, disable its exact release with
|
|
448
|
+
`vibe64 training disable-course custom-<name-slug> 1.0.0 <system-root> <revision>`.
|
|
449
|
+
|
|
450
|
+
Course progress in the **Courses** pane is read-only: `learning.read` adds
|
|
451
|
+
`lessonProgress`, one `{lessonCode,lessonHash,required,passed,completed,open}`
|
|
452
|
+
summary per saved lesson pin, computed from the same verified passes as
|
|
453
|
+
`completion`. The browser joins it with `courses.list` to show lesson statuses and
|
|
454
|
+
"N of M lessons complete" (required lessons, or all lessons when none is required).
|
|
455
|
+
|
|
315
456
|
## Private learner reservations
|
|
316
457
|
|
|
317
458
|
`@local/vibe64-training/server/learner-state` exports
|
|
@@ -469,6 +610,66 @@ which preserves private bytes and validates candidates through the existing
|
|
|
469
610
|
reservation and installed-content readers. Its fixture proof does not establish
|
|
470
611
|
live fleet stopping, off-host retention or power-loss durability.
|
|
471
612
|
|
|
613
|
+
## Official catalogue installation
|
|
614
|
+
|
|
615
|
+
`@local/vibe64-training/server/course-installer` exports
|
|
616
|
+
`createTrainingCourseInstaller({systemRoot, catalogue, repository})`. It is the
|
|
617
|
+
only in-app installation path and reads one GitHub repository, the official
|
|
618
|
+
catalogue: `mobily-enterprises/vibe64-learning-catalog` by default, or the
|
|
619
|
+
server's `VIBE64_LEARNING_CATALOG_REPOSITORY` (`owner/name`). The browser never
|
|
620
|
+
supplies a repository, commit or path.
|
|
621
|
+
|
|
622
|
+
Catalogue format (default branch):
|
|
623
|
+
|
|
624
|
+
- `domains.json`: `{schemaVersion:1, domains:[{domainId,title}]}`. The UI calls
|
|
625
|
+
these **topics**.
|
|
626
|
+
- `topics.json`: `{schemaVersion:1, topics:[{topicId, repository, domainId?,
|
|
627
|
+
releases:[{release,status,commit,manifestHash}]}]}`. The optional `domainId`
|
|
628
|
+
(one of `domains.json`) groups that topic's courses; a course is listed under
|
|
629
|
+
its first topic's domain, or under **Other courses** when none is declared.
|
|
630
|
+
- `courses/<courseId>/course.json` and `course.lock.json`: the exact descriptor
|
|
631
|
+
and the `publish-manifest` lock. The directory name must equal `courseId`.
|
|
632
|
+
|
|
633
|
+
`listAvailable()` shallow-fetches the default branch into a private scratch
|
|
634
|
+
directory, reads the files with `git cat-file` (no checkout), validates them with
|
|
635
|
+
the content schemas (strict fields, canonical `owner/learn-*` repositories,
|
|
636
|
+
40-character commits, 64-character hashes, lock/course identity and order) and
|
|
637
|
+
caches the result for 60 seconds. A fetch failure is
|
|
638
|
+
`VIBE64_TRAINING_AVAILABLE_UNREACHABLE`; invalid content is
|
|
639
|
+
`VIBE64_TRAINING_AVAILABLE_INVALID`. Reading never installs anything.
|
|
640
|
+
|
|
641
|
+
`installCourse({courseId, release, actor})` rereads the catalogue, selects that
|
|
642
|
+
exact course/lock, and for each locked topic not already installed and verified
|
|
643
|
+
fetches its canonical repository at exactly the locked commit (`git init`,
|
|
644
|
+
`fetch --depth=1 <commit>`, detached checkout, `HEAD` check) and calls the
|
|
645
|
+
original `installTopic` with `topicHash = manifestHash`. That owner re-verifies
|
|
646
|
+
the clean commit, canonical source and every byte. It then calls
|
|
647
|
+
`enableCourse` with a fresh revision, retrying once on a revision conflict.
|
|
648
|
+
Older enabled releases of the same course are then disabled with
|
|
649
|
+
`disableCourse` (fresh revision; new starts only). Saved attempts keep their pin
|
|
650
|
+
and resume. Installs run one at a time; repeated requests for the same release
|
|
651
|
+
share one operation. Git runs through `runVibe64Command` as the daemon with
|
|
652
|
+
hooks disabled; no fetched file is executed.
|
|
653
|
+
|
|
654
|
+
Scratch sources live in `<systemRoot>/training-sources/(catalogue|topic)-<uuid>`
|
|
655
|
+
(mode 0700), beside the `training/` namespace that `installTopic` keeps separate
|
|
656
|
+
from sources, and are removed in `finally`. The managed exec helper admits the
|
|
657
|
+
daemon's generic commands in exactly that one-level directory under
|
|
658
|
+
`~/.local/state/vibe64/training-sources/`.
|
|
659
|
+
|
|
660
|
+
An already enabled exact release is a no-op. A disabled release is re-enabled
|
|
661
|
+
only for the workspace owner (`VIBE64_TRAINING_COURSE_DISABLED` otherwise). A new
|
|
662
|
+
entry beyond the installed catalogue's 16 retained releases fails before any
|
|
663
|
+
download with `VIBE64_TRAINING_COURSE_LIMIT`; nothing is deleted.
|
|
664
|
+
|
|
665
|
+
The actions are `vibe64.training.available.list` (`GET
|
|
666
|
+
/api/vibe64/training/available`) and `vibe64.training.course.install` (`POST
|
|
667
|
+
/api/vibe64/training/courses/install`, input `{courseId, release}`). Any signed-in
|
|
668
|
+
user may call them, as for `lesson.start`: they can only install hash-pinned
|
|
669
|
+
releases from the official catalogue, and arbitrary sources remain operator
|
|
670
|
+
commands. Hosts that compose `createTrainingActions` without a `courseInstaller`
|
|
671
|
+
return `available:false`.
|
|
672
|
+
|
|
472
673
|
## Local operator provisioning
|
|
473
674
|
|
|
474
675
|
These commands run locally under the OS identity that owns the selected Vibe64
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
|
|
2
|
+
With the existing realtime diagnostic option (`JSKIT_REALTIME_DEBUG=1`, or
|
|
3
|
+
`config.realtime.debug=true`), conversation subscriptions emit one `pending`
|
|
4
|
+
warning if admission/snapshot reading has not returned within the client's
|
|
5
|
+
10-second acknowledgement budget. The warning names the current stage and the
|
|
6
|
+
server-generated epoch; a conversation identity is included only after its
|
|
7
|
+
successful authorized open. Observer release also records the current stage and
|
|
8
|
+
reason. While diagnostics are enabled, every stage transition is recorded at
|
|
9
|
+
warning level with its duration and total elapsed time, so warning-only logs
|
|
10
|
+
retain the earlier admission costs as well as the step pending at timeout.
|
|
11
|
+
Timers are removed on acknowledgement, failure, replacement, unsubscribe
|
|
12
|
+
and connection close. Diagnostics contain no request body or conversation text,
|
|
13
|
+
and do not change authorization, subscription deadlines or model work.
|
|
14
|
+
|
|
15
|
+
Released subscriptions stop setup at the next completed phase. The existing
|
|
16
|
+
socket owner supplies its current subscription identity to the subscribe action;
|
|
17
|
+
an obsolete open cannot attach a new observer, and a late observer is detached
|
|
18
|
+
without starting a snapshot. Reads already in progress may finish, but cannot
|
|
19
|
+
acknowledge into a replacement view. Reload performs fresh authorization, and
|
|
20
|
+
releasing a view never stops its model turn.
|
|
21
|
+
|
|
22
|
+
Prepared application submissions may explicitly enable `queueWhileSending` to
|
|
23
|
+
reuse the binding's serial delivery queue while application preparation is still
|
|
24
|
+
running. Each queued request retains its captured payload and receipt identity.
|
|
25
|
+
Stop and conversation retirement cancel queued preparation through the existing
|
|
26
|
+
owner. A typed, definite ended-turn rejection may become one ordinary Send with
|
|
27
|
+
the same identity, without repeating preparation; uncertain delivery never
|
|
28
|
+
permits replay. With the option absent or false, prepared submissions retain
|
|
29
|
+
their existing non-queueing behavior.
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"./server/studioRoots": "./src/server/studioRoots.js",
|
|
31
31
|
"./server/terminalWebSocketRoutes": "./src/server/terminalWebSocketRoutes.js",
|
|
32
32
|
"./server/vibe64MembershipStore": "./src/server/vibe64MembershipStore.js",
|
|
33
|
+
"./server/watch-observations": "./src/server/watchObservations.js",
|
|
33
34
|
"./server/projectState": "./src/server/projectState.js",
|
|
34
35
|
"./server/projectPromptHints": "./src/server/projectPromptHints.js",
|
|
35
36
|
"./server/projectRecordMetadata": "./src/server/projectRecordMetadata.js",
|