cotutor 0.2.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 +92 -20
- 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/{cli → app/cli}/cert.js +3 -3
- 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/{cli → app/cli}/doctor.d.ts +4 -3
- 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/{cli → app/cli}/serve.d.ts +12 -5
- 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/{cli → app/cli}/tutors.d.ts +15 -26
- package/dist/{cli → app/cli}/tutors.js +86 -110
- 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/{server → app/http}/stage.d.ts +9 -0
- package/dist/{server → app/http}/stage.js +34 -6
- 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/{server → app/mock}/mock.d.ts +36 -5
- 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 +77 -52
- 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/{cards → board/cards}/choice.js +0 -12
- package/dist/{cards → board/cards}/code.js +0 -3
- 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/{cards → board/cards}/image.js +1 -10
- package/dist/board/cards/index.d.ts +62 -0
- package/dist/board/cards/index.js +144 -0
- package/dist/{cards → board/cards}/kind.d.ts +10 -4
- 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/{cards → board/cards}/read.js +1 -10
- 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 -12
- package/dist/lib/index.js +14 -12
- 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 +1 -1
- package/dist/{lib → memory}/plan.js +1 -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/{lib → memory}/timetable.d.ts +0 -3
- package/dist/{lib → memory}/timetable.js +0 -11
- 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 -40
- 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 +143 -2
- package/dist/schema/board.js +15 -3
- package/dist/schema/config.d.ts +309 -94
- package/dist/schema/config.js +259 -72
- package/dist/schema/context-pack.d.ts +76 -14
- package/dist/schema/context-pack.js +91 -10
- package/dist/{lib/conversation.d.ts → schema/conversation-files.d.ts} +11 -33
- package/dist/schema/conversation-files.js +26 -0
- package/dist/schema/conversation.d.ts +385 -49
- package/dist/schema/conversation.js +135 -19
- 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 +14 -3
- package/dist/schema/index.js +14 -3
- package/dist/schema/kid-device.d.ts +20 -0
- package/dist/schema/kid-device.js +32 -0
- package/dist/schema/ledger.d.ts +8 -63
- 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 +2 -2
- package/dist/schema/timetable.js +2 -2
- 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/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 +1 -0
- package/dist/stage/stage.css +1 -1
- package/dist/stage/stage.js +1 -4383
- 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 +26 -15
- 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-tutor.md +0 -67
- package/agents/homework-tutor.md +0 -17
- package/agents/math-tutor.md +0 -68
- package/agents/planner.md +0 -18
- package/agents/reading-tutor.md +0 -65
- package/agents/scene-maker.md +0 -41
- package/dist/cards/canvas.d.ts +0 -22
- package/dist/cards/canvas.js +0 -65
- package/dist/cards/fill.d.ts +0 -14
- package/dist/cards/fill.js +0 -64
- package/dist/cards/index.d.ts +0 -48
- package/dist/cards/index.js +0 -115
- package/dist/cards/kind.js +0 -7
- package/dist/cards/scene.d.ts +0 -24
- package/dist/cards/scene.js +0 -67
- package/dist/cards/text.d.ts +0 -18
- package/dist/cards/text.js +0 -41
- package/dist/cli/doctor.js +0 -355
- package/dist/cli/init.js +0 -116
- package/dist/cli/main.js +0 -243
- package/dist/cli/serve.js +0 -56
- package/dist/cli/skeleton.d.ts +0 -39
- package/dist/cli/skeleton.js +0 -184
- package/dist/cli/skills.d.ts +0 -40
- package/dist/cli/skills.js +0 -170
- package/dist/cli/workspace.d.ts +0 -69
- package/dist/lib/agent-file.d.ts +0 -10
- package/dist/lib/agent-file.js +0 -16
- package/dist/lib/board.d.ts +0 -15
- package/dist/lib/board.js +0 -107
- package/dist/lib/context-pack.js +0 -55
- package/dist/lib/conversation.js +0 -88
- package/dist/lib/kid-board.d.ts +0 -148
- package/dist/lib/kid-board.js +0 -294
- package/dist/lib/kid-view.d.ts +0 -63
- package/dist/lib/kid-view.js +0 -93
- package/dist/lib/ledger.d.ts +0 -29
- package/dist/lib/run-plan.d.ts +0 -30
- package/dist/lib/run-plan.js +0 -32
- package/dist/lib/sections.d.ts +0 -12
- package/dist/lib/sections.js +0 -151
- package/dist/lib/stream.d.ts +0 -15
- package/dist/lib/stream.js +0 -69
- package/dist/lib/transcript.d.ts +0 -36
- package/dist/lib/transcript.js +0 -95
- package/dist/server/app.d.ts +0 -74
- package/dist/server/app.js +0 -406
- package/dist/server/kid-page.d.ts +0 -1
- package/dist/server/kid-page.js +0 -768
- package/dist/server/mock.js +0 -403
- package/dist/server/parent-page.d.ts +0 -8
- package/dist/server/parent-page.js +0 -393
- package/dist/server/runner.d.ts +0 -64
- package/dist/server/runner.js +0 -277
- package/dist/server/scene-props.d.ts +0 -16
- package/dist/server/scene-props.js +0 -39
- package/dist/server/store.d.ts +0 -43
- package/dist/server/store.js +0 -210
- package/dist/server/tts.d.ts +0 -51
- package/dist/server/tts.js +0 -99
- /package/dist/{cli → app/cli}/cert.d.ts +0 -0
- /package/dist/{cli → app/cli}/main.d.ts +0 -0
- /package/dist/{cards → board/cards}/choice.d.ts +0 -0
- /package/dist/{cards → board/cards}/code.d.ts +0 -0
- /package/dist/{cards → board/cards}/image.d.ts +0 -0
- /package/dist/{cards → board/cards}/read.d.ts +0 -0
package/dist/cli/skills.js
DELETED
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 出厂 skill(scene-maker 用的四个领域 skill,来自 drawtell-skills 包):与老师文件同一套「拷不链」机制——
|
|
3
|
-
* init 拷进 workspace 的 .claude/skills/<name>/(拷进来就是家长的),hash 记 .cotutor/shipped.json 的 skills,
|
|
4
|
-
* upgrade 没改过的换新、改过的报 diff 保留;.qwen/skills/<name> 是相对链。工作流 skill(math-explainer 等)不拷,
|
|
5
|
-
* scene-maker 的工作流写在它的老师文件正文里(《drawtell接入与场景卡.md》§3)。
|
|
6
|
-
* 顺带一个机器文件 .cotutor/drawtell:指向本包 node_modules 里 drawtell CLI 的壳脚本,老师用相对路径就能跑它。
|
|
7
|
-
*/
|
|
8
|
-
import { createHash } from 'node:crypto';
|
|
9
|
-
import { chmod, cp, lstat, mkdir, readFile, readdir, readlink, rm, symlink, unlink, writeFile } from 'node:fs/promises';
|
|
10
|
-
import { createRequire } from 'node:module';
|
|
11
|
-
import { dirname, join, relative } from 'node:path';
|
|
12
|
-
import { PACKAGE_VERSION } from "./skeleton.js";
|
|
13
|
-
import { readManifest, writeManifest } from "./tutors.js";
|
|
14
|
-
export const SHIPPED_SKILLS = ['drawtell-scene', 'drawtell-teaching', 'drawtell-cli', 'drawtell-verify'];
|
|
15
|
-
/** drawtell-skills 包的 skills/ 目录;包没装 → null(doctor 点名,init 跳过) */
|
|
16
|
-
export function packageSkillsDir() {
|
|
17
|
-
try {
|
|
18
|
-
return join(dirname(createRequire(import.meta.url).resolve('drawtell-skills/package.json')), 'skills');
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
/** drawtell CLI 的入口(本包 node_modules 里);没装 → null */
|
|
25
|
-
export function drawtellBin() {
|
|
26
|
-
try {
|
|
27
|
-
return join(dirname(createRequire(import.meta.url).resolve('drawtell/package.json')), 'bin', 'drawtell.js');
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
export const TOOL_SHIM = '.cotutor/drawtell';
|
|
34
|
-
/** 一个目录的内容 hash:相对路径 + 内容,按路径排序 */
|
|
35
|
-
export async function dirHash(dir) {
|
|
36
|
-
const files = [];
|
|
37
|
-
const walk = async (d) => {
|
|
38
|
-
for (const e of (await readdir(d, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
39
|
-
const p = join(d, e.name);
|
|
40
|
-
if (e.isDirectory())
|
|
41
|
-
await walk(p);
|
|
42
|
-
else if (e.isFile())
|
|
43
|
-
files.push(p);
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
await walk(dir);
|
|
47
|
-
const h = createHash('sha256');
|
|
48
|
-
for (const f of files.sort()) {
|
|
49
|
-
h.update(relative(dir, f));
|
|
50
|
-
h.update('\0');
|
|
51
|
-
h.update(await readFile(f));
|
|
52
|
-
h.update('\0');
|
|
53
|
-
}
|
|
54
|
-
return `sha256:${h.digest('hex')}`;
|
|
55
|
-
}
|
|
56
|
-
export function skillDirs(root, name) {
|
|
57
|
-
return { claude: join(root, '.claude', 'skills', name), qwen: join(root, '.qwen', 'skills', name) };
|
|
58
|
-
}
|
|
59
|
-
async function readState(root, name, manifest, src) {
|
|
60
|
-
const { claude } = skillDirs(root, name);
|
|
61
|
-
const st = await lstat(claude).catch(() => null);
|
|
62
|
-
if (!st?.isDirectory())
|
|
63
|
-
return { name, state: src ? 'missing' : 'unavailable', dir: claude };
|
|
64
|
-
const rec = manifest.skills?.[name];
|
|
65
|
-
const mine = await dirHash(claude);
|
|
66
|
-
if (src) {
|
|
67
|
-
const shipped = await dirHash(join(src, name)).catch(() => null);
|
|
68
|
-
if (shipped && mine === shipped)
|
|
69
|
-
return { name, state: 'latest', dir: claude, basedOn: rec?.version };
|
|
70
|
-
}
|
|
71
|
-
if (rec && rec.hash === mine)
|
|
72
|
-
return { name, state: src ? 'upgradable' : 'latest', dir: claude, basedOn: rec.version };
|
|
73
|
-
return { name, state: rec ? 'custom' : 'untracked', dir: claude, basedOn: rec?.version };
|
|
74
|
-
}
|
|
75
|
-
export async function skillStatuses(root) {
|
|
76
|
-
const manifest = await readManifest(root);
|
|
77
|
-
const src = packageSkillsDir();
|
|
78
|
-
const out = [];
|
|
79
|
-
for (const name of SHIPPED_SKILLS)
|
|
80
|
-
out.push(await readState(root, name, manifest, src));
|
|
81
|
-
return out;
|
|
82
|
-
}
|
|
83
|
-
async function installOne(root, name, src, manifest) {
|
|
84
|
-
const { claude } = skillDirs(root, name);
|
|
85
|
-
await rm(claude, { recursive: true, force: true });
|
|
86
|
-
await mkdir(dirname(claude), { recursive: true });
|
|
87
|
-
await cp(join(src, name), claude, { recursive: true });
|
|
88
|
-
manifest.skills ??= {};
|
|
89
|
-
manifest.skills[name] = { hash: await dirHash(claude), version: PACKAGE_VERSION };
|
|
90
|
-
}
|
|
91
|
-
async function ensureQwenLink(root, name) {
|
|
92
|
-
const { claude, qwen } = skillDirs(root, name);
|
|
93
|
-
await mkdir(dirname(qwen), { recursive: true });
|
|
94
|
-
const want = relative(dirname(qwen), claude);
|
|
95
|
-
const st = await lstat(qwen).catch(() => null);
|
|
96
|
-
if (st?.isSymbolicLink() && (await readlink(qwen).catch(() => '')) === want)
|
|
97
|
-
return 'exists';
|
|
98
|
-
if (st) {
|
|
99
|
-
if (!st.isSymbolicLink())
|
|
100
|
-
return 'exists';
|
|
101
|
-
await unlink(qwen);
|
|
102
|
-
await symlink(want, qwen);
|
|
103
|
-
return 'replaced';
|
|
104
|
-
}
|
|
105
|
-
await symlink(want, qwen);
|
|
106
|
-
return 'created';
|
|
107
|
-
}
|
|
108
|
-
/** init 用:缺的拷,有的不动;drawtell-skills 没装就只报一行 */
|
|
109
|
-
export async function installSkills(root) {
|
|
110
|
-
const steps = [];
|
|
111
|
-
const src = packageSkillsDir();
|
|
112
|
-
if (!src)
|
|
113
|
-
return [{ item: '.claude/skills/', action: 'kept', note: 'drawtell-skills 没装,四个领域 skill 没拷(scene-maker 作业要它们);仓库根 pnpm install' }];
|
|
114
|
-
const manifest = await readManifest(root);
|
|
115
|
-
let touched = false;
|
|
116
|
-
for (const name of SHIPPED_SKILLS) {
|
|
117
|
-
const s = await readState(root, name, manifest, src);
|
|
118
|
-
const item = `.claude/skills/${name}/`;
|
|
119
|
-
if (s.state === 'missing') {
|
|
120
|
-
await installOne(root, name, src, manifest);
|
|
121
|
-
touched = true;
|
|
122
|
-
steps.push({ item, action: 'created', note: `拷自 drawtell-skills` });
|
|
123
|
-
}
|
|
124
|
-
else
|
|
125
|
-
steps.push({ item, action: 'exists', note: s.state === 'custom' ? `自定义(基于 ${s.basedOn})` : s.state === 'upgradable' ? '可升级(cotutor upgrade)' : s.state === 'untracked' ? '已有(没有出厂记录);升级时当自定义对待' : undefined });
|
|
126
|
-
const q = await ensureQwenLink(root, name);
|
|
127
|
-
steps.push({ item: `.qwen/skills/${name}`, action: q, note: q === 'exists' ? undefined : '→ ../../.claude/skills/' });
|
|
128
|
-
}
|
|
129
|
-
if (touched)
|
|
130
|
-
await writeManifest(root, { ...manifest, version: PACKAGE_VERSION });
|
|
131
|
-
return steps;
|
|
132
|
-
}
|
|
133
|
-
/** upgrade 用:latest 跳过;upgradable 换新;custom / untracked 保留只报;缺的补 */
|
|
134
|
-
export async function upgradeSkills(root) {
|
|
135
|
-
const src = packageSkillsDir();
|
|
136
|
-
const steps = [];
|
|
137
|
-
if (!src)
|
|
138
|
-
return SHIPPED_SKILLS.map((name) => ({ name, action: 'unavailable' }));
|
|
139
|
-
const manifest = await readManifest(root);
|
|
140
|
-
for (const name of SHIPPED_SKILLS) {
|
|
141
|
-
const s = await readState(root, name, manifest, src);
|
|
142
|
-
if (s.state === 'latest')
|
|
143
|
-
steps.push({ name, action: 'latest', basedOn: s.basedOn });
|
|
144
|
-
else if (s.state === 'missing') {
|
|
145
|
-
await installOne(root, name, src, manifest);
|
|
146
|
-
steps.push({ name, action: 'installed' });
|
|
147
|
-
}
|
|
148
|
-
else if (s.state === 'upgradable') {
|
|
149
|
-
await installOne(root, name, src, manifest);
|
|
150
|
-
steps.push({ name, action: 'upgraded', basedOn: s.basedOn });
|
|
151
|
-
}
|
|
152
|
-
else
|
|
153
|
-
steps.push({ name, action: 'kept-custom', basedOn: s.basedOn });
|
|
154
|
-
await ensureQwenLink(root, name);
|
|
155
|
-
}
|
|
156
|
-
await writeManifest(root, { ...manifest, version: PACKAGE_VERSION });
|
|
157
|
-
return steps;
|
|
158
|
-
}
|
|
159
|
-
/** .cotutor/drawtell:壳脚本,老师在 agents/<name>/ 里用 ../../.cotutor/drawtell 跑 drawtell CLI;机器文件,init / upgrade 每次刷新 */
|
|
160
|
-
export async function writeToolShim(root) {
|
|
161
|
-
const file = join(root, TOOL_SHIM);
|
|
162
|
-
const bin = drawtellBin();
|
|
163
|
-
await mkdir(dirname(file), { recursive: true });
|
|
164
|
-
const body = bin
|
|
165
|
-
? `#!/bin/sh\n# cotutor 生成的机器文件:drawtell CLI 的壳,指向本包 node_modules 里的 drawtell;init / upgrade 会刷新\nexec node "${bin}" "$@"\n`
|
|
166
|
-
: `#!/bin/sh\necho "cotutor: node_modules 里没有 drawtell(仓库根 pnpm install),场景作业跑不了" >&2\nexit 1\n`;
|
|
167
|
-
await writeFile(file, body);
|
|
168
|
-
await chmod(file, 0o755);
|
|
169
|
-
return { file, available: bin !== null };
|
|
170
|
-
}
|
package/dist/cli/workspace.d.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { type CotutorConfig, type PathRole } from '../schema/index.ts';
|
|
2
|
-
/** 用法错误:main 捕获后 exit 2,错误信息即修复指南。 */
|
|
3
|
-
export declare class UsageError extends Error {
|
|
4
|
-
}
|
|
5
|
-
/** 配置文件损坏或形状不对:文件在,但用不了。 */
|
|
6
|
-
export declare class ConfigError extends UsageError {
|
|
7
|
-
readonly file: string;
|
|
8
|
-
constructor(file: string, cause: string);
|
|
9
|
-
}
|
|
10
|
-
export declare const CONFIG_FILE = "cotutor.json";
|
|
11
|
-
export declare const USER_CONFIG: string;
|
|
12
|
-
/** 机器级自签证书目录(cotutor cert 写 cert.pem + key.pem):证书签的是本机名与局域网 IP,与孩子无关,所以不在 workspace 里(2026-09-09 拍板) */
|
|
13
|
-
export declare const USER_CERT_DIR: string;
|
|
14
|
-
export declare const HOME_ROOT: string;
|
|
15
|
-
export type RootSource = 'flag' | 'env' | 'cwd' | 'user-config' | 'home-single';
|
|
16
|
-
export interface ResolvedRoot {
|
|
17
|
-
root: string;
|
|
18
|
-
source: RootSource;
|
|
19
|
-
}
|
|
20
|
-
export declare function expandPath(p: string, base: string): string;
|
|
21
|
-
export declare function redactHome(value: string): string;
|
|
22
|
-
export declare function redactDeep<T>(value: T): T;
|
|
23
|
-
/** 读 JSON:不存在 → null;坏 → ConfigError */
|
|
24
|
-
export declare function readJson(file: string): unknown | null;
|
|
25
|
-
/** 从 dir 向上找 cotutor.json,找到返回目录 */
|
|
26
|
-
export declare function findUp(dir: string): string | null;
|
|
27
|
-
/** ~/cotutor/ 下带 cotutor.json 的子目录 */
|
|
28
|
-
export declare function homeWorkspaces(homeRoot?: string): string[];
|
|
29
|
-
export interface ResolveOptions {
|
|
30
|
-
env?: NodeJS.ProcessEnv;
|
|
31
|
-
cwd?: string;
|
|
32
|
-
homeRoot?: string;
|
|
33
|
-
}
|
|
34
|
-
export declare function resolveRoot(override?: string, opts?: ResolveOptions): ResolvedRoot;
|
|
35
|
-
export interface Workspace {
|
|
36
|
-
root: string;
|
|
37
|
-
source: RootSource;
|
|
38
|
-
config: CotutorConfig;
|
|
39
|
-
/** 角色 → 绝对路径;vault 侧角色相对 vault 解析,没配 vault 就相对 workspace 根 */
|
|
40
|
-
paths: Record<PathRole, string> & Record<string, string>;
|
|
41
|
-
dirs: {
|
|
42
|
-
agents: string;
|
|
43
|
-
ledger: string;
|
|
44
|
-
conversations: string;
|
|
45
|
-
claudeAgents: string;
|
|
46
|
-
qwenAgents: string;
|
|
47
|
-
/** 场景源(scene-maker 写的 scenes/<id>.ts 与说明文件) */
|
|
48
|
-
scenes: string;
|
|
49
|
-
/** 课包(drawtell build 的产物,场景卡从这里播;派生物,gitignore) */
|
|
50
|
-
bundles: string;
|
|
51
|
-
/** 关键帧截图(drawtell snap;派生物) */
|
|
52
|
-
snaps: string;
|
|
53
|
-
};
|
|
54
|
-
files: {
|
|
55
|
-
config: string;
|
|
56
|
-
observations: string;
|
|
57
|
-
artifacts: string;
|
|
58
|
-
rulesClaude: string;
|
|
59
|
-
rulesQwen: string;
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
/** 校验 cotutor.json 的形状;失败 → ConfigError,信息是逐条修复指南 */
|
|
63
|
-
export declare function parseConfig(raw: unknown, file: string): CotutorConfig;
|
|
64
|
-
export declare function resolvePaths(root: string, paths: Record<string, string>): Workspace['paths'];
|
|
65
|
-
export declare function assembleWorkspace(root: string, source: RootSource, config: CotutorConfig): Workspace;
|
|
66
|
-
/** 定根 + 读配置 + 校验 + 展开角色。cotutor.json 缺失也是错(它是必需的)。 */
|
|
67
|
-
export declare function loadWorkspace(override?: string, opts?: ResolveOptions): Workspace;
|
|
68
|
-
/** --json / 启动日志里回报workspace(脱敏) */
|
|
69
|
-
export declare function workspaceReport(ws: Workspace): Record<string, unknown>;
|
package/dist/lib/agent-file.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 老师文件文件(.claude/agents/<name>.md 同一份链到 .qwen/agents/):YAML frontmatter + 正文即系统提示。
|
|
3
|
-
* 这里只认平铺的 `key: value` frontmatter(两个 CLI 的公共子集:name / description / maxTurns / permissionMode / memory);
|
|
4
|
-
* 正文给没有 --agent 的 CLI 经 {agentBody} 塞进 --append-system-prompt。
|
|
5
|
-
*/
|
|
6
|
-
export interface AgentFile {
|
|
7
|
-
frontmatter: Record<string, string>;
|
|
8
|
-
body: string;
|
|
9
|
-
}
|
|
10
|
-
export declare function parseAgentFile(text: string): AgentFile;
|
package/dist/lib/agent-file.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export function parseAgentFile(text) {
|
|
2
|
-
const open = /^---[^\S\n]*\n/.exec(text);
|
|
3
|
-
if (!open)
|
|
4
|
-
return { frontmatter: {}, body: text.trim() };
|
|
5
|
-
const rest = text.slice(open[0].length);
|
|
6
|
-
const end = /\n---[^\S\n]*(\n|$)/.exec(rest);
|
|
7
|
-
if (!end)
|
|
8
|
-
return { frontmatter: {}, body: text.trim() };
|
|
9
|
-
const frontmatter = {};
|
|
10
|
-
for (const raw of rest.slice(0, end.index).split('\n')) {
|
|
11
|
-
const m = /^([A-Za-z][\w-]*):\s*(.*)$/.exec(raw);
|
|
12
|
-
if (m)
|
|
13
|
-
frontmatter[m[1]] = m[2].trim().replace(/^(["'])(.*)\1$/, '$2');
|
|
14
|
-
}
|
|
15
|
-
return { frontmatter, body: rest.slice(end.index + end[0].length).trim() };
|
|
16
|
-
}
|
package/dist/lib/board.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { type BoardSection } from './kid-board.ts';
|
|
2
|
-
export interface ParseBoardOptions {
|
|
3
|
-
/** 文本还在长(流式):压住没闭合的围栏与没换行结束的最后一行 */
|
|
4
|
-
partial?: boolean;
|
|
5
|
-
}
|
|
6
|
-
export interface ParsedBoard {
|
|
7
|
-
section: BoardSection;
|
|
8
|
-
/** 没解析成的卡等,家长视图转录里显示;孩子端不报 */
|
|
9
|
-
warnings: string[];
|
|
10
|
-
/** 第一个 H2 起的尾巴(「## 家长」等,原文含标题行);没有 = 空串 */
|
|
11
|
-
tail: string;
|
|
12
|
-
}
|
|
13
|
-
/** 讲稿一行的清洗:去掉老师不该写但常写的标题号、列表号、引用号、粗体号;整行的 HTML 注释不算话 */
|
|
14
|
-
export declare function cleanSpeech(line: string): string;
|
|
15
|
-
export declare function parseBoard(text: string, opts?: ParseBoardOptions): ParsedBoard;
|
package/dist/lib/board.js
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 板书解析器:老师的回复正文(已剥掉「待裁量」「转交」段)→ 一节 BoardSection。
|
|
3
|
-
* 三条规则(《板书卡片设计.md》§2):围栏 = 卡(标签第一个词是 kind),普通行 = 讲稿一句,第一个 H2 起是给家长的尾巴。
|
|
4
|
-
* 讲稿句里 [词] 是标注(落到第一张含这个词的卡,整节找,卡在前在后都行),[[名 参数]] 是对上一张卡的动作(cue)。
|
|
5
|
-
* partial 模式给流式用:没闭合的围栏和没换行结束的最后一行压着不算,下次整段重解析自然补上。
|
|
6
|
-
* 永不抛错:围栏没闭合当到文末,卡解析不出退成文字卡并记一句 warning。
|
|
7
|
-
*/
|
|
8
|
-
import { parseCard } from "../cards/index.js";
|
|
9
|
-
import { anchorMarks, isQuestion, phrasesIn, plainLine } from "./kid-board.js";
|
|
10
|
-
const FENCE_OPEN = /^ {0,3}(`{3,}|~{3,})(.*)$/;
|
|
11
|
-
const H2 = /^##\s+\S/;
|
|
12
|
-
const CUE = /\[\[([^\[\]]+)\]\]/g;
|
|
13
|
-
function fenceClose(line, fence) {
|
|
14
|
-
const m = /^ {0,3}(`{3,}|~{3,})\s*$/.exec(line);
|
|
15
|
-
return Boolean(m && m[1][0] === fence[0] && m[1].length >= fence.length);
|
|
16
|
-
}
|
|
17
|
-
/** 讲稿一行的清洗:去掉老师不该写但常写的标题号、列表号、引用号、粗体号;整行的 HTML 注释不算话 */
|
|
18
|
-
export function cleanSpeech(line) {
|
|
19
|
-
const t = line.trim();
|
|
20
|
-
if (/^<!--.*-->$/.test(t))
|
|
21
|
-
return '';
|
|
22
|
-
return t
|
|
23
|
-
.replace(/^#{1,6}\s+/, '')
|
|
24
|
-
.replace(/^(?:[-*+]|\d+[.)])\s+/, '')
|
|
25
|
-
.replace(/^>\s*/, '')
|
|
26
|
-
.replace(/\*\*/g, '')
|
|
27
|
-
.trim();
|
|
28
|
-
}
|
|
29
|
-
function rawLine(line, cards) {
|
|
30
|
-
const anchor = cards.length ? cards.length - 1 : null;
|
|
31
|
-
const cues = [];
|
|
32
|
-
const text = line
|
|
33
|
-
.replace(CUE, (_, inner) => {
|
|
34
|
-
const [name, ...rest] = inner.trim().split(/\s+/);
|
|
35
|
-
if (name && anchor !== null)
|
|
36
|
-
cues.push({ card: anchor, name: name.toLowerCase(), ...(rest.length ? { arg: rest.join(' ') } : {}) });
|
|
37
|
-
return '';
|
|
38
|
-
})
|
|
39
|
-
.replace(/\s{2,}/g, ' ')
|
|
40
|
-
.trim();
|
|
41
|
-
return { text, anchor, cues };
|
|
42
|
-
}
|
|
43
|
-
export function parseBoard(text, opts = {}) {
|
|
44
|
-
const partial = opts.partial === true;
|
|
45
|
-
const all = text.split('\n');
|
|
46
|
-
const lines = partial && !text.endsWith('\n') ? all.slice(0, -1) : all;
|
|
47
|
-
const cards = [];
|
|
48
|
-
const raws = [];
|
|
49
|
-
const warnings = [];
|
|
50
|
-
let tail = null;
|
|
51
|
-
let i = 0;
|
|
52
|
-
while (i < lines.length) {
|
|
53
|
-
const line = lines[i];
|
|
54
|
-
if (tail) {
|
|
55
|
-
tail.push(line);
|
|
56
|
-
i++;
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
const open = FENCE_OPEN.exec(line);
|
|
60
|
-
if (open) {
|
|
61
|
-
const fence = open[1];
|
|
62
|
-
const tag = open[2].trim();
|
|
63
|
-
const body = [];
|
|
64
|
-
let j = i + 1;
|
|
65
|
-
let closed = false;
|
|
66
|
-
for (; j < lines.length; j++) {
|
|
67
|
-
if (fenceClose(lines[j], fence)) {
|
|
68
|
-
closed = true;
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
body.push(lines[j]);
|
|
72
|
-
}
|
|
73
|
-
if (!closed && partial)
|
|
74
|
-
break;
|
|
75
|
-
if (!closed)
|
|
76
|
-
warnings.push(`围栏没闭合(${tag || '无标签'}),当到文末`);
|
|
77
|
-
const r = parseCard(tag, body.join('\n'));
|
|
78
|
-
cards.push(r.card);
|
|
79
|
-
if (r.warning)
|
|
80
|
-
warnings.push(r.warning);
|
|
81
|
-
i = closed ? j + 1 : j;
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
if (H2.test(line)) {
|
|
85
|
-
tail = [line];
|
|
86
|
-
i++;
|
|
87
|
-
continue;
|
|
88
|
-
}
|
|
89
|
-
const speech = cleanSpeech(line);
|
|
90
|
-
if (speech)
|
|
91
|
-
raws.push(rawLine(speech, cards));
|
|
92
|
-
i++;
|
|
93
|
-
}
|
|
94
|
-
// 标注整节找(老师把卡写在句子后面也认),所以卡收齐了再落
|
|
95
|
-
const out = raws
|
|
96
|
-
.filter((r) => r.text)
|
|
97
|
-
.map((r) => {
|
|
98
|
-
const marks = anchorMarks(cards, phrasesIn(r.text));
|
|
99
|
-
const plain = plainLine(r.text);
|
|
100
|
-
return { text: plain, audio: null, marks, ask: isQuestion(plain), anchor: r.anchor, cues: r.cues };
|
|
101
|
-
});
|
|
102
|
-
return {
|
|
103
|
-
section: { cards, lines: out, ...(partial ? { partial: true } : {}) },
|
|
104
|
-
warnings,
|
|
105
|
-
tail: tail ? tail.join('\n').trim() : '',
|
|
106
|
-
};
|
|
107
|
-
}
|
package/dist/lib/context-pack.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 上下文包序列化(《cotutor契约草案.md》§2):固定 YAML 块 + `---` + 消息原文。
|
|
3
|
-
* 手写 YAML 子集:标量能裸写就裸写,其余 JSON 双引号(合法 YAML);空的 plan / recent 不写。
|
|
4
|
-
*/
|
|
5
|
-
import { ContextPackSchema } from "../schema/index.js";
|
|
6
|
-
const BARE = /^[A-Za-z0-9_][A-Za-z0-9_\-.:T]*$/;
|
|
7
|
-
export function yamlScalar(v) {
|
|
8
|
-
if (typeof v !== 'string')
|
|
9
|
-
return String(v);
|
|
10
|
-
return BARE.test(v) && !/^(true|false|null|~|yes|no)$/i.test(v) ? v : JSON.stringify(v);
|
|
11
|
-
}
|
|
12
|
-
export function renderContextPack(pack) {
|
|
13
|
-
const p = ContextPackSchema.parse(pack);
|
|
14
|
-
const out = ['cotutor:', ` from: ${p.from}`, ` at: ${yamlScalar(p.at)}`];
|
|
15
|
-
if (p.slot)
|
|
16
|
-
out.push(` slot: ${yamlScalar(p.slot)}`);
|
|
17
|
-
if (p.focus && (p.focus.artifact || p.focus.step !== undefined || p.focus.circled?.length || p.focus.card)) {
|
|
18
|
-
out.push(' focus:');
|
|
19
|
-
if (p.focus.artifact)
|
|
20
|
-
out.push(` artifact: ${yamlScalar(p.focus.artifact)}`);
|
|
21
|
-
if (p.focus.step !== undefined)
|
|
22
|
-
out.push(` step: ${p.focus.step}`);
|
|
23
|
-
if (p.focus.circled?.length)
|
|
24
|
-
out.push(` circled: [${p.focus.circled.map(yamlScalar).join(', ')}]`);
|
|
25
|
-
if (p.focus.card)
|
|
26
|
-
out.push(` card: ${yamlScalar(p.focus.card)}`);
|
|
27
|
-
}
|
|
28
|
-
if (p.plan.length) {
|
|
29
|
-
out.push(' plan:');
|
|
30
|
-
for (const l of p.plan)
|
|
31
|
-
out.push(` - ${yamlScalar(l)}`);
|
|
32
|
-
}
|
|
33
|
-
if (p.recent.length) {
|
|
34
|
-
out.push(' recent:');
|
|
35
|
-
for (const r of p.recent)
|
|
36
|
-
out.push(` - ${yamlScalar(`${r.date} ${r.claim}`)}`);
|
|
37
|
-
}
|
|
38
|
-
if (p.board === 'off')
|
|
39
|
-
out.push(' board: off');
|
|
40
|
-
if (p.cards?.length) {
|
|
41
|
-
out.push(' cards:');
|
|
42
|
-
for (const c of p.cards)
|
|
43
|
-
out.push(` - ${yamlScalar(c)}`);
|
|
44
|
-
}
|
|
45
|
-
return out.join('\n');
|
|
46
|
-
}
|
|
47
|
-
/** 按政策截 plan / recent,再拼成「YAML 块 --- 消息」 */
|
|
48
|
-
export function buildContextPack(pack, message, limits) {
|
|
49
|
-
const trimmed = {
|
|
50
|
-
...pack,
|
|
51
|
-
plan: (pack.plan ?? []).slice(0, limits.planLines),
|
|
52
|
-
recent: (pack.recent ?? []).slice(-limits.recent),
|
|
53
|
-
};
|
|
54
|
-
return `${renderContextPack(trimmed)}\n---\n${message.trim()}\n`;
|
|
55
|
-
}
|
package/dist/lib/conversation.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 对话索引的纯函数:日期与 job 命名、空索引、把一次运行的结果并进索引(不改旧对象)。
|
|
3
|
-
*/
|
|
4
|
-
import { ConversationIndexSchema } from "../schema/index.js";
|
|
5
|
-
const pad = (n) => String(n).padStart(2, '0');
|
|
6
|
-
/** 本地日期 YYYY-MM-DD(对话按本地日切) */
|
|
7
|
-
export function localDate(d) {
|
|
8
|
-
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
|
9
|
-
}
|
|
10
|
-
/** 本地时间到分钟 YYYY-MM-DDTHH:MM(上下文包的 at) */
|
|
11
|
-
export function localMinute(d) {
|
|
12
|
-
return `${localDate(d)}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
|
|
13
|
-
}
|
|
14
|
-
/** HHMM-<序号>,同一天内不重复 */
|
|
15
|
-
export function jobId(d, seq) {
|
|
16
|
-
return `${pad(d.getHours())}${pad(d.getMinutes())}-${seq}`;
|
|
17
|
-
}
|
|
18
|
-
export function emptyIndex(tutor, date) {
|
|
19
|
-
return ConversationIndexSchema.parse({ tutor, date });
|
|
20
|
-
}
|
|
21
|
-
/** conversations/<tutor>/<date>.json 与 <date>.<job>.log / .err.log / .mp3(整段配音)/ .<n>.mp3(讲稿第 n 句)/ .cards/<n>.json(卡的状态) */
|
|
22
|
-
export function conversationFiles(conversationsDir, tutor, date) {
|
|
23
|
-
const base = `${conversationsDir}/${tutor}/${date}`;
|
|
24
|
-
return {
|
|
25
|
-
index: `${base}.json`,
|
|
26
|
-
log: (job) => `${base}.${job}.log`,
|
|
27
|
-
err: (job) => `${base}.${job}.err.log`,
|
|
28
|
-
audio: (job) => `${base}.${job}.mp3`,
|
|
29
|
-
lineAudio: (job, n) => `${base}.${job}.${n}.mp3`,
|
|
30
|
-
cardsDir: (job) => `${base}.${job}.cards`,
|
|
31
|
-
card: (job, n) => `${base}.${job}.cards/${n}.json`,
|
|
32
|
-
cardAssetsDir: (job, n) => `${base}.${job}.cards/${n}`,
|
|
33
|
-
cardAsset: (job, n, file) => `${base}.${job}.cards/${n}/${file}`,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
/** 资产在孩子端的名字:相对 conversations/<老师>/,/api/audio 认它 */
|
|
37
|
-
export function cardAssetName(date, job, n, file) {
|
|
38
|
-
return `${date}.${job}.cards/${n}/${file}`;
|
|
39
|
-
}
|
|
40
|
-
/** 卡的 id:<job>/<n>(n 是节里的下标,0 起);页面、上下文包、状态文件名都用它 */
|
|
41
|
-
export function cardId(job, n) {
|
|
42
|
-
return `${job}/${n}`;
|
|
43
|
-
}
|
|
44
|
-
/** 上一轮之后改过状态的卡(按 job、下标排):发消息时逐张 describe 进上下文包 */
|
|
45
|
-
export function changedCards(index, states) {
|
|
46
|
-
const last = index.messages[index.messages.length - 1]?.job;
|
|
47
|
-
if (!last)
|
|
48
|
-
return [];
|
|
49
|
-
const out = [];
|
|
50
|
-
for (const m of index.messages) {
|
|
51
|
-
const per = states[m.job];
|
|
52
|
-
if (!per)
|
|
53
|
-
continue;
|
|
54
|
-
for (const n of Object.keys(per).map(Number).sort((a, b) => a - b))
|
|
55
|
-
if (per[n].turn === last)
|
|
56
|
-
out.push({ job: m.job, n, file: per[n] });
|
|
57
|
-
}
|
|
58
|
-
return out;
|
|
59
|
-
}
|
|
60
|
-
export function addMessage(index, msg) {
|
|
61
|
-
return { ...index, messages: [...index.messages, msg] };
|
|
62
|
-
}
|
|
63
|
-
/** 一次运行收尾:写 result / cost / kidText / artifacts,首次拿到 session 就记下 */
|
|
64
|
-
export function applyRun(index, job, run) {
|
|
65
|
-
const { transcript, kidView } = run;
|
|
66
|
-
const messages = index.messages.map((m) => m.job === job
|
|
67
|
-
? {
|
|
68
|
-
...m,
|
|
69
|
-
result: transcript.final ? (transcript.final.ok ? 'ok' : 'error') : 'running',
|
|
70
|
-
costUsd: transcript.final?.costUsd,
|
|
71
|
-
kidText: kidView.kidText,
|
|
72
|
-
artifacts: run.artifacts ?? m.artifacts,
|
|
73
|
-
runtime: run.runtime,
|
|
74
|
-
holdup: kidView.holdup,
|
|
75
|
-
handoff: kidView.handoff,
|
|
76
|
-
section: kidView.section,
|
|
77
|
-
...(kidView.parentText ? { parentText: kidView.parentText } : {}),
|
|
78
|
-
...(kidView.warnings.length ? { warnings: kidView.warnings } : {}),
|
|
79
|
-
error: transcript.final?.ok === false ? transcript.final.reason : null,
|
|
80
|
-
audio: run.audio ?? null,
|
|
81
|
-
}
|
|
82
|
-
: m);
|
|
83
|
-
// 会话:首次拿到就记;换了运行时(agent 不同)就以这次的为准——跨 CLI 不能 resume,索引要跟着换
|
|
84
|
-
const keep = index.session && index.session.runtime === run.runtime ? index.session : null;
|
|
85
|
-
const session = keep ?? (transcript.sessionId ? { id: transcript.sessionId, runtime: run.runtime } : index.session);
|
|
86
|
-
const costUsd = messages.reduce((s, m) => s + (m.costUsd ?? 0), 0);
|
|
87
|
-
return { ...index, session, messages, costUsd: Math.round(costUsd * 1e4) / 1e4 };
|
|
88
|
-
}
|