cotutor 0.1.0 → 0.3.0
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/LICENSE +247 -21
- package/NOTICE +42 -0
- package/README.md +107 -24
- package/bin/cotutor.js +4 -4
- package/cards/canvas/card.css +8 -0
- package/cards/canvas/card.md +68 -0
- package/cards/choice/card.css +18 -0
- package/cards/choice/card.md +55 -0
- package/cards/code/card.css +5 -0
- package/cards/code/card.md +46 -0
- package/cards/dictation/card.css +10 -0
- package/cards/dictation/card.md +97 -0
- package/cards/image/card.css +10 -0
- package/cards/image/card.md +52 -0
- package/cards/lecture/card.css +9 -0
- package/cards/lecture/card.md +69 -0
- package/cards/paint/card.css +20 -0
- package/cards/paint/card.md +77 -0
- package/cards/photo/card.css +15 -0
- package/cards/photo/card.md +61 -0
- package/cards/read/card.css +6 -0
- package/cards/read/card.md +51 -0
- package/cards/text/card.css +3 -0
- package/cards/text/card.md +69 -0
- package/cards/tianzige/card.css +17 -0
- package/cards/tianzige/card.md +78 -0
- package/cards/tutor/card.css +66 -0
- package/cards/tutor/card.md +148 -0
- package/cards/word/card.css +24 -0
- package/cards/word/card.md +91 -0
- package/cards//346/235/277/344/271/246/346/200/216/344/271/210/345/206/231.md +159 -0
- package/dist/app/activity-eval-rules.d.ts +62 -0
- package/dist/app/activity-eval-rules.js +276 -0
- package/dist/app/activity-eval.d.ts +65 -0
- package/dist/app/activity-eval.js +158 -0
- package/dist/app/build.d.ts +11 -0
- package/dist/app/build.js +45 -0
- package/dist/app/cli/activities.d.ts +63 -0
- package/dist/app/cli/activities.js +158 -0
- package/dist/app/cli/cert.d.ts +7 -0
- package/dist/app/cli/cert.js +36 -0
- package/dist/app/cli/chalk/bake.d.ts +10 -0
- package/dist/app/cli/chalk/bake.js +58 -0
- package/dist/app/cli/chalk/browser.d.ts +16 -0
- package/dist/app/cli/chalk/browser.js +142 -0
- package/dist/app/cli/chalk/build.d.ts +14 -0
- package/dist/app/cli/chalk/build.js +100 -0
- package/dist/app/cli/chalk/dub.d.ts +51 -0
- package/dist/app/cli/chalk/dub.js +106 -0
- package/dist/app/cli/chalk/load-scene.d.ts +34 -0
- package/dist/app/cli/chalk/load-scene.js +117 -0
- package/dist/app/cli/chalk/main.d.ts +7 -0
- package/dist/app/cli/chalk/main.js +198 -0
- package/dist/app/cli/chalk/serve.d.ts +4 -0
- package/dist/app/cli/chalk/serve.js +28 -0
- package/dist/app/cli/chalk/snap.d.ts +65 -0
- package/dist/app/cli/chalk/snap.js +103 -0
- package/dist/app/cli/chalk/typecheck.d.ts +7 -0
- package/dist/app/cli/chalk/typecheck.js +51 -0
- package/dist/app/cli/doctor.d.ts +23 -0
- package/dist/app/cli/doctor.js +617 -0
- package/dist/app/cli/grades.d.ts +14 -0
- package/dist/app/cli/grades.js +44 -0
- package/dist/{cli → app/cli}/init.d.ts +3 -1
- package/dist/app/cli/init.js +155 -0
- package/dist/app/cli/main.js +715 -0
- package/dist/app/cli/migrate.d.ts +58 -0
- package/dist/app/cli/migrate.js +253 -0
- package/dist/app/cli/serve.d.ts +37 -0
- package/dist/app/cli/serve.js +98 -0
- package/dist/app/cli/shipped.d.ts +30 -0
- package/dist/app/cli/shipped.js +47 -0
- package/dist/app/cli/skeleton.d.ts +38 -0
- package/dist/app/cli/skeleton.js +161 -0
- package/dist/app/cli/skills.d.ts +55 -0
- package/dist/app/cli/skills.js +189 -0
- package/dist/app/cli/themes.d.ts +52 -0
- package/dist/app/cli/themes.js +148 -0
- package/dist/app/cli/tutors.d.ts +73 -0
- package/dist/app/cli/tutors.js +250 -0
- package/dist/app/cli/usage.d.ts +2 -0
- package/dist/app/cli/usage.js +30 -0
- package/dist/app/dictation/recognize.d.ts +18 -0
- package/dist/app/dictation/recognize.js +6 -0
- package/dist/app/dictation/route.d.ts +52 -0
- package/dist/app/dictation/route.js +510 -0
- package/dist/app/diff.d.ts +11 -0
- package/dist/app/diff.js +71 -0
- package/dist/app/http/access.d.ts +62 -0
- package/dist/app/http/access.js +180 -0
- package/dist/app/http/app.d.ts +246 -0
- package/dist/app/http/app.js +1212 -0
- package/dist/app/http/dev-activities.d.ts +115 -0
- package/dist/app/http/dev-activities.js +193 -0
- package/dist/app/http/dev-overview.d.ts +108 -0
- package/dist/app/http/dev-overview.js +209 -0
- package/dist/app/http/dev-tutor-files.d.ts +80 -0
- package/dist/app/http/dev-tutor-files.js +151 -0
- package/dist/app/http/parent-home.d.ts +37 -0
- package/dist/app/http/parent-home.js +203 -0
- package/dist/app/http/range.d.ts +9 -0
- package/dist/app/http/range.js +19 -0
- package/dist/app/http/raw-view.d.ts +117 -0
- package/dist/app/http/raw-view.js +149 -0
- package/dist/app/http/send-file.d.ts +7 -0
- package/dist/app/http/send-file.js +29 -0
- package/dist/app/http/stage.d.ts +24 -0
- package/dist/app/http/stage.js +97 -0
- package/dist/app/http/theme.d.ts +13 -0
- package/dist/app/http/theme.js +41 -0
- package/dist/app/machine/bailian.d.ts +28 -0
- package/dist/app/machine/bailian.js +88 -0
- package/dist/app/mock/mock-live.d.ts +16 -0
- package/dist/app/mock/mock-live.js +140 -0
- package/dist/app/mock/mock.d.ts +89 -0
- package/dist/app/mock/mock.js +1117 -0
- package/dist/app/replay.d.ts +94 -0
- package/dist/app/replay.js +170 -0
- package/dist/app/skills/analyze-doc.d.ts +3 -0
- package/dist/app/skills/analyze-doc.js +47 -0
- package/dist/app/skills/home-doc.d.ts +5 -0
- package/dist/app/skills/home-doc.js +112 -0
- package/dist/app/skills/tune-doc.d.ts +3 -0
- package/dist/app/skills/tune-doc.js +80 -0
- package/dist/app/talk/list.d.ts +11 -0
- package/dist/app/talk/list.js +9 -0
- package/dist/app/talk/route.d.ts +16 -0
- package/dist/app/talk/route.js +142 -0
- package/dist/app/workspace.d.ts +58 -0
- package/dist/{cli → app}/workspace.js +82 -36
- package/dist/app/ws/route.d.ts +25 -0
- package/dist/app/ws/route.js +29 -0
- package/dist/app/ws/ws.d.ts +31 -0
- package/dist/app/ws/ws.js +169 -0
- package/dist/board/canvas-chat.d.ts +97 -0
- package/dist/board/canvas-chat.js +175 -0
- package/dist/board/card-guards.d.ts +15 -0
- package/dist/board/card-guards.js +38 -0
- package/dist/board/cards/canvas.d.ts +41 -0
- package/dist/board/cards/canvas.js +83 -0
- package/dist/board/cards/choice.d.ts +20 -0
- package/dist/board/cards/choice.js +64 -0
- package/dist/board/cards/code.d.ts +9 -0
- package/dist/board/cards/code.js +10 -0
- package/dist/board/cards/dictation.d.ts +42 -0
- package/dist/board/cards/dictation.js +105 -0
- package/dist/board/cards/docs.d.ts +47 -0
- package/dist/board/cards/docs.js +152 -0
- package/dist/board/cards/image.d.ts +13 -0
- package/dist/board/cards/image.js +26 -0
- package/dist/board/cards/index.d.ts +62 -0
- package/dist/board/cards/index.js +144 -0
- package/dist/board/cards/kind.d.ts +33 -0
- package/dist/board/cards/kind.js +9 -0
- package/dist/board/cards/lecture.d.ts +26 -0
- package/dist/board/cards/lecture.js +62 -0
- package/dist/board/cards/paint.d.ts +38 -0
- package/dist/board/cards/paint.js +85 -0
- package/dist/board/cards/photo.d.ts +15 -0
- package/dist/board/cards/photo.js +29 -0
- package/dist/board/cards/read.d.ts +8 -0
- package/dist/board/cards/read.js +18 -0
- package/dist/board/cards/text.d.ts +20 -0
- package/dist/board/cards/text.js +59 -0
- package/dist/board/cards/tianzige.d.ts +16 -0
- package/dist/board/cards/tianzige.js +64 -0
- package/dist/board/cards/tutor.d.ts +72 -0
- package/dist/board/cards/tutor.js +134 -0
- package/dist/board/cards/word.d.ts +20 -0
- package/dist/board/cards/word.js +76 -0
- package/dist/board/lecture.d.ts +100 -0
- package/dist/board/lecture.js +204 -0
- package/dist/board/paper.d.ts +20 -0
- package/dist/board/paper.js +76 -0
- package/dist/board/parse.d.ts +120 -0
- package/dist/board/parse.js +330 -0
- package/dist/board/presentation.d.ts +295 -0
- package/dist/board/presentation.js +615 -0
- package/dist/board/sections.d.ts +16 -0
- package/dist/board/sections.js +130 -0
- package/dist/brain/api-tools.d.ts +8 -0
- package/dist/brain/api-tools.js +190 -0
- package/dist/brain/api.d.ts +62 -0
- package/dist/brain/api.js +411 -0
- package/dist/brain/cli/adapters.d.ts +60 -0
- package/dist/brain/cli/adapters.js +91 -0
- package/dist/brain/cli/qwen.d.ts +11 -0
- package/dist/brain/cli/qwen.js +141 -0
- package/dist/brain/cli/run-plan.d.ts +59 -0
- package/dist/brain/cli/run-plan.js +71 -0
- package/dist/brain/cli/run.d.ts +35 -0
- package/dist/brain/cli/run.js +256 -0
- package/dist/brain/cli/stream-json.d.ts +18 -0
- package/dist/brain/cli/stream-json.js +86 -0
- package/dist/brain/cli/types.d.ts +144 -0
- package/dist/brain/cli/types.js +3 -0
- package/dist/brain/cli/warm.d.ts +53 -0
- package/dist/brain/cli/warm.js +103 -0
- package/dist/brain/index.d.ts +145 -0
- package/dist/brain/index.js +74 -0
- package/dist/brain/stream.d.ts +20 -0
- package/dist/brain/stream.js +70 -0
- package/dist/brain/transcript.d.ts +45 -0
- package/dist/brain/transcript.js +132 -0
- package/dist/chalk/actions.d.ts +37 -0
- package/dist/chalk/actions.js +69 -0
- package/dist/chalk/bundle.d.ts +26 -0
- package/dist/chalk/bundle.js +69 -0
- package/dist/chalk/check.d.ts +28 -0
- package/dist/chalk/check.js +291 -0
- package/dist/chalk/circle.d.ts +64 -0
- package/dist/chalk/circle.js +193 -0
- package/dist/chalk/clock.d.ts +84 -0
- package/dist/chalk/clock.js +84 -0
- package/dist/chalk/geometry.d.ts +44 -0
- package/dist/chalk/geometry.js +139 -0
- package/dist/chalk/glyphs/capitals.d.ts +12 -0
- package/dist/chalk/glyphs/capitals.js +264 -0
- package/dist/chalk/glyphs/index.d.ts +21 -0
- package/dist/chalk/glyphs/index.js +18 -0
- package/dist/chalk/glyphs/letters.d.ts +13 -0
- package/dist/chalk/glyphs/letters.js +280 -0
- package/dist/chalk/glyphs/metrics.d.ts +33 -0
- package/dist/chalk/glyphs/metrics.js +28 -0
- package/dist/chalk/glyphs/registry.d.ts +7 -0
- package/dist/chalk/glyphs/registry.js +8 -0
- package/dist/chalk/glyphs/sample.d.ts +32 -0
- package/dist/chalk/glyphs/sample.js +102 -0
- package/dist/chalk/glyphs/skeleton.d.ts +64 -0
- package/dist/chalk/glyphs/skeleton.js +126 -0
- package/dist/chalk/glyphs/types.d.ts +58 -0
- package/dist/chalk/glyphs/types.js +17 -0
- package/dist/chalk/index.d.ts +23 -0
- package/dist/chalk/index.js +15 -0
- package/dist/chalk/manifest.d.ts +41 -0
- package/dist/chalk/manifest.js +6 -0
- package/dist/chalk/paint.d.ts +180 -0
- package/dist/chalk/paint.js +210 -0
- package/dist/chalk/pointer.d.ts +8 -0
- package/dist/chalk/pointer.js +21 -0
- package/dist/chalk/prepare.d.ts +11 -0
- package/dist/chalk/prepare.js +15 -0
- package/dist/chalk/scene-schema.d.ts +199 -0
- package/dist/chalk/scene-schema.js +91 -0
- package/dist/chalk/seed.d.ts +3 -0
- package/dist/chalk/seed.js +10 -0
- package/dist/chalk/text-metrics.d.ts +8 -0
- package/dist/chalk/text-metrics.js +156 -0
- package/dist/chalk/timeline.d.ts +47 -0
- package/dist/chalk/timeline.js +84 -0
- package/dist/chalk/types.d.ts +150 -0
- package/dist/chalk/types.js +8 -0
- package/dist/lib/index.d.ts +14 -8
- package/dist/lib/index.js +14 -8
- package/dist/media/draw.d.ts +23 -0
- package/dist/media/draw.js +44 -0
- package/dist/media/mp3.d.ts +6 -0
- package/dist/media/mp3.js +58 -0
- package/dist/media/mp4.d.ts +1 -0
- package/dist/media/mp4.js +58 -0
- package/dist/media/tts-voices.d.ts +18 -0
- package/dist/media/tts-voices.js +606 -0
- package/dist/media/tts.d.ts +56 -0
- package/dist/media/tts.js +174 -0
- package/dist/media/vision.d.ts +25 -0
- package/dist/media/vision.js +71 -0
- package/dist/memory/commit.d.ts +67 -0
- package/dist/memory/commit.js +130 -0
- package/dist/memory/context.d.ts +86 -0
- package/dist/memory/context.js +97 -0
- package/dist/memory/diary.d.ts +84 -0
- package/dist/memory/diary.js +183 -0
- package/dist/memory/grade.d.ts +2 -0
- package/dist/memory/grade.js +7 -0
- package/dist/{lib → memory}/plan.d.ts +3 -1
- package/dist/{lib → memory}/plan.js +10 -1
- package/dist/memory/proposals.d.ts +11 -0
- package/dist/memory/proposals.js +43 -0
- package/dist/memory/retrieval.d.ts +44 -0
- package/dist/memory/retrieval.js +157 -0
- package/dist/memory/timetable.d.ts +19 -0
- package/dist/memory/timetable.js +95 -0
- package/dist/memory/vault-notes.d.ts +165 -0
- package/dist/memory/vault-notes.js +359 -0
- package/dist/memory/vault.d.ts +70 -0
- package/dist/memory/vault.js +169 -0
- package/dist/realtime/bailian.d.ts +120 -0
- package/dist/realtime/bailian.js +288 -0
- package/dist/realtime/cues.d.ts +51 -0
- package/dist/realtime/cues.js +94 -0
- package/dist/realtime/listen.d.ts +32 -0
- package/dist/realtime/listen.js +53 -0
- package/dist/realtime/preview.d.ts +23 -0
- package/dist/realtime/preview.js +38 -0
- package/dist/realtime/prompt.d.ts +8 -0
- package/dist/realtime/prompt.js +13 -0
- package/dist/realtime/voices.d.ts +19 -0
- package/dist/realtime/voices.js +71 -0
- package/dist/runtime/activities.d.ts +17 -0
- package/dist/runtime/activities.js +46 -0
- package/dist/runtime/activity-state.d.ts +22 -0
- package/dist/runtime/activity-state.js +83 -0
- package/dist/runtime/activity.d.ts +63 -0
- package/dist/runtime/activity.js +428 -0
- package/dist/runtime/agent-file.d.ts +24 -0
- package/dist/runtime/agent-file.js +59 -0
- package/dist/runtime/auto-bookkeep.d.ts +30 -0
- package/dist/runtime/auto-bookkeep.js +84 -0
- package/dist/{lib → runtime/context}/context-pack.d.ts +3 -3
- package/dist/runtime/context/context-pack.js +182 -0
- package/dist/runtime/context/thread-digest.d.ts +4 -0
- package/dist/runtime/context/thread-digest.js +35 -0
- package/dist/runtime/context/tutor-rules.d.ts +25 -0
- package/dist/runtime/context/tutor-rules.js +47 -0
- package/dist/runtime/delivery/delivery.d.ts +94 -0
- package/dist/runtime/delivery/delivery.js +145 -0
- package/dist/runtime/delivery/playback.d.ts +25 -0
- package/dist/runtime/delivery/playback.js +29 -0
- package/dist/runtime/delivery/player.d.ts +145 -0
- package/dist/runtime/delivery/player.js +221 -0
- package/dist/runtime/delivery/queue.d.ts +89 -0
- package/dist/runtime/delivery/queue.js +59 -0
- package/dist/runtime/home/edit.d.ts +39 -0
- package/dist/runtime/home/edit.js +132 -0
- package/dist/runtime/home/home.d.ts +180 -0
- package/dist/runtime/home/home.js +311 -0
- package/dist/runtime/home/store.d.ts +142 -0
- package/dist/runtime/home/store.js +440 -0
- package/dist/runtime/journal/conversation.d.ts +46 -0
- package/dist/runtime/journal/conversation.js +89 -0
- package/dist/runtime/journal/events.d.ts +27 -0
- package/dist/runtime/journal/events.js +136 -0
- package/dist/runtime/journal/kid-log.d.ts +105 -0
- package/dist/runtime/journal/kid-log.js +133 -0
- package/dist/runtime/journal/ledger.d.ts +17 -0
- package/dist/{lib → runtime/journal}/ledger.js +7 -32
- package/dist/runtime/journal/mix.d.ts +33 -0
- package/dist/runtime/journal/mix.js +88 -0
- package/dist/runtime/journal/mouth-index.d.ts +26 -0
- package/dist/runtime/journal/mouth-index.js +34 -0
- package/dist/runtime/journal/mouth.d.ts +54 -0
- package/dist/runtime/journal/mouth.js +102 -0
- package/dist/runtime/journal/recorder.d.ts +46 -0
- package/dist/runtime/journal/recorder.js +58 -0
- package/dist/runtime/journal/store.d.ts +123 -0
- package/dist/runtime/journal/store.js +316 -0
- package/dist/runtime/kid-input.d.ts +16 -0
- package/dist/runtime/kid-input.js +195 -0
- package/dist/runtime/kid-view.d.ts +124 -0
- package/dist/runtime/kid-view.js +157 -0
- package/dist/runtime/lecture.d.ts +86 -0
- package/dist/runtime/lecture.js +237 -0
- package/dist/runtime/live/call.d.ts +219 -0
- package/dist/runtime/live/call.js +1211 -0
- package/dist/runtime/live/turns.d.ts +48 -0
- package/dist/runtime/live/turns.js +102 -0
- package/dist/runtime/runner.d.ts +289 -0
- package/dist/runtime/runner.js +898 -0
- package/dist/runtime/talk-run.d.ts +21 -0
- package/dist/runtime/talk-run.js +34 -0
- package/dist/scenes/dictation/match.d.ts +57 -0
- package/dist/scenes/dictation/match.js +255 -0
- package/dist/scenes/dictation/recognize.d.ts +86 -0
- package/dist/scenes/dictation/recognize.js +163 -0
- package/dist/scenes/dictation/store.d.ts +112 -0
- package/dist/scenes/dictation/store.js +99 -0
- package/dist/scenes/look.d.ts +26 -0
- package/dist/scenes/look.js +1 -0
- package/dist/scenes/paint/painter.d.ts +84 -0
- package/dist/scenes/paint/painter.js +170 -0
- package/dist/scenes/paint/prompt.d.ts +23 -0
- package/dist/scenes/paint/prompt.js +36 -0
- package/dist/scenes/talk/en-words.d.ts +8 -0
- package/dist/scenes/talk/en-words.js +44 -0
- package/dist/scenes/talk/list.d.ts +44 -0
- package/dist/scenes/talk/list.js +88 -0
- package/dist/scenes/talk/store.d.ts +27 -0
- package/dist/scenes/talk/store.js +61 -0
- package/dist/scenes/talk/warmup.d.ts +16 -0
- package/dist/scenes/talk/warmup.js +39 -0
- package/dist/schema/activity.d.ts +149 -0
- package/dist/schema/activity.js +113 -0
- package/dist/schema/board.d.ts +200 -0
- package/dist/schema/board.js +42 -0
- package/dist/schema/config.d.ts +353 -80
- package/dist/schema/config.js +293 -76
- package/dist/schema/context-pack.d.ts +82 -13
- package/dist/schema/context-pack.js +97 -10
- package/dist/schema/conversation-files.d.ts +43 -0
- package/dist/schema/conversation-files.js +26 -0
- package/dist/schema/conversation.d.ts +459 -13
- package/dist/schema/conversation.js +148 -8
- package/dist/schema/events.d.ts +138 -0
- package/dist/schema/events.js +1 -0
- package/dist/schema/home.d.ts +46 -0
- package/dist/schema/home.js +30 -0
- package/dist/schema/index.d.ts +19 -4
- package/dist/schema/index.js +19 -4
- package/dist/schema/json-schema.d.ts +2 -0
- package/dist/schema/json-schema.js +23 -0
- package/dist/schema/kid-device.d.ts +20 -0
- package/dist/schema/kid-device.js +32 -0
- package/dist/schema/ledger.d.ts +9 -64
- package/dist/schema/ledger.js +7 -31
- package/dist/schema/memory.d.ts +73 -0
- package/dist/schema/memory.js +47 -0
- package/dist/schema/plan.d.ts +2 -2
- package/dist/schema/plan.js +2 -2
- package/dist/schema/sections.d.ts +32 -25
- package/dist/schema/sections.js +21 -22
- package/dist/schema/theme.d.ts +25 -0
- package/dist/schema/theme.js +26 -0
- package/dist/schema/timetable.d.ts +26 -0
- package/dist/schema/timetable.js +18 -0
- package/dist/schema/workspace.d.ts +41 -0
- package/dist/schema/workspace.js +9 -0
- package/dist/shared/errors.d.ts +8 -0
- package/dist/shared/errors.js +13 -0
- package/dist/shared/home.d.ts +2 -0
- package/dist/shared/home.js +16 -0
- package/dist/shared/human-notes.d.ts +5 -0
- package/dist/shared/human-notes.js +7 -0
- package/dist/shared/qianwen.d.ts +50 -0
- package/dist/shared/qianwen.js +109 -0
- package/dist/shared/time.d.ts +9 -0
- package/dist/shared/time.js +22 -0
- package/dist/shared/tokens.d.ts +18 -0
- package/dist/shared/tokens.js +11 -0
- package/dist/shared/wav.d.ts +10 -0
- package/dist/shared/wav.js +50 -0
- package/dist/stage/Assistant-Bold-ZDZZ6JHA.woff2 +0 -0
- package/dist/stage/Assistant-Medium-DZ25RZU3.woff2 +0 -0
- package/dist/stage/Assistant-Regular-PLF2XOGW.woff2 +0 -0
- package/dist/stage/Assistant-SemiBold-CZ5MX6FK.woff2 +0 -0
- package/dist/stage/chunk-226TNLQA.js +129 -0
- package/dist/stage/chunk-24LGQEKE.js +1 -0
- package/dist/stage/chunk-25XV6UY3.js +10 -0
- package/dist/stage/chunk-2AZI3NHJ.js +1 -0
- package/dist/stage/chunk-2BQZTTBE.js +1 -0
- package/dist/stage/chunk-2M7CGY3Y.js +11 -0
- package/dist/stage/chunk-2VR4WFQ7.js +10 -0
- package/dist/stage/chunk-2ZYXBUWG.js +9 -0
- package/dist/stage/chunk-32LAWMGY.js +1 -0
- package/dist/stage/chunk-3LEMTSOO.js +11 -0
- package/dist/stage/chunk-3QCKGZYE.js +32 -0
- package/dist/stage/chunk-44P66WFA.js +1 -0
- package/dist/stage/chunk-4AM6FRR6.js +7 -0
- package/dist/stage/chunk-4QDE4SUK.js +1 -0
- package/dist/stage/chunk-4QESHV3U.js +1 -0
- package/dist/stage/chunk-4SG5QPHB.js +2 -0
- package/dist/stage/chunk-4T4UVCOC.js +1 -0
- package/dist/stage/chunk-4WUEPPG3.js +34 -0
- package/dist/stage/chunk-4YCN6UZ5.js +99 -0
- package/dist/stage/chunk-5V7ZY2AP.js +1 -0
- package/dist/stage/chunk-5VS5Y2VJ.js +6 -0
- package/dist/stage/chunk-5W4NO2ZD.js +62 -0
- package/dist/stage/chunk-65CRNICM.js +1 -0
- package/dist/stage/chunk-66MULO7F.js +5 -0
- package/dist/stage/chunk-6COFQTBS.js +162 -0
- package/dist/stage/chunk-6VZG3M3I.js +8 -0
- package/dist/stage/chunk-7HVDH43T.js +1 -0
- package/dist/stage/chunk-7JLJN4EZ.js +8 -0
- package/dist/stage/chunk-7QDSP4LN.js +1 -0
- package/dist/stage/chunk-7R6OQAO3.js +1 -0
- package/dist/stage/chunk-7VTTHZKW.js +7 -0
- package/dist/stage/chunk-ATHR5KEN.js +10 -0
- package/dist/stage/chunk-B6R5LTP2.js +36 -0
- package/dist/stage/chunk-BD4WE264.js +1 -0
- package/dist/stage/chunk-BONANU47.js +206 -0
- package/dist/stage/chunk-BTVW7OFK.js +89 -0
- package/dist/stage/chunk-BUTJIDHG.js +8 -0
- package/dist/stage/chunk-C2IPYMML.js +84 -0
- package/dist/stage/chunk-C54FTPPV.js +9 -0
- package/dist/stage/chunk-C6LOUF2Z.js +90 -0
- package/dist/stage/chunk-CFF3PILO.js +339 -0
- package/dist/stage/chunk-CI2FQ2JY.js +9 -0
- package/dist/stage/chunk-CW5O4RV7.js +12 -0
- package/dist/stage/chunk-CYABNQYD.js +1 -0
- package/dist/stage/chunk-D7FFA4NS.js +15 -0
- package/dist/stage/chunk-DUNNXU6Z.js +8 -0
- package/dist/stage/chunk-E3E4Q6JF.js +6 -0
- package/dist/stage/chunk-EB3U3LH7.js +9 -0
- package/dist/stage/chunk-EGSZ736B.js +8 -0
- package/dist/stage/chunk-EOBXW5VQ.js +2 -0
- package/dist/stage/chunk-ERZC3B7Y.js +11 -0
- package/dist/stage/chunk-ESDOOBIH.js +11 -0
- package/dist/stage/chunk-EVU4QAL4.js +178 -0
- package/dist/stage/chunk-EVVZI2NY.js +39 -0
- package/dist/stage/chunk-FBKAZUKD.js +39 -0
- package/dist/stage/chunk-FDVKYQJN.js +1 -0
- package/dist/stage/chunk-FGPVYHVR.js +5 -0
- package/dist/stage/chunk-FHUD4AZC.js +1 -0
- package/dist/stage/chunk-FKUJ2DMY.js +96 -0
- package/dist/stage/chunk-FNZGVIJV.js +1 -0
- package/dist/stage/chunk-GBYSEGYM.js +78 -0
- package/dist/stage/chunk-GCO4TDHX.js +1 -0
- package/dist/stage/chunk-GKTML2LG.js +10 -0
- package/dist/stage/chunk-GMDIHHXQ.js +11 -0
- package/dist/stage/chunk-GOUNACI3.js +10 -0
- package/dist/stage/chunk-GXAYATPF.js +3 -0
- package/dist/stage/chunk-H2K2DDXV.js +8 -0
- package/dist/stage/chunk-H3UJI6ZY.js +13 -0
- package/dist/stage/chunk-H6PUGCME.js +7 -0
- package/dist/stage/chunk-HNBUIMIG.js +1 -0
- package/dist/stage/chunk-HRZY2BJQ.js +10 -0
- package/dist/stage/chunk-HSPJGALW.js +30 -0
- package/dist/stage/chunk-IBYORHIP.js +25 -0
- package/dist/stage/chunk-IHF4EWTY.js +1 -0
- package/dist/stage/chunk-ISBRPNKI.js +1 -0
- package/dist/stage/chunk-IZ3OI3C2.js +2 -0
- package/dist/stage/chunk-JEFZAC2R.js +1 -0
- package/dist/stage/chunk-JFIGRDPO.js +1 -0
- package/dist/stage/chunk-JFVYBOOC.js +9 -0
- package/dist/stage/chunk-JGD4TUTQ.js +1 -0
- package/dist/stage/chunk-JO4BEHDH.js +4 -0
- package/dist/stage/chunk-JOWBS42C.js +1 -0
- package/dist/stage/chunk-JP3TM2TG.js +1 -0
- package/dist/stage/chunk-JVK2C52O.js +1 -0
- package/dist/stage/chunk-K4I76XBX.js +14 -0
- package/dist/stage/chunk-KA6CZZ4M.js +1 -0
- package/dist/stage/chunk-KESSJ36M.js +1 -0
- package/dist/stage/chunk-LKATEVRU.js +1 -0
- package/dist/stage/chunk-LS4EJ2EI.js +1 -0
- package/dist/stage/chunk-LUKJQC2X.js +70 -0
- package/dist/stage/chunk-LWULR3SM.js +1 -0
- package/dist/stage/chunk-LWVRFMKX.js +2 -0
- package/dist/stage/chunk-LXC4ZBPZ.js +1 -0
- package/dist/stage/chunk-M2UP255H.js +1 -0
- package/dist/stage/chunk-MAPPXUZQ.js +231 -0
- package/dist/stage/chunk-MBMPW7Z5.js +1 -0
- package/dist/stage/chunk-MD3HMMTK.js +1 -0
- package/dist/stage/chunk-MLPCUIKR.js +17 -0
- package/dist/stage/chunk-MNQIRPDQ.js +8 -0
- package/dist/stage/chunk-MRG7MJVS.js +1 -0
- package/dist/stage/chunk-MU6EXW72.js +10 -0
- package/dist/stage/chunk-MVU2X6LU.js +4 -0
- package/dist/stage/chunk-N6UA5CZV.js +36 -0
- package/dist/stage/chunk-NLZIT2TJ.js +7 -0
- package/dist/stage/chunk-NOJR3J7M.js +1 -0
- package/dist/stage/chunk-NT7ARDOL.js +1 -0
- package/dist/stage/chunk-NWOGMPZH.js +1 -0
- package/dist/stage/chunk-NXE4KMG3.js +40 -0
- package/dist/stage/chunk-O4YCZXD2.js +257 -0
- package/dist/stage/chunk-OAJZ7HLK.js +1 -0
- package/dist/stage/chunk-OCFCFASO.js +1 -0
- package/dist/stage/chunk-ODGPG5RY.js +7 -0
- package/dist/stage/chunk-ODUEA52Q.js +3 -0
- package/dist/stage/chunk-OGDJ3FCI.js +1 -0
- package/dist/stage/chunk-OLDJ55TT.js +1 -0
- package/dist/stage/chunk-OOCL4ATI.js +2 -0
- package/dist/stage/chunk-OQEFDUDV.js +1 -0
- package/dist/stage/chunk-OQWVEWG7.js +4 -0
- package/dist/stage/chunk-OUIX6BGK.js +1 -0
- package/dist/stage/chunk-OV7OZYUO.js +7 -0
- package/dist/stage/chunk-PFGDY33O.js +1 -0
- package/dist/stage/chunk-PFJDUJB3.js +139 -0
- package/dist/stage/chunk-PGEW76ER.js +1 -0
- package/dist/stage/chunk-PP76TAQX.js +32 -0
- package/dist/stage/chunk-PTBOP4OT.js +2 -0
- package/dist/stage/chunk-PX2RVHCK.js +1 -0
- package/dist/stage/chunk-Q7K3PNAD.js +1 -0
- package/dist/stage/chunk-QDDPLZDB.js +1 -0
- package/dist/stage/chunk-QLGLZ77F.js +1 -0
- package/dist/stage/chunk-QOPFDFHI.js +1 -0
- package/dist/stage/chunk-QXT4KAEJ.js +1 -0
- package/dist/stage/chunk-R4YVZCIT.js +1 -0
- package/dist/stage/chunk-R6P6EHWA.js +62 -0
- package/dist/stage/chunk-RCH3OXBI.js +9 -0
- package/dist/stage/chunk-RHPE44I2.js +1 -0
- package/dist/stage/chunk-RJ2R4FVC.js +1 -0
- package/dist/stage/chunk-RJH2YVTD.js +1 -0
- package/dist/stage/chunk-RLWWW5OB.js +6 -0
- package/dist/stage/chunk-S3WO35Z7.js +120 -0
- package/dist/stage/chunk-S7ZGX6MW.js +1 -0
- package/dist/stage/chunk-SIAWX27B.js +1 -0
- package/dist/stage/chunk-SLG4X622.js +1 -0
- package/dist/stage/chunk-SLJRBC77.js +168 -0
- package/dist/stage/chunk-SRORWQJZ.js +1 -0
- package/dist/stage/chunk-STZTUIIF.js +2 -0
- package/dist/stage/chunk-SVQ6MWNV.js +9 -0
- package/dist/stage/chunk-TL3HLL2S.js +132 -0
- package/dist/stage/chunk-U3DOE6SF.js +24 -0
- package/dist/stage/chunk-UABQIZKW.js +6 -0
- package/dist/stage/chunk-UDK3R764.js +1 -0
- package/dist/stage/chunk-UFF4E54B.js +41 -0
- package/dist/stage/chunk-UFP5Q4AY.js +1 -0
- package/dist/stage/chunk-UMH2TSW2.js +72 -0
- package/dist/stage/chunk-UTASVNF5.js +10 -0
- package/dist/stage/chunk-UW7ML5ML.js +88 -0
- package/dist/stage/chunk-V3J7F6OP.js +1 -0
- package/dist/stage/chunk-VEHP5B5Q.js +5 -0
- package/dist/stage/chunk-VRXWB733.js +9 -0
- package/dist/stage/chunk-VVDHBBS5.js +5 -0
- package/dist/stage/chunk-VYFOH6FU.js +106 -0
- package/dist/stage/chunk-W3VZTLQS.js +3 -0
- package/dist/stage/chunk-W7WNRWTZ.js +8 -0
- package/dist/stage/chunk-WHUCV53C.js +1 -0
- package/dist/stage/chunk-WULMYHIF.js +1 -0
- package/dist/stage/chunk-X54EX7AW.js +9 -0
- package/dist/stage/chunk-X565ISZM.js +1 -0
- package/dist/stage/chunk-XGZMDECB.js +1 -0
- package/dist/stage/chunk-XHONC4RF.js +172 -0
- package/dist/stage/chunk-XIK4XQ6E.js +24 -0
- package/dist/stage/chunk-XJQQWFTE.js +1 -0
- package/dist/stage/chunk-XM4WOU3I.js +13 -0
- package/dist/stage/chunk-XM7Y5HP5.js +38 -0
- package/dist/stage/chunk-XNYYRGD5.js +292 -0
- package/dist/stage/chunk-XOYVR3SV.js +1 -0
- package/dist/stage/chunk-XQIW5HCE.js +1 -0
- package/dist/stage/chunk-YEWL7FUW.js +8 -0
- package/dist/stage/chunk-YI55PY3V.js +1 -0
- package/dist/stage/chunk-YM63HI6W.js +1 -0
- package/dist/stage/chunk-YNLGLU4P.js +9 -0
- package/dist/stage/chunk-YTNMNOWP.js +1 -0
- package/dist/stage/chunk-YV62XKTC.js +1 -0
- package/dist/stage/chunk-YVBA3QW6.js +1 -0
- package/dist/stage/chunk-Z2SY2HOC.js +1 -0
- package/dist/stage/chunk-ZBTCQEBK.js +10 -0
- package/dist/stage/chunk-ZCUFN74D.js +1 -0
- package/dist/stage/chunk-ZHOULXEJ.js +11 -0
- package/dist/stage/chunk-ZTRZIET2.js +1 -0
- package/dist/stage/index.html +11 -0
- package/dist/stage/stage.css +1 -0
- package/dist/stage/stage.js +1 -0
- package/dist/ui/dev/dev-page.d.ts +1 -0
- package/dist/ui/dev/dev-page.js +2248 -0
- package/dist/ui/dev/dev-theme.d.ts +6 -0
- package/dist/ui/dev/dev-theme.js +67 -0
- package/dist/ui/dev/qr-page.d.ts +8 -0
- package/dist/ui/dev/qr-page.js +61 -0
- package/dist/ui/dev/voice-gallery-page.d.ts +1 -0
- package/dist/ui/dev/voice-gallery-page.js +121 -0
- package/dist/ui/dev/voice-scenes.d.ts +21 -0
- package/dist/ui/dev/voice-scenes.js +30 -0
- package/dist/ui/dictation/en-box.d.ts +2 -0
- package/dist/ui/dictation/en-box.js +86 -0
- package/dist/ui/dictation/en-page.d.ts +1 -0
- package/dist/ui/dictation/en-page.js +484 -0
- package/dist/ui/dictation/page.d.ts +1 -0
- package/dist/ui/dictation/page.js +1084 -0
- package/dist/ui/dictation/parent-page.d.ts +1 -0
- package/dist/ui/dictation/parent-page.js +234 -0
- package/dist/ui/dictation/reel-mode.d.ts +1 -0
- package/dist/ui/dictation/reel-mode.js +87 -0
- package/dist/ui/dictation/reel-page.d.ts +1 -0
- package/dist/ui/dictation/reel-page.js +62 -0
- package/dist/ui/dictation/reel.d.ts +163 -0
- package/dist/ui/dictation/reel.js +436 -0
- package/dist/ui/dictation/ui.d.ts +44 -0
- package/dist/ui/dictation/ui.js +80 -0
- package/dist/ui/dictation/unlock.d.ts +7 -0
- package/dist/ui/dictation/unlock.js +16 -0
- package/dist/ui/kid/audio-client.d.ts +11 -0
- package/dist/ui/kid/audio-client.js +74 -0
- package/dist/ui/kid/board-mark-art.d.ts +37 -0
- package/dist/ui/kid/board-mark-art.js +5 -0
- package/dist/ui/kid/board-mark.d.ts +24 -0
- package/dist/ui/kid/board-mark.js +58 -0
- package/dist/ui/kid/kid-log.d.ts +15 -0
- package/dist/ui/kid/kid-log.js +87 -0
- package/dist/ui/kid/kid-nav.d.ts +11 -0
- package/dist/ui/kid/kid-nav.js +22 -0
- package/dist/ui/kid/kid-page.d.ts +9 -0
- package/dist/ui/kid/kid-page.js +3719 -0
- package/dist/ui/kid/letters.d.ts +26 -0
- package/dist/ui/kid/letters.js +51 -0
- package/dist/ui/kid/photo-edit.d.ts +83 -0
- package/dist/ui/kid/photo-edit.js +106 -0
- package/dist/ui/kid/photo-ui.d.ts +23 -0
- package/dist/ui/kid/photo-ui.js +60 -0
- package/dist/ui/kid/reel.d.ts +419 -0
- package/dist/ui/kid/reel.js +648 -0
- package/dist/ui/kid/tianzige.d.ts +8 -0
- package/dist/ui/kid/tianzige.js +45 -0
- package/dist/ui/kid/tutor-face.d.ts +35 -0
- package/dist/ui/kid/tutor-face.js +84 -0
- package/dist/ui/kid/voice-ui.d.ts +70 -0
- package/dist/ui/kid/voice-ui.js +316 -0
- package/dist/ui/kid/voice-view.d.ts +71 -0
- package/dist/ui/kid/voice-view.js +75 -0
- package/dist/ui/kid/word-draw.d.ts +2 -0
- package/dist/ui/kid/word-draw.js +107 -0
- package/dist/ui/kid/word-emoji.d.ts +10 -0
- package/dist/ui/kid/word-emoji.js +66 -0
- package/dist/ui/kid/word-layout.d.ts +25 -0
- package/dist/ui/kid/word-layout.js +29 -0
- package/dist/ui/parent/parent-home-page.d.ts +1 -0
- package/dist/ui/parent/parent-home-page.js +414 -0
- package/dist/ui/parent/parent-page.d.ts +2 -0
- package/dist/ui/parent/parent-page.js +507 -0
- package/dist/ui/shared/brand.d.ts +36 -0
- package/dist/ui/shared/brand.js +51 -0
- package/dist/ui/shared/favicon.d.ts +12 -0
- package/dist/ui/shared/favicon.js +96 -0
- package/dist/ui/shared/icon.d.ts +9 -0
- package/dist/ui/shared/icon.js +35 -0
- package/dist/ui/shared/inline-lib.d.ts +1 -0
- package/dist/ui/shared/inline-lib.js +28 -0
- package/dist/ui/shared/logo.d.ts +31 -0
- package/dist/ui/shared/logo.js +43 -0
- package/dist/ui/shared/page-dom.d.ts +12 -0
- package/dist/ui/shared/page-dom.js +36 -0
- package/dist/ui/shared/png.d.ts +1 -0
- package/dist/ui/shared/png.js +45 -0
- package/dist/ui/shared/qr-svg.d.ts +3 -0
- package/dist/ui/shared/qr-svg.js +32 -0
- package/dist/ui/shared/qr.d.ts +14 -0
- package/dist/ui/shared/qr.js +281 -0
- package/dist/ui/shared/reel-dock.d.ts +22 -0
- package/dist/ui/shared/reel-dock.js +365 -0
- package/dist/ui/shared/tutor-color.d.ts +15 -0
- package/dist/ui/shared/tutor-color.js +47 -0
- package/dist/ui/talk/page.d.ts +6 -0
- package/dist/ui/talk/page.js +294 -0
- package/grades/grade-2/README.md +11 -0
- package/grades/grade-2/VALIDATION.md +41 -0
- package/grades/grade-2/agents/chinese-tutor/activities//344/275/240/350/257/264/346/210/221/347/224/273.md +157 -0
- package/grades/grade-2/agents/chinese-tutor/activities//344/275/240/350/257/264/346/210/221/347/224/273./344/276/213/345/255/220.md +78 -0
- package/grades/grade-2/agents/chinese-tutor/activities//344/276/213/345/255/220/345/233/276//345/200/237/344/274/236.jpg +0 -0
- package/grades/grade-2/agents/chinese-tutor/activities//344/276/213/345/255/220/345/233/276//345/260/217/347/214/264/346/221/230/346/241/203.jpg +0 -0
- package/grades/grade-2/agents/chinese-tutor/activities//345/206/231/350/257/235.md +64 -0
- package/grades/grade-2/agents/chinese-tutor/activities//345/206/231/350/257/235./344/276/213/345/255/220.md +31 -0
- package/grades/grade-2/agents/chinese-tutor/activities//345/220/254/345/206/231.md +48 -0
- package/grades/grade-2/agents/chinese-tutor/activities//345/244/215/344/271/240.md +79 -0
- package/grades/grade-2/agents/chinese-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
- package/grades/grade-2/agents/chinese-tutor/activities//345/260/217/350/257/276/345/240/202.md +53 -0
- package/grades/grade-2/agents/chinese-tutor/activities//346/211/271/346/224/271.md +81 -0
- package/grades/grade-2/agents/chinese-tutor/activities//346/211/271/346/224/271./344/276/213/345/255/220.md +35 -0
- package/grades/grade-2/agents/chinese-tutor/activities//347/234/213/345/233/276/350/257/264/350/257/235.md +94 -0
- package/grades/grade-2/agents/chinese-tutor/activities//347/234/213/345/233/276/350/257/264/350/257/235./344/276/213/345/255/220.md +63 -0
- package/grades/grade-2/agents/chinese-tutor/activities//351/242/204/344/271/240.md +82 -0
- package/grades/grade-2/agents/chinese-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
- package/grades/grade-2/agents/chinese-tutor.md +59 -0
- package/grades/grade-2/agents/english-tutor/activities//345/217/243/350/257/255/350/257/276.md +149 -0
- package/grades/grade-2/agents/english-tutor/activities//345/217/243/350/257/255/350/257/276./344/276/213/345/255/220.md +13 -0
- package/grades/grade-2/agents/english-tutor/activities//345/220/254/345/206/231.md +47 -0
- package/grades/grade-2/agents/english-tutor/activities//345/244/215/344/271/240.md +78 -0
- package/grades/grade-2/agents/english-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
- package/grades/grade-2/agents/english-tutor/activities//345/260/217/350/257/276/345/240/202.md +53 -0
- package/grades/grade-2/agents/english-tutor/activities//346/211/271/346/224/271.md +80 -0
- package/grades/grade-2/agents/english-tutor/activities//346/211/271/346/224/271./344/276/213/345/255/220.md +35 -0
- package/grades/grade-2/agents/english-tutor/activities//351/242/204/344/271/240.md +86 -0
- package/grades/grade-2/agents/english-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
- package/grades/grade-2/agents/english-tutor.md +57 -0
- package/grades/grade-2/agents/math-tutor/activities//345/244/215/344/271/240.md +78 -0
- package/grades/grade-2/agents/math-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
- package/grades/grade-2/agents/math-tutor/activities//345/260/217/350/257/276/345/240/202.md +56 -0
- package/grades/grade-2/agents/math-tutor/activities//345/260/217/350/257/276/345/240/202./344/276/213/345/255/220.md +52 -0
- package/grades/grade-2/agents/math-tutor/activities//346/211/271/346/224/271.md +80 -0
- package/grades/grade-2/agents/math-tutor/activities//346/211/271/346/224/271./344/276/213/345/255/220.md +35 -0
- package/grades/grade-2/agents/math-tutor/activities//351/242/204/344/271/240.md +81 -0
- package/grades/grade-2/agents/math-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
- package/grades/grade-2/agents/math-tutor.md +51 -0
- package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/index.json +44 -0
- package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-1.mp3 +0 -0
- package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-2.mp3 +0 -0
- package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-3.mp3 +0 -0
- package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-4.mp3 +0 -0
- package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-5.mp3 +0 -0
- package/grades/grade-2/examples/2026-10-27-pingjunfen/bake.json +1 -0
- package/grades/grade-2/examples/2026-10-27-pingjunfen/manifest.json +63 -0
- package/grades/grade-2/examples/2026-10-27-pingjunfen/scene.json +247 -0
- package/grades/grade-2/examples/2026-10-27-pingjunfen.md +40 -0
- package/grades/grade-2/examples/2026-10-27-pingjunfen.ts +26 -0
- package/grades/grade-2/examples//345/271/263/345/235/207/345/210/206./344/276/213/345/255/220.md +24 -0
- package/grades/grade-2/examples//346/225/260/345/255/246/345/271/263/345/235/207/345/210/206.md +42 -0
- package/grades/grade-2/validation/2026-10-27.json +4410 -0
- package/package.json +32 -12
- package/skills/chalk-cli/SKILL.md +62 -0
- package/skills/chalk-scene/SKILL.md +91 -0
- package/skills/chalk-teaching/SKILL.md +82 -0
- package/skills/chalk-teaching/models//344/272/244/351/224/231/346/225/260/345/210/227/345/210/206/350/241/214.md +8 -0
- package/skills/chalk-teaching/models//345/207/221/345/215/201.md +7 -0
- package/skills/chalk-teaching/models//345/221/250/346/234/237/350/247/204/345/276/213.md +6 -0
- package/skills/chalk-teaching/models//345/256/236/347/211/251/345/233/276-/345/242/236/345/207/217.md +6 -0
- package/skills/chalk-teaching/models//345/256/236/347/211/251/345/233/276-/346/257/224/345/244/232/345/260/221-/346/261/202/345/244/247/346/225/260/346/261/202/345/260/217/346/225/260.md +7 -0
- package/skills/chalk-teaching/models//345/256/236/347/211/251/345/233/276-/346/257/224/345/244/232/345/260/221-/346/261/202/345/267/256.md +6 -0
- package/skills/chalk-teaching/models//345/260/217/346/243/222/350/277/233/344/275/215/345/212/240.md +7 -0
- package/skills/chalk-teaching/models//345/260/217/346/243/222/351/200/200/344/275/215/345/207/217.md +6 -0
- package/skills/chalk-teaching/models//346/216/222/351/230/237/347/202/271/351/230/265.md +7 -0
- package/skills/chalk-teaching/models//346/227/266/351/227/264/346/225/260/350/275/264.md +6 -0
- package/skills/chalk-teaching/models//346/245/274/345/261/202/351/227/264/351/232/224/345/233/276.md +7 -0
- package/skills/chalk-teaching/models//347/240/264/345/215/201.md +7 -0
- package/skills/chalk-teaching/models//347/253/226/345/274/217/351/200/200/344/275/215.md +6 -0
- package/skills/chalk-teaching/models//347/272/277/346/256/265/345/233/276.md +7 -0
- package/skills/chalk-teaching/models-index.md +24 -0
- package/skills/chalk-teaching/references//350/256/262/350/247/243/346/250/241/346/235/277/344/270/211/346/241/243.md +32 -0
- package/skills/chalk-teaching/references//350/257/264/346/230/216/346/226/207/344/273/266.md +102 -0
- package/skills/chalk-verify/SKILL.md +57 -0
- package/skills/chalk-verify/references//350/257/204/345/210/244/346/240/207/345/207/206.md +69 -0
- package/skills/cotutor-analyze/SKILL.md +106 -0
- package/skills/cotutor-analyze/references//345/221/275/344/273/244/344/270/216/346/226/207/344/273/266.md +31 -0
- package/skills/cotutor-board/SKILL.md +373 -0
- package/skills/cotutor-board/references/README.md +38 -0
- package/skills/cotutor-board/references/canvas.md +68 -0
- package/skills/cotutor-board/references/choice.md +55 -0
- package/skills/cotutor-board/references/code.md +46 -0
- package/skills/cotutor-board/references/image.md +52 -0
- package/skills/cotutor-board/references/lecture.md +69 -0
- package/skills/cotutor-board/references/paint.md +77 -0
- package/skills/cotutor-board/references/photo.md +61 -0
- package/skills/cotutor-board/references/read.md +51 -0
- package/skills/cotutor-board/references/text.md +69 -0
- package/skills/cotutor-board/references/tianzige.md +78 -0
- package/skills/cotutor-board/references/word.md +91 -0
- package/skills/cotutor-home/SKILL.md +169 -0
- package/skills/cotutor-home/references/dictation.md +97 -0
- package/skills/cotutor-home/references/tutor.md +148 -0
- package/skills/cotutor-home/references//345/221/275/344/273/244.md +21 -0
- package/skills/cotutor-home/references//351/246/226/351/241/265/350/257/255/346/263/225.md +142 -0
- package/skills/cotutor-tune/SKILL.md +147 -0
- package/skills/cotutor-tune/references//345/255/227/346/256/265.md +50 -0
- package/skills/cotutor-tutor/SKILL.md +261 -0
- package/skills/cotutor-tutor/references//344/270/212/344/270/213/346/226/207/345/214/205.md +78 -0
- package/themes/default/kid.css +86 -0
- package/themes/default/theme.json +26 -0
- package/agents/chinese-teacher.md +0 -19
- package/agents/homework-aide.md +0 -17
- package/agents/math-teacher.md +0 -19
- package/agents/planner.md +0 -18
- package/agents/reading-teacher.md +0 -19
- package/dist/cli/doctor.d.ts +0 -19
- package/dist/cli/doctor.js +0 -190
- package/dist/cli/init.js +0 -114
- package/dist/cli/main.js +0 -123
- package/dist/cli/serve.d.ts +0 -19
- package/dist/cli/serve.js +0 -22
- package/dist/cli/skeleton.d.ts +0 -21
- package/dist/cli/skeleton.js +0 -82
- package/dist/cli/workspace.d.ts +0 -61
- package/dist/lib/agent-file.d.ts +0 -10
- package/dist/lib/agent-file.js +0 -16
- package/dist/lib/context-pack.js +0 -46
- package/dist/lib/conversation.d.ts +0 -28
- package/dist/lib/conversation.js +0 -44
- package/dist/lib/kid-view.d.ts +0 -26
- package/dist/lib/kid-view.js +0 -38
- package/dist/lib/ledger.d.ts +0 -21
- package/dist/lib/sections.d.ts +0 -12
- package/dist/lib/sections.js +0 -151
- package/dist/lib/transcript.d.ts +0 -36
- package/dist/lib/transcript.js +0 -95
- package/dist/server/app.d.ts +0 -13
- package/dist/server/app.js +0 -45
- /package/dist/{cli → app/cli}/main.d.ts +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type InstallStep } from './tutors.ts';
|
|
2
|
+
/** section:出厂模板里有的整段(dictation 这种后加的),你这份没有;retired:出厂写进去、应用已经不读的整段,补缺时删掉 */
|
|
3
|
+
export type GapKind = 'tutor' | 'runtime' | 'flag' | 'cards' | 'section' | 'retired';
|
|
4
|
+
export interface ConfigGap {
|
|
5
|
+
kind: GapKind;
|
|
6
|
+
/** 点位:tutors.math-tutor / runtimes.qwen / runtimes.qwen.run */
|
|
7
|
+
path: string;
|
|
8
|
+
/** 人话:缺的是什么、补上有什么用 */
|
|
9
|
+
detail: string;
|
|
10
|
+
/** 补上之后这个点位的值(--dry-run 打印、页面提示用);retired 是 undefined(删掉) */
|
|
11
|
+
value: unknown;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 把出厂模板里有、这份没有的旗标插进来,**位置照出厂模板**:
|
|
15
|
+
* 插到「出厂模板里排在它前面、这份也有」的那个旗标之后;一个都找不到就放末尾。
|
|
16
|
+
* 已经有的旗标一律不碰——值被家长改过(预算 2 → 5)是她的决定。
|
|
17
|
+
*/
|
|
18
|
+
export declare function insertMissingFlags(mine: readonly string[], factory: readonly string[]): {
|
|
19
|
+
argv: string[];
|
|
20
|
+
added: string[];
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* 这份 cotutor.json 比出厂模板少了什么。只看「有没有」,不看值——值是家长的。
|
|
24
|
+
* 注意:出厂老师是家长手动从 tutors 里删掉的(页面删不了出厂老师),这里也会当成缺,
|
|
25
|
+
* 所以 `--dry-run` 先列、doctor 那条不是必需项。
|
|
26
|
+
*/
|
|
27
|
+
export declare function configGaps(raw: unknown, agentsDir?: string): Promise<ConfigGap[]>;
|
|
28
|
+
export interface UpgradeConfigResult {
|
|
29
|
+
file: string;
|
|
30
|
+
gaps: ConfigGap[];
|
|
31
|
+
/** 真写了没有(--dry-run 与没有差异时都是 false) */
|
|
32
|
+
applied: boolean;
|
|
33
|
+
/** 新老师进了表之后顺带补的文件与目录(老师文件、agents/<name>/) */
|
|
34
|
+
installed: InstallStep[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 补缺并落盘:补丁打在**原始 JSON** 上(`$schema` `_note` 这些机器不认识的键原样留着),
|
|
38
|
+
* 整份过契约才写;不过就抛,原文件不动。
|
|
39
|
+
*/
|
|
40
|
+
export declare function upgradeConfig(root: string, opts?: {
|
|
41
|
+
dryRun?: boolean;
|
|
42
|
+
}): Promise<UpgradeConfigResult>;
|
|
43
|
+
/** doctor 与家长端都要:读文件算差异;文件读不到 / 坏了就当没有差异(那边有别的检查在报) */
|
|
44
|
+
export declare function configGapsOf(root: string): Promise<ConfigGap[]>;
|
|
45
|
+
export interface LayoutStep {
|
|
46
|
+
item: string;
|
|
47
|
+
action: 'moved' | 'kept' | 'removed';
|
|
48
|
+
note?: string;
|
|
49
|
+
}
|
|
50
|
+
/** doctor 用:老位置里还有东西的那几个(相对 workspace 根) */
|
|
51
|
+
export declare function legacyLayout(root: string): Promise<string[]>;
|
|
52
|
+
/**
|
|
53
|
+
* init / upgrade 第一步:老位置里的东西原样挪到新位置(不改内容、不看 hash),出厂件新不新由后面安装那一步照常查。
|
|
54
|
+
* 必须在 installTutors / installSkills 之前:不然新位置是空的,出厂件先拷进去,家长改过的那份就晾在老位置。
|
|
55
|
+
* 新位置已经有同名的不挪、报一声;老目录搬空了删掉(.claude/skills 随后换成链,见 skills.ts 的 linkClaudeSkills),.claude/ 里别的东西不碰。
|
|
56
|
+
* 顺带删掉 RETIRED_FILES(机器文件,删了也只是缓存没了)。
|
|
57
|
+
*/
|
|
58
|
+
export declare function migrateLayout(root: string): Promise<LayoutStep[]>;
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 老 workspace 的迁移:cotutor.json 补缺(下面大半),和目录搬家、清掉不再用的机器文件(文件末尾的 migrateLayout)。
|
|
3
|
+
*
|
|
4
|
+
* cotutor.json 是**政策文件**:init 只在缺失时写模板,已有的那份机器永不改(家长的决定不由机器代做)。
|
|
5
|
+
* 代价是包更新带来的新出厂件不会自己出现在老 workspace 里,而且「没有」的表现是**静默**的——
|
|
6
|
+
* 所以有这一层:把「出厂模板有、你这份没有」算出来(doctor 的 `config.migrate` 点名、家长端设置页顶部提示),
|
|
7
|
+
* `cotutor upgrade --config` 只**补缺**——加缺的键、往命令模板里插缺的旗标;家长写过的值一个都不动
|
|
8
|
+
* (改小的预算、加过的 `-m qwen3.8-flash`、换掉的 default 运行时全都原样留着)。
|
|
9
|
+
* 唯一删的是 RETIRED 里点了名的出厂段(机器写进去、应用已经不读的,如 2026-10-31 的 tts);家长自己加的键不在表里,不碰。
|
|
10
|
+
*
|
|
11
|
+
* 差异是**现算的**:拿家长自己的 slug / name / port 生成一份出厂模板,和她这份逐项比,
|
|
12
|
+
* 所以以后模板再加东西,这里不用跟着改。
|
|
13
|
+
*/
|
|
14
|
+
import { workspaceGradePack } from "./grades.js";
|
|
15
|
+
import { lstat, mkdir, readFile, readdir, rename, rm, rmdir, writeFile } from 'node:fs/promises';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { CotutorConfigSchema, SKILLS_DIR, explainIssues } from "../../schema/index.js";
|
|
18
|
+
import { configTemplate, shippedAgents } from "./skeleton.js";
|
|
19
|
+
import { installTutors } from "./tutors.js";
|
|
20
|
+
import { CONFIG_FILE, ConfigError, readJson } from "../workspace.js";
|
|
21
|
+
const isObj = (v) => Boolean(v) && typeof v === 'object' && !Array.isArray(v);
|
|
22
|
+
/** 命令模板里一个旗标带几个词:`--output-format stream-json` 是两个,`--include-partial-messages` 是一个(值不以 - 打头) */
|
|
23
|
+
function flagSpan(argv, i) {
|
|
24
|
+
const span = [argv[i]];
|
|
25
|
+
for (let j = i + 1; j < argv.length && !argv[j].startsWith('-'); j++)
|
|
26
|
+
span.push(argv[j]);
|
|
27
|
+
return span;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 把出厂模板里有、这份没有的旗标插进来,**位置照出厂模板**:
|
|
31
|
+
* 插到「出厂模板里排在它前面、这份也有」的那个旗标之后;一个都找不到就放末尾。
|
|
32
|
+
* 已经有的旗标一律不碰——值被家长改过(预算 2 → 5)是她的决定。
|
|
33
|
+
*/
|
|
34
|
+
export function insertMissingFlags(mine, factory) {
|
|
35
|
+
const argv = [...mine];
|
|
36
|
+
const added = [];
|
|
37
|
+
for (let i = 0; i < factory.length; i++) {
|
|
38
|
+
const tok = factory[i];
|
|
39
|
+
if (!tok.startsWith('-') || argv.includes(tok))
|
|
40
|
+
continue;
|
|
41
|
+
const span = flagSpan(factory, i);
|
|
42
|
+
let at = argv.length;
|
|
43
|
+
for (let j = i - 1; j >= 0; j--) {
|
|
44
|
+
const prev = factory[j];
|
|
45
|
+
if (!prev.startsWith('-'))
|
|
46
|
+
continue;
|
|
47
|
+
const k = argv.indexOf(prev);
|
|
48
|
+
if (k === -1)
|
|
49
|
+
continue;
|
|
50
|
+
at = k + flagSpan(argv, k).length;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
argv.splice(at, 0, ...span);
|
|
54
|
+
added.push(...span);
|
|
55
|
+
}
|
|
56
|
+
return { argv, added };
|
|
57
|
+
}
|
|
58
|
+
/** 出厂模板:拿这份配置自己的 slug / name / port 生成,免得差异里混进「孩子叫什么」这种无关项 */
|
|
59
|
+
async function factoryConfig(raw, agentsDir) {
|
|
60
|
+
const kid = isObj(raw.kid) ? raw.kid : {};
|
|
61
|
+
const server = isObj(raw.server) ? raw.server : {};
|
|
62
|
+
return JSON.parse(configTemplate({
|
|
63
|
+
slug: typeof kid.slug === 'string' ? kid.slug : 'kid',
|
|
64
|
+
name: typeof kid.name === 'string' ? kid.name : undefined,
|
|
65
|
+
port: typeof server.port === 'number' ? server.port : undefined,
|
|
66
|
+
tutors: await shippedAgents(agentsDir),
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 这份 cotutor.json 比出厂模板少了什么。只看「有没有」,不看值——值是家长的。
|
|
71
|
+
* 注意:出厂老师是家长手动从 tutors 里删掉的(页面删不了出厂老师),这里也会当成缺,
|
|
72
|
+
* 所以 `--dry-run` 先列、doctor 那条不是必需项。
|
|
73
|
+
*/
|
|
74
|
+
export async function configGaps(raw, agentsDir) {
|
|
75
|
+
if (!isObj(raw))
|
|
76
|
+
return [];
|
|
77
|
+
const factory = await factoryConfig(raw, agentsDir);
|
|
78
|
+
const gaps = [];
|
|
79
|
+
const mineTutors = isObj(raw.tutors) ? raw.tutors : {};
|
|
80
|
+
const factoryTutors = isObj(factory.tutors) ? factory.tutors : {};
|
|
81
|
+
for (const [name, entry] of Object.entries(factoryTutors)) {
|
|
82
|
+
if (name in mineTutors)
|
|
83
|
+
continue;
|
|
84
|
+
const display = isObj(entry) && typeof entry.display === 'string' ? entry.display : name;
|
|
85
|
+
gaps.push({ kind: 'tutor', path: `tutors.${name}`, detail: `出厂老师 ${display}(${name})不在 tutors 里`, value: entry });
|
|
86
|
+
}
|
|
87
|
+
// 卡的清单(2026-10-07,《卡片协议.md》「谁拿到哪些卡」):出厂老师有、你这份没写 → 补出厂的;不想裁就写全部种类,这条就不再提
|
|
88
|
+
for (const [name, entry] of Object.entries(factoryTutors)) {
|
|
89
|
+
const mine = mineTutors[name];
|
|
90
|
+
if (!isObj(mine) || 'cards' in mine || !isObj(entry) || !Array.isArray(entry.cards))
|
|
91
|
+
continue;
|
|
92
|
+
gaps.push({ kind: 'cards', path: `tutors.${name}.cards`, detail: `${name} 没写卡的清单,板书写法里讲全部卡;出厂清单 ${entry.cards.join(' ')}`, value: entry.cards });
|
|
93
|
+
}
|
|
94
|
+
const mineRuntimes = isObj(raw.runtimes) ? raw.runtimes : {};
|
|
95
|
+
const factoryRuntimes = isObj(factory.runtimes) ? factory.runtimes : {};
|
|
96
|
+
for (const [name, rt] of Object.entries(factoryRuntimes)) {
|
|
97
|
+
if (name === 'default' || name in mineRuntimes)
|
|
98
|
+
continue;
|
|
99
|
+
gaps.push({ kind: 'runtime', path: `runtimes.${name}`, detail: `出厂运行时 ${name} 不在 runtimes 里`, value: rt });
|
|
100
|
+
}
|
|
101
|
+
for (const [name, rt] of Object.entries(factoryRuntimes)) {
|
|
102
|
+
if (name === 'default' || !isObj(rt))
|
|
103
|
+
continue;
|
|
104
|
+
const mine = mineRuntimes[name];
|
|
105
|
+
if (!isObj(mine))
|
|
106
|
+
continue; // 整个运行时都缺,上面那轮已经报了
|
|
107
|
+
// 出厂模板换了说话方式(消息改走 stdin)而你的改过:逐个补旗标会拼出过不了契约的模板,不动(家长的决定)
|
|
108
|
+
if (rt.stdin && !mine.stdin)
|
|
109
|
+
continue;
|
|
110
|
+
for (const key of ['run', 'resume']) {
|
|
111
|
+
const f = rt[key];
|
|
112
|
+
const u = mine[key];
|
|
113
|
+
if (!Array.isArray(f) || !Array.isArray(u))
|
|
114
|
+
continue;
|
|
115
|
+
const { argv, added } = insertMissingFlags(u, f);
|
|
116
|
+
if (!added.length)
|
|
117
|
+
continue;
|
|
118
|
+
const what = `缺出厂旗标 ${added.join(' ')}`;
|
|
119
|
+
gaps.push({ kind: 'flag', path: `runtimes.${name}.${key}`, detail: `${name} 的 ${key} 命令模板${what}`, value: argv });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// 后加的整段(2026-10-10 听写的拍照认词要求):写进文件家长才看得见、改得动;已经有这一段就不碰
|
|
123
|
+
for (const key of SECTIONS) {
|
|
124
|
+
if (key in raw || !(key in factory))
|
|
125
|
+
continue;
|
|
126
|
+
gaps.push({ kind: 'section', path: key, detail: `缺 ${key} 这一段(${SECTION_WHAT[key]})`, value: factory[key] });
|
|
127
|
+
}
|
|
128
|
+
for (const key of RETIRED) {
|
|
129
|
+
if (key in raw)
|
|
130
|
+
gaps.push({ kind: 'retired', path: key, detail: `${key} 这一段不再用了(${RETIRED_WHAT[key]}),删掉`, value: undefined });
|
|
131
|
+
}
|
|
132
|
+
return gaps;
|
|
133
|
+
}
|
|
134
|
+
/** 补缺时会整段补上的配置段:出厂模板写了、写进文件才好改的 */
|
|
135
|
+
const SECTIONS = ['dictation'];
|
|
136
|
+
const SECTION_WHAT = { dictation: '听写拍照认词用的模型,补上就能在文件里改(挑词的要求在听写 activity 文件)' };
|
|
137
|
+
/** 不再用的出厂段:老模板写进去的,应用已经不读(契约照样放过,只是留着让人以为还管用) */
|
|
138
|
+
const RETIRED = ['tts'];
|
|
139
|
+
const RETIRED_WHAT = { tts: '配音 2026-10-31 并进了应用,直连百炼,不再起 voxtell 命令' };
|
|
140
|
+
function setAt(obj, path, value) {
|
|
141
|
+
const keys = path.split('.');
|
|
142
|
+
let cur = obj;
|
|
143
|
+
for (const k of keys.slice(0, -1)) {
|
|
144
|
+
if (!isObj(cur[k]))
|
|
145
|
+
cur[k] = {};
|
|
146
|
+
cur = cur[k];
|
|
147
|
+
}
|
|
148
|
+
const last = keys[keys.length - 1];
|
|
149
|
+
if (value === undefined)
|
|
150
|
+
delete cur[last];
|
|
151
|
+
else
|
|
152
|
+
cur[last] = value;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 补缺并落盘:补丁打在**原始 JSON** 上(`$schema` `_note` 这些机器不认识的键原样留着),
|
|
156
|
+
* 整份过契约才写;不过就抛,原文件不动。
|
|
157
|
+
*/
|
|
158
|
+
export async function upgradeConfig(root, opts = {}) {
|
|
159
|
+
const file = join(root, CONFIG_FILE);
|
|
160
|
+
const raw = readJson(file);
|
|
161
|
+
if (raw === null)
|
|
162
|
+
throw new ConfigError(file, '不存在:先 cotutor init <slug> 建 workspace');
|
|
163
|
+
if (!isObj(raw))
|
|
164
|
+
throw new ConfigError(file, '顶层不是一个 JSON 对象');
|
|
165
|
+
const gaps = await configGaps(raw, (await workspaceGradePack(root)).agentsDir);
|
|
166
|
+
if (opts.dryRun || !gaps.length)
|
|
167
|
+
return { file, gaps, applied: false, installed: [] };
|
|
168
|
+
const merged = JSON.parse(JSON.stringify(raw));
|
|
169
|
+
for (const g of gaps)
|
|
170
|
+
setAt(merged, g.path, g.value);
|
|
171
|
+
const r = CotutorConfigSchema.safeParse(merged);
|
|
172
|
+
if (!r.success) {
|
|
173
|
+
throw new ConfigError(file, `补完之后不合契约,没有写入:\n${explainIssues(r.error.issues).map((l) => ` - ${l}`).join('\n')}`);
|
|
174
|
+
}
|
|
175
|
+
const tmp = `${file}.tmp`;
|
|
176
|
+
await writeFile(tmp, `${JSON.stringify(merged, null, 2)}\n`);
|
|
177
|
+
await rename(tmp, file);
|
|
178
|
+
// 新老师进了表,她的文件与家还得在,否则 doctor 立刻报「老师文件读不到」——
|
|
179
|
+
// 补缺就补到底(installTutors 是 init 用的同一条路:缺的拷、有的不动)
|
|
180
|
+
// 老布局先搬:不然新位置是空的,出厂老师先拷进去,家长改过的那份晾在 .claude/agents/
|
|
181
|
+
if (gaps.some((g) => g.kind === 'tutor'))
|
|
182
|
+
await migrateLayout(root);
|
|
183
|
+
const installed = gaps.some((g) => g.kind === 'tutor')
|
|
184
|
+
? (await installTutors(root, Object.keys(r.data.tutors))).filter((s) => s.action === 'created' || s.action === 'replaced')
|
|
185
|
+
: [];
|
|
186
|
+
return { file, gaps, applied: true, installed };
|
|
187
|
+
}
|
|
188
|
+
/** doctor 与家长端都要:读文件算差异;文件读不到 / 坏了就当没有差异(那边有别的检查在报) */
|
|
189
|
+
export async function configGapsOf(root) {
|
|
190
|
+
try {
|
|
191
|
+
return await configGaps(JSON.parse(await readFile(join(root, CONFIG_FILE), 'utf8')), (await workspaceGradePack(root)).agentsDir);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// ---- 目录搬家(2026-10-30):老师文件 .claude/agents/ → agents/,技能 .claude/skills/ → .agents/skills/ ----
|
|
198
|
+
// 起因:Claude CLI 2026-10-28 移除后 .claude/ 只是历史名字;Codex、Qwen Code 认 .agents/skills,老师文件和老师的家并排才和包里一样。
|
|
199
|
+
// 老 workspace 都搬完了这一段就删(同 2026-10-22 删 .qwen 链的迁移)。
|
|
200
|
+
/** 还没搬完的老位置(实体目录才算;.claude/skills 是链就是新布局) */
|
|
201
|
+
const LEGACY_DIRS = [
|
|
202
|
+
{ from: '.claude/agents', to: 'agents' },
|
|
203
|
+
{ from: '.claude/skills', to: SKILLS_DIR },
|
|
204
|
+
];
|
|
205
|
+
/**
|
|
206
|
+
* 不再用的机器文件(相对 workspace 根):2026-10-31 配音的缓存合成一份 .cotutor/tts/,试听、听写念词原来各存一处,设置页的「试一句」也去掉了;
|
|
207
|
+
* 同日 drawtell 并进本包,做课包是 cotutor chalk,不再要指向 drawtell CLI 的壳 .cotutor/drawtell
|
|
208
|
+
*/
|
|
209
|
+
const RETIRED_FILES = ['.cotutor/tts-preview', '.cotutor/dictation-say', '.cotutor/tts-try.mp3', '.cotutor/drawtell'];
|
|
210
|
+
/** doctor 用:老位置里还有东西的那几个(相对 workspace 根) */
|
|
211
|
+
export async function legacyLayout(root) {
|
|
212
|
+
const out = [];
|
|
213
|
+
for (const { from } of LEGACY_DIRS) {
|
|
214
|
+
const st = await lstat(join(root, from)).catch(() => null);
|
|
215
|
+
if (st?.isDirectory() && (await readdir(join(root, from))).some((n) => n !== '.DS_Store'))
|
|
216
|
+
out.push(`${from}/`);
|
|
217
|
+
}
|
|
218
|
+
return out;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* init / upgrade 第一步:老位置里的东西原样挪到新位置(不改内容、不看 hash),出厂件新不新由后面安装那一步照常查。
|
|
222
|
+
* 必须在 installTutors / installSkills 之前:不然新位置是空的,出厂件先拷进去,家长改过的那份就晾在老位置。
|
|
223
|
+
* 新位置已经有同名的不挪、报一声;老目录搬空了删掉(.claude/skills 随后换成链,见 skills.ts 的 linkClaudeSkills),.claude/ 里别的东西不碰。
|
|
224
|
+
* 顺带删掉 RETIRED_FILES(机器文件,删了也只是缓存没了)。
|
|
225
|
+
*/
|
|
226
|
+
export async function migrateLayout(root) {
|
|
227
|
+
const steps = [];
|
|
228
|
+
for (const { from, to } of LEGACY_DIRS) {
|
|
229
|
+
const dir = join(root, from);
|
|
230
|
+
if (!(await lstat(dir).catch(() => null))?.isDirectory())
|
|
231
|
+
continue;
|
|
232
|
+
await rm(join(dir, '.DS_Store'), { force: true });
|
|
233
|
+
for (const name of (await readdir(dir)).sort()) {
|
|
234
|
+
const dest = join(root, to, name);
|
|
235
|
+
if (await lstat(dest).catch(() => null)) {
|
|
236
|
+
steps.push({ item: `${from}/${name}`, action: 'kept', note: `${to}/${name} 已经有了,没挪;对一下要哪份,删掉另一份` });
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
await mkdir(join(root, to), { recursive: true });
|
|
240
|
+
await rename(join(dir, name), dest);
|
|
241
|
+
steps.push({ item: `${to}/${name}`, action: 'moved', note: `从 ${from}/ 挪来` });
|
|
242
|
+
}
|
|
243
|
+
if (await rmdir(dir).then(() => true, () => false))
|
|
244
|
+
steps.push({ item: `${from}/`, action: 'removed', note: '搬空了' });
|
|
245
|
+
}
|
|
246
|
+
for (const rel of RETIRED_FILES) {
|
|
247
|
+
if (!(await lstat(join(root, rel)).catch(() => null)))
|
|
248
|
+
continue;
|
|
249
|
+
await rm(join(root, rel), { recursive: true, force: true });
|
|
250
|
+
steps.push({ item: rel, action: 'removed', note: '不再用的机器文件' });
|
|
251
|
+
}
|
|
252
|
+
return steps;
|
|
253
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type Server } from 'node:http';
|
|
2
|
+
import type { ListenInfo } from '../../ui/dev/qr-page.ts';
|
|
3
|
+
import { type AppContext } from '../http/app.ts';
|
|
4
|
+
import { type ResolveOptions, type Workspace } from '../workspace.ts';
|
|
5
|
+
export interface ServeOptions extends ResolveOptions {
|
|
6
|
+
workspace?: string;
|
|
7
|
+
port?: number;
|
|
8
|
+
host?: string;
|
|
9
|
+
/** 强制走 HTTP(哪怕证书在) */
|
|
10
|
+
http?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ServeResult {
|
|
13
|
+
server: Server;
|
|
14
|
+
ctx: AppContext;
|
|
15
|
+
ws: Workspace;
|
|
16
|
+
port: number;
|
|
17
|
+
https: boolean;
|
|
18
|
+
/** 本机名与局域网 IPv4 各一条 */
|
|
19
|
+
urls: string[];
|
|
20
|
+
/** 扫码页:在这台电脑上打开的那条(localhost,证书里签了) */
|
|
21
|
+
qrPage: string;
|
|
22
|
+
warnings: string[];
|
|
23
|
+
}
|
|
24
|
+
/** 证书路径:cotutor.json 的 server.https 优先(相对 workspace 根),否则机器级 ~/.config/cotutor/certs/;都没有 → null */
|
|
25
|
+
export declare function httpsFiles(ws: Workspace): {
|
|
26
|
+
cert: string;
|
|
27
|
+
key: string;
|
|
28
|
+
} | null;
|
|
29
|
+
/** 局域网 IPv4(iPad / iPhone 用它访问;.local 名不一定解析得到,有些设备还会挑中走不通的 IPv6) */
|
|
30
|
+
export declare function lanAddresses(): string[];
|
|
31
|
+
/** 本机的 mDNS 名(与 cotutor cert 签的那条同一个写法) */
|
|
32
|
+
export declare function localName(host?: string): string;
|
|
33
|
+
/** 证书认不认这个主机名;读不了当作不认 */
|
|
34
|
+
export declare function certCovers(certFile: string, host: string): boolean;
|
|
35
|
+
/** 扫码页要的三样;listen 之后才知道真端口 */
|
|
36
|
+
export declare function listenInfo(https: boolean, port: number): ListenInfo;
|
|
37
|
+
export declare function serveWorkspace(opts?: ServeOptions): Promise<ServeResult>;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cotutor serve:一 workspace 一进程,端口读 cotutor.json(--port 覆盖)。
|
|
3
|
+
* 启动打印解析结果与体检警告(配置坏了直接不起,骨架缺失只警告)。
|
|
4
|
+
* 扫码页:/qr 现画一张二维码(编 <本机名>.local 那条,不随 Wi-Fi 变),iPad 用相机扫;listen 之后把真端口交给 ctx.listen。
|
|
5
|
+
* HTTPS(iPad 上录音要):server.https 指了证书就用它(单个 workspace 的例外);没指就看机器级 ~/.config/cotutor/certs/(cotutor cert 用 mkcert 建);都没有走 HTTP。
|
|
6
|
+
*/
|
|
7
|
+
import { X509Certificate } from 'node:crypto';
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
import { createServer as createHttp } from 'node:http';
|
|
10
|
+
import { createServer as createHttps } from 'node:https';
|
|
11
|
+
import { hostname, networkInterfaces } from 'node:os';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { doctorWorkspace } from "./doctor.js";
|
|
14
|
+
import { createContext, createHandler } from "../http/app.js";
|
|
15
|
+
import { liveUpgrade } from "../ws/route.js";
|
|
16
|
+
import { AUTO_BOOKKEEP_EVERY_MS, autoBookkeep } from "../../runtime/auto-bookkeep.js";
|
|
17
|
+
import { USER_CERT_DIR, expandPath, loadWorkspace } from "../workspace.js";
|
|
18
|
+
/** 证书路径:cotutor.json 的 server.https 优先(相对 workspace 根),否则机器级 ~/.config/cotutor/certs/;都没有 → null */
|
|
19
|
+
export function httpsFiles(ws) {
|
|
20
|
+
const h = ws.config.server.https;
|
|
21
|
+
if (h)
|
|
22
|
+
return { cert: expandPath(h.cert, ws.root), key: expandPath(h.key, ws.root) };
|
|
23
|
+
const cert = join(USER_CERT_DIR, 'cert.pem');
|
|
24
|
+
const key = join(USER_CERT_DIR, 'key.pem');
|
|
25
|
+
try {
|
|
26
|
+
readFileSync(cert);
|
|
27
|
+
readFileSync(key);
|
|
28
|
+
return { cert, key };
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** 局域网 IPv4(iPad / iPhone 用它访问;.local 名不一定解析得到,有些设备还会挑中走不通的 IPv6) */
|
|
35
|
+
export function lanAddresses() {
|
|
36
|
+
const out = [];
|
|
37
|
+
for (const list of Object.values(networkInterfaces()))
|
|
38
|
+
for (const i of list ?? [])
|
|
39
|
+
if (i.family === 'IPv4' && !i.internal)
|
|
40
|
+
out.push(i.address);
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
/** 本机的 mDNS 名(与 cotutor cert 签的那条同一个写法) */
|
|
44
|
+
export function localName(host = hostname()) {
|
|
45
|
+
return host.endsWith('.local') ? host : `${host}.local`;
|
|
46
|
+
}
|
|
47
|
+
/** 证书认不认这个主机名;读不了当作不认 */
|
|
48
|
+
export function certCovers(certFile, host) {
|
|
49
|
+
try {
|
|
50
|
+
return new X509Certificate(readFileSync(certFile)).checkHost(host) !== undefined;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** 扫码页要的三样;listen 之后才知道真端口 */
|
|
57
|
+
export function listenInfo(https, port) {
|
|
58
|
+
const scheme = https ? 'https' : 'http';
|
|
59
|
+
const ip = lanAddresses()[0];
|
|
60
|
+
return { name: `${scheme}://${localName()}:${port}/`, ip: ip ? `${scheme}://${ip}:${port}/` : null, https };
|
|
61
|
+
}
|
|
62
|
+
export async function serveWorkspace(opts = {}) {
|
|
63
|
+
const ws = loadWorkspace(opts.workspace, opts);
|
|
64
|
+
const report = await doctorWorkspace(ws.root, { ...opts, probeEnv: false });
|
|
65
|
+
const warnings = report.checks.filter((c) => !c.ok).map((c) => `${c.name}:${c.detail}${c.fix ? `(${c.fix})` : ''}`);
|
|
66
|
+
const port = opts.port ?? ws.config.server.port;
|
|
67
|
+
const ctx = createContext(ws);
|
|
68
|
+
const handler = createHandler(ctx);
|
|
69
|
+
const tls = opts.http ? null : httpsFiles(ws);
|
|
70
|
+
const server = tls ? createHttps({ cert: readFileSync(tls.cert), key: readFileSync(tls.key) }, handler) : createHttp(handler);
|
|
71
|
+
// WebSocket:实时老师的那条线(src/app/ws/);不认就关掉
|
|
72
|
+
server.on('upgrade', (req, socket, head) => { void liveUpgrade(req, socket, head, ctx).then((took) => { if (!took)
|
|
73
|
+
socket.destroy(); }, () => socket.destroy()); });
|
|
74
|
+
await new Promise((resolveListen, reject) => {
|
|
75
|
+
server.once('error', reject);
|
|
76
|
+
server.listen(port, opts.host ?? '0.0.0.0', () => resolveListen());
|
|
77
|
+
});
|
|
78
|
+
const actual = server.address().port;
|
|
79
|
+
const scheme = tls ? 'https' : 'http';
|
|
80
|
+
const urls = [hostname(), ...lanAddresses()].map((h) => `${scheme}://${h}:${actual}/`);
|
|
81
|
+
ctx.listen = () => listenInfo(Boolean(tls), actual);
|
|
82
|
+
// 自动记账(cotutor.json vault.autoBookkeep,缺省关;src/runtime/auto-bookkeep.ts):隔一阵看一次,开关跟着 cotutor.json 热重载;上一次没跑完不叠
|
|
83
|
+
let booking = false;
|
|
84
|
+
const timer = setInterval(() => {
|
|
85
|
+
if (booking)
|
|
86
|
+
return;
|
|
87
|
+
booking = true;
|
|
88
|
+
void (async () => {
|
|
89
|
+
await ctx.reload();
|
|
90
|
+
await autoBookkeep(ctx.runner, ctx.ws, ctx.now());
|
|
91
|
+
})().catch(() => undefined).finally(() => { booking = false; });
|
|
92
|
+
}, AUTO_BOOKKEEP_EVERY_MS);
|
|
93
|
+
timer.unref();
|
|
94
|
+
server.once('close', () => clearInterval(timer));
|
|
95
|
+
if (tls && !certCovers(tls.cert, localName()))
|
|
96
|
+
warnings.push(`证书不含 ${localName()}:扫码打开会报「不安全」(重跑 cotutor cert,再重启 serve)`);
|
|
97
|
+
return { server, ctx, ws, port: actual, https: Boolean(tls), urls, qrPage: `${scheme}://localhost:${actual}/dev/qr`, warnings };
|
|
98
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const SHIPPED_FILE = ".cotutor/shipped.json";
|
|
2
|
+
export interface ShippedManifest {
|
|
3
|
+
/** 已安装的出厂教学包;旧版缺省按二年级迁移,与孩子当前年级分开。 */
|
|
4
|
+
teachingPack?: {
|
|
5
|
+
grade: number;
|
|
6
|
+
};
|
|
7
|
+
/** 出厂 skill(做课包的四个 chalk-* + 本包的机器件)的 hash,与 tutors 同一套机制(src/app/cli/skills.ts) */
|
|
8
|
+
skills?: Record<string, {
|
|
9
|
+
hash: string;
|
|
10
|
+
version: string;
|
|
11
|
+
}>;
|
|
12
|
+
/** 出厂主题(themes/<name>/)的目录 hash,同一套机制(src/app/cli/themes.ts) */
|
|
13
|
+
themes?: Record<string, {
|
|
14
|
+
hash: string;
|
|
15
|
+
version: string;
|
|
16
|
+
}>;
|
|
17
|
+
/** 出厂 activity(agents/<老师>/activities/<名>.md,键是「老师/名」),同一套机制(src/app/cli/activities.ts) */
|
|
18
|
+
activities?: Record<string, {
|
|
19
|
+
hash: string;
|
|
20
|
+
version: string;
|
|
21
|
+
}>;
|
|
22
|
+
version: string;
|
|
23
|
+
tutors: Record<string, {
|
|
24
|
+
hash: string;
|
|
25
|
+
version: string;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
28
|
+
export declare const sha256: (text: string) => string;
|
|
29
|
+
export declare function readManifest(root: string): Promise<ShippedManifest>;
|
|
30
|
+
export declare function writeManifest(root: string, m: ShippedManifest): Promise<void>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** 所有出厂件共用的来源记录;修改时保留其他种类的 hash。 */
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { readFile, mkdir, writeFile, rename } from 'node:fs/promises';
|
|
4
|
+
import { join, dirname } from 'node:path';
|
|
5
|
+
import { UsageError } from "../workspace.js";
|
|
6
|
+
export const SHIPPED_FILE = '.cotutor/shipped.json';
|
|
7
|
+
export const sha256 = (text) => `sha256:${createHash('sha256').update(text).digest('hex')}`;
|
|
8
|
+
export async function readManifest(root) {
|
|
9
|
+
let text;
|
|
10
|
+
try {
|
|
11
|
+
text = await readFile(join(root, SHIPPED_FILE), 'utf8');
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
if (err.code === 'ENOENT')
|
|
15
|
+
return { version: '0', tutors: {} };
|
|
16
|
+
throw err;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const raw = JSON.parse(text);
|
|
20
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
21
|
+
throw new Error('顶层要是对象');
|
|
22
|
+
if (raw.teachingPack !== undefined && (!raw.teachingPack || !Number.isInteger(raw.teachingPack.grade) || raw.teachingPack.grade < 1 || raw.teachingPack.grade > 6))
|
|
23
|
+
throw new Error('teachingPack.grade 要是 1–6 的整数');
|
|
24
|
+
for (const key of ['tutors', 'activities', 'skills', 'themes']) {
|
|
25
|
+
const records = raw[key];
|
|
26
|
+
if (records === undefined)
|
|
27
|
+
continue;
|
|
28
|
+
if (!records || typeof records !== 'object' || Array.isArray(records))
|
|
29
|
+
throw new Error(`${key} 要是对象`);
|
|
30
|
+
for (const rec of Object.values(records)) {
|
|
31
|
+
if (!rec || typeof rec.hash !== 'string' || typeof rec.version !== 'string')
|
|
32
|
+
throw new Error(`${key} 的记录要有 hash 和 version`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { ...raw, version: raw.version ?? '0', tutors: raw.tutors ?? {} };
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
throw new UsageError(`${join(root, SHIPPED_FILE)} 出厂记录用不了:${err.message}。请恢复或修复记录,不会重置 hash 或猜测年级。`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function writeManifest(root, m) {
|
|
42
|
+
const file = join(root, SHIPPED_FILE);
|
|
43
|
+
await mkdir(dirname(file), { recursive: true });
|
|
44
|
+
const tmp = `${file}.tmp`;
|
|
45
|
+
await writeFile(tmp, `${JSON.stringify({ ...m, _note: '出厂时老师文件的 hash,cotutor upgrade 据此分辨「没改过」与「改过」;机器写,不用手改' }, null, 2)}\n`);
|
|
46
|
+
await rename(tmp, file);
|
|
47
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const DIRS: readonly ["agents", "ledger", "conversations", "bundles"];
|
|
2
|
+
export declare const LEDGER_FILES: readonly ["ledger/artifacts.jsonl"];
|
|
3
|
+
/** 默认年级的出厂老师目录;workspace 的操作用 workspaceGradePack 选来源 */
|
|
4
|
+
export declare const PACKAGE_AGENTS_DIR: string;
|
|
5
|
+
/** 本包版本(出厂件的 hash 记录带它,升级时知道基于哪版) */
|
|
6
|
+
export declare const PACKAGE_VERSION: string;
|
|
7
|
+
export interface ShippedAgent {
|
|
8
|
+
name: string;
|
|
9
|
+
file: string;
|
|
10
|
+
description: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function shippedAgents(dir?: string): Promise<ShippedAgent[]>;
|
|
13
|
+
export declare const GITIGNORE = "# \u8F6C\u5F55\u65E5\u5FD7\u4F53\u79EF\u5927\u3001\u53EF\u4ECE\u5BF9\u8BDD\u7D22\u5F15\u91CD\u5EFA\u5173\u952E\u4FE1\u606F;\u8981\u7559\u5168\u6863\u5C31\u5220\u6389\u4E0B\u9762\u8FD9\u884C\nconversations/**/*.log\n# \u914D\u97F3\u53EF\u91CD\u65B0\u5408\u6210\nconversations/**/*.mp3\n# \u56DE\u653E(cotutor replay)\u662F\u8C03\u63D0\u793A\u8BCD\u4E0E vault \u65F6\u7684\u5BF9\u7167,\u4E0D\u662F\u5B69\u5B50\u7684\u5BF9\u8BDD\nevals/\n# \u505A\u597D\u7684\u8BFE(\u8BFE\u5305\u3001\u89C6\u9891\u8BFE)\u4E0E\u8BFE\u5305\u622A\u56FE:\u4F53\u79EF\u5927,\u6E90\u5728\u5BB6\u957F\u505A\u8BFE\u7684\u5730\u65B9\nbundles/\nlectures/\nsnaps/\n# \u53E3\u8BED\u8BFE(\u5B69\u5B50\u7684\u539F\u58F0\u3001\u7167\u7247)\ntalk/\n# \u4F5C\u4E1A\u7167\u7247(\u5B69\u5B50\u5728\u8001\u5E08\u9875\u4E0A\u62CD\u7684;paths.captures):\u4F53\u79EF\u5927\u3001\u53EA\u662F\u8FD9\u4E00\u8F6E\u7684\u7D20\u6750,\u8BA4\u51FA\u7684\u6587\u5B57\u5728\u65E5\u8BB0\u91CC\ncaptures/\n# \u5BB6\u957F\u5728 workspace \u91CC\u7528 Claude Code \u65F6\u5B83\u7684\u4E2A\u4EBA\u8BBE\u7F6E\n.claude/settings.local.json\n# .cotutor/ \u662F\u673A\u5668\u6587\u4EF6(\u677F\u4E66\u5199\u6CD5\u7F13\u5B58\u3001\u914D\u97F3\u7F13\u5B58\u3001\u4E8C\u7EF4\u7801\u3001\u65E5\u5FD7\u3001CLI \u58F3\u3001qwen \u7684\u5BB6),\u53EA\u7559\u51FA\u5382 hash \u4E0E schema\n.cotutor/*\n!.cotutor/shipped.json\n!.cotutor/cotutor.schema.json\nnode_modules/\n.DS_Store\n";
|
|
14
|
+
/** 档案模板(paths.profile,缺了才写):cotutor: profile 的那篇,原文整篇进每个话题的第一条 */
|
|
15
|
+
export declare function profileTemplate(name: string): string;
|
|
16
|
+
/** 参考目录的 README(缺了才写) */
|
|
17
|
+
export declare const REFERENCE_README = "# \u53C2\u8003\n\n\u8FD9\u91CC\u653E\u653F\u7B56\u4E0E\u4F60\u81EA\u5DF1\u7684\u7B14\u8BB0:\u8BB2\u67D0\u7C7B\u9898\u7684\u504F\u597D\u3001\u8584\u5F31\u70B9\u3001\u5FCC\u8BB3\u3001\u6309\u9898\u578B\u6574\u7406\u7684\u4E1C\u897F\u2014\u2014\u968F\u4FBF\u5EFA,\u673A\u5668\u53EA\u8BFB\u4E0D\u5199\u3002\n\u8BA9\u8001\u5E08\u770B\u5230\u7684\u529E\u6CD5:\u5728\u6863\u6848\u6216\u8FD9\u4F4D\u8001\u5E08\u7684\u5165\u53E3\u6587\u4EF6(`cotutor: subject` \u7684\u90A3\u7BC7)\u91CC\u94FE\u8FC7\u53BB(`[[\u627E\u89C4\u5F8B\u586B\u6570]]`);\u8001\u5E08\u62FF\u5230\u8DEF\u5F84,\u8981\u7528\u65F6\u81EA\u5DF1\u8BFB\u3002\n";
|
|
18
|
+
export interface TutorTemplateInput {
|
|
19
|
+
name: string;
|
|
20
|
+
display: string;
|
|
21
|
+
subject?: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 家长自己加老师时的文件模板:和出厂老师一样只有人设与这一科的做法;
|
|
26
|
+
* 公共的守则(上下文包、三种回复、记忆段、不变的规矩)在机器技能 cotutor-tutor,应用每个话题第一条放进上下文包。
|
|
27
|
+
*/
|
|
28
|
+
export declare function tutorTemplate(t: TutorTemplateInput): string;
|
|
29
|
+
export interface ConfigTemplateInput {
|
|
30
|
+
slug: string;
|
|
31
|
+
name?: string;
|
|
32
|
+
port?: number;
|
|
33
|
+
tutors: ShippedAgent[];
|
|
34
|
+
}
|
|
35
|
+
/** cotutor.json 模板:只在文件不存在时写入;政策文件永不自动重建或覆盖(家长的决定不由机器代做)。 */
|
|
36
|
+
export declare function configTemplate(input: ConfigTemplateInput): string;
|
|
37
|
+
/** 把 JSON Schema 写进 workspace(机器文件,每次 init / upgrade 都刷新);板书语法表出厂成技能 cotutor-board,见 skills.ts `writeBoardSkill` */
|
|
38
|
+
export declare function writeSchemaFile(root: string): Promise<string>;
|