@lingjingai/scriptctl 0.35.0 → 0.36.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 (367) hide show
  1. package/README.md +21 -5
  2. package/changes/0.36.0.md +22 -0
  3. package/dist/bin.js +0 -0
  4. package/dist/cli.d.ts +2 -1
  5. package/dist/cli.js +52 -128
  6. package/dist/cli.js.map +1 -1
  7. package/dist/common.d.ts +0 -16
  8. package/dist/common.js +2 -342
  9. package/dist/common.js.map +1 -1
  10. package/dist/domain/ingest/apply-plan.d.ts +23 -0
  11. package/dist/domain/ingest/apply-plan.js +210 -0
  12. package/dist/domain/ingest/apply-plan.js.map +1 -0
  13. package/dist/domain/ingest/assembler.d.ts +57 -0
  14. package/dist/domain/ingest/assembler.js +181 -0
  15. package/dist/domain/ingest/assembler.js.map +1 -0
  16. package/dist/domain/ingest/chunker.d.ts +9 -0
  17. package/dist/domain/ingest/chunker.js +38 -0
  18. package/dist/domain/ingest/chunker.js.map +1 -0
  19. package/dist/domain/ingest/evidence.d.ts +5 -0
  20. package/dist/domain/ingest/evidence.js +66 -0
  21. package/dist/domain/ingest/evidence.js.map +1 -0
  22. package/dist/domain/ingest/govern.d.ts +3 -0
  23. package/dist/domain/ingest/govern.js +127 -0
  24. package/dist/domain/ingest/govern.js.map +1 -0
  25. package/dist/domain/ingest/jsonl-parser.d.ts +6 -0
  26. package/dist/domain/ingest/jsonl-parser.js +187 -0
  27. package/dist/domain/ingest/jsonl-parser.js.map +1 -0
  28. package/dist/domain/ingest/markdown-parser.d.ts +6 -0
  29. package/dist/domain/ingest/markdown-parser.js +186 -0
  30. package/dist/domain/ingest/markdown-parser.js.map +1 -0
  31. package/dist/domain/ingest/records.d.ts +71 -0
  32. package/dist/domain/ingest/records.js +9 -0
  33. package/dist/domain/ingest/records.js.map +1 -0
  34. package/dist/domain/ingest/renumber.d.ts +14 -0
  35. package/dist/domain/ingest/renumber.js +130 -0
  36. package/dist/domain/ingest/renumber.js.map +1 -0
  37. package/dist/domain/ingest/script-v3.d.ts +94 -0
  38. package/dist/domain/ingest/script-v3.js +7 -0
  39. package/dist/domain/ingest/script-v3.js.map +1 -0
  40. package/dist/domain/ingest/state-reconcile.d.ts +11 -0
  41. package/dist/domain/ingest/state-reconcile.js +90 -0
  42. package/dist/domain/ingest/state-reconcile.js.map +1 -0
  43. package/dist/domain/ingest/validation.d.ts +11 -0
  44. package/dist/domain/ingest/validation.js +168 -0
  45. package/dist/domain/ingest/validation.js.map +1 -0
  46. package/dist/domain/ingest/video-aggregate.d.ts +23 -0
  47. package/dist/domain/ingest/video-aggregate.js +89 -0
  48. package/dist/domain/ingest/video-aggregate.js.map +1 -0
  49. package/dist/domain/ingest/video-apply.d.ts +37 -0
  50. package/dist/domain/ingest/video-apply.js +236 -0
  51. package/dist/domain/ingest/video-apply.js.map +1 -0
  52. package/dist/domain/ingest/video-md-parser.d.ts +2 -0
  53. package/dist/domain/ingest/video-md-parser.js +233 -0
  54. package/dist/domain/ingest/video-md-parser.js.map +1 -0
  55. package/dist/domain/ingest/video-records.d.ts +56 -0
  56. package/dist/domain/ingest/video-records.js +9 -0
  57. package/dist/domain/ingest/video-records.js.map +1 -0
  58. package/dist/domain/loom/index.d.ts +2 -1
  59. package/dist/domain/loom/index.js +12 -10
  60. package/dist/domain/loom/index.js.map +1 -1
  61. package/dist/domain/loom/types.d.ts +3 -2
  62. package/dist/domain/script/lookups.d.ts +3 -2
  63. package/dist/domain/script/lookups.js +25 -8
  64. package/dist/domain/script/lookups.js.map +1 -1
  65. package/dist/domain/script/patch/apply.js +2 -2
  66. package/dist/domain/script/patch/apply.js.map +1 -1
  67. package/dist/domain/script/patch/helpers.d.ts +3 -7
  68. package/dist/domain/script/patch/helpers.js +23 -96
  69. package/dist/domain/script/patch/helpers.js.map +1 -1
  70. package/dist/domain/script/patch/ops-action.d.ts +0 -2
  71. package/dist/domain/script/patch/ops-action.js +34 -100
  72. package/dist/domain/script/patch/ops-action.js.map +1 -1
  73. package/dist/domain/script/patch/ops-asset.d.ts +1 -0
  74. package/dist/domain/script/patch/ops-asset.js +102 -155
  75. package/dist/domain/script/patch/ops-asset.js.map +1 -1
  76. package/dist/domain/script/patch/ops-dialogue.d.ts +1 -4
  77. package/dist/domain/script/patch/ops-dialogue.js +43 -220
  78. package/dist/domain/script/patch/ops-dialogue.js.map +1 -1
  79. package/dist/domain/script/patch/ops-extend.js +8 -2
  80. package/dist/domain/script/patch/ops-extend.js.map +1 -1
  81. package/dist/domain/script/patch/ops-meta.js.map +1 -1
  82. package/dist/domain/script/patch/ops-scene.js +26 -39
  83. package/dist/domain/script/patch/ops-scene.js.map +1 -1
  84. package/dist/domain/script/patch/ops-state.d.ts +3 -3
  85. package/dist/domain/script/patch/ops-state.js +33 -49
  86. package/dist/domain/script/patch/ops-state.js.map +1 -1
  87. package/dist/domain/script/patch/registry.js +9 -13
  88. package/dist/domain/script/patch/registry.js.map +1 -1
  89. package/dist/domain/script/refs.js +23 -111
  90. package/dist/domain/script/refs.js.map +1 -1
  91. package/dist/domain/script/scene-refs.d.ts +3 -0
  92. package/dist/domain/script/scene-refs.js +35 -0
  93. package/dist/domain/script/scene-refs.js.map +1 -0
  94. package/dist/domain/script/schema.js +17 -21
  95. package/dist/domain/script/schema.js.map +1 -1
  96. package/dist/domain/script/text-util.d.ts +7 -0
  97. package/dist/domain/script/text-util.js +91 -0
  98. package/dist/domain/script/text-util.js.map +1 -0
  99. package/dist/help-text.js +117 -410
  100. package/dist/help-text.js.map +1 -1
  101. package/dist/infra/converters.js +1 -1
  102. package/dist/infra/converters.js.map +1 -1
  103. package/dist/infra/episode-title.d.ts +4 -0
  104. package/dist/infra/episode-title.js +129 -0
  105. package/dist/infra/episode-title.js.map +1 -0
  106. package/dist/infra/ingest/review-renderer.d.ts +1 -0
  107. package/dist/infra/ingest/review-renderer.js +431 -0
  108. package/dist/infra/ingest/review-renderer.js.map +1 -0
  109. package/dist/infra/ingest/source-resolver.d.ts +21 -0
  110. package/dist/infra/ingest/source-resolver.js +51 -0
  111. package/dist/infra/ingest/source-resolver.js.map +1 -0
  112. package/dist/infra/ingest/text-reader.d.ts +3 -0
  113. package/dist/infra/ingest/text-reader.js +27 -0
  114. package/dist/infra/ingest/text-reader.js.map +1 -0
  115. package/dist/infra/ingest/video-discovery.d.ts +8 -0
  116. package/dist/infra/ingest/video-discovery.js +60 -0
  117. package/dist/infra/ingest/video-discovery.js.map +1 -0
  118. package/dist/infra/ingest/workspace-store.d.ts +18 -0
  119. package/dist/infra/ingest/workspace-store.js +70 -0
  120. package/dist/infra/ingest/workspace-store.js.map +1 -0
  121. package/dist/infra/llm/anthropic-model.d.ts +11 -0
  122. package/dist/infra/llm/anthropic-model.js +109 -0
  123. package/dist/infra/llm/anthropic-model.js.map +1 -0
  124. package/dist/infra/llm/gemini-upload.d.ts +9 -0
  125. package/dist/infra/llm/gemini-upload.js +94 -0
  126. package/dist/infra/llm/gemini-upload.js.map +1 -0
  127. package/dist/infra/llm/gemini-video-model.d.ts +47 -0
  128. package/dist/infra/llm/gemini-video-model.js +167 -0
  129. package/dist/infra/llm/gemini-video-model.js.map +1 -0
  130. package/dist/infra/llm/openai-compatible-model.d.ts +13 -0
  131. package/dist/infra/llm/openai-compatible-model.js +143 -0
  132. package/dist/infra/llm/openai-compatible-model.js.map +1 -0
  133. package/dist/infra/llm/proxy.d.ts +1 -0
  134. package/dist/infra/llm/proxy.js +30 -0
  135. package/dist/infra/llm/proxy.js.map +1 -0
  136. package/dist/infra/llm/retry.d.ts +5 -0
  137. package/dist/infra/llm/retry.js +20 -0
  138. package/dist/infra/llm/retry.js.map +1 -0
  139. package/dist/llm/composition.d.ts +5 -0
  140. package/dist/llm/composition.js +5 -0
  141. package/dist/llm/composition.js.map +1 -0
  142. package/dist/llm/config.d.ts +26 -0
  143. package/dist/llm/config.js +201 -0
  144. package/dist/llm/config.js.map +1 -0
  145. package/dist/llm/registry.d.ts +44 -0
  146. package/dist/llm/registry.js +48 -0
  147. package/dist/llm/registry.js.map +1 -0
  148. package/dist/llm/router.d.ts +23 -0
  149. package/dist/llm/router.js +0 -0
  150. package/dist/llm/router.js.map +1 -0
  151. package/dist/llm/tasks/ingest/asset-curate.d.ts +13 -0
  152. package/dist/llm/tasks/ingest/asset-curate.js +45 -0
  153. package/dist/llm/tasks/ingest/asset-curate.js.map +1 -0
  154. package/dist/llm/tasks/ingest/asset-extract.d.ts +12 -0
  155. package/dist/llm/tasks/ingest/asset-extract.js +51 -0
  156. package/dist/llm/tasks/ingest/asset-extract.js.map +1 -0
  157. package/dist/llm/tasks/ingest/asset-govern.d.ts +22 -0
  158. package/dist/llm/tasks/ingest/asset-govern.js +143 -0
  159. package/dist/llm/tasks/ingest/asset-govern.js.map +1 -0
  160. package/dist/llm/tasks/ingest/mention-resolve.d.ts +9 -0
  161. package/dist/llm/tasks/ingest/mention-resolve.js +39 -0
  162. package/dist/llm/tasks/ingest/mention-resolve.js.map +1 -0
  163. package/dist/llm/tasks/ingest/plot-speaker.d.ts +11 -0
  164. package/dist/llm/tasks/ingest/plot-speaker.js +72 -0
  165. package/dist/llm/tasks/ingest/plot-speaker.js.map +1 -0
  166. package/dist/llm/tasks/ingest/roster-merge.d.ts +46 -0
  167. package/dist/llm/tasks/ingest/roster-merge.js +235 -0
  168. package/dist/llm/tasks/ingest/roster-merge.js.map +1 -0
  169. package/dist/llm/tasks/ingest/state-merge.d.ts +10 -0
  170. package/dist/llm/tasks/ingest/state-merge.js +84 -0
  171. package/dist/llm/tasks/ingest/state-merge.js.map +1 -0
  172. package/dist/llm/tasks/ingest/state-reconcile.d.ts +8 -0
  173. package/dist/llm/tasks/ingest/state-reconcile.js +44 -0
  174. package/dist/llm/tasks/ingest/state-reconcile.js.map +1 -0
  175. package/dist/llm/tasks/ingest/text-normalize.d.ts +10 -0
  176. package/dist/llm/tasks/ingest/text-normalize.js +89 -0
  177. package/dist/llm/tasks/ingest/text-normalize.js.map +1 -0
  178. package/dist/llm/tasks/ingest/video-correct.d.ts +30 -0
  179. package/dist/llm/tasks/ingest/video-correct.js +144 -0
  180. package/dist/llm/tasks/ingest/video-correct.js.map +1 -0
  181. package/dist/llm/tasks/ingest/video-transcribe.d.ts +4 -0
  182. package/dist/llm/tasks/ingest/video-transcribe.js +105 -0
  183. package/dist/llm/tasks/ingest/video-transcribe.js.map +1 -0
  184. package/dist/llm/tasks/schemas.d.ts +5 -0
  185. package/dist/llm/tasks/schemas.js +107 -0
  186. package/dist/llm/tasks/schemas.js.map +1 -0
  187. package/dist/llm/types.d.ts +97 -0
  188. package/dist/llm/types.js +13 -0
  189. package/dist/llm/types.js.map +1 -0
  190. package/dist/usecases/doctor.d.ts +1 -1
  191. package/dist/usecases/doctor.js +36 -9
  192. package/dist/usecases/doctor.js.map +1 -1
  193. package/dist/usecases/ingest/command.d.ts +5 -0
  194. package/dist/usecases/ingest/command.js +57 -0
  195. package/dist/usecases/ingest/command.js.map +1 -0
  196. package/dist/usecases/ingest/fanout.d.ts +10 -0
  197. package/dist/usecases/ingest/fanout.js +23 -0
  198. package/dist/usecases/ingest/fanout.js.map +1 -0
  199. package/dist/usecases/ingest/pass4-mention-resolve.d.ts +11 -0
  200. package/dist/usecases/ingest/pass4-mention-resolve.js +52 -0
  201. package/dist/usecases/ingest/pass4-mention-resolve.js.map +1 -0
  202. package/dist/usecases/ingest/pass5-extract.d.ts +7 -0
  203. package/dist/usecases/ingest/pass5-extract.js +50 -0
  204. package/dist/usecases/ingest/pass5-extract.js.map +1 -0
  205. package/dist/usecases/ingest/pass5-govern.d.ts +13 -0
  206. package/dist/usecases/ingest/pass5-govern.js +155 -0
  207. package/dist/usecases/ingest/pass5-govern.js.map +1 -0
  208. package/dist/usecases/ingest/pipeline.d.ts +28 -0
  209. package/dist/usecases/ingest/pipeline.js +144 -0
  210. package/dist/usecases/ingest/pipeline.js.map +1 -0
  211. package/dist/usecases/ingest/publish-command.d.ts +4 -0
  212. package/dist/usecases/ingest/publish-command.js +77 -0
  213. package/dist/usecases/ingest/publish-command.js.map +1 -0
  214. package/dist/usecases/ingest/status.d.ts +39 -0
  215. package/dist/usecases/ingest/status.js +155 -0
  216. package/dist/usecases/ingest/status.js.map +1 -0
  217. package/dist/usecases/ingest/video-pass3.d.ts +26 -0
  218. package/dist/usecases/ingest/video-pass3.js +0 -0
  219. package/dist/usecases/ingest/video-pass3.js.map +1 -0
  220. package/dist/usecases/ingest/video-pipeline.d.ts +32 -0
  221. package/dist/usecases/ingest/video-pipeline.js +202 -0
  222. package/dist/usecases/ingest/video-pipeline.js.map +1 -0
  223. package/dist/usecases/ingest/view-command.d.ts +4 -0
  224. package/dist/usecases/ingest/view-command.js +51 -0
  225. package/dist/usecases/ingest/view-command.js.map +1 -0
  226. package/dist/usecases/script/actions.js +2 -2
  227. package/dist/usecases/script/actions.js.map +1 -1
  228. package/dist/usecases/script/actor.js.map +1 -1
  229. package/dist/usecases/script/actors.js.map +1 -1
  230. package/dist/usecases/script/add-actor.js.map +1 -1
  231. package/dist/usecases/script/add-episode.js.map +1 -1
  232. package/dist/usecases/script/add-location.js.map +1 -1
  233. package/dist/usecases/script/add-prop.js.map +1 -1
  234. package/dist/usecases/script/alias.js.map +1 -1
  235. package/dist/usecases/script/assets.js.map +1 -1
  236. package/dist/usecases/script/context.js.map +1 -1
  237. package/dist/usecases/script/create.js +3 -6
  238. package/dist/usecases/script/create.js.map +1 -1
  239. package/dist/usecases/script/delete.js.map +1 -1
  240. package/dist/usecases/script/describe.js.map +1 -1
  241. package/dist/usecases/script/dialogue.js +6 -13
  242. package/dist/usecases/script/dialogue.js.map +1 -1
  243. package/dist/usecases/script/do.js +1 -1
  244. package/dist/usecases/script/do.js.map +1 -1
  245. package/dist/usecases/script/episodes.js.map +1 -1
  246. package/dist/usecases/script/{add-speaker.d.ts → importance.d.ts} +1 -1
  247. package/dist/usecases/script/importance.js +17 -0
  248. package/dist/usecases/script/importance.js.map +1 -0
  249. package/dist/usecases/script/insert.js.map +1 -1
  250. package/dist/usecases/script/issues.js.map +1 -1
  251. package/dist/usecases/script/lib.d.ts +8 -6
  252. package/dist/usecases/script/lib.js +81 -97
  253. package/dist/usecases/script/lib.js.map +1 -1
  254. package/dist/usecases/script/locations.js.map +1 -1
  255. package/dist/usecases/script/merge.js.map +1 -1
  256. package/dist/usecases/script/move.js.map +1 -1
  257. package/dist/usecases/script/props.js.map +1 -1
  258. package/dist/usecases/script/refs.js.map +1 -1
  259. package/dist/usecases/script/rename.js.map +1 -1
  260. package/dist/usecases/script/replace.js.map +1 -1
  261. package/dist/usecases/script/role.js.map +1 -1
  262. package/dist/usecases/script/scenes.js +8 -15
  263. package/dist/usecases/script/scenes.js.map +1 -1
  264. package/dist/usecases/script/script-patch.js +1 -1
  265. package/dist/usecases/script/script-patch.js.map +1 -1
  266. package/dist/usecases/script/script-validate.js +1 -1
  267. package/dist/usecases/script/script-validate.js.map +1 -1
  268. package/dist/usecases/script/session.d.ts +4 -4
  269. package/dist/usecases/script/session.js +57 -78
  270. package/dist/usecases/script/session.js.map +1 -1
  271. package/dist/usecases/script/split.js.map +1 -1
  272. package/dist/usecases/script/state-add.js.map +1 -1
  273. package/dist/usecases/script/state-delete.js.map +1 -1
  274. package/dist/usecases/script/state-rename.js.map +1 -1
  275. package/dist/usecases/script/summary.js.map +1 -1
  276. package/dist/usecases/script/synopsis-generate.d.ts +4 -5
  277. package/dist/usecases/script/synopsis-generate.js +30 -46
  278. package/dist/usecases/script/synopsis-generate.js.map +1 -1
  279. package/dist/usecases/script/transition.js.map +1 -1
  280. package/dist/usecases/script/type.js.map +1 -1
  281. package/dist/usecases/script/worldview.js.map +1 -1
  282. package/package.json +22 -17
  283. package/skills/scriptctl/SKILL.md +140 -120
  284. package/skills/scriptctl/references/atomic-write-workflow.md +12 -9
  285. package/skills/scriptctl/references/ingest-workflow.md +85 -0
  286. package/skills/scriptctl/references/state-reference-repair.md +26 -39
  287. package/dist/domain/direct/runner.d.ts +0 -25
  288. package/dist/domain/direct/runner.js +0 -88
  289. package/dist/domain/direct/runner.js.map +0 -1
  290. package/dist/domain/direct/stage.d.ts +0 -108
  291. package/dist/domain/direct/stage.js +0 -134
  292. package/dist/domain/direct/stage.js.map +0 -1
  293. package/dist/domain/direct/stages/asset-curation.d.ts +0 -2
  294. package/dist/domain/direct/stages/asset-curation.js +0 -10
  295. package/dist/domain/direct/stages/asset-curation.js.map +0 -1
  296. package/dist/domain/direct/stages/batch-extract.d.ts +0 -2
  297. package/dist/domain/direct/stages/batch-extract.js +0 -12
  298. package/dist/domain/direct/stages/batch-extract.js.map +0 -1
  299. package/dist/domain/direct/stages/batch-plan.d.ts +0 -2
  300. package/dist/domain/direct/stages/batch-plan.js +0 -9
  301. package/dist/domain/direct/stages/batch-plan.js.map +0 -1
  302. package/dist/domain/direct/stages/episode-merge.d.ts +0 -2
  303. package/dist/domain/direct/stages/episode-merge.js +0 -11
  304. package/dist/domain/direct/stages/episode-merge.js.map +0 -1
  305. package/dist/domain/direct/stages/episode-plan.d.ts +0 -2
  306. package/dist/domain/direct/stages/episode-plan.js +0 -9
  307. package/dist/domain/direct/stages/episode-plan.js.map +0 -1
  308. package/dist/domain/direct/stages/episode-synopsis.d.ts +0 -2
  309. package/dist/domain/direct/stages/episode-synopsis.js +0 -12
  310. package/dist/domain/direct/stages/episode-synopsis.js.map +0 -1
  311. package/dist/domain/direct/stages/episode-titles.d.ts +0 -2
  312. package/dist/domain/direct/stages/episode-titles.js +0 -12
  313. package/dist/domain/direct/stages/episode-titles.js.map +0 -1
  314. package/dist/domain/direct/stages/index.d.ts +0 -19
  315. package/dist/domain/direct/stages/index.js +0 -41
  316. package/dist/domain/direct/stages/index.js.map +0 -1
  317. package/dist/domain/direct/stages/metadata.d.ts +0 -2
  318. package/dist/domain/direct/stages/metadata.js +0 -11
  319. package/dist/domain/direct/stages/metadata.js.map +0 -1
  320. package/dist/domain/direct/stages/script-merge.d.ts +0 -2
  321. package/dist/domain/direct/stages/script-merge.js +0 -15
  322. package/dist/domain/direct/stages/script-merge.js.map +0 -1
  323. package/dist/domain/direct/stages/script-synopsis.d.ts +0 -2
  324. package/dist/domain/direct/stages/script-synopsis.js +0 -12
  325. package/dist/domain/direct/stages/script-synopsis.js.map +0 -1
  326. package/dist/domain/direct/stages/source-prepare.d.ts +0 -2
  327. package/dist/domain/direct/stages/source-prepare.js +0 -9
  328. package/dist/domain/direct/stages/source-prepare.js.map +0 -1
  329. package/dist/domain/direct/stages/state-binding.d.ts +0 -2
  330. package/dist/domain/direct/stages/state-binding.js +0 -9
  331. package/dist/domain/direct/stages/state-binding.js.map +0 -1
  332. package/dist/domain/direct/stages/state-curation.d.ts +0 -2
  333. package/dist/domain/direct/stages/state-curation.js +0 -10
  334. package/dist/domain/direct/stages/state-curation.js.map +0 -1
  335. package/dist/domain/direct/stages/validate.d.ts +0 -2
  336. package/dist/domain/direct/stages/validate.js +0 -10
  337. package/dist/domain/direct/stages/validate.js.map +0 -1
  338. package/dist/domain/direct-core.d.ts +0 -313
  339. package/dist/domain/direct-core.js +0 -8514
  340. package/dist/domain/direct-core.js.map +0 -1
  341. package/dist/domain/script/validate.d.ts +0 -22
  342. package/dist/domain/script/validate.js +0 -997
  343. package/dist/domain/script/validate.js.map +0 -1
  344. package/dist/infra/providers.d.ts +0 -97
  345. package/dist/infra/providers.js +0 -1396
  346. package/dist/infra/providers.js.map +0 -1
  347. package/dist/usecases/direct.d.ts +0 -27
  348. package/dist/usecases/direct.js +0 -4172
  349. package/dist/usecases/direct.js.map +0 -1
  350. package/dist/usecases/parse.d.ts +0 -15
  351. package/dist/usecases/parse.js +0 -429
  352. package/dist/usecases/parse.js.map +0 -1
  353. package/dist/usecases/script/add-speaker.js +0 -22
  354. package/dist/usecases/script/add-speaker.js.map +0 -1
  355. package/dist/usecases/script/export.d.ts +0 -3
  356. package/dist/usecases/script/export.js +0 -111
  357. package/dist/usecases/script/export.js.map +0 -1
  358. package/dist/usecases/script/overlap.d.ts +0 -3
  359. package/dist/usecases/script/overlap.js +0 -21
  360. package/dist/usecases/script/overlap.js.map +0 -1
  361. package/dist/usecases/script/speakers.d.ts +0 -3
  362. package/dist/usecases/script/speakers.js +0 -28
  363. package/dist/usecases/script/speakers.js.map +0 -1
  364. package/dist/usecases/script/state-change.d.ts +0 -3
  365. package/dist/usecases/script/state-change.js +0 -24
  366. package/dist/usecases/script/state-change.js.map +0 -1
  367. package/skills/scriptctl/references/direct-workflow.md +0 -72
@@ -1,72 +1,59 @@
1
- # State 引用修复核验
1
+ # State 引用修复核验(v3)
2
2
 
3
- 适用:合并 state、删除 state,或修 `STATE_NOT_FOUND` / 状态引用错连。重点不是只改 `states[]`,而是确认引用该状态的场和动作都被修好。
3
+ 适用:合并 state、删除 state,或修 `STATE_NOT_MATERIALIZED` / 状态引用错连。重点不是只改 `states[]`,而是确认**引用该状态的场景 cast 引用**都被修好。
4
+
5
+ > v3 里造型(state)只挂在**场景级 cast 引用**上(`scene.actors[]` / `props[]` / `location` 的 `state_id`),**没有** action 级 `state_changes`。所以引用只有一层,比 v2 简单。
4
6
 
5
7
  ## 操作语义
6
8
 
7
- scriptctl 没有单独的 `state-merge` 命令;合并 state 用“删除旧 state 并替换引用”表达:
9
+ scriptctl 没有单独的 `state-merge` 命令;合并 state = "删旧 state 并替换引用":
8
10
 
9
11
  ```bash
10
- scriptctl delete actor:act_001/st_old --strategy replace --replacement st_keep
11
- ```
12
-
13
- 删除且不保留引用:
12
+ # 合并:把 st_old 的引用全指向 st_keep,再删 st_old(replacement 必须是同一资产已存在的 state_id)
13
+ scriptctl state-delete actor:act_001/st_old --strategy replace --replacement st_keep
14
14
 
15
- ```bash
16
- scriptctl delete actor:act_001/st_old --strategy remove
15
+ # 真删除:删 st_old,引用它的场景 ref 的 state_id 被清掉
16
+ scriptctl state-delete actor:act_001/st_old --strategy remove
17
17
  ```
18
18
 
19
- 等价别名:`state-delete actor:act_001/st_old --strategy ...`。
19
+ (`delete actor:act_001/st_old --strategy ...` 是等价写法。)
20
20
 
21
21
  ## 必查流程
22
22
 
23
- 1. 操作前反查旧 state
23
+ 1. **操作前反查旧 state**,看谁在引用它:
24
24
 
25
25
  ```bash
26
26
  scriptctl refs actor:act_001/st_old
27
27
  ```
28
28
 
29
- 输出里 `scene_initial_state` 是场景 context 引用,形如 `ep_001/scn_003.context.actors[0]`;`state_change_from` / `state_change_to` 是 action 的 `state_changes` 引用。
29
+ 输出里是各场景 cast 引用(形如 `ep_001/scn_003.actors[0].state_id`)。
30
30
 
31
- 2. 合并时用 `replace`,不要先裸删 state:
31
+ 2. **合并用 `replace`**,不要先裸删:
32
32
 
33
33
  ```bash
34
- scriptctl delete actor:act_001/st_old --strategy replace --replacement st_keep
34
+ scriptctl state-delete actor:act_001/st_old --strategy replace --replacement st_keep
35
35
  ```
36
36
 
37
- 期望结果:
38
- - `scriptctl refs actor:act_001/st_old` 为空。
39
- - `scriptctl refs actor:act_001/st_keep` 包含原来应该保留的场景初始状态和 action 状态变化引用。
40
- - `scriptctl validate` 通过。
37
+ 期望:`refs actor:act_001/st_old` 为空;`refs actor:act_001/st_keep` 含原来该保留的场景引用;`scriptctl validate` 通过。
41
38
 
42
- 3. 真删除时用 `remove`:
39
+ 3. **真删除用 `remove`**:
43
40
 
44
41
  ```bash
45
- scriptctl delete actor:act_001/st_old --strategy remove
42
+ scriptctl state-delete actor:act_001/st_old --strategy remove
46
43
  ```
47
44
 
48
- 期望结果:
49
- - 场景 context 中引用该 state 的 ref 被保留,但 `state_id` 变成 `null`。
50
- - 涉及该 state 的 action `state_changes` 被移除,避免留下半截 from/to。
51
- - `scriptctl refs actor:act_001/st_old` 为空,`scriptctl validate` 通过。
52
-
53
- 4. 如果只想清某场的初始状态,不要删 state:
45
+ 期望:引用该 state 的场景 ref 被保留、但 `state_id` 被清(角色仍在场,只是没造型);`refs actor:act_001/st_old` 为空;`validate` 通过。
54
46
 
55
- ```bash
56
- scriptctl context ep_001/scn_003 actor:act_001 --clear
57
- ```
58
-
59
- 如果要移除该角色在某场的引用:
47
+ 4. **只想清某场的造型**(不删 state):
60
48
 
61
49
  ```bash
62
- scriptctl context ep_001/scn_003 actor:act_001 --remove
50
+ scriptctl scene-ref ep_001/scn_003 actor:act_001 --clear # 保留在场,清造型
51
+ scriptctl scene-ref ep_001/scn_003 actor:act_001 --remove # 整个移出该场
63
52
  ```
64
53
 
65
- ## 状态引用散在两层
66
-
67
- 改状态引用时两层都要覆盖,`replace`/`remove` 会自动处理,核验时也按这两层看:
68
-
69
- - 场景初始状态:`scene.context.{actors|locations|props}[].state_id`。
70
- - 动作状态变化:`action.state_changes[].from_state_id` / `to_state_id`。
54
+ ## 核验要点
71
55
 
72
- `replace` 把两层里指向旧 state 的引用全改成 replacement 再删旧定义;`remove` 把 context ref 的 `state_id` 清成 `null` 并删掉碰到旧 state 的 action state_changes。replacement 只能是**同一资产**上已存在的 state_id。改完用 `scriptctl refs actor:<id>/<st>` 复查为空、`scriptctl validate` 通过。
56
+ - 引用只有一层:`scene.{actors|props}[].state_id` `scene.location.state_id`。`replace`/`remove` 会自动处理这一层。
57
+ - replacement 只能是**同一资产**上已存在的 state_id。
58
+ - 改完固定两步复查:`scriptctl refs actor:<id>/<st>` 为空 + `scriptctl validate` 通过。
59
+ - `STATE_NOT_MATERIALIZED`:某场引用了一个该资产上不存在的 state_id。用 `scriptctl states <asset>` 看合法 state_id,再 `scene-ref <ep/scn> <kind:id> --state <合法 id>` 修正。
@@ -1,25 +0,0 @@
1
- import { type Stage, type StageContext } from "./stage.js";
2
- export interface RunStagesOptions {
3
- force?: boolean;
4
- bypassInternalCaches?: boolean;
5
- only?: Set<string>;
6
- persistScriptAfterStages?: boolean;
7
- }
8
- /**
9
- * Run the pipeline in order. A stage whose output artifact already exists and
10
- * validates is skipped (resume), unless `force` is set or it isn't in `only`.
11
- * Stages with `output: null` always run (they decide their own per-unit reuse).
12
- *
13
- * The StageIncomplete sentinel (raised by episode-synopsis when some episode
14
- * still has unextracted batches) is NOT swallowed — it propagates so the
15
- * orchestrator can emit the INIT INCOMPLETE report + EXIT_RUNTIME, exactly as
16
- * the former god-command did with its early return.
17
- */
18
- export declare function runStages(ctx: StageContext, stages?: readonly Stage[], opts?: RunStagesOptions): Promise<void>;
19
- /**
20
- * Run exactly one stage by name against an existing workspace. Each stage
21
- * rehydrates the prior artifacts it needs from disk (ensure* helpers), so a
22
- * single step can run standalone — `direct run metadata` re-extracts metadata
23
- * for a workspace whose script.initial.json already exists, etc.
24
- */
25
- export declare function runOne(ctx: StageContext, stageName: string): Promise<Stage>;
@@ -1,88 +0,0 @@
1
- import { CliError, EXIT_USAGE } from "../../common.js";
2
- import { stageRunStateName } from "./stage.js";
3
- import { STAGES, stageByName, stageNames } from "./stages/index.js";
4
- // Stages that mutate the in-memory script but rely on a LATER stage to persist
5
- // it: in a full init the script-synopsis stage is the single write point for
6
- // script.initial.json. When one of these runs standalone via `direct run`, no
7
- // later stage follows, so runOne must persist the result or the mutation is
8
- // silently lost (e.g. `direct run metadata` would update asset_metadata.json but
9
- // leave the stale script on disk). script-synopsis writes the script itself and
10
- // validate is read-only, so neither is listed.
11
- const SCRIPT_PERSISTING_STAGES = new Set(["script-merge", "asset-curation", "state-curation", "state-binding", "metadata"]);
12
- // Whether a stage can be skipped because its single output artifact is already
13
- // present and valid. Stages with `output: null` (per-unit / always-recompute)
14
- // are never skipped wholesale — they manage their own reuse internally.
15
- function isStageSatisfied(stage, ctx) {
16
- if (stage.output === null)
17
- return false;
18
- return ctx.ws.readJsonSafe(stage.output) !== null;
19
- }
20
- /**
21
- * Run the pipeline in order. A stage whose output artifact already exists and
22
- * validates is skipped (resume), unless `force` is set or it isn't in `only`.
23
- * Stages with `output: null` always run (they decide their own per-unit reuse).
24
- *
25
- * The StageIncomplete sentinel (raised by episode-synopsis when some episode
26
- * still has unextracted batches) is NOT swallowed — it propagates so the
27
- * orchestrator can emit the INIT INCOMPLETE report + EXIT_RUNTIME, exactly as
28
- * the former god-command did with its early return.
29
- */
30
- export async function runStages(ctx, stages = STAGES, opts = {}) {
31
- ctx.ws.ensure();
32
- // script-synopsis is the natural write point for script.initial.json. If it will
33
- // run later in THIS invocation it persists the cumulative script once at the end,
34
- // so the per-stage hook below would only duplicate that write (and flush partial
35
- // pre-synopsis artifacts). Only persist per-stage when synopsis is NOT in this run
36
- // (a single-stage `direct run metadata` / runOne path), so the mutation isn't lost.
37
- const synopsisPersistsLater = stages.some((s) => s.name === "script-synopsis" && (!opts.only || opts.only.has("script-synopsis")));
38
- const persistScriptAfterStages = opts.persistScriptAfterStages ?? true;
39
- for (const stage of stages) {
40
- if (opts.only && !opts.only.has(stage.name))
41
- continue;
42
- if (!opts.force && isStageSatisfied(stage, ctx)) {
43
- ctx.emitProgress(stage.name, "success");
44
- ctx.timing.record({
45
- name: stageRunStateName(stage.name),
46
- category: "stage",
47
- status: "skipped",
48
- startedAtMs: Date.now(),
49
- finishedAtMs: Date.now(),
50
- });
51
- continue;
52
- }
53
- const previousBypassInternalCaches = ctx.state.bypassInternalCaches;
54
- ctx.state.bypassInternalCaches = Boolean(opts.bypassInternalCaches);
55
- try {
56
- await ctx.timing.span({ name: stageRunStateName(stage.name), category: "stage" }, () => stage.run(ctx));
57
- }
58
- finally {
59
- ctx.state.bypassInternalCaches = previousBypassInternalCaches;
60
- }
61
- if (persistScriptAfterStages && !synopsisPersistsLater && SCRIPT_PERSISTING_STAGES.has(stage.name) && ctx.state.script) {
62
- ctx.ws.writeJson("script.initial.json", ctx.state.script);
63
- }
64
- }
65
- }
66
- /**
67
- * Run exactly one stage by name against an existing workspace. Each stage
68
- * rehydrates the prior artifacts it needs from disk (ensure* helpers), so a
69
- * single step can run standalone — `direct run metadata` re-extracts metadata
70
- * for a workspace whose script.initial.json already exists, etc.
71
- */
72
- export async function runOne(ctx, stageName) {
73
- const stage = stageByName(stageName);
74
- if (!stage) {
75
- throw new CliError("DIRECT RUN BLOCKED: unknown stage", `Unknown stage "${stageName}".`, {
76
- exitCode: EXIT_USAGE,
77
- required: [`one of: ${stageNames().join(", ")}`],
78
- received: [stageName],
79
- nextSteps: ["Pass a valid stage name to `direct run`."],
80
- });
81
- }
82
- // Delegate to runStages so the single post-stage persist hook (and any future
83
- // shared behaviour) applies identically to the standalone path — `direct run
84
- // <stage> --force` and the non-force `runStages({only})` path must not diverge.
85
- await runStages(ctx, [stage], { force: true, bypassInternalCaches: true });
86
- return stage;
87
- }
88
- //# sourceMappingURL=runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/domain/direct/runner.ts"],"names":[],"mappings":"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"}
@@ -1,108 +0,0 @@
1
- import type { ProviderLike } from "../direct-core.js";
2
- export type Dict = Record<string, unknown>;
3
- export type StageName = "source-prepare" | "episode-plan" | "episode-titles" | "batch-plan" | "batch-extract" | "episode-merge" | "episode-synopsis" | "script-merge" | "asset-curation" | "state-curation" | "state-binding" | "metadata" | "script-synopsis" | "validate";
4
- export declare function stageRunStateName(stage: StageName): string;
5
- export declare class Workspace {
6
- readonly root: string;
7
- readonly dir: string;
8
- constructor(root: string);
9
- ensure(): void;
10
- pathOf(name: string): string;
11
- rootPathOf(name: string): string;
12
- has(name: string): boolean;
13
- hasRoot(name: string): boolean;
14
- readJson<T = Dict>(name: string): T;
15
- readJsonOr<T = Dict>(name: string, fallback: T): T;
16
- readJsonSafe<T = Dict>(name: string): T | null;
17
- writeJson(name: string, data: unknown): void;
18
- readText(name: string): string;
19
- readRootText(name: string): string;
20
- mkdir(name: string): string;
21
- delete(name: string): void;
22
- }
23
- export interface DirectRunOptions {
24
- source: string;
25
- workspace: string;
26
- providerName: string;
27
- model: string;
28
- concurrency: number;
29
- batchMode: string;
30
- batchTargetLines: number;
31
- batchMaxChars: number;
32
- batchMinLines: number;
33
- selEpisodes: Set<number>;
34
- selBatches: Set<string>;
35
- retryErrors: boolean;
36
- runAll: boolean;
37
- skipSummary: boolean;
38
- skipMetadata: boolean;
39
- resummarize: boolean;
40
- summaryThresholdChars: number;
41
- }
42
- export interface DirectRunState {
43
- manifest: Dict | null;
44
- episodePlan: Dict | null;
45
- batchPlan: Dict | null;
46
- sourceText: string;
47
- projectName: string;
48
- titleDegraded: number[];
49
- pending: Dict[];
50
- reusedBatchCount: number;
51
- stickyErrorCount: number;
52
- changedEpisodes: Set<number>;
53
- doneBatches: number;
54
- erroredBatches: number;
55
- totalEpisodes: number;
56
- totalBatches: number;
57
- mergedResults: Dict[];
58
- incompleteEpisodes: number[];
59
- summaryDegradedEpisodes: number[];
60
- summaryFullDegraded: boolean;
61
- summaryDegradeReason: string;
62
- script: Dict | null;
63
- assetNormalization: Dict | null;
64
- bypassInternalCaches: boolean;
65
- validation: Dict | null;
66
- }
67
- export declare function emptyRunState(): DirectRunState;
68
- export declare class StageIncomplete extends Error {
69
- constructor(message?: string);
70
- }
71
- export interface StageContext {
72
- ws: Workspace;
73
- options: DirectRunOptions;
74
- state: DirectRunState;
75
- provider(): ProviderLike;
76
- timing: DirectTimingRecorder;
77
- emitProgress: ProgressEmitter;
78
- updateRunState(updates: Dict): void;
79
- }
80
- export type DirectTimingStatus = "success" | "error" | "skipped";
81
- export type DirectTimingCategory = "stage" | "substage" | "chunk" | "repair" | "branch";
82
- export interface DirectTimingSpanOptions {
83
- name: string;
84
- category: DirectTimingCategory;
85
- parent?: string;
86
- metadata?: Dict;
87
- }
88
- export interface DirectTimingRecordOptions extends DirectTimingSpanOptions {
89
- status: DirectTimingStatus;
90
- startedAtMs: number;
91
- finishedAtMs: number;
92
- error?: string;
93
- }
94
- export interface DirectTimingRecorder {
95
- reset(command: string): void;
96
- span<T>(options: DirectTimingSpanOptions, run: () => Promise<T> | T): Promise<T>;
97
- record(options: DirectTimingRecordOptions): void;
98
- flush(): void;
99
- }
100
- export interface Stage {
101
- readonly name: StageName;
102
- readonly output: string | null;
103
- run(ctx: StageContext): Promise<void>;
104
- }
105
- export interface ProgressEmitter {
106
- (stage: StageName, status?: "running" | "success" | "warning" | "skipped" | "error" | "pending"): void;
107
- }
108
- export type ProviderFactory = () => ProviderLike;
@@ -1,134 +0,0 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import { deletePath, directDir, exists, readJson, readText, writeJson, } from "../../common.js";
4
- // run_state.json carries the snake_case stage names that `direct status` and
5
- // emitInitProgress already key on; keep them as the persisted identity so the
6
- // status table is byte-compatible with the pre-refactor pipeline.
7
- export function stageRunStateName(stage) {
8
- switch (stage) {
9
- case "source-prepare": return "source_prepare";
10
- case "episode-plan": return "episode_plan";
11
- case "episode-titles": return "episode_titles";
12
- case "batch-plan": return "batch_plan";
13
- case "batch-extract": return "batch_extract";
14
- case "episode-merge": return "episode_merge";
15
- case "episode-synopsis": return "episode_synopsis";
16
- case "script-merge": return "script_merge";
17
- case "asset-curation": return "asset_curation";
18
- case "state-curation": return "state_curation";
19
- case "state-binding": return "state_binding";
20
- case "metadata": return "metadata_extract";
21
- case "script-synopsis": return "script_synopsis";
22
- case "validate": return "validate";
23
- }
24
- }
25
- // ---------------------------------------------------------------------------
26
- // Workspace — typed, atomic artifact IO over the direct workspace directory.
27
- // Wraps common.ts's DEFAULT_STORE writes (tmp file + rename), so a crash mid-
28
- // write can never leave a torn artifact. Sole owner of the `*_results/`,
29
- // `script.initial.json`, `run_state.json` on-disk layout used by the pipeline.
30
- // ---------------------------------------------------------------------------
31
- export class Workspace {
32
- root;
33
- dir;
34
- constructor(root) {
35
- this.root = root;
36
- this.dir = directDir(root);
37
- }
38
- ensure() {
39
- fs.mkdirSync(this.dir, { recursive: true });
40
- }
41
- // Absolute path of an artifact under the direct dir (e.g. "episode_plan.json"
42
- // or "batch_results"). Relative segments are joined onto the direct dir.
43
- pathOf(name) {
44
- return path.join(this.dir, name);
45
- }
46
- // Absolute path of a file relative to the workspace ROOT (e.g. "source.txt",
47
- // which lives beside the direct dir, not inside it).
48
- rootPathOf(name) {
49
- return path.join(this.root, name);
50
- }
51
- has(name) {
52
- return exists(this.pathOf(name));
53
- }
54
- hasRoot(name) {
55
- return exists(this.rootPathOf(name));
56
- }
57
- readJson(name) {
58
- return readJson(this.pathOf(name));
59
- }
60
- readJsonOr(name, fallback) {
61
- return this.has(name) ? this.readJson(name) : fallback;
62
- }
63
- // Read but never throw on a malformed/absent artifact — returns null so a
64
- // stage can treat "present but corrupt" the same as "missing" (self-heal).
65
- readJsonSafe(name) {
66
- if (!this.has(name))
67
- return null;
68
- try {
69
- return this.readJson(name);
70
- }
71
- catch {
72
- return null;
73
- }
74
- }
75
- // Atomic write (tmp + rename, via DEFAULT_STORE.writeJson). Creates the parent
76
- // dir if needed so a stage never has to mkdir its own results dir.
77
- writeJson(name, data) {
78
- fs.mkdirSync(path.dirname(this.pathOf(name)), { recursive: true });
79
- writeJson(this.pathOf(name), data);
80
- }
81
- readText(name) {
82
- return readText(this.pathOf(name));
83
- }
84
- readRootText(name) {
85
- return readText(this.rootPathOf(name));
86
- }
87
- mkdir(name) {
88
- const p = this.pathOf(name);
89
- fs.mkdirSync(p, { recursive: true });
90
- return p;
91
- }
92
- delete(name) {
93
- const p = this.pathOf(name);
94
- if (exists(p))
95
- deletePath(p);
96
- }
97
- }
98
- export function emptyRunState() {
99
- return {
100
- manifest: null,
101
- episodePlan: null,
102
- batchPlan: null,
103
- sourceText: "",
104
- projectName: "",
105
- titleDegraded: [],
106
- pending: [],
107
- reusedBatchCount: 0,
108
- stickyErrorCount: 0,
109
- changedEpisodes: new Set(),
110
- doneBatches: 0,
111
- erroredBatches: 0,
112
- totalEpisodes: 0,
113
- totalBatches: 0,
114
- mergedResults: [],
115
- incompleteEpisodes: [],
116
- summaryDegradedEpisodes: [],
117
- summaryFullDegraded: false,
118
- summaryDegradeReason: "",
119
- script: null,
120
- assetNormalization: null,
121
- bypassInternalCaches: false,
122
- validation: null,
123
- };
124
- }
125
- // Sentinel a stage throws to abort the run with an "incomplete" (not "failed")
126
- // outcome — the batch-extract → episode-merge path uses it when some episode
127
- // still has unextracted batches, which is a resumable non-error stop.
128
- export class StageIncomplete extends Error {
129
- constructor(message = "stage incomplete") {
130
- super(message);
131
- this.name = "StageIncomplete";
132
- }
133
- }
134
- //# sourceMappingURL=stage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../src/domain/direct/stage.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { Stage } from "../stage.js";
2
- export declare const assetCurationStage: Stage;
@@ -1,10 +0,0 @@
1
- import { stageAssetCuration } from "../../../usecases/direct.js";
2
- // Provider first emits name-only grouping expressions, then compact curation
3
- // expressions; deterministic code parses and applies both to ctx.state.script
4
- // (or script.initial.json). Writes: asset_grouping.json, asset_curation.json.
5
- export const assetCurationStage = {
6
- name: "asset-curation",
7
- output: "asset_curation.json",
8
- run: (ctx) => stageAssetCuration(ctx),
9
- };
10
- //# sourceMappingURL=asset-curation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"asset-curation.js","sourceRoot":"","sources":["../../../../src/domain/direct/stages/asset-curation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAU;IACvC,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,qBAAqB;IAC7B,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC;CACtC,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { Stage } from "../stage.js";
2
- export declare const batchExtractStage: Stage;
@@ -1,12 +0,0 @@
1
- import { stageBatchExtract } from "../../../usecases/direct.js";
2
- // LLM-extract each batch concurrently, persisting per-batch result/error files
3
- // (the resume unit). Reads: source.txt + episode_plan.json + batch_plan.json.
4
- // Writes: batch_results/<key>.json|.error.json. `output: null` — completion is
5
- // per-batch, not a single artifact, so the runner never skips it wholesale;
6
- // reuse is decided per batch inside the stage (classifyBatch).
7
- export const batchExtractStage = {
8
- name: "batch-extract",
9
- output: null,
10
- run: (ctx) => stageBatchExtract(ctx),
11
- };
12
- //# sourceMappingURL=batch-extract.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"batch-extract.js","sourceRoot":"","sources":["../../../../src/domain/direct/stages/batch-extract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,4EAA4E;AAC5E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAAU;IACtC,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC;CACrC,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { Stage } from "../stage.js";
2
- export declare const batchPlanStage: Stage;
@@ -1,9 +0,0 @@
1
- import { stageBatchPlan } from "../../../usecases/direct.js";
2
- // Split each episode into natural extraction batches (deterministic). Reads:
3
- // source.txt + episode_plan.json. Writes: batch_plan.json.
4
- export const batchPlanStage = {
5
- name: "batch-plan",
6
- output: "batch_plan.json",
7
- run: (ctx) => stageBatchPlan(ctx),
8
- };
9
- //# sourceMappingURL=batch-plan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"batch-plan.js","sourceRoot":"","sources":["../../../../src/domain/direct/stages/batch-plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,6EAA6E;AAC7E,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAU;IACnC,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,iBAAiB;IACzB,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC;CAClC,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { Stage } from "../stage.js";
2
- export declare const episodeMergeStage: Stage;
@@ -1,11 +0,0 @@
1
- import { stageEpisodeMerge } from "../../../usecases/direct.js";
2
- // Merge each episode's batch results into one episode result (deterministic).
3
- // Reads: batch_results/ + plans. Writes: in-memory merged results carried on
4
- // ctx.state (persisted by the episode-synopsis stage, matching the god-command
5
- // order). `output: null` — the persisted artifact is written by the next stage.
6
- export const episodeMergeStage = {
7
- name: "episode-merge",
8
- output: null,
9
- run: (ctx) => stageEpisodeMerge(ctx),
10
- };
11
- //# sourceMappingURL=episode-merge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"episode-merge.js","sourceRoot":"","sources":["../../../../src/domain/direct/stages/episode-merge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,8EAA8E;AAC9E,6EAA6E;AAC7E,+EAA+E;AAC/E,gFAAgF;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAU;IACtC,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC;CACrC,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { Stage } from "../stage.js";
2
- export declare const episodePlanStage: Stage;
@@ -1,9 +0,0 @@
1
- import { stageEpisodePlan } from "../../../usecases/direct.js";
2
- // Split source.txt into episodes (deterministic). Reads: source.txt. Writes:
3
- // episode_plan.json.
4
- export const episodePlanStage = {
5
- name: "episode-plan",
6
- output: "episode_plan.json",
7
- run: (ctx) => stageEpisodePlan(ctx),
8
- };
9
- //# sourceMappingURL=episode-plan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"episode-plan.js","sourceRoot":"","sources":["../../../../src/domain/direct/stages/episode-plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,6EAA6E;AAC7E,qBAAqB;AACrB,MAAM,CAAC,MAAM,gBAAgB,GAAU;IACrC,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,mBAAmB;IAC3B,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC;CACpC,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { Stage } from "../stage.js";
2
- export declare const episodeSynopsisStage: Stage;
@@ -1,12 +0,0 @@
1
- import { stageEpisodeSynopsis } from "../../../usecases/direct.js";
2
- // Resolve each episode's synopsis (reduce-1: passthrough / reuse / skip / LLM
3
- // stitch) then persist episode_results/ep_NNN.json. Reads: merged results +
4
- // prior persisted syn. Writes: episode_results/*.json. Also raises the resumable
5
- // "incomplete" stop when an episode still has unextracted batches. `output: null`
6
- // — completion is per-episode, decided inside the stage.
7
- export const episodeSynopsisStage = {
8
- name: "episode-synopsis",
9
- output: null,
10
- run: (ctx) => stageEpisodeSynopsis(ctx),
11
- };
12
- //# sourceMappingURL=episode-synopsis.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"episode-synopsis.js","sourceRoot":"","sources":["../../../../src/domain/direct/stages/episode-synopsis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,8EAA8E;AAC9E,4EAA4E;AAC5E,iFAAiF;AACjF,kFAAkF;AAClF,yDAAyD;AACzD,MAAM,CAAC,MAAM,oBAAoB,GAAU;IACzC,IAAI,EAAE,kBAAkB;IACxB,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC;CACxC,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { Stage } from "../stage.js";
2
- export declare const episodeTitlesStage: Stage;
@@ -1,12 +0,0 @@
1
- import { stageEpisodeTitles } from "../../../usecases/direct.js";
2
- // LLM-enrich the plan's missing episode titles (soft-degrade to deterministic
3
- // titles). Reads: source.txt + episode_plan.json. Writes: episode_plan.json
4
- // (titles filled in place). `output: null` — the plan artifact already exists
5
- // from episode-plan, so completion isn't captured by file presence; the runner
6
- // never skips titles wholesale.
7
- export const episodeTitlesStage = {
8
- name: "episode-titles",
9
- output: null,
10
- run: (ctx) => stageEpisodeTitles(ctx),
11
- };
12
- //# sourceMappingURL=episode-titles.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"episode-titles.js","sourceRoot":"","sources":["../../../../src/domain/direct/stages/episode-titles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,+EAA+E;AAC/E,gCAAgC;AAChC,MAAM,CAAC,MAAM,kBAAkB,GAAU;IACvC,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC;CACtC,CAAC"}
@@ -1,19 +0,0 @@
1
- import type { Stage, StageName } from "../stage.js";
2
- import { sourcePrepareStage } from "./source-prepare.js";
3
- import { episodePlanStage } from "./episode-plan.js";
4
- import { episodeTitlesStage } from "./episode-titles.js";
5
- import { batchPlanStage } from "./batch-plan.js";
6
- import { batchExtractStage } from "./batch-extract.js";
7
- import { episodeMergeStage } from "./episode-merge.js";
8
- import { episodeSynopsisStage } from "./episode-synopsis.js";
9
- import { scriptMergeStage } from "./script-merge.js";
10
- import { assetCurationStage } from "./asset-curation.js";
11
- import { stateCurationStage } from "./state-curation.js";
12
- import { stateBindingStage } from "./state-binding.js";
13
- import { metadataStage } from "./metadata.js";
14
- import { scriptSynopsisStage } from "./script-synopsis.js";
15
- import { validateStage } from "./validate.js";
16
- export declare const STAGES: readonly Stage[];
17
- export declare function stageByName(name: string): Stage | undefined;
18
- export declare function stageNames(): StageName[];
19
- export { sourcePrepareStage, episodePlanStage, episodeTitlesStage, batchPlanStage, batchExtractStage, episodeMergeStage, episodeSynopsisStage, scriptMergeStage, assetCurationStage, stateCurationStage, stateBindingStage, metadataStage, scriptSynopsisStage, validateStage, };