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
@@ -0,0 +1,294 @@
1
+ /**
2
+ * /talk:口语课的页面,孩子端(设计稿 https://claude.ai/artifact/6uL5XfzhFEfX74cmeWbF9c)。家长端没有这一页。
3
+ * 按 hash 切两屏:#/ 拍照(同拍照听写的骨架,photo-ui.ts;上次的口语单给「接着上」)、#/list/<id> 照片在左、口语单在右(孩子能改、能补、能删)。
4
+ * 改好了交给英语老师的实时页上课(先热身、再打电话);这一页自己不打电话了。
5
+ * 内联脚本里不写反斜杠、不写反引号、不写美元加花括号(这是模板字符串,见 AGENTS.md「坑」)。
6
+ */
7
+ import { TUTOR_FACE_CSS, TUTOR_FACE_JS, backTutorJson } from "../kid/tutor-face.js";
8
+ import { KID_NAV_JS } from "../kid/kid-nav.js";
9
+ import { pageDomJs } from "../shared/page-dom.js";
10
+ import { KID_LOG_JS } from "../kid/kid-log.js";
11
+ import { SNAP_CSS, cameraSvg, snapHtml } from "../kid/photo-ui.js";
12
+ import { faviconLinks } from "../shared/favicon.js";
13
+ const TALK_PAGE = `<!doctype html>
14
+ <html lang="zh-CN"><head><meta charset="utf-8">
15
+ <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover,user-scalable=no">
16
+ <meta name="apple-mobile-web-app-capable" content="yes">
17
+ ${faviconLinks()}
18
+ <title>口语课</title>
19
+ <link rel="stylesheet" href="/kid/theme.css">
20
+ <style>
21
+ :root { --paper:#faf9f4; --ink:#2b2b2b; --dim:#8a8781; --line:#e2dfd6; --card:#ffffff; --kid:#dbeeff; --tutor:#fff3d6; --tutor-line:#f0dca8; --tutor-ink:#8a5a12; --accent:#e8743b; --blue:#eef4ff; --blue-ink:#2f5e9e; --plum:#efe9fb; --plum-ink:#7a4fc9; --grey:#eeece6; --night:#2b3a4a; --red:#b3412a; }
22
+ /* 孩子那几屏跟口语课挂的那位老师走:他的学科色(读到老师后换,缺省英语绿)、头像、名字 */
23
+ :root { --sc:#1f8a4c; --sc-soft:color-mix(in srgb, var(--sc) 12%, #fff); --sc-ink:color-mix(in srgb, var(--sc) 62%, #000); }
24
+ * { box-sizing:border-box; -webkit-tap-highlight-color:transparent; }
25
+ /* 自己写了 display:flex 的块会盖掉浏览器自带的 [hidden](2026-10-10 Safari 上看到的) */
26
+ [hidden] { display:none !important; }
27
+ html,body { margin:0; height:100%; background:var(--paper); color:var(--ink); font:17px/1.5 -apple-system,"PingFang SC","Helvetica Neue",sans-serif; overscroll-behavior:none; }
28
+ body { -webkit-user-select:none; user-select:none; }
29
+ input,button { font:inherit; color:inherit; }
30
+ button { cursor:pointer; border:0; background:none; padding:0; }
31
+ button:disabled { opacity:.4; cursor:default; }
32
+ input { -webkit-user-select:text; user-select:text; }
33
+ .view { display:none; min-height:100%; flex-direction:column; }
34
+ .view.on { display:flex; }
35
+ .pill { display:inline-flex; align-items:center; gap:8px; height:48px; padding:0 18px; border-radius:24px; background:#fff; border:1px solid var(--line); font-size:17px; font-weight:600; white-space:nowrap; }
36
+ .pill.dark { background:var(--ink); color:#fff; border-color:var(--ink); }
37
+ .pill.red { color:var(--red); }
38
+ .pill:active { transform:scale(.96); }
39
+ .muted { color:var(--dim); }
40
+ .small { font-size:14px; }
41
+ .toast { position:fixed; left:50%; bottom:24px; transform:translateX(-50%); background:var(--ink); color:#fff; border-radius:20px; padding:10px 18px; font-size:15px; z-index:50; display:none; max-width:90vw; }
42
+ .toast.on { display:block; }
43
+ svg { flex:none; }
44
+
45
+ /* 孩子:拍照(photo-ui.ts,同拍照听写)。.main 是主按钮:老师的颜色 */
46
+ .main { display:inline-flex; align-items:center; justify-content:center; gap:8px; min-height:60px; padding:0 30px; border-radius:30px; background:var(--sc); color:#fff; font-size:20px; font-weight:600; }
47
+ .main:disabled { opacity:.45; }
48
+ #snap { padding:calc(env(safe-area-inset-top) + 10px) 24px calc(env(safe-area-inset-bottom) + 24px); }
49
+ ${SNAP_CSS}
50
+ /* 孩子:照片在左、口语单在右(竖着照片在上);读的时候照片上一道扫过的光,右边先用浅灰占好位置 */
51
+ #pick { height:100vh; height:100dvh; }
52
+ #pick .pwrap { flex:1; min-height:0; display:flex; gap:20px; padding:calc(env(safe-area-inset-top) + 10px) 20px calc(env(safe-area-inset-bottom) + 16px) 24px; }
53
+ .tk-shot { flex:1; min-width:0; min-height:0; display:flex; align-items:center; justify-content:center; padding-top:48px; }
54
+ .tk-shotin { position:relative; display:inline-block; max-width:100%; border-radius:12px; overflow:hidden; background:#2b2b2b; }
55
+ .tk-shotin img { display:block; max-width:100%; max-height:calc(100vh - 100px); max-height:calc(100dvh - 100px); min-width:160px; min-height:160px; }
56
+ .tk-scan { position:absolute; left:0; right:0; top:0; height:30%; background:linear-gradient(180deg, transparent, color-mix(in srgb, var(--sc) 28%, transparent), transparent); animation:tk-scan 1.6s ease-in-out infinite alternate; pointer-events:none; }
57
+ @keyframes tk-scan { from { transform:translateY(-40%); } to { transform:translateY(270%); } }
58
+ .tk-side { width:420px; flex:none; min-height:0; display:flex; flex-direction:column; gap:10px; }
59
+ .tk-hd { display:flex; align-items:center; gap:14px; }
60
+ .tk-hd .tfav { width:52px; height:52px; font-size:24px; }
61
+ .tk-hd b { display:block; font-size:22px; } .tk-hd small { display:block; font-size:15px; color:var(--dim); }
62
+ .tk-scroll { flex:1; min-height:0; overflow:auto; display:flex; flex-direction:column; gap:8px; padding:2px; }
63
+ .tk-sec { font-size:14px; font-weight:700; color:var(--dim); margin-top:6px; }
64
+ .tk-ws { display:grid; grid-template-columns:repeat(2, minmax(0, 1fr)); gap:8px; }
65
+ .tk-it { display:flex; align-items:center; gap:8px; min-height:62px; padding:6px 4px 6px 12px; background:#fff; border:1.5px solid var(--line); border-radius:16px; }
66
+ .tk-it .tx { flex:1; min-width:0; text-align:left; display:flex; align-items:center; gap:10px; min-height:48px; }
67
+ .tk-it .tx > span { min-width:0; }
68
+ .tk-it .en { display:block; font-size:21px; font-weight:600; line-height:1.2; overflow-wrap:anywhere; }
69
+ .tk-it.w .en { font-family:"Chalkboard SE","Comic Sans MS","Marker Felt",sans-serif; font-weight:400; font-size:23px; }
70
+ .tk-it .zh { display:block; font-size:13px; color:var(--dim); }
71
+ .tk-it .em { font-size:26px; line-height:1; flex:none; }
72
+ .tk-it .x { flex:none; width:44px; height:44px; border-radius:22px; display:grid; place-items:center; color:var(--dim); }
73
+ .tk-it.ed { border:2px solid var(--sc); box-shadow:0 0 0 4px color-mix(in srgb, var(--sc) 15%, transparent); }
74
+ .tk-it.ed .x { color:var(--sc); }
75
+ .tk-it input { display:block; width:100%; border:0; border-bottom:2px solid var(--sc); background:transparent; padding:2px 0; outline:0; font-size:20px; }
76
+ .tk-it input.zh { border-bottom:1px solid var(--line); font-size:14px; color:var(--dim); margin-top:4px; }
77
+ .tk-sk { background:#ebe8e0; border-radius:16px; min-height:62px; }
78
+ .tk-add { align-self:flex-start; display:inline-flex; align-items:center; gap:6px; min-height:44px; padding:0 6px; color:var(--sc-ink); font-weight:600; }
79
+ .tk-go { display:flex; gap:10px; }
80
+ .tk-go .pill { height:60px; border-radius:30px; }
81
+ .tk-go .main { flex:1; padding:0 16px; }
82
+ @media (orientation: portrait) {
83
+ #pick .pwrap { flex-direction:column; }
84
+ .tk-shot { flex:none; padding-top:52px; }
85
+ .tk-shotin img { max-height:36vh; }
86
+ .tk-side { width:auto; flex:1; }
87
+ }
88
+
89
+ __TUTOR_FACE_CSS__
90
+ </style></head>
91
+ <body>
92
+ <div id="snap" class="view">
93
+ ${snapHtml({ kind: 'talk', id: 'snap-hero', cam: 'p-cam', lib: 'p-lib' })}
94
+ </div>
95
+
96
+ <div id="pick" class="view"><div class="pwrap">
97
+ <div class="tk-shot"><div class="tk-shotin"><img id="p-img" alt="拍的那一页"><div class="tk-scan" id="p-scan" hidden></div></div></div>
98
+ <div class="tk-side">
99
+ <div class="tk-hd"><span id="p-av"></span><div><b id="p-title">老师在看这一页…</b><small id="p-sub">找出单词和句子,一会儿就好</small></div></div>
100
+ <div class="tk-scroll">
101
+ <div class="tk-sec">单词 · <span id="p-nw">0</span></div>
102
+ <div class="tk-ws" id="p-words"></div>
103
+ <button class="tk-add" type="button" id="p-addw"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>补一个单词</button>
104
+ <div class="tk-sec">句子 · <span id="p-ns">0</span></div>
105
+ <div id="p-sents" style="display:flex;flex-direction:column;gap:8px"></div>
106
+ <button class="tk-add" type="button" id="p-adds"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>补一句</button>
107
+ </div>
108
+ <div class="tk-go"><button class="pill" type="button" id="p-again">${cameraSvg()}重拍</button><button class="main" type="button" id="p-go" disabled>先热身,再打电话</button></div>
109
+ </div>
110
+ </div></div>
111
+
112
+ <div class="toast" id="toast"></div>
113
+
114
+ <script>
115
+ // 孩子端的流水(kid-log.ts):最先装上出错的监听
116
+ __KID_LOG_JS__
117
+ (() => {
118
+ // $ / h / toast / api(../server/page-dom.ts,几页共用)
119
+ ${pageDomJs(2400)}
120
+ let info = null;
121
+
122
+ // ---- 路由:#/ 拍照、#/list/<id> 看口语单 ----
123
+ const views = ['snap', 'pick'];
124
+ const show = (name) => { for (const v of views) $('#' + v).classList.toggle('on', v === name); BACK.el.hidden = false; };
125
+ // 左上角「‹ logo」胶囊同老师页:点了回首页
126
+ __TUTOR_FACE_JS__
127
+ // 孩子端不往浏览器历史里加东西(kid-nav.ts):回首页、交给老师页都是替换当前页
128
+ __KID_NAV_JS__
129
+ const BACK = backCapsule(() => kidGo('/'));
130
+ // 胶囊带上口语课挂的老师:链接带 ?tutor= 时服务端出页面就插进来(BACK_TUTOR),打开就是他的颜色和首字;没带的等 wearOwner 找到老师再填
131
+ const BACK_TUTOR = __BACK_TUTOR__;
132
+ BACK.set(BACK_TUTOR);
133
+ BACK.el.hidden = true; document.body.append(BACK.el);
134
+ let OWNER = null;
135
+ /** 口语课挂的那位老师:首页链接带 ?tutor=,没带就找卡上有口语课的,再没有找英语老师;换上他的颜色、头像、名字 */
136
+ const wearOwner = async () => {
137
+ let ts = [];
138
+ try { ts = (await api('GET', '/api/kid/home')).tutors || []; } catch { return; }
139
+ const want = new URLSearchParams(location.search).get('tutor');
140
+ const t = ts.find((x) => x.name === want) || ts.find((x) => (x.extras || []).includes('talk')) || ts.find((x) => x.lang === 'en');
141
+ if (!t) return;
142
+ OWNER = t;
143
+ BACK.set(t);
144
+ document.documentElement.style.setProperty('--sc', t.color);
145
+ $('#snap-av').replaceChildren(tutorAvatar(t));
146
+ $('#p-av').replaceChildren(tutorAvatar(t));
147
+ };
148
+ const go = (hash) => { location.hash = hash; };
149
+ kidLog.start({ page: 'talk', mode: 'kid' });
150
+ const route = () => {
151
+ const m = /^#\\/list\\/([^/]+)/.exec(location.hash);
152
+ if (!m) { show('snap'); void snap(); return; }
153
+ show('pick'); void pick(m[1]);
154
+ };
155
+ window.addEventListener('hashchange', route);
156
+
157
+ // ---- 拍照:同拍照听写的骨架;上次的口语单在最上面给「接着上」 ----
158
+ const lastList = () => (info && info.enabled ? (info.talks || []).find((x) => x.status === 'ready' && x.list.words.length + x.list.sentences.length > 0) : null) || null;
159
+ async function snap() {
160
+ try { info = await api('GET', '/api/talk'); } catch (e) { info = null; }
161
+ if (info && !info.enabled) { location.replace('/'); return; }
162
+ const last = lastList();
163
+ $('#snap-resume').hidden = !last;
164
+ $('#snap-cam-btn').classList.toggle('alt', Boolean(last));
165
+ if (!last) return;
166
+ const d = new Date(last.createdAt), nw = last.list.words.length, ns = last.list.sentences.length;
167
+ $('#snap-resume-sub').textContent = (d.getMonth() + 1) + ' 月 ' + d.getDate() + ' 日拍的 · ' + [nw ? nw + ' 个单词' : '', ns ? ns + ' 句' : ''].filter(Boolean).join('、');
168
+ }
169
+ $('#snap-resume-go').addEventListener('click', (e) => { handoff(async () => (await api('POST', '/api/talk', { from: 'latest' })).id, e.currentTarget); });
170
+ const shrink = (file) => new Promise((resolve, reject) => {
171
+ const img = new Image();
172
+ const url = URL.createObjectURL(file);
173
+ img.onload = () => { const max = 1600; const k = Math.min(1, max / Math.max(img.width, img.height)); const c = document.createElement('canvas'); c.width = Math.round(img.width * k); c.height = Math.round(img.height * k); c.getContext('2d').drawImage(img, 0, 0, c.width, c.height); URL.revokeObjectURL(url); resolve(c.toDataURL('image/jpeg', 0.85)); };
174
+ img.onerror = () => { URL.revokeObjectURL(url); reject(new Error('这张图打不开')); };
175
+ img.src = url;
176
+ });
177
+
178
+ // ---- 看口语单:照片在左;读的时候「老师在看这一页…」,读完原地填上;点一项改字、× 去掉、能补 ----
179
+ const MAX = { words: 12, sentences: 8 };
180
+ let P = { id: null, meta: null, waiting: false, failed: false, edit: null };
181
+ async function shoot(file) {
182
+ if (!file) return;
183
+ if (P.url) URL.revokeObjectURL(P.url);
184
+ P = { id: null, meta: null, waiting: true, failed: false, edit: null, url: URL.createObjectURL(file) };
185
+ $('#p-img').src = P.url;
186
+ history.replaceState(null, '', location.pathname + location.search + '#/list/');
187
+ show('pick'); renderPick();
188
+ try {
189
+ const photo = await shrink(file);
190
+ const m = await api('POST', '/api/talk', { photo });
191
+ P.id = m.id; P.meta = m;
192
+ history.replaceState(null, '', location.pathname + location.search + '#/list/' + m.id);
193
+ } catch (e) { P.failed = true; }
194
+ P.waiting = false; renderPick();
195
+ }
196
+ $('#p-cam').addEventListener('change', (e) => { const f = e.target.files[0]; e.target.value = ''; shoot(f); });
197
+ $('#p-lib').addEventListener('change', (e) => { const f = e.target.files[0]; e.target.value = ''; shoot(f); });
198
+ async function pick(id) {
199
+ if (P.id === id && P.meta) { renderPick(); return; }
200
+ P = { id: null, meta: null, waiting: true, failed: false, edit: null };
201
+ renderPick();
202
+ try { P.meta = (await api('GET', '/api/talk/' + id)).meta; P.id = id; } catch (e) { go('#/'); return; }
203
+ if (P.meta.photo) $('#p-img').src = '/api/talk/' + id + '/photo'; else $('#p-img').removeAttribute('src');
204
+ P.waiting = false; renderPick();
205
+ }
206
+ const ICON_X = '<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg>';
207
+ const ICON_OK = '<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12l5 5 9-10"/></svg>';
208
+ /** 改完一项:英文空了就去掉 */
209
+ const doneEdit = () => {
210
+ const e = P.edit; P.edit = null;
211
+ if (!e || !P.meta) return;
212
+ const arr = P.meta.list[e.kind], it = arr[e.i];
213
+ if (it) { it.en = it.en.replace(/\\s+/g, ' ').trim(); it.zh = (it.zh || '').trim(); if (!it.en) arr.splice(e.i, 1); }
214
+ };
215
+ function itemEl(kind, it, i) {
216
+ const word = kind === 'words';
217
+ const editing = P.edit && P.edit.kind === kind && P.edit.i === i;
218
+ if (editing) {
219
+ const en = h('input', { class: 'en', value: it.en, placeholder: word ? '单词' : '英文句子', autocapitalize: 'off', autocorrect: 'off', spellcheck: 'false', 'aria-label': '英文' });
220
+ const zh = h('input', { class: 'zh', value: it.zh || '', placeholder: '中文意思(可以不写)', 'aria-label': '中文' });
221
+ en.addEventListener('input', () => { it.en = en.value; renderGo(); });
222
+ zh.addEventListener('input', () => { it.zh = zh.value; });
223
+ for (const x of [en, zh]) x.addEventListener('keydown', (ev) => { if (ev.key === 'Enter') { doneEdit(); renderPick(); } });
224
+ const el = h('div', { class: 'tk-it ed' + (word ? ' w' : '') }, h('div', { class: 'tx', style: 'display:block' }, en, zh), h('button', { class: 'x', type: 'button', 'aria-label': '改好了', html: ICON_OK, on: { click: () => { doneEdit(); renderPick(); } } }));
225
+ setTimeout(() => { if (!en.value) en.focus(); }, 0);
226
+ return el;
227
+ }
228
+ return h('div', { class: 'tk-it' + (word ? ' w' : '') },
229
+ h('button', { class: 'tx', type: 'button', 'aria-label': '改 ' + it.en, on: { click: () => { doneEdit(); P.edit = { kind, i: P.meta.list[kind].indexOf(it) }; renderPick(); } } },
230
+ word && it.emoji ? h('span', { class: 'em' }, it.emoji) : null, h('span', {}, h('span', { class: 'en' }, it.en), it.zh ? h('span', { class: 'zh' }, it.zh) : null)),
231
+ h('button', { class: 'x', type: 'button', 'aria-label': '不要 ' + it.en, html: ICON_X, on: { click: () => { doneEdit(); const k = P.meta.list[kind].indexOf(it); if (k >= 0) P.meta.list[kind].splice(k, 1); renderPick(); } } }));
232
+ }
233
+ const filled = () => (P.meta ? P.meta.list.words.filter((x) => x.en.trim()).length + P.meta.list.sentences.filter((x) => x.en.trim()).length : 0);
234
+ function renderGo() {
235
+ const n = filled();
236
+ $('#p-go').disabled = !P.id || !n || P.waiting;
237
+ const label = '先热身,再打电话';
238
+ $('#p-go').textContent = n ? label + ' · ' + n + ' 个' : label;
239
+ }
240
+ function renderPick() {
241
+ $('#p-scan').hidden = !P.waiting;
242
+ const L = P.meta ? P.meta.list : null;
243
+ const n = L ? L.words.length + L.sentences.length : 0;
244
+ $('#p-title').textContent = P.waiting ? '老师在看这一页…' : '今天的口语单';
245
+ $('#p-sub').textContent = P.waiting ? '找出单词和句子,一会儿就好' : P.failed ? '这张没传上去,再拍一张试试' : n ? '点一项改字,不要的点 ×' : '这一页没看到英文,换一页拍,或者自己补几个';
246
+ if (P.waiting || !L) {
247
+ $('#p-nw').textContent = '…'; $('#p-ns').textContent = '…';
248
+ $('#p-words').replaceChildren(...[0, 1, 2, 3].map(() => h('div', { class: 'tk-sk' })));
249
+ $('#p-sents').replaceChildren(h('div', { class: 'tk-sk' }), h('div', { class: 'tk-sk' }));
250
+ $('#p-addw').hidden = true; $('#p-adds').hidden = true;
251
+ } else {
252
+ $('#p-nw').textContent = L.words.length; $('#p-ns').textContent = L.sentences.length;
253
+ $('#p-words').replaceChildren(...L.words.map((it, i) => itemEl('words', it, i)));
254
+ $('#p-sents').replaceChildren(...L.sentences.map((it, i) => itemEl('sentences', it, i)));
255
+ $('#p-addw').hidden = !P.id || L.words.length >= MAX.words; $('#p-adds').hidden = !P.id || L.sentences.length >= MAX.sentences;
256
+ }
257
+ renderGo();
258
+ }
259
+ const addItem = (kind) => { if (!P.meta) return; doneEdit(); const arr = P.meta.list[kind]; arr.push({ en: '', zh: '' }); P.edit = { kind, i: arr.length - 1 }; renderPick(); };
260
+ $('#p-addw').addEventListener('click', () => addItem('words'));
261
+ $('#p-adds').addEventListener('click', () => addItem('sentences'));
262
+ $('#p-again').addEventListener('click', () => {
263
+ // 这张不要了:还没开始的那份删掉,不留在 talk/ 里
264
+ if (P.id && P.meta && P.meta.status === 'draft') api('DELETE', '/api/talk/' + P.id).catch(() => {});
265
+ P = { id: null, meta: null, waiting: false, failed: false, edit: null };
266
+ go('#/');
267
+ });
268
+ $('#p-go').addEventListener('click', (e) => {
269
+ doneEdit();
270
+ const words = P.meta.list.words.filter((x) => x.en.trim()), sentences = P.meta.list.sentences.filter((x) => x.en.trim());
271
+ if (!words.length && !sentences.length) return;
272
+ const id = P.id;
273
+ handoff(async () => { P.meta = await api('PUT', '/api/talk/' + id + '/list', { words, sentences, ready: true }); return id; }, e.currentTarget);
274
+ });
275
+
276
+ // ---- 交给英语老师的实时页(这页只准备口语单):存好口语单(或接着上),换到老师页;那边点「先热身,再打电话」那一下才起声音 ----
277
+ async function handoff(getId, btn) {
278
+ if (btn) btn.disabled = true;
279
+ if (!OWNER) await wearOwner();
280
+ if (!OWNER) { if (btn) btn.disabled = false; toast('没找到英语老师'); return; }
281
+ let id;
282
+ try { id = await getId(); } catch (e) { if (btn) btn.disabled = false; toast('没连上,再点一次'); return; }
283
+ kidGo('/?tutor=' + encodeURIComponent(OWNER.name) + '&talk=' + encodeURIComponent(id));
284
+ }
285
+
286
+ void wearOwner();
287
+ route();
288
+ })();
289
+ </script>
290
+ </body></html>`;
291
+ /** back:链接带的 ?tutor= 那位老师(胶囊上的颜色、首字);不知道 null */
292
+ export function talkPage(back = null) {
293
+ return TALK_PAGE.replace('__TUTOR_FACE_JS__', () => TUTOR_FACE_JS).replace('__KID_LOG_JS__', () => KID_LOG_JS).replace('__KID_NAV_JS__', () => KID_NAV_JS).replace('__BACK_TUTOR__', () => backTutorJson(back)).replace('__TUTOR_FACE_CSS__', () => TUTOR_FACE_CSS);
294
+ }
@@ -0,0 +1,11 @@
1
+ # 二年级教学包
2
+
3
+ 面向中国大陆小学二年级。默认采用短句、一次一个问题、具体情境与逐步提示。年级不代表孩子已经学过某项知识;教材版本、学期和进度由孩子档案与学科入口文件提供,英语难度还要看实际表现。
4
+
5
+ 普通聊天使用 `agents/<老师>.md`;activity 使用自己完整的「老师怎么带」,不继承老师正文。共同守则和板书协议仍由应用提供。
6
+
7
+ 安装: `cotutor init ming --grade 2`。文件拷进 workspace 后属于家长;upgrade 只换未修改的。老师 ID 与现有 activity 名称保持稳定,看图说话的按钮可显示为「看图写话」。
8
+
9
+ 三科提供预习、检查作业、复习(孩子端老师牌上常驻三块方砖);语文另有看图说话、写话、听写与表达活动;英语另有口语课、听写;小课堂继续使用提前做好的课包,看完再问。典型题型的完整示例见 `examples/数学平均分.md`。
10
+
11
+ 验证:所有 activity 及例子必须通过静态检查;真实模型的评估结果见 [验证记录](VALIDATION.md),命令见仓库 `docs/年级教学包.md`。静态通过不表示教学效果已经验证。
@@ -0,0 +1,41 @@
1
+ # 二年级教学包验证记录
2
+
3
+ 日期:2026-10-27。代码检查与合成孩子的模型评估,不是实际儿童教学效果测量。
4
+
5
+ ## 代码与打包
6
+
7
+ - `pnpm typecheck`、构建与舞台构建通过。
8
+ - 全量 82 个测试文件通过;随后对年级迁移改动重跑 grades、init-doctor,均通过。
9
+ - 测试覆盖新安装、幂等补缺、旧 hash 迁移、自定义保护、恢复出厂、来源损坏、缺失年级、年级不一致提醒与实际上下文包。
10
+ - 出厂 activity 与例子均通过静态检查。
11
+ - npm 打包预览确认包含年级文件、例子、课包及五段音频,不再包含旧的包根 agents 目录。
12
+ - 平均分课包通过 drawtell 构建检查;逐步截图检查了空盘、第一轮、第二轮及结论;课包可读取、画面已烤、配音文件和时长齐全。
13
+ - `pnpm smoke` 仍有一个原有阻塞:根 package.json 的 drawtell 依赖是 `link:../drawtell`,需要正式发版时换成可安装的版本。其他出厂检查通过。本次未发布。(2026-10-31 drawtell 并进本包成了 src/chalk,这个依赖没有了。)
14
+
15
+ ## 模型与范围
16
+
17
+ - 数学:qwen3.8-max,effort medium。
18
+ - 语文:qwen3.8-max,effort low。
19
+ - 英语:qwen3.8-flash;早期试跑用 low,最终默认采用 medium。
20
+ - 模拟孩子:qwen3.8-flash。
21
+
22
+ 三科预习、批改(2026-11-03 改名检查作业,教法没改,只改了名字和开场那句「带孩子检查作业」)、复习与语文写话均跑过缺材料/给定范围多轮/结束边界。口语课验证了按给定词表热身;平均分小课堂验证了看懂就收、主动要求练一道后的互动。口语通话后半段沿用原有流程,本次没有进行真人音频通话验收。
23
+
24
+ 完整批次每个例子跑 1 次,两项复习修正后的完整例子各跑 3 次,九个共性 activity 的缺材料开场各跑 3 次。轮次上限只是评估停止条件,不代表孩子已经完成学习。
25
+
26
+ ## 发现与修正
27
+
28
+ | 发现 | 修正与复验 |
29
+ |---|---|
30
+ | 英语 low 偶尔只出卡、无讲稿,或把判断材料的过程念出来 | 增加完整开场示例及「每节有讲稿」检查;新安装英语改为 medium,旧配置保留。最终英语三项完整例子通过 |
31
+ | 数学预习完成平均分后又出不能分完的新题 | 明确只记录当前情境的未解问题,不追加另一题;复验通过 |
32
+ | 拍照开场先问哪一页、再问能否拍照,一节两个问号 | 开场改成一句直接请求;九个活动各跑 3 次,27 次通过 |
33
+ | 语文复习先问「那右边呢」,又问一次右边是什么 | 过渡用陈述句,末尾只留一个问句;完整例子重复复验 |
34
+
35
+ 完整批次中数学、语文复习的旧失败记录保留,由后续 `review-repeat-*` 的完整复验结果替代。不要只看早期批次的通过率。
36
+
37
+ ## 可复核记录
38
+
39
+ [机器记录与对话摘要](validation/2026-10-27.json) 保留历次失败、最终完整流程与定向复验,不含 API key、机器路径或家庭真实对话。`source_sha256` 是当前交付提示词的 hash;早期试跑使用过旧版本,不能把这些 hash 当作所有历史运行的源快照。
40
+
41
+ 家长换模型、改提示词或提供不同教材后,仍需在自己的试用 workspace 重跑例子,并人工看有没有泄题、误判转写、追加任务或替孩子写话。当前检查不能证明所有教学内容正确,也不代表孩子长期掌握了知识。
@@ -0,0 +1,157 @@
1
+ ---
2
+ name: 你说我画
3
+ description: 孩子编一个故事,老师用画家的口吻问到说清楚,画家画成一张连环画。填了「词」就是我来出题
4
+ cards: read paint
5
+ ---
6
+
7
+ <!-- 给人看
8
+ 谁读:「老师怎么带」就是这个话题老师的系统提示(人设也在这里写,不读语文老师文件);「画家收到什么」给百炼文生图;别的节给你看
9
+ 记忆:这个 activity 自己一篇,vault 的 记忆/语文老师·你说我画.md;要和语文老师共享,在 vault 里复制
10
+ 能改:都能改。改完 cotutor activity check chinese-tutor 你说我画;upgrade 只换你没改过的
11
+ 改了:先 check,再真跑几个故事看(cotutor send / replay)
12
+ -->
13
+
14
+ 孩子编一个故事,语文老师一问一答帮他说清楚,画家照着画成一张四格连环画。图是奖励,要教的是把一件事说清楚。
15
+
16
+ ## 家长填的
17
+
18
+ ```参数
19
+ 词: 词表,可空 —— 这周学的词。填了就是「我来出题」,画出来是一道看图说话题
20
+ 最多画: 数,可空 —— 一个话题最多画几张(第二张起是孩子改了一句重画);不填不限
21
+ ```
22
+
23
+ ## 应用算的
24
+
25
+ ```应用算
26
+ 还能画: 数 —— 这个话题还能画几张:最多画减已画;没填最多画就不限,没有这一项
27
+ 缺: 字 —— 上一张画图卡没画的原因(下面「应用拦的」哪一条没过);画了就是空的
28
+ ```
29
+
30
+ ## 应用拦的
31
+
32
+ 老师写了 `paint` 卡,应用先查这几条,都过了才交给画家。没过就不画,下一条告诉老师缺哪条;孩子那边停在分好的几幅。删掉一行就不拦那一条。
33
+
34
+ ```应用拦
35
+ 连说过一遍 —— 话题里有一张三行以上的 read 卡,孩子在它后面开过口
36
+ 还能画 —— 还能画大于 0;不限时照过
37
+ ```
38
+ <!-- 为什么应用拦:「说没说清楚」应用判不了,只能靠老师;「整段放出来、孩子连着说过」看板书就知道。图花钱、画了收不回,能查的不靠老师自觉。 -->
39
+
40
+ ## 老师怎么带
41
+
42
+ 你是这个家的语文老师,今天陪孩子玩「你说我画」。说话慢,一次只问一件事;总是替画家问,用「画家想知道……」开口。
43
+
44
+ 默认面向中国大陆小学二年级。
45
+ 教材版本和已学内容看档案、学科入口文件与本次材料。
46
+ 孩子已经会的少提示,还不会的拆成更小的一步。
47
+
48
+ 孩子编一个故事,你帮孩子说清楚,画家照着画,画是奖励。
49
+
50
+ 第一句: 说画家来了,想听一个故事。请孩子先说是谁的故事。
51
+
52
+ 1. 问开头:谁、在哪里、什么时候。整个故事问一次。
53
+ 2. 问经过:先、接着、最后。三到四件事,一件一幅。
54
+ 3. 问结尾:结果怎样,心里怎么想。
55
+ 4. 每节放一张 `read` 卡,只写孩子这次说的,整理成一句。
56
+ 5. 画家要知道的都说清楚了,整段放一张 `read` 卡,一行一句。请孩子看着连起来说一遍。
57
+ 6. 孩子说完一遍,和孩子分幅。有几件事分几幅,一幅一件事,两到四幅。放一张 `read` 卡,一行一幅:「第 1 幅:……」。
58
+ 7. 写一张 `paint` 卡,分幅照第 6 步的,一幅一行。讲稿说「画家开始画了」,末句问孩子猜画家会怎么画。
59
+
60
+ - `还能画` 是这个话题还能画几张图,不是几幅。一张图里照样分两到四幅,别让孩子删事情。
61
+ - 没有 `还能画`,就是想画几张都行。
62
+ - 「画家开始画了」只和 `paint` 卡一起说。这一节没写 `paint` 卡,就别说开始画了。
63
+ <!-- 为什么:2026-10-13 qwen 真跑,老师把「还能画 2」说成「今天画家最多能画两幅」,让孩子从四件事里挑两件;又只放了分幅的 read 卡就说「画家开始画了」,下一轮看到没画成,改口「画家画累了」。 -->
64
+
65
+ {{有 词}}
66
+ ### 我来出题
67
+
68
+ `activity:` 里的 `词` 是这周学的词,孩子是出题人,画好的就是一道看图说话题。
69
+
70
+ - 第 1 步之前:先把词念出来,请孩子挑三四个。
71
+ - 第 6 步之后:一个词落到一幅,问孩子看图的人怎么看得出来。
72
+ - 写 `paint` 卡之前:请孩子说要问看图的人什么,你整理成题干,念给孩子听。
73
+ - `paint` 卡里写上 `题:`(这个题干)和 `词:`(孩子挑的词)。
74
+ - 一幅最多落两个词。画不出来的词(突然、终于)只放进 `词:`。
75
+ {{/有}}
76
+
77
+ ### 画家要知道的七件事
78
+
79
+ 谁、在哪里、什么时候;先、接着、最后;每幅一件事;看得出来;前后对得上;说得通;结果和心情。
80
+
81
+ ### 怎么问
82
+
83
+ - 用画家的口吻问:「画家想知道……」。不说「你没说清楚」。
84
+ - 前后对不上:把孩子说过的两句并排放一张 `read` 卡,问画家画哪个。
85
+ - 「画家糊涂了」只用在前后对不上。孩子说「后来」「到了秋天」是往后跳,说得通;要补中间,问「中间呢」。
86
+ - 不合常理:问中间过了什么。「早上种下,中午就能吃吗?」
87
+ - 孩子说是魔法、是童话,就算。请孩子在开头交代一句。
88
+ - 孩子说「很高兴」「很多」「很漂亮」:问画家怎么画出来。
89
+ - 孩子的话和样子一起留下:「小猴低着头,脸红红的,觉得很羞愧。」
90
+ - 一句里有好几件事:问这一幅画哪件,别的放到下一幅。
91
+ - 只问不改。孩子给了说法就收下。
92
+ - 同一件事问两次还说不出:给两个让孩子挑。
93
+ - 孩子催着画:说「画家还想知道一件事」,接着问。
94
+ - 七件事没齐、孩子没连着说一遍,不写 `paint` 卡。
95
+ - `paint` 卡里只写孩子说过的:角色的样子、地方、东西。孩子没说颜色、衣服,`角色:` 只写名字,或问孩子。
96
+ - 画图卡写法里的例子是别人的故事,别照着抄。
97
+ <!-- 为什么:2026-10-12 qwen 真跑,把 paint 卡例子里的「戴黄色草帽」「坐在树下吃桃子」抄进了孩子的故事,还把四件事挤成两幅。 -->
98
+ - 提示放在问句前面,问句永远是最后一句。
99
+ <!-- 为什么用画家的口吻:二年级说不清楚,多半是不知道听的人缺什么;画家是个具体的读者,追问就不是评判。 -->
100
+ <!-- 为什么只问不改:要教的是「听的人会在哪里卡住」,不是「什么是对的」;那个故事要是孩子自己的。 -->
101
+ <!-- 为什么连说一遍才画:图是奖励,奖的是把整段说清楚;先画了,后面就没人想说了。应用也拦(「应用拦的」),这里是老师那一半 -->
102
+
103
+ ### 画好以后
104
+
105
+ - 你看不到图。`cards:` 里那一行说画好了没有。
106
+ - 画好了:问孩子「哪里和你想的一样?哪里不一样?」。别说图上画了什么。
107
+ - 孩子说哪里不一样:问画家是照哪一句画的,这句怎么说画家才画得出来。
108
+ - 孩子想改:`还能画` 不是 0,就改那一句,再写一张 `paint` 卡。
109
+ - `缺` 是 `连说过一遍`:说「画家想再听你连着讲一遍」,把整段的 `read` 卡再放一次。孩子讲完,再写 `paint` 卡。
110
+ - `还能画` 是 0:说「这个故事画够啦,想再画,就讲一个新故事」。请孩子看着分好的几幅,自己讲一遍。
111
+ - 没画成:请孩子看着分好的几幅,自己讲一遍。别说没画成,也别编画家累了。
112
+ <!-- 为什么看「还能画」:一个话题最多几张,应用算好了递给你,你不用自己数。 -->
113
+ <!-- 为什么不说「画累了,明天再画」:一天画几张不限了,这句成了哄孩子的假话。 -->
114
+
115
+ 收: 问完「哪里一样、哪里不一样」,或请孩子自己讲完一遍,就夸一句他讲的故事,收。
116
+
117
+ ### 一段好的回复
118
+
119
+ 孩子说「小猴一整天都在睡大觉」,前面说过「小猴帮小熊浇了水」:
120
+
121
+ 小猴一整天都在睡大觉,你记得真清楚。
122
+ 可是画家有点糊涂了。
123
+ ```read
124
+ 小猴一整天都在睡大觉。
125
+ 小猴帮小熊浇了水。
126
+ ```
127
+ 这两句都是你说的。
128
+ 画家画小猴,是画他睡觉,还是画他浇水呢?
129
+
130
+ ## 画家收到什么
131
+
132
+ <!-- 应用填三个插槽:版式(几格怎么排,看分幅有几幅)、角色(paint 卡的「角色:」)、分幅。三个都要在,少了 activity check 报错 -->
133
+ <!-- 画家照这一节画:改画风就改中间那几行,改了存上下一张就照它 -->
134
+
135
+ ```画家
136
+ {{版式}}
137
+
138
+ 儿童绘本插画,水彩加干净的线条,颜色明亮柔和,像小学语文练习册里的看图写话插图。
139
+ 人物是可爱的卡通形象,表情和动作夸张一点,一眼看得出在干什么、心情怎样。
140
+ 画面里不要任何文字、对话气泡、拟声词。
141
+
142
+ {{角色}}
143
+
144
+ {{分幅}}
145
+ ```
146
+
147
+ ```画家不要
148
+ 文字,字母,水印,对话气泡,拟声词,写实照片,恐怖,血腥,武器,畸形的手,多余的肢体,格子数量不对
149
+ ```
150
+
151
+ ## 孩子看到什么
152
+
153
+ 题干一行;画好前是分好的几幅和「画家在画」;画好了图淡入。没画成就一直是分好的几幅,孩子端不说没画成。
154
+
155
+ ## 记下什么
156
+
157
+ 图在 `conversations/<老师>/<日期>.<job>.cards/<第几张>/paint.png`,旁边的 `paint.json` 记着交给画家的整段话。
@@ -0,0 +1,78 @@
1
+ ---
2
+ activity: 你说我画
3
+ ---
4
+
5
+ <!-- 给人看
6
+ 谁读:cotutor activity eval chinese-tutor 你说我画。真老师跑,孩子由百炼的对话模型照「故事」「人设」扮,画家是假的(不花钱)
7
+ 怎么用:改了 你说我画.md 的「老师怎么带」,跑一遍;一个例子缺省跑 3 次,次次都过才算过。花钱:一轮约一次问答
8
+ 怎么加:家长端看到一次跑偏,就照那个孩子写一个例子。一个 ## 一个例子
9
+ 写法:故事 = 孩子心里的故事;人设 = 什么样的孩子;孩子 = 写死的话,按顺序先说;照片 = 随第一句「孩子:」发的图(相对这个文件);参数 = 同首页按钮(名=值;名=值);最多轮;判 = 下面一行一条
10
+ 判有:出画图卡、不出画图卡、画图卡前放过整段、放过整段、分幅至少: n、画图卡带题干和词、分幅没有看不见的词、每节末句是问句、不说: …、问到: …、并排: A | B、词落到幅: n
11
+ -->
12
+
13
+ ## 顺的故事
14
+
15
+ 故事: 春天的早上,小熊和小猴在地里种西瓜。中午太阳很大,小熊提着水壶给瓜苗浇水,小猴躺在树下睡大觉。到了夏天,小熊的地里结满了大西瓜,小猴的地里只长了草。小熊送给小猴一个西瓜,小猴低着头,脸红红的。
16
+ 人设: 二年级孩子,问一句答一句,一次只说一件事,不主动把故事说完。
17
+ 孩子: 我想讲小熊和小猴的故事
18
+ 最多轮: 16
19
+ 判:
20
+ - 出画图卡
21
+ - 画图卡前放过整段
22
+ - 分幅至少: 2
23
+ - 分幅没有看不见的词
24
+ - 每节末句是问句
25
+ - 问到: 画家
26
+ - 不说: 你没说清楚、你错了、说错了、不对哦
27
+
28
+ ## 前后对不上
29
+
30
+ 故事: 小猴一整天都在睡大觉。小猴帮小熊浇了水。后来西瓜熟了,小熊很高兴。
31
+ 人设: 二年级孩子,记性有点乱,前面说小猴一整天睡大觉,后面又说小猴帮小熊浇了水;老师问到时才想起来选一个。
32
+ 孩子: 我想讲小猴的故事
33
+ 孩子: 小猴一整天都在睡大觉
34
+ 孩子: 小猴帮小熊浇了水
35
+ 最多轮: 10
36
+ 判:
37
+ - 并排: 睡大觉 | 浇了水
38
+ - 每节末句是问句
39
+ - 不说: 你没说清楚、你错了、说错了、不对哦
40
+
41
+ ## 魔法种子
42
+
43
+ 故事: 小兔子在院子里种下一颗魔法种子,晚上下了一场雨,第二天早上种子长成了一棵比房子还高的胡萝卜树,小兔子请好朋友们来摘胡萝卜,大家都很开心。
44
+ 人设: 二年级孩子,喜欢魔法,老师问「一晚上能长这么高吗」就说「因为是魔法种子呀」。
45
+ 孩子: 我要讲魔法种子
46
+ 最多轮: 16
47
+ 判:
48
+ - 出画图卡
49
+ - 画图卡前放过整段
50
+ - 分幅至少: 2
51
+ - 分幅没有看不见的词
52
+ - 每节末句是问句
53
+
54
+ ## 催着画
55
+
56
+ 故事: 小狗在公园里玩球。
57
+ 人设: 二年级孩子,很想快点看到画,每次只说半句,常说「快画吧」「画家快画」,不肯连起来说。
58
+ 孩子: 小狗
59
+ 孩子: 快画吧
60
+ 最多轮: 6
61
+ 判:
62
+ - 不出画图卡
63
+ - 每节末句是问句
64
+ - 不说: 你没说清楚
65
+
66
+ ## 我来出题
67
+
68
+ 故事: 春天,小熊在地里播种,小猴在树下睡大觉。夏天小熊的西瓜满满一地,小猴什么也没有,觉得很羞愧。
69
+ 人设: 二年级孩子,愿意用老师给的词,老师问看图的人怎么看得出来时会想一想。
70
+ 参数: 词=播种、睡大觉、满满、羞愧
71
+ 最多轮: 18
72
+ 判:
73
+ - 出画图卡
74
+ - 画图卡前放过整段
75
+ - 分幅至少: 2
76
+ - 问到: 怎么看
77
+ - 画图卡带题干和词
78
+ - 分幅没有看不见的词