cotutor 0.2.0 → 0.4.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.
Files changed (912) hide show
  1. package/LICENSE +249 -21
  2. package/NOTICE +42 -0
  3. package/README.md +115 -20
  4. package/avatars/chinese.webp +0 -0
  5. package/avatars/english.webp +0 -0
  6. package/avatars/math.webp +0 -0
  7. package/bin/cotutor.js +15 -5
  8. package/cards/canvas/card.css +8 -0
  9. package/cards/canvas/card.md +68 -0
  10. package/cards/choice/card.css +18 -0
  11. package/cards/choice/card.md +55 -0
  12. package/cards/code/card.css +5 -0
  13. package/cards/code/card.md +46 -0
  14. package/cards/dictation/card.css +10 -0
  15. package/cards/dictation/card.md +97 -0
  16. package/cards/image/card.css +10 -0
  17. package/cards/image/card.md +52 -0
  18. package/cards/lecture/card.css +9 -0
  19. package/cards/lecture/card.md +69 -0
  20. package/cards/paint/card.css +20 -0
  21. package/cards/paint/card.md +77 -0
  22. package/cards/photo/card.css +22 -0
  23. package/cards/photo/card.md +61 -0
  24. package/cards/read/card.css +6 -0
  25. package/cards/read/card.md +51 -0
  26. package/cards/text/card.css +3 -0
  27. package/cards/text/card.md +69 -0
  28. package/cards/tianzige/card.css +17 -0
  29. package/cards/tianzige/card.md +78 -0
  30. package/cards/tutor/card.css +79 -0
  31. package/cards/tutor/card.md +149 -0
  32. package/cards/word/card.css +24 -0
  33. package/cards/word/card.md +91 -0
  34. package/cards//346/235/277/344/271/246/346/200/216/344/271/210/345/206/231.md +159 -0
  35. package/dist/app/activity-eval-rules.d.ts +62 -0
  36. package/dist/app/activity-eval-rules.js +276 -0
  37. package/dist/app/activity-eval.d.ts +65 -0
  38. package/dist/app/activity-eval.js +159 -0
  39. package/dist/app/build.d.ts +11 -0
  40. package/dist/app/build.js +45 -0
  41. package/dist/app/cli/activities.d.ts +70 -0
  42. package/dist/app/cli/activities.js +196 -0
  43. package/dist/app/cli/cert.d.ts +12 -0
  44. package/dist/app/cli/cert.js +49 -0
  45. package/dist/app/cli/chalk/bake.d.ts +10 -0
  46. package/dist/app/cli/chalk/bake.js +58 -0
  47. package/dist/app/cli/chalk/browser.d.ts +16 -0
  48. package/dist/app/cli/chalk/browser.js +157 -0
  49. package/dist/app/cli/chalk/build.d.ts +14 -0
  50. package/dist/app/cli/chalk/build.js +100 -0
  51. package/dist/app/cli/chalk/dub.d.ts +51 -0
  52. package/dist/app/cli/chalk/dub.js +106 -0
  53. package/dist/app/cli/chalk/load-scene.d.ts +34 -0
  54. package/dist/app/cli/chalk/load-scene.js +117 -0
  55. package/dist/app/cli/chalk/main.d.ts +7 -0
  56. package/dist/app/cli/chalk/main.js +199 -0
  57. package/dist/app/cli/chalk/serve.d.ts +4 -0
  58. package/dist/app/cli/chalk/serve.js +28 -0
  59. package/dist/app/cli/chalk/snap.d.ts +65 -0
  60. package/dist/app/cli/chalk/snap.js +103 -0
  61. package/dist/app/cli/chalk/typecheck.d.ts +7 -0
  62. package/dist/app/cli/chalk/typecheck.js +51 -0
  63. package/dist/app/cli/doctor.d.ts +24 -0
  64. package/dist/app/cli/doctor.js +553 -0
  65. package/dist/app/cli/firewall.d.ts +24 -0
  66. package/dist/app/cli/firewall.js +79 -0
  67. package/dist/app/cli/grades.d.ts +14 -0
  68. package/dist/app/cli/grades.js +44 -0
  69. package/dist/{cli → app/cli}/init.d.ts +3 -1
  70. package/dist/app/cli/init.js +158 -0
  71. package/dist/app/cli/main.js +1038 -0
  72. package/dist/app/cli/migrate.d.ts +49 -0
  73. package/dist/app/cli/migrate.js +195 -0
  74. package/dist/app/cli/port-holder.d.ts +16 -0
  75. package/dist/app/cli/port-holder.js +34 -0
  76. package/dist/app/cli/port.d.ts +37 -0
  77. package/dist/app/cli/port.js +116 -0
  78. package/dist/app/cli/sandbox.d.ts +25 -0
  79. package/dist/app/cli/sandbox.js +166 -0
  80. package/dist/app/cli/serve-log.d.ts +13 -0
  81. package/dist/app/cli/serve-log.js +90 -0
  82. package/dist/app/cli/serve.d.ts +51 -0
  83. package/dist/app/cli/serve.js +168 -0
  84. package/dist/app/cli/service-windows.d.ts +50 -0
  85. package/dist/app/cli/service-windows.js +117 -0
  86. package/dist/app/cli/service.d.ts +138 -0
  87. package/dist/app/cli/service.js +429 -0
  88. package/dist/app/cli/shipped.d.ts +30 -0
  89. package/dist/app/cli/shipped.js +47 -0
  90. package/dist/app/cli/skeleton.d.ts +38 -0
  91. package/dist/app/cli/skeleton.js +161 -0
  92. package/dist/app/cli/skills.d.ts +59 -0
  93. package/dist/app/cli/skills.js +199 -0
  94. package/dist/app/cli/themes.d.ts +52 -0
  95. package/dist/app/cli/themes.js +148 -0
  96. package/dist/app/cli/tray-icons.d.ts +11 -0
  97. package/dist/app/cli/tray-icons.js +87 -0
  98. package/dist/app/cli/tray-ids.d.ts +6 -0
  99. package/dist/app/cli/tray-ids.js +6 -0
  100. package/dist/app/cli/tray-mac.d.ts +8 -0
  101. package/dist/app/cli/tray-mac.js +140 -0
  102. package/dist/app/cli/tray-run.d.ts +1 -0
  103. package/dist/app/cli/tray-run.js +33 -0
  104. package/dist/app/cli/tray-windows.d.ts +5 -0
  105. package/dist/app/cli/tray-windows.js +166 -0
  106. package/dist/app/cli/tray.d.ts +205 -0
  107. package/dist/app/cli/tray.js +618 -0
  108. package/dist/{cli → app/cli}/tutors.d.ts +15 -26
  109. package/dist/{cli → app/cli}/tutors.js +86 -110
  110. package/dist/app/cli/usage.d.ts +2 -0
  111. package/dist/app/cli/usage.js +35 -0
  112. package/dist/app/dictation/recognize.d.ts +18 -0
  113. package/dist/app/dictation/recognize.js +6 -0
  114. package/dist/app/dictation/route.d.ts +52 -0
  115. package/dist/app/dictation/route.js +511 -0
  116. package/dist/app/diff.d.ts +11 -0
  117. package/dist/app/diff.js +71 -0
  118. package/dist/app/http/access.d.ts +62 -0
  119. package/dist/app/http/access.js +180 -0
  120. package/dist/app/http/app.d.ts +241 -0
  121. package/dist/app/http/app.js +1159 -0
  122. package/dist/app/http/avatars.d.ts +17 -0
  123. package/dist/app/http/avatars.js +35 -0
  124. package/dist/app/http/dev-activities.d.ts +115 -0
  125. package/dist/app/http/dev-activities.js +193 -0
  126. package/dist/app/http/dev-overview.d.ts +108 -0
  127. package/dist/app/http/dev-overview.js +209 -0
  128. package/dist/app/http/dev-tutor-files.d.ts +80 -0
  129. package/dist/app/http/dev-tutor-files.js +151 -0
  130. package/dist/app/http/parent-home.d.ts +51 -0
  131. package/dist/app/http/parent-home.js +266 -0
  132. package/dist/app/http/parent-look.d.ts +2 -0
  133. package/dist/app/http/parent-look.js +151 -0
  134. package/dist/app/http/range.d.ts +9 -0
  135. package/dist/app/http/range.js +19 -0
  136. package/dist/app/http/raw-view.d.ts +117 -0
  137. package/dist/app/http/raw-view.js +149 -0
  138. package/dist/app/http/send-file.d.ts +7 -0
  139. package/dist/app/http/send-file.js +29 -0
  140. package/dist/{server → app/http}/stage.d.ts +9 -0
  141. package/dist/{server → app/http}/stage.js +34 -6
  142. package/dist/app/http/theme.d.ts +13 -0
  143. package/dist/app/http/theme.js +41 -0
  144. package/dist/app/http/voice-preview.d.ts +4 -0
  145. package/dist/app/http/voice-preview.js +34 -0
  146. package/dist/app/machine/bailian.d.ts +26 -0
  147. package/dist/app/machine/bailian.js +87 -0
  148. package/dist/app/mock/mock-live.d.ts +16 -0
  149. package/dist/app/mock/mock-live.js +140 -0
  150. package/dist/{server → app/mock}/mock.d.ts +38 -5
  151. package/dist/app/mock/mock.js +1125 -0
  152. package/dist/app/replay.d.ts +94 -0
  153. package/dist/app/replay.js +170 -0
  154. package/dist/app/skills/analyze-doc.d.ts +3 -0
  155. package/dist/app/skills/analyze-doc.js +47 -0
  156. package/dist/app/skills/home-doc.d.ts +5 -0
  157. package/dist/app/skills/home-doc.js +112 -0
  158. package/dist/app/skills/tune-doc.d.ts +3 -0
  159. package/dist/app/skills/tune-doc.js +80 -0
  160. package/dist/app/talk/list.d.ts +11 -0
  161. package/dist/app/talk/list.js +9 -0
  162. package/dist/app/talk/route.d.ts +16 -0
  163. package/dist/app/talk/route.js +142 -0
  164. package/dist/app/workspace.d.ts +63 -0
  165. package/dist/{cli → app}/workspace.js +100 -52
  166. package/dist/app/ws/route.d.ts +31 -0
  167. package/dist/app/ws/route.js +33 -0
  168. package/dist/app/ws/ws.d.ts +31 -0
  169. package/dist/app/ws/ws.js +169 -0
  170. package/dist/board/canvas-chat.d.ts +97 -0
  171. package/dist/board/canvas-chat.js +175 -0
  172. package/dist/board/card-guards.d.ts +15 -0
  173. package/dist/board/card-guards.js +38 -0
  174. package/dist/board/cards/canvas.d.ts +41 -0
  175. package/dist/board/cards/canvas.js +83 -0
  176. package/dist/{cards → board/cards}/choice.js +0 -12
  177. package/dist/{cards → board/cards}/code.js +0 -3
  178. package/dist/board/cards/dictation.d.ts +42 -0
  179. package/dist/board/cards/dictation.js +105 -0
  180. package/dist/board/cards/docs.d.ts +47 -0
  181. package/dist/board/cards/docs.js +152 -0
  182. package/dist/{cards → board/cards}/image.js +1 -10
  183. package/dist/board/cards/index.d.ts +62 -0
  184. package/dist/board/cards/index.js +144 -0
  185. package/dist/{cards → board/cards}/kind.d.ts +10 -4
  186. package/dist/board/cards/kind.js +9 -0
  187. package/dist/board/cards/lecture.d.ts +26 -0
  188. package/dist/board/cards/lecture.js +62 -0
  189. package/dist/board/cards/paint.d.ts +38 -0
  190. package/dist/board/cards/paint.js +85 -0
  191. package/dist/board/cards/photo.d.ts +15 -0
  192. package/dist/board/cards/photo.js +29 -0
  193. package/dist/{cards → board/cards}/read.js +1 -10
  194. package/dist/board/cards/text.d.ts +20 -0
  195. package/dist/board/cards/text.js +59 -0
  196. package/dist/board/cards/tianzige.d.ts +16 -0
  197. package/dist/board/cards/tianzige.js +64 -0
  198. package/dist/board/cards/tutor.d.ts +72 -0
  199. package/dist/board/cards/tutor.js +134 -0
  200. package/dist/board/cards/word.d.ts +20 -0
  201. package/dist/board/cards/word.js +76 -0
  202. package/dist/board/lecture.d.ts +100 -0
  203. package/dist/board/lecture.js +204 -0
  204. package/dist/board/paper.d.ts +20 -0
  205. package/dist/board/paper.js +76 -0
  206. package/dist/board/parse.d.ts +118 -0
  207. package/dist/board/parse.js +324 -0
  208. package/dist/board/presentation.d.ts +289 -0
  209. package/dist/board/presentation.js +613 -0
  210. package/dist/board/sections.d.ts +16 -0
  211. package/dist/board/sections.js +130 -0
  212. package/dist/brain/api-tools.d.ts +8 -0
  213. package/dist/brain/api-tools.js +191 -0
  214. package/dist/brain/api.d.ts +57 -0
  215. package/dist/brain/api.js +394 -0
  216. package/dist/brain/index.d.ts +97 -0
  217. package/dist/brain/index.js +11 -0
  218. package/dist/brain/log.d.ts +5 -0
  219. package/dist/brain/log.js +22 -0
  220. package/dist/brain/runtime.d.ts +30 -0
  221. package/dist/brain/runtime.js +23 -0
  222. package/dist/brain/stream-json.d.ts +16 -0
  223. package/dist/brain/stream-json.js +82 -0
  224. package/dist/brain/stream.d.ts +20 -0
  225. package/dist/brain/stream.js +70 -0
  226. package/dist/brain/transcript.d.ts +45 -0
  227. package/dist/brain/transcript.js +132 -0
  228. package/dist/brain/types.d.ts +99 -0
  229. package/dist/brain/types.js +14 -0
  230. package/dist/chalk/actions.d.ts +37 -0
  231. package/dist/chalk/actions.js +69 -0
  232. package/dist/chalk/bundle.d.ts +26 -0
  233. package/dist/chalk/bundle.js +69 -0
  234. package/dist/chalk/check.d.ts +28 -0
  235. package/dist/chalk/check.js +291 -0
  236. package/dist/chalk/circle.d.ts +64 -0
  237. package/dist/chalk/circle.js +193 -0
  238. package/dist/chalk/clock.d.ts +84 -0
  239. package/dist/chalk/clock.js +84 -0
  240. package/dist/chalk/geometry.d.ts +44 -0
  241. package/dist/chalk/geometry.js +139 -0
  242. package/dist/chalk/glyphs/capitals.d.ts +12 -0
  243. package/dist/chalk/glyphs/capitals.js +264 -0
  244. package/dist/chalk/glyphs/index.d.ts +21 -0
  245. package/dist/chalk/glyphs/index.js +18 -0
  246. package/dist/chalk/glyphs/letters.d.ts +13 -0
  247. package/dist/chalk/glyphs/letters.js +280 -0
  248. package/dist/chalk/glyphs/metrics.d.ts +33 -0
  249. package/dist/chalk/glyphs/metrics.js +28 -0
  250. package/dist/chalk/glyphs/registry.d.ts +7 -0
  251. package/dist/chalk/glyphs/registry.js +8 -0
  252. package/dist/chalk/glyphs/sample.d.ts +32 -0
  253. package/dist/chalk/glyphs/sample.js +102 -0
  254. package/dist/chalk/glyphs/skeleton.d.ts +64 -0
  255. package/dist/chalk/glyphs/skeleton.js +126 -0
  256. package/dist/chalk/glyphs/types.d.ts +58 -0
  257. package/dist/chalk/glyphs/types.js +17 -0
  258. package/dist/chalk/index.d.ts +23 -0
  259. package/dist/chalk/index.js +15 -0
  260. package/dist/chalk/manifest.d.ts +41 -0
  261. package/dist/chalk/manifest.js +6 -0
  262. package/dist/chalk/paint.d.ts +180 -0
  263. package/dist/chalk/paint.js +210 -0
  264. package/dist/chalk/pointer.d.ts +8 -0
  265. package/dist/chalk/pointer.js +21 -0
  266. package/dist/chalk/prepare.d.ts +11 -0
  267. package/dist/chalk/prepare.js +15 -0
  268. package/dist/chalk/scene-schema.d.ts +199 -0
  269. package/dist/chalk/scene-schema.js +91 -0
  270. package/dist/chalk/seed.d.ts +3 -0
  271. package/dist/chalk/seed.js +10 -0
  272. package/dist/chalk/text-metrics.d.ts +8 -0
  273. package/dist/chalk/text-metrics.js +156 -0
  274. package/dist/chalk/timeline.d.ts +47 -0
  275. package/dist/chalk/timeline.js +84 -0
  276. package/dist/chalk/types.d.ts +150 -0
  277. package/dist/chalk/types.js +8 -0
  278. package/dist/lib/index.d.ts +14 -12
  279. package/dist/lib/index.js +14 -12
  280. package/dist/media/draw.d.ts +23 -0
  281. package/dist/media/draw.js +44 -0
  282. package/dist/media/mp3.d.ts +6 -0
  283. package/dist/media/mp3.js +58 -0
  284. package/dist/media/mp4.d.ts +1 -0
  285. package/dist/media/mp4.js +58 -0
  286. package/dist/media/tts-voices.d.ts +18 -0
  287. package/dist/media/tts-voices.js +606 -0
  288. package/dist/media/tts.d.ts +56 -0
  289. package/dist/media/tts.js +174 -0
  290. package/dist/media/vision.d.ts +25 -0
  291. package/dist/media/vision.js +71 -0
  292. package/dist/memory/commit.d.ts +67 -0
  293. package/dist/memory/commit.js +130 -0
  294. package/dist/memory/context.d.ts +86 -0
  295. package/dist/memory/context.js +97 -0
  296. package/dist/memory/diary.d.ts +84 -0
  297. package/dist/memory/diary.js +183 -0
  298. package/dist/memory/grade.d.ts +2 -0
  299. package/dist/memory/grade.js +7 -0
  300. package/dist/{lib → memory}/plan.d.ts +1 -1
  301. package/dist/{lib → memory}/plan.js +1 -1
  302. package/dist/memory/proposals.d.ts +11 -0
  303. package/dist/memory/proposals.js +43 -0
  304. package/dist/memory/retrieval.d.ts +44 -0
  305. package/dist/memory/retrieval.js +157 -0
  306. package/dist/{lib → memory}/timetable.d.ts +0 -3
  307. package/dist/{lib → memory}/timetable.js +0 -11
  308. package/dist/memory/vault-notes.d.ts +165 -0
  309. package/dist/memory/vault-notes.js +359 -0
  310. package/dist/memory/vault.d.ts +70 -0
  311. package/dist/memory/vault.js +169 -0
  312. package/dist/realtime/bailian.d.ts +120 -0
  313. package/dist/realtime/bailian.js +289 -0
  314. package/dist/realtime/cues.d.ts +51 -0
  315. package/dist/realtime/cues.js +94 -0
  316. package/dist/realtime/listen.d.ts +32 -0
  317. package/dist/realtime/listen.js +53 -0
  318. package/dist/realtime/preview.d.ts +23 -0
  319. package/dist/realtime/preview.js +38 -0
  320. package/dist/realtime/prompt.d.ts +8 -0
  321. package/dist/realtime/prompt.js +13 -0
  322. package/dist/realtime/voices.d.ts +21 -0
  323. package/dist/realtime/voices.js +71 -0
  324. package/dist/runtime/activities.d.ts +29 -0
  325. package/dist/runtime/activities.js +72 -0
  326. package/dist/runtime/activity-state.d.ts +22 -0
  327. package/dist/runtime/activity-state.js +83 -0
  328. package/dist/runtime/activity.d.ts +63 -0
  329. package/dist/runtime/activity.js +428 -0
  330. package/dist/runtime/agent-file.d.ts +24 -0
  331. package/dist/runtime/agent-file.js +59 -0
  332. package/dist/runtime/auto-bookkeep.d.ts +30 -0
  333. package/dist/runtime/auto-bookkeep.js +84 -0
  334. package/dist/{lib → runtime/context}/context-pack.d.ts +3 -3
  335. package/dist/runtime/context/context-pack.js +182 -0
  336. package/dist/runtime/context/thread-digest.d.ts +4 -0
  337. package/dist/runtime/context/thread-digest.js +35 -0
  338. package/dist/runtime/context/tutor-rules.d.ts +25 -0
  339. package/dist/runtime/context/tutor-rules.js +47 -0
  340. package/dist/runtime/delivery/delivery.d.ts +94 -0
  341. package/dist/runtime/delivery/delivery.js +145 -0
  342. package/dist/runtime/delivery/playback.d.ts +25 -0
  343. package/dist/runtime/delivery/playback.js +29 -0
  344. package/dist/runtime/delivery/player.d.ts +145 -0
  345. package/dist/runtime/delivery/player.js +221 -0
  346. package/dist/runtime/delivery/queue.d.ts +89 -0
  347. package/dist/runtime/delivery/queue.js +59 -0
  348. package/dist/runtime/home/edit.d.ts +39 -0
  349. package/dist/runtime/home/edit.js +132 -0
  350. package/dist/runtime/home/home.d.ts +191 -0
  351. package/dist/runtime/home/home.js +318 -0
  352. package/dist/runtime/home/store.d.ts +142 -0
  353. package/dist/runtime/home/store.js +455 -0
  354. package/dist/runtime/journal/conversation.d.ts +46 -0
  355. package/dist/runtime/journal/conversation.js +89 -0
  356. package/dist/runtime/journal/events.d.ts +27 -0
  357. package/dist/runtime/journal/events.js +136 -0
  358. package/dist/runtime/journal/kid-log.d.ts +105 -0
  359. package/dist/runtime/journal/kid-log.js +133 -0
  360. package/dist/runtime/journal/ledger.d.ts +17 -0
  361. package/dist/{lib → runtime/journal}/ledger.js +7 -40
  362. package/dist/runtime/journal/mix.d.ts +42 -0
  363. package/dist/runtime/journal/mix.js +129 -0
  364. package/dist/runtime/journal/mouth-index.d.ts +26 -0
  365. package/dist/runtime/journal/mouth-index.js +34 -0
  366. package/dist/runtime/journal/mouth.d.ts +54 -0
  367. package/dist/runtime/journal/mouth.js +102 -0
  368. package/dist/runtime/journal/recorder.d.ts +91 -0
  369. package/dist/runtime/journal/recorder.js +148 -0
  370. package/dist/runtime/journal/store.d.ts +123 -0
  371. package/dist/runtime/journal/store.js +316 -0
  372. package/dist/runtime/kid-input.d.ts +16 -0
  373. package/dist/runtime/kid-input.js +194 -0
  374. package/dist/runtime/kid-view.d.ts +124 -0
  375. package/dist/runtime/kid-view.js +157 -0
  376. package/dist/runtime/lecture.d.ts +86 -0
  377. package/dist/runtime/lecture.js +237 -0
  378. package/dist/runtime/live/call.d.ts +231 -0
  379. package/dist/runtime/live/call.js +1244 -0
  380. package/dist/runtime/live/turns.d.ts +48 -0
  381. package/dist/runtime/live/turns.js +102 -0
  382. package/dist/runtime/runner.d.ts +243 -0
  383. package/dist/runtime/runner.js +777 -0
  384. package/dist/runtime/talk-run.d.ts +21 -0
  385. package/dist/runtime/talk-run.js +34 -0
  386. package/dist/scenes/dictation/match.d.ts +57 -0
  387. package/dist/scenes/dictation/match.js +255 -0
  388. package/dist/scenes/dictation/recognize.d.ts +86 -0
  389. package/dist/scenes/dictation/recognize.js +163 -0
  390. package/dist/scenes/dictation/store.d.ts +112 -0
  391. package/dist/scenes/dictation/store.js +99 -0
  392. package/dist/scenes/look.d.ts +26 -0
  393. package/dist/scenes/look.js +1 -0
  394. package/dist/scenes/paint/painter.d.ts +84 -0
  395. package/dist/scenes/paint/painter.js +171 -0
  396. package/dist/scenes/paint/prompt.d.ts +23 -0
  397. package/dist/scenes/paint/prompt.js +36 -0
  398. package/dist/scenes/talk/en-words.d.ts +8 -0
  399. package/dist/scenes/talk/en-words.js +44 -0
  400. package/dist/scenes/talk/list.d.ts +44 -0
  401. package/dist/scenes/talk/list.js +88 -0
  402. package/dist/scenes/talk/store.d.ts +27 -0
  403. package/dist/scenes/talk/store.js +61 -0
  404. package/dist/scenes/talk/warmup.d.ts +16 -0
  405. package/dist/scenes/talk/warmup.js +39 -0
  406. package/dist/schema/activity.d.ts +149 -0
  407. package/dist/schema/activity.js +113 -0
  408. package/dist/schema/board.d.ts +143 -2
  409. package/dist/schema/board.js +15 -3
  410. package/dist/schema/config.d.ts +339 -103
  411. package/dist/schema/config.js +269 -84
  412. package/dist/schema/context-pack.d.ts +76 -14
  413. package/dist/schema/context-pack.js +91 -10
  414. package/dist/{lib/conversation.d.ts → schema/conversation-files.d.ts} +11 -33
  415. package/dist/schema/conversation-files.js +26 -0
  416. package/dist/schema/conversation.d.ts +391 -49
  417. package/dist/schema/conversation.js +135 -19
  418. package/dist/schema/events.d.ts +138 -0
  419. package/dist/schema/events.js +1 -0
  420. package/dist/schema/home.d.ts +56 -0
  421. package/dist/schema/home.js +35 -0
  422. package/dist/schema/index.d.ts +14 -3
  423. package/dist/schema/index.js +14 -3
  424. package/dist/schema/kid-device.d.ts +20 -0
  425. package/dist/schema/kid-device.js +32 -0
  426. package/dist/schema/ledger.d.ts +8 -63
  427. package/dist/schema/ledger.js +7 -31
  428. package/dist/schema/memory.d.ts +73 -0
  429. package/dist/schema/memory.js +47 -0
  430. package/dist/schema/plan.d.ts +2 -2
  431. package/dist/schema/plan.js +2 -2
  432. package/dist/schema/sections.d.ts +32 -25
  433. package/dist/schema/sections.js +21 -22
  434. package/dist/schema/theme.d.ts +25 -0
  435. package/dist/schema/theme.js +26 -0
  436. package/dist/schema/timetable.d.ts +2 -2
  437. package/dist/schema/timetable.js +2 -2
  438. package/dist/schema/workspace.d.ts +68 -0
  439. package/dist/schema/workspace.js +37 -0
  440. package/dist/shared/default-port.d.ts +2 -0
  441. package/dist/shared/default-port.js +2 -0
  442. package/dist/shared/errors.d.ts +8 -0
  443. package/dist/shared/errors.js +13 -0
  444. package/dist/shared/home.d.ts +2 -0
  445. package/dist/shared/home.js +16 -0
  446. package/dist/shared/human-notes.d.ts +5 -0
  447. package/dist/shared/human-notes.js +7 -0
  448. package/dist/shared/qianwen.d.ts +54 -0
  449. package/dist/shared/qianwen.js +113 -0
  450. package/dist/shared/site-url.d.ts +2 -0
  451. package/dist/shared/site-url.js +5 -0
  452. package/dist/shared/time.d.ts +9 -0
  453. package/dist/shared/time.js +22 -0
  454. package/dist/shared/tokens.d.ts +18 -0
  455. package/dist/shared/tokens.js +11 -0
  456. package/dist/shared/wav.d.ts +10 -0
  457. package/dist/shared/wav.js +50 -0
  458. package/dist/stage/chunk-226TNLQA.js +129 -0
  459. package/dist/stage/chunk-24LGQEKE.js +1 -0
  460. package/dist/stage/chunk-25XV6UY3.js +10 -0
  461. package/dist/stage/chunk-2AZI3NHJ.js +1 -0
  462. package/dist/stage/chunk-2BQZTTBE.js +1 -0
  463. package/dist/stage/chunk-2M7CGY3Y.js +11 -0
  464. package/dist/stage/chunk-2VR4WFQ7.js +10 -0
  465. package/dist/stage/chunk-2ZYXBUWG.js +9 -0
  466. package/dist/stage/chunk-32LAWMGY.js +1 -0
  467. package/dist/stage/chunk-3LEMTSOO.js +11 -0
  468. package/dist/stage/chunk-3QCKGZYE.js +32 -0
  469. package/dist/stage/chunk-44P66WFA.js +1 -0
  470. package/dist/stage/chunk-4AM6FRR6.js +7 -0
  471. package/dist/stage/chunk-4QDE4SUK.js +1 -0
  472. package/dist/stage/chunk-4QESHV3U.js +1 -0
  473. package/dist/stage/chunk-4SG5QPHB.js +2 -0
  474. package/dist/stage/chunk-4T4UVCOC.js +1 -0
  475. package/dist/stage/chunk-4WUEPPG3.js +34 -0
  476. package/dist/stage/chunk-4YCN6UZ5.js +99 -0
  477. package/dist/stage/chunk-5V7ZY2AP.js +1 -0
  478. package/dist/stage/chunk-5VS5Y2VJ.js +6 -0
  479. package/dist/stage/chunk-5W4NO2ZD.js +62 -0
  480. package/dist/stage/chunk-65CRNICM.js +1 -0
  481. package/dist/stage/chunk-66MULO7F.js +5 -0
  482. package/dist/stage/chunk-6COFQTBS.js +162 -0
  483. package/dist/stage/chunk-6VZG3M3I.js +8 -0
  484. package/dist/stage/chunk-7HVDH43T.js +1 -0
  485. package/dist/stage/chunk-7JLJN4EZ.js +8 -0
  486. package/dist/stage/chunk-7QDSP4LN.js +1 -0
  487. package/dist/stage/chunk-7R6OQAO3.js +1 -0
  488. package/dist/stage/chunk-7VTTHZKW.js +7 -0
  489. package/dist/stage/chunk-ATHR5KEN.js +10 -0
  490. package/dist/stage/chunk-B6R5LTP2.js +36 -0
  491. package/dist/stage/chunk-BD4WE264.js +1 -0
  492. package/dist/stage/chunk-BONANU47.js +206 -0
  493. package/dist/stage/chunk-BTVW7OFK.js +89 -0
  494. package/dist/stage/chunk-BUTJIDHG.js +8 -0
  495. package/dist/stage/chunk-C2IPYMML.js +84 -0
  496. package/dist/stage/chunk-C54FTPPV.js +9 -0
  497. package/dist/stage/chunk-C6LOUF2Z.js +90 -0
  498. package/dist/stage/chunk-CFF3PILO.js +339 -0
  499. package/dist/stage/chunk-CI2FQ2JY.js +9 -0
  500. package/dist/stage/chunk-CW5O4RV7.js +12 -0
  501. package/dist/stage/chunk-CYABNQYD.js +1 -0
  502. package/dist/stage/chunk-D7FFA4NS.js +15 -0
  503. package/dist/stage/chunk-DUNNXU6Z.js +8 -0
  504. package/dist/stage/chunk-E3E4Q6JF.js +6 -0
  505. package/dist/stage/chunk-EB3U3LH7.js +9 -0
  506. package/dist/stage/chunk-EGSZ736B.js +8 -0
  507. package/dist/stage/chunk-EOBXW5VQ.js +2 -0
  508. package/dist/stage/chunk-ERZC3B7Y.js +11 -0
  509. package/dist/stage/chunk-ESDOOBIH.js +11 -0
  510. package/dist/stage/chunk-EVU4QAL4.js +178 -0
  511. package/dist/stage/chunk-EVVZI2NY.js +39 -0
  512. package/dist/stage/chunk-FBKAZUKD.js +39 -0
  513. package/dist/stage/chunk-FDVKYQJN.js +1 -0
  514. package/dist/stage/chunk-FGPVYHVR.js +5 -0
  515. package/dist/stage/chunk-FHUD4AZC.js +1 -0
  516. package/dist/stage/chunk-FKUJ2DMY.js +96 -0
  517. package/dist/stage/chunk-FNZGVIJV.js +1 -0
  518. package/dist/stage/chunk-GBYSEGYM.js +78 -0
  519. package/dist/stage/chunk-GCO4TDHX.js +1 -0
  520. package/dist/stage/chunk-GKTML2LG.js +10 -0
  521. package/dist/stage/chunk-GMDIHHXQ.js +11 -0
  522. package/dist/stage/chunk-GOUNACI3.js +10 -0
  523. package/dist/stage/chunk-GXAYATPF.js +3 -0
  524. package/dist/stage/chunk-H2K2DDXV.js +8 -0
  525. package/dist/stage/chunk-H3UJI6ZY.js +13 -0
  526. package/dist/stage/chunk-H6PUGCME.js +7 -0
  527. package/dist/stage/chunk-HNBUIMIG.js +1 -0
  528. package/dist/stage/chunk-HRZY2BJQ.js +10 -0
  529. package/dist/stage/chunk-HSPJGALW.js +30 -0
  530. package/dist/stage/chunk-IBYORHIP.js +25 -0
  531. package/dist/stage/chunk-IHF4EWTY.js +1 -0
  532. package/dist/stage/chunk-ISBRPNKI.js +1 -0
  533. package/dist/stage/chunk-IZ3OI3C2.js +2 -0
  534. package/dist/stage/chunk-JEFZAC2R.js +1 -0
  535. package/dist/stage/chunk-JFIGRDPO.js +1 -0
  536. package/dist/stage/chunk-JFVYBOOC.js +9 -0
  537. package/dist/stage/chunk-JGD4TUTQ.js +1 -0
  538. package/dist/stage/chunk-JO4BEHDH.js +4 -0
  539. package/dist/stage/chunk-JOWBS42C.js +1 -0
  540. package/dist/stage/chunk-JP3TM2TG.js +1 -0
  541. package/dist/stage/chunk-JVK2C52O.js +1 -0
  542. package/dist/stage/chunk-K4I76XBX.js +14 -0
  543. package/dist/stage/chunk-KA6CZZ4M.js +1 -0
  544. package/dist/stage/chunk-KESSJ36M.js +1 -0
  545. package/dist/stage/chunk-LKATEVRU.js +1 -0
  546. package/dist/stage/chunk-LS4EJ2EI.js +1 -0
  547. package/dist/stage/chunk-LUKJQC2X.js +70 -0
  548. package/dist/stage/chunk-LWULR3SM.js +1 -0
  549. package/dist/stage/chunk-LWVRFMKX.js +2 -0
  550. package/dist/stage/chunk-LXC4ZBPZ.js +1 -0
  551. package/dist/stage/chunk-M2UP255H.js +1 -0
  552. package/dist/stage/chunk-MAPPXUZQ.js +231 -0
  553. package/dist/stage/chunk-MBMPW7Z5.js +1 -0
  554. package/dist/stage/chunk-MD3HMMTK.js +1 -0
  555. package/dist/stage/chunk-MLPCUIKR.js +17 -0
  556. package/dist/stage/chunk-MNQIRPDQ.js +8 -0
  557. package/dist/stage/chunk-MRG7MJVS.js +1 -0
  558. package/dist/stage/chunk-MU6EXW72.js +10 -0
  559. package/dist/stage/chunk-MVU2X6LU.js +4 -0
  560. package/dist/stage/chunk-N6UA5CZV.js +36 -0
  561. package/dist/stage/chunk-NLZIT2TJ.js +7 -0
  562. package/dist/stage/chunk-NOJR3J7M.js +1 -0
  563. package/dist/stage/chunk-NT7ARDOL.js +1 -0
  564. package/dist/stage/chunk-NWOGMPZH.js +1 -0
  565. package/dist/stage/chunk-NXE4KMG3.js +40 -0
  566. package/dist/stage/chunk-O4YCZXD2.js +257 -0
  567. package/dist/stage/chunk-OAJZ7HLK.js +1 -0
  568. package/dist/stage/chunk-OCFCFASO.js +1 -0
  569. package/dist/stage/chunk-ODGPG5RY.js +7 -0
  570. package/dist/stage/chunk-ODUEA52Q.js +3 -0
  571. package/dist/stage/chunk-OGDJ3FCI.js +1 -0
  572. package/dist/stage/chunk-OLDJ55TT.js +1 -0
  573. package/dist/stage/chunk-OOCL4ATI.js +2 -0
  574. package/dist/stage/chunk-OQEFDUDV.js +1 -0
  575. package/dist/stage/chunk-OQWVEWG7.js +4 -0
  576. package/dist/stage/chunk-OUIX6BGK.js +1 -0
  577. package/dist/stage/chunk-OV7OZYUO.js +7 -0
  578. package/dist/stage/chunk-PFGDY33O.js +1 -0
  579. package/dist/stage/chunk-PFJDUJB3.js +139 -0
  580. package/dist/stage/chunk-PGEW76ER.js +1 -0
  581. package/dist/stage/chunk-PP76TAQX.js +32 -0
  582. package/dist/stage/chunk-PTBOP4OT.js +2 -0
  583. package/dist/stage/chunk-PX2RVHCK.js +1 -0
  584. package/dist/stage/chunk-Q7K3PNAD.js +1 -0
  585. package/dist/stage/chunk-QDDPLZDB.js +1 -0
  586. package/dist/stage/chunk-QLGLZ77F.js +1 -0
  587. package/dist/stage/chunk-QOPFDFHI.js +1 -0
  588. package/dist/stage/chunk-QXT4KAEJ.js +1 -0
  589. package/dist/stage/chunk-R4YVZCIT.js +1 -0
  590. package/dist/stage/chunk-R6P6EHWA.js +62 -0
  591. package/dist/stage/chunk-RCH3OXBI.js +9 -0
  592. package/dist/stage/chunk-RHPE44I2.js +1 -0
  593. package/dist/stage/chunk-RJ2R4FVC.js +1 -0
  594. package/dist/stage/chunk-RJH2YVTD.js +1 -0
  595. package/dist/stage/chunk-RLWWW5OB.js +6 -0
  596. package/dist/stage/chunk-S3WO35Z7.js +120 -0
  597. package/dist/stage/chunk-S7ZGX6MW.js +1 -0
  598. package/dist/stage/chunk-SIAWX27B.js +1 -0
  599. package/dist/stage/chunk-SLG4X622.js +1 -0
  600. package/dist/stage/chunk-SLJRBC77.js +168 -0
  601. package/dist/stage/chunk-SRORWQJZ.js +1 -0
  602. package/dist/stage/chunk-STZTUIIF.js +2 -0
  603. package/dist/stage/chunk-SVQ6MWNV.js +9 -0
  604. package/dist/stage/chunk-TL3HLL2S.js +132 -0
  605. package/dist/stage/chunk-U3DOE6SF.js +24 -0
  606. package/dist/stage/chunk-UABQIZKW.js +6 -0
  607. package/dist/stage/chunk-UDK3R764.js +1 -0
  608. package/dist/stage/chunk-UFF4E54B.js +41 -0
  609. package/dist/stage/chunk-UFP5Q4AY.js +1 -0
  610. package/dist/stage/chunk-UMH2TSW2.js +72 -0
  611. package/dist/stage/chunk-UTASVNF5.js +10 -0
  612. package/dist/stage/chunk-UW7ML5ML.js +88 -0
  613. package/dist/stage/chunk-V3J7F6OP.js +1 -0
  614. package/dist/stage/chunk-VEHP5B5Q.js +5 -0
  615. package/dist/stage/chunk-VRXWB733.js +9 -0
  616. package/dist/stage/chunk-VVDHBBS5.js +5 -0
  617. package/dist/stage/chunk-VYFOH6FU.js +106 -0
  618. package/dist/stage/chunk-W3VZTLQS.js +3 -0
  619. package/dist/stage/chunk-W7WNRWTZ.js +8 -0
  620. package/dist/stage/chunk-WHUCV53C.js +1 -0
  621. package/dist/stage/chunk-WULMYHIF.js +1 -0
  622. package/dist/stage/chunk-X54EX7AW.js +9 -0
  623. package/dist/stage/chunk-X565ISZM.js +1 -0
  624. package/dist/stage/chunk-XGZMDECB.js +1 -0
  625. package/dist/stage/chunk-XHONC4RF.js +172 -0
  626. package/dist/stage/chunk-XIK4XQ6E.js +24 -0
  627. package/dist/stage/chunk-XJQQWFTE.js +1 -0
  628. package/dist/stage/chunk-XM4WOU3I.js +13 -0
  629. package/dist/stage/chunk-XM7Y5HP5.js +38 -0
  630. package/dist/stage/chunk-XNYYRGD5.js +292 -0
  631. package/dist/stage/chunk-XOYVR3SV.js +1 -0
  632. package/dist/stage/chunk-XQIW5HCE.js +1 -0
  633. package/dist/stage/chunk-YEWL7FUW.js +8 -0
  634. package/dist/stage/chunk-YI55PY3V.js +1 -0
  635. package/dist/stage/chunk-YM63HI6W.js +1 -0
  636. package/dist/stage/chunk-YNLGLU4P.js +9 -0
  637. package/dist/stage/chunk-YTNMNOWP.js +1 -0
  638. package/dist/stage/chunk-YV62XKTC.js +1 -0
  639. package/dist/stage/chunk-YVBA3QW6.js +1 -0
  640. package/dist/stage/chunk-Z2SY2HOC.js +1 -0
  641. package/dist/stage/chunk-ZBTCQEBK.js +10 -0
  642. package/dist/stage/chunk-ZCUFN74D.js +1 -0
  643. package/dist/stage/chunk-ZHOULXEJ.js +11 -0
  644. package/dist/stage/chunk-ZTRZIET2.js +1 -0
  645. package/dist/stage/index.html +1 -0
  646. package/dist/stage/stage.css +1 -1
  647. package/dist/stage/stage.js +1 -4383
  648. package/dist/ui/dev/dev-page.d.ts +1 -0
  649. package/dist/ui/dev/dev-page.js +2021 -0
  650. package/dist/ui/dev/dev-theme.d.ts +6 -0
  651. package/dist/ui/dev/dev-theme.js +67 -0
  652. package/dist/ui/dev/voice-gallery-page.d.ts +1 -0
  653. package/dist/ui/dev/voice-gallery-page.js +121 -0
  654. package/dist/ui/dev/voice-scenes.d.ts +21 -0
  655. package/dist/ui/dev/voice-scenes.js +30 -0
  656. package/dist/ui/dictation/en-box.d.ts +2 -0
  657. package/dist/ui/dictation/en-box.js +86 -0
  658. package/dist/ui/dictation/en-page.d.ts +1 -0
  659. package/dist/ui/dictation/en-page.js +484 -0
  660. package/dist/ui/dictation/page.d.ts +1 -0
  661. package/dist/ui/dictation/page.js +1084 -0
  662. package/dist/ui/dictation/parent-page.d.ts +1 -0
  663. package/dist/ui/dictation/parent-page.js +234 -0
  664. package/dist/ui/dictation/reel-mode.d.ts +1 -0
  665. package/dist/ui/dictation/reel-mode.js +87 -0
  666. package/dist/ui/dictation/reel-page.d.ts +1 -0
  667. package/dist/ui/dictation/reel-page.js +62 -0
  668. package/dist/ui/dictation/reel.d.ts +163 -0
  669. package/dist/ui/dictation/reel.js +436 -0
  670. package/dist/ui/dictation/ui.d.ts +44 -0
  671. package/dist/ui/dictation/ui.js +80 -0
  672. package/dist/ui/dictation/unlock.d.ts +7 -0
  673. package/dist/ui/dictation/unlock.js +16 -0
  674. package/dist/ui/kid/audio-client.d.ts +11 -0
  675. package/dist/ui/kid/audio-client.js +74 -0
  676. package/dist/ui/kid/board-mark-art.d.ts +37 -0
  677. package/dist/ui/kid/board-mark-art.js +5 -0
  678. package/dist/ui/kid/board-mark.d.ts +24 -0
  679. package/dist/ui/kid/board-mark.js +58 -0
  680. package/dist/ui/kid/home-tiles.d.ts +14 -0
  681. package/dist/ui/kid/home-tiles.js +44 -0
  682. package/dist/ui/kid/kid-log.d.ts +15 -0
  683. package/dist/ui/kid/kid-log.js +87 -0
  684. package/dist/ui/kid/kid-nav.d.ts +11 -0
  685. package/dist/ui/kid/kid-nav.js +22 -0
  686. package/dist/ui/kid/kid-page.d.ts +9 -0
  687. package/dist/ui/kid/kid-page.js +3684 -0
  688. package/dist/ui/kid/letters.d.ts +26 -0
  689. package/dist/ui/kid/letters.js +51 -0
  690. package/dist/ui/kid/photo-edit.d.ts +83 -0
  691. package/dist/ui/kid/photo-edit.js +106 -0
  692. package/dist/ui/kid/photo-ui.d.ts +23 -0
  693. package/dist/ui/kid/photo-ui.js +60 -0
  694. package/dist/ui/kid/reel.d.ts +419 -0
  695. package/dist/ui/kid/reel.js +648 -0
  696. package/dist/ui/kid/tianzige.d.ts +8 -0
  697. package/dist/ui/kid/tianzige.js +45 -0
  698. package/dist/ui/kid/tutor-face.d.ts +35 -0
  699. package/dist/ui/kid/tutor-face.js +84 -0
  700. package/dist/ui/kid/voice-ui.d.ts +70 -0
  701. package/dist/ui/kid/voice-ui.js +316 -0
  702. package/dist/ui/kid/voice-view.d.ts +71 -0
  703. package/dist/ui/kid/voice-view.js +75 -0
  704. package/dist/ui/kid/word-draw.d.ts +2 -0
  705. package/dist/ui/kid/word-draw.js +107 -0
  706. package/dist/ui/kid/word-emoji.d.ts +10 -0
  707. package/dist/ui/kid/word-emoji.js +68 -0
  708. package/dist/ui/kid/word-layout.d.ts +25 -0
  709. package/dist/ui/kid/word-layout.js +29 -0
  710. package/dist/ui/parent/parent-home-page.d.ts +1 -0
  711. package/dist/ui/parent/parent-home-page.js +722 -0
  712. package/dist/ui/parent/parent-page.d.ts +2 -0
  713. package/dist/ui/parent/parent-page.js +511 -0
  714. package/dist/ui/parent/parent-settings-page.d.ts +1 -0
  715. package/dist/ui/parent/parent-settings-page.js +133 -0
  716. package/dist/ui/parent/qr-page.d.ts +8 -0
  717. package/dist/ui/parent/qr-page.js +66 -0
  718. package/dist/ui/shared/brand.d.ts +38 -0
  719. package/dist/ui/shared/brand.js +53 -0
  720. package/dist/ui/shared/favicon.d.ts +12 -0
  721. package/dist/ui/shared/favicon.js +96 -0
  722. package/dist/ui/shared/icon.d.ts +9 -0
  723. package/dist/ui/shared/icon.js +35 -0
  724. package/dist/ui/shared/inline-lib.d.ts +1 -0
  725. package/dist/ui/shared/inline-lib.js +28 -0
  726. package/dist/ui/shared/logo.d.ts +31 -0
  727. package/dist/ui/shared/logo.js +43 -0
  728. package/dist/ui/shared/page-dom.d.ts +12 -0
  729. package/dist/ui/shared/page-dom.js +36 -0
  730. package/dist/ui/shared/png.d.ts +1 -0
  731. package/dist/ui/shared/png.js +45 -0
  732. package/dist/ui/shared/qr-svg.d.ts +3 -0
  733. package/dist/ui/shared/qr-svg.js +32 -0
  734. package/dist/ui/shared/qr.d.ts +14 -0
  735. package/dist/ui/shared/qr.js +281 -0
  736. package/dist/ui/shared/reel-dock.d.ts +22 -0
  737. package/dist/ui/shared/reel-dock.js +365 -0
  738. package/dist/ui/shared/tutor-color.d.ts +15 -0
  739. package/dist/ui/shared/tutor-color.js +47 -0
  740. package/dist/ui/talk/page.d.ts +6 -0
  741. package/dist/ui/talk/page.js +294 -0
  742. package/grades/grade-2/README.md +11 -0
  743. package/grades/grade-2/VALIDATION.md +41 -0
  744. package/grades/grade-2/agents/chinese-tutor/activities//344/275/240/350/257/264/346/210/221/347/224/273.md +157 -0
  745. 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
  746. 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
  747. 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
  748. package/grades/grade-2/agents/chinese-tutor/activities//345/206/231/350/257/235.md +64 -0
  749. package/grades/grade-2/agents/chinese-tutor/activities//345/206/231/350/257/235./344/276/213/345/255/220.md +31 -0
  750. package/grades/grade-2/agents/chinese-tutor/activities//345/220/254/345/206/231.md +48 -0
  751. package/grades/grade-2/agents/chinese-tutor/activities//345/244/215/344/271/240.md +79 -0
  752. package/grades/grade-2/agents/chinese-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
  753. package/grades/grade-2/agents/chinese-tutor/activities//345/260/217/350/257/276/345/240/202.md +53 -0
  754. package/grades/grade-2/agents/chinese-tutor/activities//346/243/200/346/237/245/344/275/234/344/270/232.md +81 -0
  755. package/grades/grade-2/agents/chinese-tutor/activities//346/243/200/346/237/245/344/275/234/344/270/232./344/276/213/345/255/220.md +35 -0
  756. package/grades/grade-2/agents/chinese-tutor/activities//347/234/213/345/233/276/350/257/264/350/257/235.md +94 -0
  757. 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
  758. package/grades/grade-2/agents/chinese-tutor/activities//351/242/204/344/271/240.md +82 -0
  759. package/grades/grade-2/agents/chinese-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
  760. package/grades/grade-2/agents/chinese-tutor.md +59 -0
  761. package/grades/grade-2/agents/english-tutor/activities//345/217/243/350/257/255/350/257/276.md +149 -0
  762. 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
  763. package/grades/grade-2/agents/english-tutor/activities//345/220/254/345/206/231.md +47 -0
  764. package/grades/grade-2/agents/english-tutor/activities//345/244/215/344/271/240.md +78 -0
  765. package/grades/grade-2/agents/english-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
  766. package/grades/grade-2/agents/english-tutor/activities//345/260/217/350/257/276/345/240/202.md +53 -0
  767. package/grades/grade-2/agents/english-tutor/activities//346/243/200/346/237/245/344/275/234/344/270/232.md +80 -0
  768. package/grades/grade-2/agents/english-tutor/activities//346/243/200/346/237/245/344/275/234/344/270/232./344/276/213/345/255/220.md +35 -0
  769. package/grades/grade-2/agents/english-tutor/activities//351/242/204/344/271/240.md +86 -0
  770. package/grades/grade-2/agents/english-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
  771. package/grades/grade-2/agents/english-tutor.md +57 -0
  772. package/grades/grade-2/agents/math-tutor/activities//345/244/215/344/271/240.md +78 -0
  773. package/grades/grade-2/agents/math-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
  774. package/grades/grade-2/agents/math-tutor/activities//345/260/217/350/257/276/345/240/202.md +56 -0
  775. 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
  776. package/grades/grade-2/agents/math-tutor/activities//346/243/200/346/237/245/344/275/234/344/270/232.md +80 -0
  777. package/grades/grade-2/agents/math-tutor/activities//346/243/200/346/237/245/344/275/234/344/270/232./344/276/213/345/255/220.md +35 -0
  778. package/grades/grade-2/agents/math-tutor/activities//351/242/204/344/271/240.md +81 -0
  779. package/grades/grade-2/agents/math-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
  780. package/grades/grade-2/agents/math-tutor.md +51 -0
  781. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/index.json +44 -0
  782. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-1.mp3 +0 -0
  783. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-2.mp3 +0 -0
  784. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-3.mp3 +0 -0
  785. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-4.mp3 +0 -0
  786. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-5.mp3 +0 -0
  787. package/grades/grade-2/examples/2026-10-27-pingjunfen/bake.json +1 -0
  788. package/grades/grade-2/examples/2026-10-27-pingjunfen/manifest.json +63 -0
  789. package/grades/grade-2/examples/2026-10-27-pingjunfen/scene.json +247 -0
  790. package/grades/grade-2/examples/2026-10-27-pingjunfen.md +40 -0
  791. package/grades/grade-2/examples/2026-10-27-pingjunfen.ts +26 -0
  792. package/grades/grade-2/examples//345/271/263/345/235/207/345/210/206./344/276/213/345/255/220.md +24 -0
  793. package/grades/grade-2/examples//346/225/260/345/255/246/345/271/263/345/235/207/345/210/206.md +42 -0
  794. package/grades/grade-2/validation/2026-10-27.json +4410 -0
  795. package/package.json +27 -15
  796. package/skills/chalk-cli/SKILL.md +62 -0
  797. package/skills/chalk-scene/SKILL.md +91 -0
  798. package/skills/chalk-teaching/SKILL.md +82 -0
  799. 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
  800. package/skills/chalk-teaching/models//345/207/221/345/215/201.md +7 -0
  801. package/skills/chalk-teaching/models//345/221/250/346/234/237/350/247/204/345/276/213.md +6 -0
  802. package/skills/chalk-teaching/models//345/256/236/347/211/251/345/233/276-/345/242/236/345/207/217.md +6 -0
  803. 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
  804. 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
  805. package/skills/chalk-teaching/models//345/260/217/346/243/222/350/277/233/344/275/215/345/212/240.md +7 -0
  806. package/skills/chalk-teaching/models//345/260/217/346/243/222/351/200/200/344/275/215/345/207/217.md +6 -0
  807. package/skills/chalk-teaching/models//346/216/222/351/230/237/347/202/271/351/230/265.md +7 -0
  808. package/skills/chalk-teaching/models//346/227/266/351/227/264/346/225/260/350/275/264.md +6 -0
  809. package/skills/chalk-teaching/models//346/245/274/345/261/202/351/227/264/351/232/224/345/233/276.md +7 -0
  810. package/skills/chalk-teaching/models//347/240/264/345/215/201.md +7 -0
  811. package/skills/chalk-teaching/models//347/253/226/345/274/217/351/200/200/344/275/215.md +6 -0
  812. package/skills/chalk-teaching/models//347/272/277/346/256/265/345/233/276.md +7 -0
  813. package/skills/chalk-teaching/models-index.md +24 -0
  814. 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
  815. package/skills/chalk-teaching/references//350/257/264/346/230/216/346/226/207/344/273/266.md +102 -0
  816. package/skills/chalk-verify/SKILL.md +57 -0
  817. package/skills/chalk-verify/references//350/257/204/345/210/244/346/240/207/345/207/206.md +69 -0
  818. package/skills/cotutor-analyze/SKILL.md +106 -0
  819. package/skills/cotutor-analyze/references//345/221/275/344/273/244/344/270/216/346/226/207/344/273/266.md +31 -0
  820. package/skills/cotutor-board/SKILL.md +373 -0
  821. package/skills/cotutor-board/references/README.md +38 -0
  822. package/skills/cotutor-board/references/canvas.md +68 -0
  823. package/skills/cotutor-board/references/choice.md +55 -0
  824. package/skills/cotutor-board/references/code.md +46 -0
  825. package/skills/cotutor-board/references/image.md +52 -0
  826. package/skills/cotutor-board/references/lecture.md +69 -0
  827. package/skills/cotutor-board/references/paint.md +77 -0
  828. package/skills/cotutor-board/references/photo.md +61 -0
  829. package/skills/cotutor-board/references/read.md +51 -0
  830. package/skills/cotutor-board/references/text.md +69 -0
  831. package/skills/cotutor-board/references/tianzige.md +78 -0
  832. package/skills/cotutor-board/references/word.md +91 -0
  833. package/skills/cotutor-home/SKILL.md +170 -0
  834. package/skills/cotutor-home/references/dictation.md +97 -0
  835. package/skills/cotutor-home/references/tutor.md +149 -0
  836. package/skills/cotutor-home/references//345/221/275/344/273/244.md +21 -0
  837. package/skills/cotutor-home/references//351/246/226/351/241/265/350/257/255/346/263/225.md +143 -0
  838. package/skills/cotutor-tune/SKILL.md +147 -0
  839. package/skills/cotutor-tune/references//345/255/227/346/256/265.md +53 -0
  840. package/skills/cotutor-tutor/SKILL.md +253 -0
  841. package/skills/cotutor-tutor/references//344/270/212/344/270/213/346/226/207/345/214/205.md +78 -0
  842. package/themes/default/kid.css +86 -0
  843. package/themes/default/theme.json +26 -0
  844. package/agents/chinese-tutor.md +0 -67
  845. package/agents/homework-tutor.md +0 -17
  846. package/agents/math-tutor.md +0 -68
  847. package/agents/planner.md +0 -18
  848. package/agents/reading-tutor.md +0 -65
  849. package/agents/scene-maker.md +0 -41
  850. package/dist/cards/canvas.d.ts +0 -22
  851. package/dist/cards/canvas.js +0 -65
  852. package/dist/cards/fill.d.ts +0 -14
  853. package/dist/cards/fill.js +0 -64
  854. package/dist/cards/index.d.ts +0 -48
  855. package/dist/cards/index.js +0 -115
  856. package/dist/cards/kind.js +0 -7
  857. package/dist/cards/scene.d.ts +0 -24
  858. package/dist/cards/scene.js +0 -67
  859. package/dist/cards/text.d.ts +0 -18
  860. package/dist/cards/text.js +0 -41
  861. package/dist/cli/cert.d.ts +0 -7
  862. package/dist/cli/cert.js +0 -36
  863. package/dist/cli/doctor.d.ts +0 -22
  864. package/dist/cli/doctor.js +0 -355
  865. package/dist/cli/init.js +0 -116
  866. package/dist/cli/main.js +0 -243
  867. package/dist/cli/serve.d.ts +0 -30
  868. package/dist/cli/serve.js +0 -56
  869. package/dist/cli/skeleton.d.ts +0 -39
  870. package/dist/cli/skeleton.js +0 -184
  871. package/dist/cli/skills.d.ts +0 -40
  872. package/dist/cli/skills.js +0 -170
  873. package/dist/cli/workspace.d.ts +0 -69
  874. package/dist/lib/agent-file.d.ts +0 -10
  875. package/dist/lib/agent-file.js +0 -16
  876. package/dist/lib/board.d.ts +0 -15
  877. package/dist/lib/board.js +0 -107
  878. package/dist/lib/context-pack.js +0 -55
  879. package/dist/lib/conversation.js +0 -88
  880. package/dist/lib/kid-board.d.ts +0 -148
  881. package/dist/lib/kid-board.js +0 -294
  882. package/dist/lib/kid-view.d.ts +0 -63
  883. package/dist/lib/kid-view.js +0 -93
  884. package/dist/lib/ledger.d.ts +0 -29
  885. package/dist/lib/run-plan.d.ts +0 -30
  886. package/dist/lib/run-plan.js +0 -32
  887. package/dist/lib/sections.d.ts +0 -12
  888. package/dist/lib/sections.js +0 -151
  889. package/dist/lib/stream.d.ts +0 -15
  890. package/dist/lib/stream.js +0 -69
  891. package/dist/lib/transcript.d.ts +0 -36
  892. package/dist/lib/transcript.js +0 -95
  893. package/dist/server/app.d.ts +0 -74
  894. package/dist/server/app.js +0 -406
  895. package/dist/server/kid-page.d.ts +0 -1
  896. package/dist/server/kid-page.js +0 -768
  897. package/dist/server/mock.js +0 -403
  898. package/dist/server/parent-page.d.ts +0 -8
  899. package/dist/server/parent-page.js +0 -393
  900. package/dist/server/runner.d.ts +0 -64
  901. package/dist/server/runner.js +0 -277
  902. package/dist/server/scene-props.d.ts +0 -16
  903. package/dist/server/scene-props.js +0 -39
  904. package/dist/server/store.d.ts +0 -43
  905. package/dist/server/store.js +0 -210
  906. package/dist/server/tts.d.ts +0 -51
  907. package/dist/server/tts.js +0 -99
  908. /package/dist/{cli → app/cli}/main.d.ts +0 -0
  909. /package/dist/{cards → board/cards}/choice.d.ts +0 -0
  910. /package/dist/{cards → board/cards}/code.d.ts +0 -0
  911. /package/dist/{cards → board/cards}/image.d.ts +0 -0
  912. /package/dist/{cards → board/cards}/read.d.ts +0 -0
@@ -1,148 +0,0 @@
1
- /**
2
- * 板书(孩子端老师页)的纯逻辑:卡片 JSON 契约、标注锚点、播放状态机、字幕行与输入条的状态。
3
- * 这份文件两处共用:服务端(解析器、测试)与孩子端页面——kid-page.ts 把它剥掉类型内联进 <script>,
4
- * 所以**不能有运行时 import、不能碰 DOM、不能用 enum / namespace**(Node 的 stripTypeScriptTypes 只剥类型)。
5
- *
6
- * 契约的分工(《板书卡片设计.md》):老师写「段落 = 讲稿,围栏 = 卡」的正文,服务端(src/lib/board.ts + src/cards/)解析成
7
- * 下面的 BoardSection JSON 放进对话索引;孩子端只认 JSON。卡 = {kind, props},每种卡的 props 契约在 src/cards/<kind>.ts;
8
- * 这里只知道每种卡「哪些字能被标注、笔是什么样」,不认识的 kind 也有兜底。
9
- */
10
- /**
11
- * 一张卡:kind 是种类(text / read / choice / fill / image / code…),props 由那种卡自己定;state 是孩子在卡上做的事(存服务端,形状由那种卡定);
12
- * assets 是已经生成好的配音文件(相对 conversations/<老师>/,如 2026-09-10.1620-1.cards/2/1.mp3),点读段按 <段号>.mp3 找
13
- */
14
- export interface BoardCard {
15
- kind: string;
16
- props: Record<string, unknown>;
17
- state?: unknown;
18
- assets?: string[];
19
- }
20
- /** 一处敲黑板:第几张卡上的哪个词 */
21
- export interface BoardMark {
22
- card: number;
23
- phrase: string;
24
- }
25
- /** 讲到这句时对某张卡做的事(讲稿里 [[名 参数]]):open / close / play… 页面按卡的种类执行,不认识的忽略 */
26
- export interface BoardCue {
27
- card: number;
28
- name: string;
29
- arg?: string;
30
- }
31
- /** 讲稿的一句:配音文件(没有 = 浏览器合成)、这句念到时要画的标注、是不是问句(末句问句 → 停下等)、锚到上一张卡 */
32
- export interface BoardLine {
33
- text: string;
34
- audio: string | null;
35
- marks: BoardMark[];
36
- ask: boolean;
37
- /** 这句上面最近的一张卡(没有 = null);播到这句就滚到它,不依赖老师打括号 */
38
- anchor: number | null;
39
- cues: BoardCue[];
40
- }
41
- /** 一节板书 = 一轮回复:卡整块铺,讲稿逐句播;partial = 还在流式生成 */
42
- export interface BoardSection {
43
- cards: BoardCard[];
44
- lines: BoardLine[];
45
- partial?: boolean;
46
- }
47
- /** 一张卡上所有能被标注的文字;不认识的 kind 拿 props 里所有字符串 */
48
- export declare function cardTexts(card: BoardCard): string[];
49
- /** 讲稿里方括号的词落到哪张卡:第一张含这个词的卡;找不到的词丢掉(只出字幕,不报错) */
50
- export declare function anchorMarks(cards: readonly BoardCard[], phrases: readonly string[]): BoardMark[];
51
- /** 讲稿一句里的 [词] → 词列表;顺序保留 */
52
- export declare function phrasesIn(line: string): string[];
53
- /** 去掉讲稿一句里的方括号(念的时候不念括号) */
54
- export declare function plainLine(line: string): string;
55
- export type MarkStyle = 'marker' | 'circle' | 'wave' | 'box' | 'green';
56
- /** 笔的样子按卡定:封面 / 要记住的话 / 点读段涂荧光笔,算式与步骤绿底,选项与填空加框,其余波浪线 */
57
- export declare function markStyle(card: BoardCard): MarkStyle;
58
- /** 有舞台交互(能改状态、能「交给老师」)的种类;其余点开只是放大看 */
59
- export declare function hasState(card: BoardCard): boolean;
60
- /** 画板上画了几笔(状态里的 ink 元素数) */
61
- export declare function inkCount(card: BoardCard): number;
62
- /** 重卡:舞台在 iframe 里的舞台包(/stage/)开,页面只管顶栏、字幕行、输入条 */
63
- export declare function isHeavy(card: BoardCard): boolean;
64
- /** 场景卡能不能播(课包到了);没到紧凑态写「图还在路上」 */
65
- export declare function sceneReady(card: BoardCard): boolean;
66
- export type ScenePhase = 'loading' | 'ready' | 'drawing' | 'gap' | 'done' | 'paused';
67
- /** 舞台里场景在播时的字幕行:讲稿句是场景的,右侧按钮映射到播放器(drawing → 暂停;gap / ready / paused → 继续 / 播放;done → 没钮) */
68
- export declare function sceneSubtitle(phase: ScenePhase, line: string, step: number, total: number): SubtitleView;
69
- /** 点读第 k 段(0 起)的配音文件(相对 conversations/<老师>/);没生成好 → null(退浏览器合成声) */
70
- export declare function segmentAudio(card: BoardCard, k: number): string | null;
71
- /** 填空当前填了什么(按空的顺序;没填的空是空串) */
72
- export declare function filledAnswers(card: BoardCard): string[];
73
- /** 孩子在这张卡上做了什么(「交给老师」能不能按、字幕行回显用):选择题是选项,填空是填的字;没做 → [] */
74
- export declare function stateSummary(card: BoardCard): string[];
75
- /** 舞台顶栏的名字:文字卡的标题 / 正文、选择题的问题、其余第一段有字的;截 24 字 */
76
- export declare function cardTitle(card: BoardCard): string;
77
- /** 选择题:点第 i 项后的选中集合——单选换成它(再点取消),多选切换 */
78
- export declare function togglePick(picked: readonly number[], i: number, multi: boolean): number[];
79
- /** 选择题当前选了什么(回显与紧凑态用):「B 三个」 */
80
- export declare function pickedLabels(card: BoardCard): string[];
81
- export declare function isQuestion(text: string): boolean;
82
- /** 孩子端条目里页面用到的字段(与 kid-view 的 KidMessage 兼容) */
83
- export interface BoardMessage {
84
- job: string;
85
- question: string | null;
86
- reply: string | null;
87
- audio: string | null;
88
- pending: boolean;
89
- section?: BoardSection | null;
90
- }
91
- export interface BoardEntry extends BoardSection {
92
- job: string;
93
- /** 老师还在说:卡只增不改,讲稿不播;整轮跑完换成正式的一节 */
94
- partial?: boolean;
95
- }
96
- /**
97
- * 孩子端条目 → 板书节。有 section 用 section(讲稿空就把 reply 当一句);只有 reply 的退成一张文字卡 + 一句讲稿;
98
- * 孩子的话不上板;还在跑的只有带 partial 板书(流式,已有卡)才出节且标 partial,其余不出。
99
- */
100
- export declare function sectionsFromMessages(messages: readonly BoardMessage[]): BoardEntry[];
101
- /** 一节在目录里的名字:封面标题 > 有名字的文字卡 > 第一张有字的卡 > 第一句讲稿;截到 14 个字 */
102
- export declare function sectionTitle(s: BoardSection): string;
103
- /** stage = 讲稿把这句交给了场景卡的舞台([[play]]),等它 done */
104
- export type PlayStatus = 'idle' | 'playing' | 'paused' | 'waiting' | 'done' | 'stage';
105
- export interface PlayerState {
106
- section: number;
107
- line: number;
108
- status: PlayStatus;
109
- }
110
- /** 打开页面时的位置:停在最后一节末尾;末句是问句就等着(继续钮在) */
111
- export declare function playerAtEnd(sections: readonly BoardSection[]): PlayerState;
112
- /** 新来一节:从它第一句开始播;没讲稿就直接算完 */
113
- export declare function startSection(index: number, sections: readonly BoardSection[]): PlayerState;
114
- /**
115
- * 一句播完往下走:同节还有句 → 下一句;没了 → 有下一节就进下一节(孩子已经答过了,不用等);
116
- * 没下一节且末句是问句 → 停下等;否则完。
117
- */
118
- export declare function advance(state: PlayerState, sections: readonly BoardSection[]): PlayerState;
119
- /** 当前节里播到这句为止该画上的标注(打开页面或跳到某句时一次画齐) */
120
- export declare function marksUpTo(sections: readonly BoardSection[], state: PlayerState): BoardMark[];
121
- /** 播到这句该滚到哪张卡:标注所在的卡优先,其次锚点卡,再没有就 null(页面滚到本节第一张) */
122
- export declare function lineTarget(line: BoardLine): number | null;
123
- export interface SubtitleInput {
124
- state: PlayerState;
125
- sections: readonly BoardSection[];
126
- /** 孩子刚说的话,短暂回显(拍板 2026-09-10) */
127
- echo: string | null;
128
- pending: boolean;
129
- /** 等老师时那句人设话 */
130
- thinking: string;
131
- limit: boolean;
132
- }
133
- export interface SubtitleView {
134
- text: string;
135
- kind: 'line' | 'echo' | 'thinking' | 'limit' | 'empty';
136
- right: 'pause' | 'play' | 'continue' | 'none';
137
- }
138
- /** 字幕行:上限 > 回显孩子的话 > 等老师 > 当前句(按播放状态定右侧的钮) */
139
- export declare function subtitleFor(i: SubtitleInput): SubtitleView;
140
- export type BarMode = 'idle' | 'typing' | 'holding';
141
- export type BarEvent = 'tap' | 'holdStart' | 'holdEnd' | 'holdCancel' | 'sent' | 'blur';
142
- /** 输入条中间那段:点 → 打字;按住 → 说话;松手 / 上滑取消 / 发出 / 失焦 → 回到闲置 */
143
- export declare function barNext(mode: BarMode, ev: BarEvent): BarMode;
144
- export type Layout = 'phone' | 'tablet';
145
- /** 平板横屏才用两列板书;竖屏与手机一律单列 */
146
- export declare function layoutFor(width: number, height: number): Layout;
147
- /** 没配音也没浏览器合成时,一句停多久(毫秒):按字数估 */
148
- export declare function lineDurationMs(text: string): number;
@@ -1,294 +0,0 @@
1
- /**
2
- * 板书(孩子端老师页)的纯逻辑:卡片 JSON 契约、标注锚点、播放状态机、字幕行与输入条的状态。
3
- * 这份文件两处共用:服务端(解析器、测试)与孩子端页面——kid-page.ts 把它剥掉类型内联进 <script>,
4
- * 所以**不能有运行时 import、不能碰 DOM、不能用 enum / namespace**(Node 的 stripTypeScriptTypes 只剥类型)。
5
- *
6
- * 契约的分工(《板书卡片设计.md》):老师写「段落 = 讲稿,围栏 = 卡」的正文,服务端(src/lib/board.ts + src/cards/)解析成
7
- * 下面的 BoardSection JSON 放进对话索引;孩子端只认 JSON。卡 = {kind, props},每种卡的 props 契约在 src/cards/<kind>.ts;
8
- * 这里只知道每种卡「哪些字能被标注、笔是什么样」,不认识的 kind 也有兜底。
9
- */
10
- const str = (v) => (typeof v === 'string' ? v : '');
11
- const strs = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === 'string') : []);
12
- /** 一张卡上所有能被标注的文字;不认识的 kind 拿 props 里所有字符串 */
13
- export function cardTexts(card) {
14
- const p = card.props || {};
15
- switch (card.kind) {
16
- case 'text':
17
- return [str(p.title), str(p.text)];
18
- case 'read':
19
- return strs(p.segments);
20
- case 'choice':
21
- return [str(p.question), ...strs(p.options)];
22
- case 'fill':
23
- return [str(p.text)];
24
- case 'code':
25
- return [str(p.text)];
26
- case 'image':
27
- return [str(p.caption)];
28
- case 'scene':
29
- return [str(p.title), str(p.problem), str(p.text)];
30
- case 'canvas':
31
- return [str(p.prompt)];
32
- default:
33
- return Object.values(p).flatMap((v) => (typeof v === 'string' ? [v] : strs(v)));
34
- }
35
- }
36
- /** 讲稿里方括号的词落到哪张卡:第一张含这个词的卡;找不到的词丢掉(只出字幕,不报错) */
37
- export function anchorMarks(cards, phrases) {
38
- const out = [];
39
- for (const raw of phrases) {
40
- const phrase = raw.trim();
41
- if (!phrase)
42
- continue;
43
- const card = cards.findIndex((c) => cardTexts(c).some((t) => t.includes(phrase)));
44
- if (card >= 0)
45
- out.push({ card, phrase });
46
- }
47
- return out;
48
- }
49
- /** 讲稿一句里的 [词] → 词列表;顺序保留 */
50
- export function phrasesIn(line) {
51
- const out = [];
52
- const re = /\[([^\[\]]+)\]/g;
53
- let m;
54
- while ((m = re.exec(line)))
55
- out.push(m[1]);
56
- return out;
57
- }
58
- /** 去掉讲稿一句里的方括号(念的时候不念括号) */
59
- export function plainLine(line) {
60
- return line.replace(/\[([^\[\]]+)\]/g, '$1');
61
- }
62
- /** 笔的样子按卡定:封面 / 要记住的话 / 点读段涂荧光笔,算式与步骤绿底,选项与填空加框,其余波浪线 */
63
- export function markStyle(card) {
64
- const style = str((card.props || {}).style);
65
- switch (card.kind) {
66
- case 'text':
67
- return style === 'cover' || style === 'note' ? 'marker' : style === 'formula' || style === 'step' ? 'green' : 'wave';
68
- case 'read':
69
- return 'marker';
70
- case 'choice':
71
- case 'fill':
72
- return 'box';
73
- default:
74
- return 'wave';
75
- }
76
- }
77
- /** 有舞台交互(能改状态、能「交给老师」)的种类;其余点开只是放大看 */
78
- export function hasState(card) {
79
- return card.kind === 'choice' || card.kind === 'fill' || card.kind === 'canvas';
80
- }
81
- /** 画板上画了几笔(状态里的 ink 元素数) */
82
- export function inkCount(card) {
83
- const st = card.state;
84
- return Array.isArray(st?.ink) ? st.ink.length : 0;
85
- }
86
- /** 重卡:舞台在 iframe 里的舞台包(/stage/)开,页面只管顶栏、字幕行、输入条 */
87
- export function isHeavy(card) {
88
- return card.kind === 'scene' || card.kind === 'canvas';
89
- }
90
- /** 场景卡能不能播(课包到了);没到紧凑态写「图还在路上」 */
91
- export function sceneReady(card) {
92
- return card.kind === 'scene' && (card.props || {}).ready === true;
93
- }
94
- /** 舞台里场景在播时的字幕行:讲稿句是场景的,右侧按钮映射到播放器(drawing → 暂停;gap / ready / paused → 继续 / 播放;done → 没钮) */
95
- export function sceneSubtitle(phase, line, step, total) {
96
- switch (phase) {
97
- case 'drawing':
98
- return { text: line, kind: 'line', right: 'pause' };
99
- case 'gap':
100
- return { text: line, kind: 'line', right: step >= total ? 'none' : 'continue' };
101
- case 'ready':
102
- return { text: line, kind: 'line', right: 'play' };
103
- case 'paused':
104
- return { text: line, kind: 'line', right: 'play' };
105
- case 'done':
106
- return { text: line, kind: 'line', right: 'none' };
107
- default:
108
- return { text: '', kind: 'empty', right: 'none' };
109
- }
110
- }
111
- /** 点读第 k 段(0 起)的配音文件(相对 conversations/<老师>/);没生成好 → null(退浏览器合成声) */
112
- export function segmentAudio(card, k) {
113
- const want = `/${k + 1}.mp3`;
114
- return (card.assets || []).find((a) => a.endsWith(want)) ?? null;
115
- }
116
- /** 填空当前填了什么(按空的顺序;没填的空是空串) */
117
- export function filledAnswers(card) {
118
- const blanks = typeof (card.props || {}).blanks === 'number' ? card.props.blanks : 0;
119
- const st = card.state;
120
- const got = Array.isArray(st?.answers) ? st.answers.map((x) => (typeof x === 'string' ? x.trim() : '')) : [];
121
- return Array.from({ length: blanks }, (_, i) => got[i] ?? '');
122
- }
123
- /** 孩子在这张卡上做了什么(「交给老师」能不能按、字幕行回显用):选择题是选项,填空是填的字;没做 → [] */
124
- export function stateSummary(card) {
125
- if (card.kind === 'choice')
126
- return pickedLabels(card);
127
- if (card.kind === 'fill')
128
- return filledAnswers(card).filter(Boolean);
129
- if (card.kind === 'canvas')
130
- return inkCount(card) ? [`画了 ${inkCount(card)} 笔`] : [];
131
- return [];
132
- }
133
- /** 舞台顶栏的名字:文字卡的标题 / 正文、选择题的问题、其余第一段有字的;截 24 字 */
134
- export function cardTitle(card) {
135
- const p = card.props || {};
136
- const first = str(p.title) || str(p.question) || str(p.text) || str(p.caption) || str(p.prompt) || strs(p.segments)[0] || cardTexts(card).find((t) => t.trim()) || (card.kind === 'image' ? '图' : card.kind === 'canvas' ? '画一画' : '');
137
- const cps = Array.from(first.trim().replace(/\s+/g, ' '));
138
- return cps.length > 24 ? `${cps.slice(0, 24).join('')}…` : cps.join('');
139
- }
140
- const LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
141
- /** 选择题:点第 i 项后的选中集合——单选换成它(再点取消),多选切换 */
142
- export function togglePick(picked, i, multi) {
143
- if (picked.includes(i))
144
- return picked.filter((x) => x !== i);
145
- return multi ? [...picked, i] : [i];
146
- }
147
- /** 选择题当前选了什么(回显与紧凑态用):「B 三个」 */
148
- export function pickedLabels(card) {
149
- const options = strs((card.props || {}).options);
150
- const st = card.state;
151
- const picked = Array.isArray(st?.picked) ? st.picked.filter((x) => typeof x === 'number') : [];
152
- return picked.filter((i) => i >= 0 && i < options.length).map((i) => `${LETTERS[i] ?? i + 1} ${options[i]}`);
153
- }
154
- export function isQuestion(text) {
155
- const t = text.trim();
156
- return t.endsWith('?') || t.endsWith('?');
157
- }
158
- function lineFrom(text, audio) {
159
- return { text, audio, marks: [], ask: isQuestion(text), anchor: null, cues: [] };
160
- }
161
- /**
162
- * 孩子端条目 → 板书节。有 section 用 section(讲稿空就把 reply 当一句);只有 reply 的退成一张文字卡 + 一句讲稿;
163
- * 孩子的话不上板;还在跑的只有带 partial 板书(流式,已有卡)才出节且标 partial,其余不出。
164
- */
165
- export function sectionsFromMessages(messages) {
166
- const out = [];
167
- for (const m of messages) {
168
- if (m.pending) {
169
- if (m.section && m.section.partial && m.section.cards.length)
170
- out.push({ job: m.job, cards: m.section.cards, lines: m.section.lines, partial: true });
171
- continue;
172
- }
173
- if (m.section && (m.section.cards.length || m.section.lines.length)) {
174
- const lines = m.section.lines.length ? m.section.lines : m.reply ? [lineFrom(m.reply, m.audio)] : [];
175
- out.push({ job: m.job, cards: m.section.cards, lines });
176
- }
177
- else if (m.reply)
178
- out.push({ job: m.job, cards: [{ kind: 'text', props: { text: m.reply } }], lines: [lineFrom(m.reply, m.audio)] });
179
- }
180
- return out;
181
- }
182
- /** 一节在目录里的名字:封面标题 > 有名字的文字卡 > 第一张有字的卡 > 第一句讲稿;截到 14 个字 */
183
- export function sectionTitle(s) {
184
- const pick = () => {
185
- for (const c of s.cards)
186
- if (c.kind === 'text' && c.props.style === 'cover' && str(c.props.title))
187
- return str(c.props.title);
188
- for (const c of s.cards)
189
- if (c.kind === 'text' && str(c.props.title))
190
- return str(c.props.title);
191
- for (const c of s.cards) {
192
- const t = cardTexts(c).find((x) => x.trim());
193
- if (t)
194
- return t;
195
- }
196
- return s.lines[0]?.text ?? '';
197
- };
198
- const cps = Array.from(pick().trim());
199
- return cps.length > 14 ? `${cps.slice(0, 14).join('')}…` : cps.join('');
200
- }
201
- /** 打开页面时的位置:停在最后一节末尾;末句是问句就等着(继续钮在) */
202
- export function playerAtEnd(sections) {
203
- if (!sections.length)
204
- return { section: -1, line: -1, status: 'idle' };
205
- const section = sections.length - 1;
206
- const line = sections[section].lines.length - 1;
207
- const last = sections[section].lines[line];
208
- return { section, line, status: last && last.ask ? 'waiting' : 'done' };
209
- }
210
- /** 新来一节:从它第一句开始播;没讲稿就直接算完 */
211
- export function startSection(index, sections) {
212
- const s = sections[index];
213
- if (!s || !s.lines.length)
214
- return { section: index, line: -1, status: 'done' };
215
- return { section: index, line: 0, status: 'playing' };
216
- }
217
- /**
218
- * 一句播完往下走:同节还有句 → 下一句;没了 → 有下一节就进下一节(孩子已经答过了,不用等);
219
- * 没下一节且末句是问句 → 停下等;否则完。
220
- */
221
- export function advance(state, sections) {
222
- const s = sections[state.section];
223
- if (!s)
224
- return { ...state, status: 'done' };
225
- if (state.line < s.lines.length - 1)
226
- return { section: state.section, line: state.line + 1, status: 'playing' };
227
- if (state.section < sections.length - 1)
228
- return startSection(state.section + 1, sections);
229
- const last = s.lines[state.line];
230
- return { ...state, status: last && last.ask ? 'waiting' : 'done' };
231
- }
232
- /** 当前节里播到这句为止该画上的标注(打开页面或跳到某句时一次画齐) */
233
- export function marksUpTo(sections, state) {
234
- const s = sections[state.section];
235
- if (!s || state.line < 0)
236
- return [];
237
- return s.lines.slice(0, state.line + 1).flatMap((l) => l.marks);
238
- }
239
- /** 播到这句该滚到哪张卡:标注所在的卡优先,其次锚点卡,再没有就 null(页面滚到本节第一张) */
240
- export function lineTarget(line) {
241
- if (line.marks.length)
242
- return line.marks[line.marks.length - 1].card;
243
- return line.anchor;
244
- }
245
- /** 字幕行:上限 > 回显孩子的话 > 等老师 > 当前句(按播放状态定右侧的钮) */
246
- export function subtitleFor(i) {
247
- if (i.limit)
248
- return { text: '今天聊够啦,明天再来', kind: 'limit', right: 'none' };
249
- if (i.echo)
250
- return { text: i.echo, kind: 'echo', right: 'none' };
251
- if (i.pending)
252
- return { text: i.thinking, kind: 'thinking', right: 'none' };
253
- const line = i.sections[i.state.section]?.lines[i.state.line];
254
- const text = line ? plainLine(line.text) : '';
255
- switch (i.state.status) {
256
- case 'playing':
257
- return { text, kind: 'line', right: 'pause' };
258
- case 'paused':
259
- return { text, kind: 'line', right: 'play' };
260
- case 'waiting':
261
- return { text, kind: 'line', right: 'continue' };
262
- case 'done':
263
- return { text, kind: text ? 'line' : 'empty', right: 'none' };
264
- case 'stage':
265
- return { text, kind: 'line', right: 'none' };
266
- default:
267
- return { text: '', kind: 'empty', right: 'none' };
268
- }
269
- }
270
- /** 输入条中间那段:点 → 打字;按住 → 说话;松手 / 上滑取消 / 发出 / 失焦 → 回到闲置 */
271
- export function barNext(mode, ev) {
272
- switch (ev) {
273
- case 'holdStart':
274
- return 'holding';
275
- case 'holdEnd':
276
- case 'holdCancel':
277
- return mode === 'holding' ? 'idle' : mode;
278
- case 'tap':
279
- return mode === 'idle' ? 'typing' : mode;
280
- case 'sent':
281
- case 'blur':
282
- return 'idle';
283
- default:
284
- return mode;
285
- }
286
- }
287
- /** 平板横屏才用两列板书;竖屏与手机一律单列 */
288
- export function layoutFor(width, height) {
289
- return width >= 900 && width > height ? 'tablet' : 'phone';
290
- }
291
- /** 没配音也没浏览器合成时,一句停多久(毫秒):按字数估 */
292
- export function lineDurationMs(text) {
293
- return Math.max(1200, Array.from(plainLine(text)).length * 260);
294
- }
@@ -1,63 +0,0 @@
1
- import type { ConversationMessage, Handoff, HoldupAsk } from '../schema/index.ts';
2
- import type { CardAssets, CardStates } from './conversation.ts';
3
- import type { BoardSection } from './kid-board.ts';
4
- import type { Transcript } from './transcript.ts';
5
- export interface KidView {
6
- /** 给孩子的话(讲稿各句,换行分隔);null = 这次运行没有(出错、还在跑、或最终文本剥完是空的) */
7
- kidText: string | null;
8
- truncated: boolean;
9
- holdup: HoldupAsk | null;
10
- handoff: Handoff | null;
11
- /** 运行是否正常收尾 */
12
- ok: boolean;
13
- /** 板书节(卡 + 讲稿);没有卡也没有讲稿 = null */
14
- section: BoardSection | null;
15
- /** 解析时的提醒(卡没解析成等),家长视图转录里显示 */
16
- warnings: string[];
17
- /** 第一个 H2 起给家长的尾巴(「## 家长」等);没有 = 空串 */
18
- parentText: string;
19
- }
20
- /** 以空行分段,取最后一个非空段(段内换行保留) */
21
- export declare function lastParagraph(text: string): string;
22
- /** 按码点数截断;能在句末断就在句末断(不加省略号),否则硬截加 … */
23
- export declare function truncateReply(text: string, max: number): {
24
- text: string;
25
- truncated: boolean;
26
- };
27
- /**
28
- * 孩子看的正文从哪来(2026-09-10 拍板,两次真跑的教训):`result.result` 只是这轮**最后一段**顶层文本——老师写完板书再用一次工具、再补一句,
29
- * 板书和「## 转交」段就没了。所以正文 = 这轮里**带围栏(卡)或带 H2 固定段的顶层文本段** + **最后一段**(顺序不变,重复不算两次);
30
- * 中间那些「我先看看账本」之类没卡没段的话不进。子代理的话本来就不在顶层。
31
- */
32
- export declare function kidSource(t: Transcript): string | null;
33
- export declare function deriveKidView(t: Transcript, policy: {
34
- replyMaxChars: number;
35
- }): KidView;
36
- /** 孩子端的一条:自己问的话(别人问的不显示)+ 老师给孩子的话 + 配音;出错的运行什么都不出现(问句还在) */
37
- export interface KidMessage {
38
- job: string;
39
- at: string;
40
- /** 孩子自己说的;家长 / 系统发的不给孩子看,为 null */
41
- question: string | null;
42
- /** 老师给孩子的话;还在跑或这轮没有 = null */
43
- reply: string | null;
44
- /** 配音文件名(conversations/<老师>/ 下);没有 = 用浏览器自带的声 */
45
- audio: string | null;
46
- /** 老师还在想 */
47
- pending: boolean;
48
- /** 本次运行新增的产物 id */
49
- artifacts: string[];
50
- /** 板书节(卡 + 讲稿;答案等秘密已剥);没有 = 页面把 reply 当一张文字卡 */
51
- section?: BoardSection | null;
52
- }
53
- /**
54
- * 对话索引 → 孩子端条目(《契约草案.md》§4 的机械过滤在服务端做):不带 result / error / holdup / handoff / 费用 / 家长尾巴;
55
- * 卡上的答案剥掉,孩子自己做的状态(states)与已生成的资产(assets,都从 .cards/ 读)并到卡上。出错的运行:没有 question 的直接不出现;有 question 的只留问句(老师头像不灰,下一条照常)。
56
- */
57
- export declare function kidConversation(index: {
58
- messages: readonly ConversationMessage[];
59
- }, states?: CardStates, assets?: CardAssets): KidMessage[];
60
- /** 今天孩子已发的条数(每日上限按它算;家长发的不算,「继续」不算,交答案算) */
61
- export declare function kidMessageCount(index: {
62
- messages: readonly ConversationMessage[];
63
- }): number;
@@ -1,93 +0,0 @@
1
- /**
2
- * 孩子视图(《cotutor契约草案.md》§4,2026-09-10 改板书):最终文本剥掉「待裁量」「转交」段后,正文就是板书——
3
- * 普通段落是讲稿(一行一句),围栏是卡(src/lib/board.ts 解析);kidText = 讲稿各句拼起来(家长视图的「孩子看到」摘要),
4
- * 每句按 replyMaxChars 截;第一个 H2 起是给家长的尾巴(parentText),孩子看不到。出错什么都不出现。机械规则,不靠模型判断。
5
- * 正文取自 kidSource:带卡 / 带固定段的顶层文本段 + 最后一段(老师板书之后又用了工具也不丢)。
6
- */
7
- import { stripSecrets } from "../cards/index.js";
8
- import { parseBoard } from "./board.js";
9
- import { parseSections } from "./sections.js";
10
- const SENTENCE_END = new Set(['。', '!', '!', '?', '?', ';', ';', '\n']);
11
- /** 以空行分段,取最后一个非空段(段内换行保留) */
12
- export function lastParagraph(text) {
13
- const paras = text
14
- .split(/\n[ \t]*\n+/)
15
- .map((p) => p.trim())
16
- .filter(Boolean);
17
- return paras[paras.length - 1] ?? '';
18
- }
19
- /** 按码点数截断;能在句末断就在句末断(不加省略号),否则硬截加 … */
20
- export function truncateReply(text, max) {
21
- const cps = Array.from(text);
22
- if (cps.length <= max)
23
- return { text, truncated: false };
24
- let cut = -1;
25
- for (let i = Math.min(max, cps.length) - 1; i >= Math.floor(max * 0.4); i--) {
26
- if (SENTENCE_END.has(cps[i])) {
27
- cut = i + 1;
28
- break;
29
- }
30
- }
31
- if (cut > 0)
32
- return { text: cps.slice(0, cut).join('').trim(), truncated: true };
33
- return { text: `${cps.slice(0, max).join('').trim()}…`, truncated: true };
34
- }
35
- const none = (ok, holdup = null, handoff = null) => ({ kidText: null, truncated: false, holdup, handoff, ok, section: null, warnings: [], parentText: '' });
36
- const FENCE_OR_H2 = /^\s*(?:```|~~~|## )/m;
37
- /**
38
- * 孩子看的正文从哪来(2026-09-10 拍板,两次真跑的教训):`result.result` 只是这轮**最后一段**顶层文本——老师写完板书再用一次工具、再补一句,
39
- * 板书和「## 转交」段就没了。所以正文 = 这轮里**带围栏(卡)或带 H2 固定段的顶层文本段** + **最后一段**(顺序不变,重复不算两次);
40
- * 中间那些「我先看看账本」之类没卡没段的话不进。子代理的话本来就不在顶层。
41
- */
42
- export function kidSource(t) {
43
- if (!t.final?.text)
44
- return null;
45
- const last = t.final.text.trim();
46
- const blocks = t.items.filter((i) => i.kind === 'text' && !i.sub).map((i) => i.text.trim());
47
- const kept = blocks.filter((b) => b !== last && FENCE_OR_H2.test(b));
48
- return [...kept, last].join('\n\n');
49
- }
50
- export function deriveKidView(t, policy) {
51
- if (!t.final)
52
- return none(false);
53
- if (!t.final.ok || !t.final.text)
54
- return none(t.final.ok);
55
- const { body, holdup, handoff } = parseSections(kidSource(t) ?? t.final.text);
56
- const board = parseBoard(body);
57
- const { cards, lines } = board.section;
58
- if (!cards.length && !lines.length)
59
- return { ...none(true, holdup, handoff), warnings: board.warnings, parentText: board.tail };
60
- let truncated = false;
61
- const cut = lines.map((l) => {
62
- const r = truncateReply(l.text, policy.replyMaxChars);
63
- truncated = truncated || r.truncated;
64
- return { ...l, text: r.text };
65
- });
66
- const section = { ...board.section, lines: cut };
67
- const kidText = cut.map((l) => l.text).join('\n');
68
- return { kidText: kidText || null, truncated, holdup, handoff, ok: true, section, warnings: board.warnings, parentText: board.tail };
69
- }
70
- /**
71
- * 对话索引 → 孩子端条目(《契约草案.md》§4 的机械过滤在服务端做):不带 result / error / holdup / handoff / 费用 / 家长尾巴;
72
- * 卡上的答案剥掉,孩子自己做的状态(states)与已生成的资产(assets,都从 .cards/ 读)并到卡上。出错的运行:没有 question 的直接不出现;有 question 的只留问句(老师头像不灰,下一条照常)。
73
- */
74
- export function kidConversation(index, states = {}, assets = {}) {
75
- const out = [];
76
- for (const m of index.messages) {
77
- const question = m.from === 'kid' ? m.text : null;
78
- const reply = m.result === 'ok' ? (m.kidText ?? null) : null;
79
- const pending = m.result === 'running';
80
- if (question === null && reply === null && !pending)
81
- continue;
82
- const per = states[m.job];
83
- const files = assets[m.job];
84
- const withState = m.section && (per || files) ? { ...m.section, cards: m.section.cards.map((c, n) => ({ ...c, ...(per?.[n] ? { state: per[n].state } : {}), ...(files?.[n]?.length ? { assets: files[n] } : {}) })) } : m.section;
85
- const section = m.result === 'ok' && withState ? stripSecrets(withState) : undefined;
86
- out.push({ job: m.job, at: m.at, question, reply, audio: reply ? (m.audio ?? null) : null, pending, artifacts: reply ? [...m.artifacts] : [], ...(section ? { section } : {}) });
87
- }
88
- return out;
89
- }
90
- /** 今天孩子已发的条数(每日上限按它算;家长发的不算,「继续」不算,交答案算) */
91
- export function kidMessageCount(index) {
92
- return index.messages.filter((m) => m.from === 'kid' && m.action !== 'continue').length;
93
- }
@@ -1,29 +0,0 @@
1
- /**
2
- * 账本读写的纯函数部分:逐行 JSON + zod,坏行报行号不中断;按 id 折叠,后者为准。
3
- */
4
- import type { z } from 'zod';
5
- import { type Artifact, type ArtifactEvent, type Observation, type ObservationLine } from '../schema/index.ts';
6
- export interface JsonlParse<T> {
7
- rows: T[];
8
- errors: string[];
9
- }
10
- export declare function parseJsonl<T>(text: string, schema: z.ZodType<T>, file?: string): JsonlParse<T>;
11
- export declare const parseObservations: (text: string) => JsonlParse<ObservationLine>;
12
- export declare const parseArtifactEvents: (text: string) => JsonlParse<ArtifactEvent>;
13
- /** 完整行建条目,纠错行改 retracted;顺序按首次出现 */
14
- export declare function mergeObservations(lines: ObservationLine[]): Observation[];
15
- /** 折叠产物事件;首行缺 kind / by 的产物报错(不进结果) */
16
- export declare function mergeArtifacts(events: ArtifactEvent[]): {
17
- artifacts: Artifact[];
18
- errors: string[];
19
- };
20
- /** o-YYYYMMDD-NNN,同日顺延 */
21
- export declare function nextObservationId(date: string, existing: Iterable<string>): string;
22
- /** 上下文包的 recent:未撤回、本学科(没配 subject 就全量)的最近 n 条,按日期与出现顺序,只带 date + claim */
23
- export declare function recentObservations(obs: Observation[], opts: {
24
- subject?: string;
25
- n: number;
26
- }): {
27
- date: string;
28
- claim: string;
29
- }[];
@@ -1,30 +0,0 @@
1
- /**
2
- * 一次运行的命令规划(纯函数):按运行时选 run 还是 resume、填占位符、定 cwd 相对路径。
3
- * 规则:当天索引里已有会话**且**是同一运行时跑出来的 → resume;否则新开(跨天索引本来就是新的,零点后第一条自然不带 --resume;
4
- * 换了运行时也新开——claude 的会话 id qwen 不认)。{agentBody} 只给模板里真用到它的运行时读老师正文。
5
- */
6
- import { type Runtime, type ConversationIndex, type CotutorConfig } from '../schema/index.ts';
7
- export interface RunPlan {
8
- /** 运行时名(runtimes 里的键) */
9
- runtime: string;
10
- /** 完整命令行,argv[0] 是可执行文件 */
11
- argv: string[];
12
- /** 这次是 resume 还是新开 */
13
- resume: boolean;
14
- /** resume 的会话 id */
15
- session: string | null;
16
- }
17
- export declare class RuntimeError extends Error {
18
- }
19
- export declare function getRuntime(config: CotutorConfig, name?: string): {
20
- name: string;
21
- runtime: Runtime;
22
- };
23
- /** 模板里有没有用到某个占位符(决定要不要去读老师正文) */
24
- export declare function runtimeUses(runtime: Runtime, placeholder: string): boolean;
25
- export declare function planRun(config: CotutorConfig, index: Pick<ConversationIndex, 'session'>, vars: {
26
- agent: string;
27
- prompt: string;
28
- agentBody?: string;
29
- runtime?: string;
30
- }): RunPlan;