@lingjingai/scriptctl 0.34.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 (375) hide show
  1. package/README.md +30 -5
  2. package/changes/0.35.0.md +22 -0
  3. package/changes/0.36.0.md +22 -0
  4. package/changes/unreleased.md +3 -5
  5. package/dist/cli.d.ts +2 -1
  6. package/dist/cli.js +56 -128
  7. package/dist/cli.js.map +1 -1
  8. package/dist/common.d.ts +0 -16
  9. package/dist/common.js +2 -342
  10. package/dist/common.js.map +1 -1
  11. package/dist/domain/ingest/apply-plan.d.ts +23 -0
  12. package/dist/domain/ingest/apply-plan.js +210 -0
  13. package/dist/domain/ingest/apply-plan.js.map +1 -0
  14. package/dist/domain/ingest/assembler.d.ts +57 -0
  15. package/dist/domain/ingest/assembler.js +181 -0
  16. package/dist/domain/ingest/assembler.js.map +1 -0
  17. package/dist/domain/ingest/chunker.d.ts +9 -0
  18. package/dist/domain/ingest/chunker.js +38 -0
  19. package/dist/domain/ingest/chunker.js.map +1 -0
  20. package/dist/domain/ingest/evidence.d.ts +5 -0
  21. package/dist/domain/ingest/evidence.js +66 -0
  22. package/dist/domain/ingest/evidence.js.map +1 -0
  23. package/dist/domain/ingest/govern.d.ts +3 -0
  24. package/dist/domain/ingest/govern.js +127 -0
  25. package/dist/domain/ingest/govern.js.map +1 -0
  26. package/dist/domain/ingest/jsonl-parser.d.ts +6 -0
  27. package/dist/domain/ingest/jsonl-parser.js +187 -0
  28. package/dist/domain/ingest/jsonl-parser.js.map +1 -0
  29. package/dist/domain/ingest/markdown-parser.d.ts +6 -0
  30. package/dist/domain/ingest/markdown-parser.js +186 -0
  31. package/dist/domain/ingest/markdown-parser.js.map +1 -0
  32. package/dist/domain/ingest/records.d.ts +71 -0
  33. package/dist/domain/ingest/records.js +9 -0
  34. package/dist/domain/ingest/records.js.map +1 -0
  35. package/dist/domain/ingest/renumber.d.ts +14 -0
  36. package/dist/domain/ingest/renumber.js +130 -0
  37. package/dist/domain/ingest/renumber.js.map +1 -0
  38. package/dist/domain/ingest/script-v3.d.ts +94 -0
  39. package/dist/domain/ingest/script-v3.js +7 -0
  40. package/dist/domain/ingest/script-v3.js.map +1 -0
  41. package/dist/domain/ingest/state-reconcile.d.ts +11 -0
  42. package/dist/domain/ingest/state-reconcile.js +90 -0
  43. package/dist/domain/ingest/state-reconcile.js.map +1 -0
  44. package/dist/domain/ingest/validation.d.ts +11 -0
  45. package/dist/domain/ingest/validation.js +168 -0
  46. package/dist/domain/ingest/validation.js.map +1 -0
  47. package/dist/domain/ingest/video-aggregate.d.ts +23 -0
  48. package/dist/domain/ingest/video-aggregate.js +89 -0
  49. package/dist/domain/ingest/video-aggregate.js.map +1 -0
  50. package/dist/domain/ingest/video-apply.d.ts +37 -0
  51. package/dist/domain/ingest/video-apply.js +236 -0
  52. package/dist/domain/ingest/video-apply.js.map +1 -0
  53. package/dist/domain/ingest/video-md-parser.d.ts +2 -0
  54. package/dist/domain/ingest/video-md-parser.js +233 -0
  55. package/dist/domain/ingest/video-md-parser.js.map +1 -0
  56. package/dist/domain/ingest/video-records.d.ts +56 -0
  57. package/dist/domain/ingest/video-records.js +9 -0
  58. package/dist/domain/ingest/video-records.js.map +1 -0
  59. package/dist/domain/loom/index.d.ts +2 -1
  60. package/dist/domain/loom/index.js +12 -10
  61. package/dist/domain/loom/index.js.map +1 -1
  62. package/dist/domain/loom/types.d.ts +3 -2
  63. package/dist/domain/script/lookups.d.ts +3 -2
  64. package/dist/domain/script/lookups.js +25 -8
  65. package/dist/domain/script/lookups.js.map +1 -1
  66. package/dist/domain/script/patch/apply.js +2 -2
  67. package/dist/domain/script/patch/apply.js.map +1 -1
  68. package/dist/domain/script/patch/helpers.d.ts +3 -7
  69. package/dist/domain/script/patch/helpers.js +23 -96
  70. package/dist/domain/script/patch/helpers.js.map +1 -1
  71. package/dist/domain/script/patch/ops-action.d.ts +0 -2
  72. package/dist/domain/script/patch/ops-action.js +34 -100
  73. package/dist/domain/script/patch/ops-action.js.map +1 -1
  74. package/dist/domain/script/patch/ops-asset.d.ts +1 -0
  75. package/dist/domain/script/patch/ops-asset.js +102 -155
  76. package/dist/domain/script/patch/ops-asset.js.map +1 -1
  77. package/dist/domain/script/patch/ops-dialogue.d.ts +1 -4
  78. package/dist/domain/script/patch/ops-dialogue.js +43 -220
  79. package/dist/domain/script/patch/ops-dialogue.js.map +1 -1
  80. package/dist/domain/script/patch/ops-extend.js +8 -2
  81. package/dist/domain/script/patch/ops-extend.js.map +1 -1
  82. package/dist/domain/script/patch/ops-meta.js.map +1 -1
  83. package/dist/domain/script/patch/ops-scene.js +26 -39
  84. package/dist/domain/script/patch/ops-scene.js.map +1 -1
  85. package/dist/domain/script/patch/ops-state.d.ts +3 -3
  86. package/dist/domain/script/patch/ops-state.js +33 -49
  87. package/dist/domain/script/patch/ops-state.js.map +1 -1
  88. package/dist/domain/script/patch/registry.js +9 -13
  89. package/dist/domain/script/patch/registry.js.map +1 -1
  90. package/dist/domain/script/refs.js +23 -111
  91. package/dist/domain/script/refs.js.map +1 -1
  92. package/dist/domain/script/scene-refs.d.ts +3 -0
  93. package/dist/domain/script/scene-refs.js +35 -0
  94. package/dist/domain/script/scene-refs.js.map +1 -0
  95. package/dist/domain/script/schema.js +17 -21
  96. package/dist/domain/script/schema.js.map +1 -1
  97. package/dist/domain/script/text-util.d.ts +7 -0
  98. package/dist/domain/script/text-util.js +91 -0
  99. package/dist/domain/script/text-util.js.map +1 -0
  100. package/dist/help-text.js +145 -414
  101. package/dist/help-text.js.map +1 -1
  102. package/dist/infra/converters.js +1 -1
  103. package/dist/infra/converters.js.map +1 -1
  104. package/dist/infra/episode-title.d.ts +4 -0
  105. package/dist/infra/episode-title.js +129 -0
  106. package/dist/infra/episode-title.js.map +1 -0
  107. package/dist/infra/ingest/review-renderer.d.ts +1 -0
  108. package/dist/infra/ingest/review-renderer.js +431 -0
  109. package/dist/infra/ingest/review-renderer.js.map +1 -0
  110. package/dist/infra/ingest/source-resolver.d.ts +21 -0
  111. package/dist/infra/ingest/source-resolver.js +51 -0
  112. package/dist/infra/ingest/source-resolver.js.map +1 -0
  113. package/dist/infra/ingest/text-reader.d.ts +3 -0
  114. package/dist/infra/ingest/text-reader.js +27 -0
  115. package/dist/infra/ingest/text-reader.js.map +1 -0
  116. package/dist/infra/ingest/video-discovery.d.ts +8 -0
  117. package/dist/infra/ingest/video-discovery.js +60 -0
  118. package/dist/infra/ingest/video-discovery.js.map +1 -0
  119. package/dist/infra/ingest/workspace-store.d.ts +18 -0
  120. package/dist/infra/ingest/workspace-store.js +70 -0
  121. package/dist/infra/ingest/workspace-store.js.map +1 -0
  122. package/dist/infra/llm/anthropic-model.d.ts +11 -0
  123. package/dist/infra/llm/anthropic-model.js +109 -0
  124. package/dist/infra/llm/anthropic-model.js.map +1 -0
  125. package/dist/infra/llm/gemini-upload.d.ts +9 -0
  126. package/dist/infra/llm/gemini-upload.js +94 -0
  127. package/dist/infra/llm/gemini-upload.js.map +1 -0
  128. package/dist/infra/llm/gemini-video-model.d.ts +47 -0
  129. package/dist/infra/llm/gemini-video-model.js +167 -0
  130. package/dist/infra/llm/gemini-video-model.js.map +1 -0
  131. package/dist/infra/llm/openai-compatible-model.d.ts +13 -0
  132. package/dist/infra/llm/openai-compatible-model.js +143 -0
  133. package/dist/infra/llm/openai-compatible-model.js.map +1 -0
  134. package/dist/infra/llm/proxy.d.ts +1 -0
  135. package/dist/infra/llm/proxy.js +30 -0
  136. package/dist/infra/llm/proxy.js.map +1 -0
  137. package/dist/infra/llm/retry.d.ts +5 -0
  138. package/dist/infra/llm/retry.js +20 -0
  139. package/dist/infra/llm/retry.js.map +1 -0
  140. package/dist/llm/composition.d.ts +5 -0
  141. package/dist/llm/composition.js +5 -0
  142. package/dist/llm/composition.js.map +1 -0
  143. package/dist/llm/config.d.ts +26 -0
  144. package/dist/llm/config.js +201 -0
  145. package/dist/llm/config.js.map +1 -0
  146. package/dist/llm/registry.d.ts +44 -0
  147. package/dist/llm/registry.js +48 -0
  148. package/dist/llm/registry.js.map +1 -0
  149. package/dist/llm/router.d.ts +23 -0
  150. package/dist/llm/router.js +0 -0
  151. package/dist/llm/router.js.map +1 -0
  152. package/dist/llm/tasks/ingest/asset-curate.d.ts +13 -0
  153. package/dist/llm/tasks/ingest/asset-curate.js +45 -0
  154. package/dist/llm/tasks/ingest/asset-curate.js.map +1 -0
  155. package/dist/llm/tasks/ingest/asset-extract.d.ts +12 -0
  156. package/dist/llm/tasks/ingest/asset-extract.js +51 -0
  157. package/dist/llm/tasks/ingest/asset-extract.js.map +1 -0
  158. package/dist/llm/tasks/ingest/asset-govern.d.ts +22 -0
  159. package/dist/llm/tasks/ingest/asset-govern.js +143 -0
  160. package/dist/llm/tasks/ingest/asset-govern.js.map +1 -0
  161. package/dist/llm/tasks/ingest/mention-resolve.d.ts +9 -0
  162. package/dist/llm/tasks/ingest/mention-resolve.js +39 -0
  163. package/dist/llm/tasks/ingest/mention-resolve.js.map +1 -0
  164. package/dist/llm/tasks/ingest/plot-speaker.d.ts +11 -0
  165. package/dist/llm/tasks/ingest/plot-speaker.js +72 -0
  166. package/dist/llm/tasks/ingest/plot-speaker.js.map +1 -0
  167. package/dist/llm/tasks/ingest/roster-merge.d.ts +46 -0
  168. package/dist/llm/tasks/ingest/roster-merge.js +235 -0
  169. package/dist/llm/tasks/ingest/roster-merge.js.map +1 -0
  170. package/dist/llm/tasks/ingest/state-merge.d.ts +10 -0
  171. package/dist/llm/tasks/ingest/state-merge.js +84 -0
  172. package/dist/llm/tasks/ingest/state-merge.js.map +1 -0
  173. package/dist/llm/tasks/ingest/state-reconcile.d.ts +8 -0
  174. package/dist/llm/tasks/ingest/state-reconcile.js +44 -0
  175. package/dist/llm/tasks/ingest/state-reconcile.js.map +1 -0
  176. package/dist/llm/tasks/ingest/text-normalize.d.ts +10 -0
  177. package/dist/llm/tasks/ingest/text-normalize.js +89 -0
  178. package/dist/llm/tasks/ingest/text-normalize.js.map +1 -0
  179. package/dist/llm/tasks/ingest/video-correct.d.ts +30 -0
  180. package/dist/llm/tasks/ingest/video-correct.js +144 -0
  181. package/dist/llm/tasks/ingest/video-correct.js.map +1 -0
  182. package/dist/llm/tasks/ingest/video-transcribe.d.ts +4 -0
  183. package/dist/llm/tasks/ingest/video-transcribe.js +105 -0
  184. package/dist/llm/tasks/ingest/video-transcribe.js.map +1 -0
  185. package/dist/llm/tasks/schemas.d.ts +5 -0
  186. package/dist/llm/tasks/schemas.js +107 -0
  187. package/dist/llm/tasks/schemas.js.map +1 -0
  188. package/dist/llm/types.d.ts +97 -0
  189. package/dist/llm/types.js +13 -0
  190. package/dist/llm/types.js.map +1 -0
  191. package/dist/usecases/doctor.d.ts +1 -1
  192. package/dist/usecases/doctor.js +36 -9
  193. package/dist/usecases/doctor.js.map +1 -1
  194. package/dist/usecases/ingest/command.d.ts +5 -0
  195. package/dist/usecases/ingest/command.js +57 -0
  196. package/dist/usecases/ingest/command.js.map +1 -0
  197. package/dist/usecases/ingest/fanout.d.ts +10 -0
  198. package/dist/usecases/ingest/fanout.js +23 -0
  199. package/dist/usecases/ingest/fanout.js.map +1 -0
  200. package/dist/usecases/ingest/pass4-mention-resolve.d.ts +11 -0
  201. package/dist/usecases/ingest/pass4-mention-resolve.js +52 -0
  202. package/dist/usecases/ingest/pass4-mention-resolve.js.map +1 -0
  203. package/dist/usecases/ingest/pass5-extract.d.ts +7 -0
  204. package/dist/usecases/ingest/pass5-extract.js +50 -0
  205. package/dist/usecases/ingest/pass5-extract.js.map +1 -0
  206. package/dist/usecases/ingest/pass5-govern.d.ts +13 -0
  207. package/dist/usecases/ingest/pass5-govern.js +155 -0
  208. package/dist/usecases/ingest/pass5-govern.js.map +1 -0
  209. package/dist/usecases/ingest/pipeline.d.ts +28 -0
  210. package/dist/usecases/ingest/pipeline.js +144 -0
  211. package/dist/usecases/ingest/pipeline.js.map +1 -0
  212. package/dist/usecases/ingest/publish-command.d.ts +4 -0
  213. package/dist/usecases/ingest/publish-command.js +77 -0
  214. package/dist/usecases/ingest/publish-command.js.map +1 -0
  215. package/dist/usecases/ingest/status.d.ts +39 -0
  216. package/dist/usecases/ingest/status.js +155 -0
  217. package/dist/usecases/ingest/status.js.map +1 -0
  218. package/dist/usecases/ingest/video-pass3.d.ts +26 -0
  219. package/dist/usecases/ingest/video-pass3.js +0 -0
  220. package/dist/usecases/ingest/video-pass3.js.map +1 -0
  221. package/dist/usecases/ingest/video-pipeline.d.ts +32 -0
  222. package/dist/usecases/ingest/video-pipeline.js +202 -0
  223. package/dist/usecases/ingest/video-pipeline.js.map +1 -0
  224. package/dist/usecases/ingest/view-command.d.ts +4 -0
  225. package/dist/usecases/ingest/view-command.js +51 -0
  226. package/dist/usecases/ingest/view-command.js.map +1 -0
  227. package/dist/usecases/script/actions.js +2 -2
  228. package/dist/usecases/script/actions.js.map +1 -1
  229. package/dist/usecases/script/actor.js.map +1 -1
  230. package/dist/usecases/script/actors.js +1 -0
  231. package/dist/usecases/script/actors.js.map +1 -1
  232. package/dist/usecases/script/add-actor.js.map +1 -1
  233. package/dist/usecases/script/add-episode.js.map +1 -1
  234. package/dist/usecases/script/add-location.js.map +1 -1
  235. package/dist/usecases/script/add-prop.js.map +1 -1
  236. package/dist/usecases/script/alias.js.map +1 -1
  237. package/dist/usecases/script/assets.js +2 -1
  238. package/dist/usecases/script/assets.js.map +1 -1
  239. package/dist/usecases/script/context.js.map +1 -1
  240. package/dist/usecases/script/create.js +3 -6
  241. package/dist/usecases/script/create.js.map +1 -1
  242. package/dist/usecases/script/delete.js.map +1 -1
  243. package/dist/usecases/script/describe.js.map +1 -1
  244. package/dist/usecases/script/dialogue.js +6 -13
  245. package/dist/usecases/script/dialogue.js.map +1 -1
  246. package/dist/usecases/script/do.js +1 -1
  247. package/dist/usecases/script/do.js.map +1 -1
  248. package/dist/usecases/script/episodes.js.map +1 -1
  249. package/dist/usecases/script/{add-speaker.d.ts → importance.d.ts} +1 -1
  250. package/dist/usecases/script/importance.js +17 -0
  251. package/dist/usecases/script/importance.js.map +1 -0
  252. package/dist/usecases/script/insert.js.map +1 -1
  253. package/dist/usecases/script/issues.js.map +1 -1
  254. package/dist/usecases/script/lib.d.ts +19 -6
  255. package/dist/usecases/script/lib.js +173 -99
  256. package/dist/usecases/script/lib.js.map +1 -1
  257. package/dist/usecases/script/locations.js +1 -0
  258. package/dist/usecases/script/locations.js.map +1 -1
  259. package/dist/usecases/script/merge.js.map +1 -1
  260. package/dist/usecases/script/move.js.map +1 -1
  261. package/dist/usecases/script/props.js +1 -0
  262. package/dist/usecases/script/props.js.map +1 -1
  263. package/dist/usecases/script/refs.js.map +1 -1
  264. package/dist/usecases/script/rename.js.map +1 -1
  265. package/dist/usecases/script/replace.js.map +1 -1
  266. package/dist/usecases/script/role.js.map +1 -1
  267. package/dist/usecases/script/scenes.js +8 -15
  268. package/dist/usecases/script/scenes.js.map +1 -1
  269. package/dist/usecases/script/script-patch.js +1 -1
  270. package/dist/usecases/script/script-patch.js.map +1 -1
  271. package/dist/usecases/script/script-validate.js +1 -1
  272. package/dist/usecases/script/script-validate.js.map +1 -1
  273. package/dist/usecases/script/session.d.ts +4 -4
  274. package/dist/usecases/script/session.js +57 -78
  275. package/dist/usecases/script/session.js.map +1 -1
  276. package/dist/usecases/script/split.js.map +1 -1
  277. package/dist/usecases/script/state-add.js.map +1 -1
  278. package/dist/usecases/script/state-delete.js.map +1 -1
  279. package/dist/usecases/script/state-rename.js.map +1 -1
  280. package/dist/usecases/script/states.js +58 -13
  281. package/dist/usecases/script/states.js.map +1 -1
  282. package/dist/usecases/script/summary.js +8 -0
  283. package/dist/usecases/script/summary.js.map +1 -1
  284. package/dist/usecases/script/synopsis-generate.d.ts +4 -5
  285. package/dist/usecases/script/synopsis-generate.js +30 -46
  286. package/dist/usecases/script/synopsis-generate.js.map +1 -1
  287. package/dist/usecases/script/transition.js.map +1 -1
  288. package/dist/usecases/script/type.js.map +1 -1
  289. package/dist/usecases/script/worldview.js.map +1 -1
  290. package/package.json +11 -3
  291. package/scripts/install-skill.mjs +120 -0
  292. package/skills/scriptctl/SKILL.md +293 -0
  293. package/skills/scriptctl/references/atomic-write-workflow.md +117 -0
  294. package/skills/scriptctl/references/ingest-workflow.md +85 -0
  295. package/skills/scriptctl/references/state-reference-repair.md +59 -0
  296. package/dist/domain/direct/runner.d.ts +0 -25
  297. package/dist/domain/direct/runner.js +0 -88
  298. package/dist/domain/direct/runner.js.map +0 -1
  299. package/dist/domain/direct/stage.d.ts +0 -108
  300. package/dist/domain/direct/stage.js +0 -134
  301. package/dist/domain/direct/stage.js.map +0 -1
  302. package/dist/domain/direct/stages/asset-curation.d.ts +0 -2
  303. package/dist/domain/direct/stages/asset-curation.js +0 -10
  304. package/dist/domain/direct/stages/asset-curation.js.map +0 -1
  305. package/dist/domain/direct/stages/batch-extract.d.ts +0 -2
  306. package/dist/domain/direct/stages/batch-extract.js +0 -12
  307. package/dist/domain/direct/stages/batch-extract.js.map +0 -1
  308. package/dist/domain/direct/stages/batch-plan.d.ts +0 -2
  309. package/dist/domain/direct/stages/batch-plan.js +0 -9
  310. package/dist/domain/direct/stages/batch-plan.js.map +0 -1
  311. package/dist/domain/direct/stages/episode-merge.d.ts +0 -2
  312. package/dist/domain/direct/stages/episode-merge.js +0 -11
  313. package/dist/domain/direct/stages/episode-merge.js.map +0 -1
  314. package/dist/domain/direct/stages/episode-plan.d.ts +0 -2
  315. package/dist/domain/direct/stages/episode-plan.js +0 -9
  316. package/dist/domain/direct/stages/episode-plan.js.map +0 -1
  317. package/dist/domain/direct/stages/episode-synopsis.d.ts +0 -2
  318. package/dist/domain/direct/stages/episode-synopsis.js +0 -12
  319. package/dist/domain/direct/stages/episode-synopsis.js.map +0 -1
  320. package/dist/domain/direct/stages/episode-titles.d.ts +0 -2
  321. package/dist/domain/direct/stages/episode-titles.js +0 -12
  322. package/dist/domain/direct/stages/episode-titles.js.map +0 -1
  323. package/dist/domain/direct/stages/index.d.ts +0 -19
  324. package/dist/domain/direct/stages/index.js +0 -41
  325. package/dist/domain/direct/stages/index.js.map +0 -1
  326. package/dist/domain/direct/stages/metadata.d.ts +0 -2
  327. package/dist/domain/direct/stages/metadata.js +0 -11
  328. package/dist/domain/direct/stages/metadata.js.map +0 -1
  329. package/dist/domain/direct/stages/script-merge.d.ts +0 -2
  330. package/dist/domain/direct/stages/script-merge.js +0 -15
  331. package/dist/domain/direct/stages/script-merge.js.map +0 -1
  332. package/dist/domain/direct/stages/script-synopsis.d.ts +0 -2
  333. package/dist/domain/direct/stages/script-synopsis.js +0 -12
  334. package/dist/domain/direct/stages/script-synopsis.js.map +0 -1
  335. package/dist/domain/direct/stages/source-prepare.d.ts +0 -2
  336. package/dist/domain/direct/stages/source-prepare.js +0 -9
  337. package/dist/domain/direct/stages/source-prepare.js.map +0 -1
  338. package/dist/domain/direct/stages/state-binding.d.ts +0 -2
  339. package/dist/domain/direct/stages/state-binding.js +0 -9
  340. package/dist/domain/direct/stages/state-binding.js.map +0 -1
  341. package/dist/domain/direct/stages/state-curation.d.ts +0 -2
  342. package/dist/domain/direct/stages/state-curation.js +0 -10
  343. package/dist/domain/direct/stages/state-curation.js.map +0 -1
  344. package/dist/domain/direct/stages/validate.d.ts +0 -2
  345. package/dist/domain/direct/stages/validate.js +0 -10
  346. package/dist/domain/direct/stages/validate.js.map +0 -1
  347. package/dist/domain/direct-core.d.ts +0 -313
  348. package/dist/domain/direct-core.js +0 -8516
  349. package/dist/domain/direct-core.js.map +0 -1
  350. package/dist/domain/script/validate.d.ts +0 -22
  351. package/dist/domain/script/validate.js +0 -997
  352. package/dist/domain/script/validate.js.map +0 -1
  353. package/dist/infra/providers.d.ts +0 -97
  354. package/dist/infra/providers.js +0 -1396
  355. package/dist/infra/providers.js.map +0 -1
  356. package/dist/usecases/direct.d.ts +0 -27
  357. package/dist/usecases/direct.js +0 -4172
  358. package/dist/usecases/direct.js.map +0 -1
  359. package/dist/usecases/parse.d.ts +0 -15
  360. package/dist/usecases/parse.js +0 -429
  361. package/dist/usecases/parse.js.map +0 -1
  362. package/dist/usecases/script/add-speaker.js +0 -22
  363. package/dist/usecases/script/add-speaker.js.map +0 -1
  364. package/dist/usecases/script/export.d.ts +0 -3
  365. package/dist/usecases/script/export.js +0 -111
  366. package/dist/usecases/script/export.js.map +0 -1
  367. package/dist/usecases/script/overlap.d.ts +0 -3
  368. package/dist/usecases/script/overlap.js +0 -21
  369. package/dist/usecases/script/overlap.js.map +0 -1
  370. package/dist/usecases/script/speakers.d.ts +0 -3
  371. package/dist/usecases/script/speakers.js +0 -28
  372. package/dist/usecases/script/speakers.js.map +0 -1
  373. package/dist/usecases/script/state-change.d.ts +0 -3
  374. package/dist/usecases/script/state-change.js +0 -24
  375. package/dist/usecases/script/state-change.js.map +0 -1
@@ -0,0 +1,14 @@
1
+ type Obj = Record<string, unknown>;
2
+ export type IdMap = {
3
+ episodes: Record<string, string>;
4
+ scenes: Record<string, string>;
5
+ actors: Record<string, string>;
6
+ locations: Record<string, string>;
7
+ props: Record<string, string>;
8
+ states: Record<string, string>;
9
+ };
10
+ export declare function renumberIds(input: unknown): {
11
+ script: Obj;
12
+ idMap: IdMap;
13
+ };
14
+ export {};
@@ -0,0 +1,130 @@
1
+ // Deterministic final id renumbering (§ ids). Governance leaves survivor ids
2
+ // with gaps (merges/…) and globally-unique state ids; this one-time pass, run at
3
+ // the very end of ingest, renumbers everything to clean, contiguous, readable
4
+ // ids and rewrites all references. ids are opaque stable keys — this is only the
5
+ // clean initial numbering for the freshly-generated product (editing never
6
+ // renumbers). Pure: input never mutated; returns the doc + old→new id map.
7
+ //
8
+ // episode ep_NNN by episodes[] order
9
+ // scene scn_NNN global, by appearance order (scenes can move across eps)
10
+ // actor act_NNN by first appearance in the script (per kind, contiguous)
11
+ // location loc_NNN
12
+ // prop prp_NNN
13
+ // state default + st_NNN per-asset scoped (default kept)
14
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
15
+ const isArr = (v) => Array.isArray(v);
16
+ const pad = (n) => String(n).padStart(3, "0");
17
+ const KINDS = [
18
+ { key: "actors", idField: "actor_id", prefix: "act" },
19
+ { key: "locations", idField: "location_id", prefix: "loc" },
20
+ { key: "props", idField: "prop_id", prefix: "prp" },
21
+ ];
22
+ export function renumberIds(input) {
23
+ if (!isObj(input))
24
+ throw new Error("renumberIds expects a script object");
25
+ const doc = JSON.parse(JSON.stringify(input));
26
+ const idMap = { episodes: {}, scenes: {}, actors: {}, locations: {}, props: {}, states: {} };
27
+ // 1. Asset ids by first appearance (document walk).
28
+ const seen = { actors: [], locations: [], props: [] };
29
+ const seenSet = { actors: new Set(), locations: new Set(), props: new Set() };
30
+ const see = (bucket, id) => { if (typeof id === "string" && !seenSet[bucket].has(id)) {
31
+ seenSet[bucket].add(id);
32
+ seen[bucket].push(id);
33
+ } };
34
+ for (const ep of isArr(doc.episodes) ? doc.episodes : []) {
35
+ if (!isObj(ep) || !isArr(ep.scenes))
36
+ continue;
37
+ for (const sc of ep.scenes) {
38
+ if (!isObj(sc))
39
+ continue;
40
+ if (isObj(sc.location))
41
+ see("locations", sc.location.location_id);
42
+ for (const a of isArr(sc.actors) ? sc.actors : [])
43
+ if (isObj(a))
44
+ see("actors", a.actor_id);
45
+ for (const p of isArr(sc.props) ? sc.props : [])
46
+ if (isObj(p))
47
+ see("props", p.prop_id);
48
+ for (const ac of isArr(sc.actions) ? sc.actions : [])
49
+ if (isObj(ac) && isObj(ac.speaker))
50
+ see("actors", ac.speaker.actor_id);
51
+ }
52
+ }
53
+ // Append any asset present in the top-level lists but never referenced.
54
+ for (const { key, idField } of KINDS)
55
+ for (const a of isArr(doc[key]) ? doc[key] : [])
56
+ if (isObj(a))
57
+ see(key, a[idField]);
58
+ for (const { key, prefix } of KINDS)
59
+ seen[key].forEach((old, i) => { idMap[key][old] = `${prefix}_${pad(i + 1)}`; });
60
+ // 2. Rebuild top-level asset lists in new-id order; renumber per-asset states.
61
+ for (const { key, idField } of KINDS) {
62
+ const list = (isArr(doc[key]) ? doc[key] : []).filter(isObj);
63
+ const bucket = idMap[key];
64
+ const byNew = new Map();
65
+ for (const a of list) {
66
+ const oldId = a[idField];
67
+ const newId = bucket[oldId] ?? oldId;
68
+ a[idField] = newId;
69
+ // states: keep default, renumber the rest st_001.. in array order.
70
+ let n = 0;
71
+ for (const st of isArr(a.states) ? a.states : []) {
72
+ if (!isObj(st) || typeof st.state_id !== "string")
73
+ continue;
74
+ if (st.state_id === "default")
75
+ continue;
76
+ const ns = `st_${pad(++n)}`;
77
+ idMap.states[st.state_id] = ns;
78
+ st.state_id = ns;
79
+ }
80
+ byNew.set(newId, a);
81
+ }
82
+ doc[key] = [...byNew.entries()].sort((x, y) => (x[0] < y[0] ? -1 : 1)).map((e) => e[1]);
83
+ }
84
+ // 3. Episode / scene ids (in order).
85
+ let scn = 0;
86
+ (isArr(doc.episodes) ? doc.episodes : []).forEach((ep, ei) => {
87
+ if (!isObj(ep))
88
+ return;
89
+ if (typeof ep.episode_id === "string") {
90
+ const nid = `ep_${pad(ei + 1)}`;
91
+ idMap.episodes[ep.episode_id] = nid;
92
+ ep.episode_id = nid;
93
+ }
94
+ for (const sc of isArr(ep.scenes) ? ep.scenes : []) {
95
+ if (!isObj(sc))
96
+ continue;
97
+ if (typeof sc.scene_id === "string") {
98
+ const nid = `scn_${pad(++scn)}`;
99
+ idMap.scenes[sc.scene_id] = nid;
100
+ sc.scene_id = nid;
101
+ }
102
+ }
103
+ });
104
+ // 4. Rewrite references (asset ids + state ids) throughout the scenes.
105
+ const remapRef = (holder, idField, kind) => {
106
+ if (!isObj(holder) || typeof holder[idField] !== "string")
107
+ return;
108
+ holder[idField] = idMap[kind][holder[idField]] ?? holder[idField];
109
+ if (typeof holder.state_id === "string" && idMap.states[holder.state_id])
110
+ holder.state_id = idMap.states[holder.state_id];
111
+ };
112
+ for (const ep of isArr(doc.episodes) ? doc.episodes : []) {
113
+ if (!isObj(ep) || !isArr(ep.scenes))
114
+ continue;
115
+ for (const sc of ep.scenes) {
116
+ if (!isObj(sc))
117
+ continue;
118
+ remapRef(sc.location, "location_id", "locations");
119
+ for (const a of isArr(sc.actors) ? sc.actors : [])
120
+ remapRef(a, "actor_id", "actors");
121
+ for (const p of isArr(sc.props) ? sc.props : [])
122
+ remapRef(p, "prop_id", "props");
123
+ for (const ac of isArr(sc.actions) ? sc.actions : [])
124
+ if (isObj(ac))
125
+ remapRef(ac.speaker, "actor_id", "actors");
126
+ }
127
+ }
128
+ return { script: doc, idMap };
129
+ }
130
+ //# sourceMappingURL=renumber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renumber.js","sourceRoot":"","sources":["../../../src/domain/ingest/renumber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ export type SpeakerV3 = {
2
+ actor_id: string;
3
+ state_id?: string;
4
+ } | {
5
+ kind: "system" | "broadcast" | "offscreen" | "group";
6
+ label?: string;
7
+ };
8
+ export type Importance = "featured" | "background";
9
+ export declare const IMPORTANCE_TIERS: readonly ["featured", "background"];
10
+ export type TransitionPromptV3 = {
11
+ target: string;
12
+ process: string;
13
+ contrast: string;
14
+ };
15
+ export interface ActionV3 {
16
+ type: "action" | "dialogue" | "inner_thought" | "transition";
17
+ content: string;
18
+ speaker?: SpeakerV3;
19
+ emotion?: string;
20
+ transition_prompt?: TransitionPromptV3;
21
+ }
22
+ export type EntityRefV3 = {
23
+ actor_id: string;
24
+ state_id?: string;
25
+ } | {
26
+ prop_id: string;
27
+ state_id?: string;
28
+ };
29
+ export interface SceneV3 {
30
+ scene_id: string;
31
+ environment?: {
32
+ space?: string;
33
+ time?: string;
34
+ };
35
+ location: {
36
+ location_id: string;
37
+ state_id?: string;
38
+ } | null;
39
+ actors: {
40
+ actor_id: string;
41
+ state_id?: string;
42
+ }[];
43
+ props: {
44
+ prop_id: string;
45
+ state_id?: string;
46
+ }[];
47
+ actions: ActionV3[];
48
+ }
49
+ export interface EpisodeV3 {
50
+ episode_id: string;
51
+ title?: string;
52
+ scenes: SceneV3[];
53
+ }
54
+ export interface StateV3 {
55
+ state_id: string;
56
+ state_name: string;
57
+ description: string;
58
+ }
59
+ export interface ActorV3 {
60
+ actor_id: string;
61
+ actor_name: string;
62
+ importance: Importance;
63
+ role_type?: string;
64
+ aliases?: string[];
65
+ description: string;
66
+ states: StateV3[];
67
+ }
68
+ export interface LocationV3 {
69
+ location_id: string;
70
+ location_name: string;
71
+ importance: Importance;
72
+ aliases?: string[];
73
+ description: string;
74
+ states: StateV3[];
75
+ }
76
+ export interface PropV3 {
77
+ prop_id: string;
78
+ prop_name: string;
79
+ importance: Importance;
80
+ aliases?: string[];
81
+ description: string;
82
+ states: StateV3[];
83
+ }
84
+ export interface ScriptV3 {
85
+ version: 3;
86
+ title: string;
87
+ worldview: string;
88
+ style: string;
89
+ actors: ActorV3[];
90
+ locations: LocationV3[];
91
+ props: PropV3[];
92
+ episodes: EpisodeV3[];
93
+ }
94
+ export declare const NON_ACTOR_SPEAKER_KINDS: readonly ["system", "broadcast", "offscreen", "group", "minor"];
@@ -0,0 +1,7 @@
1
+ // Script schema v3 (§15.1, revised): content is plain text; scene-level cast and
2
+ // props carry materialized state. Kept ingest-local. Scripts remain plain JSON
3
+ // objects; these types document the shape the emitter writes and the validator
4
+ // enforces.
5
+ export const IMPORTANCE_TIERS = ["featured", "background"];
6
+ export const NON_ACTOR_SPEAKER_KINDS = ["system", "broadcast", "offscreen", "group", "minor"];
7
+ //# sourceMappingURL=script-v3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-v3.js","sourceRoot":"","sources":["../../../src/domain/ingest/script-v3.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,+EAA+E;AAC/E,+EAA+E;AAC/E,YAAY;AASZ,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,YAAY,CAAU,CAAC;AAyCpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type StateGroup = {
2
+ canonical: string;
3
+ state_ids: string[];
4
+ };
5
+ type Obj = Record<string, unknown>;
6
+ export declare function mergeableStates(asset: Obj): Array<{
7
+ id: string;
8
+ name: string;
9
+ }>;
10
+ export declare function applyStateReconcile(input: unknown, keepByAsset: Map<string, StateGroup[]>): Obj;
11
+ export {};
@@ -0,0 +1,90 @@
1
+ // Deterministic state-reconcile apply (§9.8). The LLM, per owner, selects the
2
+ // DURABLE appearance states (grouping equivalents, choosing a canonical name);
3
+ // every other candidate state is transient (emotion/pose/action/moment) and is
4
+ // dropped. This module applies that: keep+rename+merge the selected states, drop
5
+ // the rest (clearing refs that used them so they inherit), on the pre-materialize
6
+ // doc; governDeterministic then assigns default + materializes. Pure.
7
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
8
+ const isArr = (v) => Array.isArray(v);
9
+ const KIND_ID_FIELD = { actor: "actor_id", location: "location_id", prop: "prop_id" };
10
+ // Non-"default" states of an asset as {id, name} — the candidates.
11
+ export function mergeableStates(asset) {
12
+ return (isArr(asset.states) ? asset.states : []).filter(isObj)
13
+ .map((s) => ({ id: String(s.state_id), name: String(s.state_name) }))
14
+ .filter((s) => s.id !== "default");
15
+ }
16
+ // keepByAsset: assetId → the durable state groups the model selected. Any
17
+ // non-default state of that asset NOT in a group is dropped.
18
+ export function applyStateReconcile(input, keepByAsset) {
19
+ if (!isObj(input))
20
+ throw new Error("state-reconcile expects a script object");
21
+ const doc = JSON.parse(JSON.stringify(input));
22
+ const remap = new Map(); // global-unique stateId → survivor id, or null = drop (clear ref)
23
+ for (const kind of ["actor", "location", "prop"]) {
24
+ const list = doc[`${kind}s`];
25
+ if (!isArr(list))
26
+ continue;
27
+ for (const asset of list) {
28
+ if (!isObj(asset))
29
+ continue;
30
+ const id = String(asset[KIND_ID_FIELD[kind]]);
31
+ const groups = keepByAsset.get(id);
32
+ if (!groups)
33
+ continue; // owner not reconciled (no non-default states)
34
+ const states = (isArr(asset.states) ? asset.states : []).filter(isObj);
35
+ const byId = new Map(states.map((s) => [String(s.state_id), s]));
36
+ const kept = states.filter((s) => s.state_id === "default"); // keep synthetic default
37
+ const keptIds = new Set();
38
+ for (const g of groups) {
39
+ const members = g.state_ids.filter((sid) => byId.has(sid) && sid !== "default");
40
+ if (members.length === 0)
41
+ continue;
42
+ const rep = members[0];
43
+ byId.get(rep).state_name = g.canonical;
44
+ kept.push(byId.get(rep));
45
+ for (const m of members) {
46
+ remap.set(m, rep);
47
+ keptIds.add(m);
48
+ }
49
+ }
50
+ // Any non-default candidate not kept is a transient state → drop (clear refs).
51
+ for (const s of states) {
52
+ const sid = String(s.state_id);
53
+ if (sid !== "default" && !keptIds.has(sid))
54
+ remap.set(sid, null);
55
+ }
56
+ asset.states = kept;
57
+ }
58
+ }
59
+ if (remap.size > 0)
60
+ rewriteRefStates(doc, remap);
61
+ return doc;
62
+ }
63
+ function rewriteRefStates(doc, remap) {
64
+ const fix = (holder) => {
65
+ if (!isObj(holder) || typeof holder.state_id !== "string" || !remap.has(holder.state_id))
66
+ return;
67
+ const nv = remap.get(holder.state_id);
68
+ if (nv === null)
69
+ delete holder.state_id; // dropped transient → inherit
70
+ else
71
+ holder.state_id = nv;
72
+ };
73
+ for (const ep of isArr(doc.episodes) ? doc.episodes : []) {
74
+ if (!isObj(ep) || !isArr(ep.scenes))
75
+ continue;
76
+ for (const sc of ep.scenes) {
77
+ if (!isObj(sc))
78
+ continue;
79
+ fix(sc.location);
80
+ for (const a of isArr(sc.actors) ? sc.actors : [])
81
+ fix(a);
82
+ for (const p of isArr(sc.props) ? sc.props : [])
83
+ fix(p);
84
+ for (const ac of isArr(sc.actions) ? sc.actions : [])
85
+ if (isObj(ac))
86
+ fix(ac.speaker);
87
+ }
88
+ }
89
+ }
90
+ //# sourceMappingURL=state-reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-reconcile.js","sourceRoot":"","sources":["../../../src/domain/ingest/state-reconcile.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+EAA+E;AAC/E,+EAA+E;AAC/E,iFAAiF;AACjF,kFAAkF;AAClF,sEAAsE;AAKtE,MAAM,KAAK,GAAG,CAAC,CAAU,EAAY,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACjG,MAAM,KAAK,GAAG,CAAC,CAAU,EAAkB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAE/D,MAAM,aAAa,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAW,CAAC;AAE/F,mEAAmE;AACnE,MAAM,UAAU,eAAe,CAAC,KAAU;IACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC3D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAE,CAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,CAAE,CAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;SACtF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,0EAA0E;AAC1E,6DAA6D;AAC7D,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,WAAsC;IACxF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAQ,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC,CAAC,kEAAkE;IAElH,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAU,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM;gBAAE,SAAS,CAAC,+CAA+C;YACtE,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAU,CAAC;YAChF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,MAAM,IAAI,GAAU,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,yBAAyB;YAC7F,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;YAClC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC;gBAChF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBACnC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,UAAU,GAAG,CAAC,CAAC,SAAS,CAAC;gBACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC;gBAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;YACjE,CAAC;YACD,+EAA+E;YAC/E,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC/B,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACnE,CAAC;YACD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;QAAE,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAQ,EAAE,KAAiC;IACnE,MAAM,GAAG,GAAG,CAAC,MAAe,EAAE,EAAE;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;YAAE,OAAO;QACjG,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAE,CAAC;QACvC,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,8BAA8B;;YAClE,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;IAC5B,CAAC,CAAC;IACF,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC;YAAE,SAAS;QAC9C,KAAK,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,SAAS;YACzB,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YACjB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1D,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACxD,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAAE,IAAI,KAAK,CAAC,EAAE,CAAC;oBAAE,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type ValidationIssue = {
2
+ code: string;
3
+ path: string;
4
+ message: string;
5
+ };
6
+ export type ValidationResult = {
7
+ ok: boolean;
8
+ errors: ValidationIssue[];
9
+ warnings: ValidationIssue[];
10
+ };
11
+ export declare function validateScriptV3(doc: unknown): ValidationResult;
@@ -0,0 +1,168 @@
1
+ // Deterministic Script v3 structural + referential validator (§9.9, revised).
2
+ // Enforces v3 invariants: plain-text content, single scene-level location,
3
+ // scene-level actors/props with materialized state, no legacy v2 fields
4
+ // (state_changes / action.actor_id / scene.context / speakers[] / content spans).
5
+ import { IMPORTANCE_TIERS, NON_ACTOR_SPEAKER_KINDS } from "./script-v3.js";
6
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
7
+ const isArr = (v) => Array.isArray(v);
8
+ const isStr = (v) => typeof v === "string";
9
+ const ACTION_LEGACY = ["state_changes", "actor_id", "speakers", "lines"];
10
+ export function validateScriptV3(doc) {
11
+ const errors = [];
12
+ const warnings = [];
13
+ const err = (code, path, message) => errors.push({ code, path, message });
14
+ if (!isObj(doc))
15
+ return { ok: false, errors: [{ code: "not_object", path: "$", message: "script must be an object" }], warnings };
16
+ if (doc.version !== 3)
17
+ err("version", "$.version", "version must be 3");
18
+ for (const key of ["title", "worldview", "style"])
19
+ if (!isStr(doc[key]))
20
+ err("field", `$.${key}`, `${key} must be a string`);
21
+ const stateIds = new Map();
22
+ const idKind = new Map();
23
+ const collect = (list, kind, idField, nameField, path) => {
24
+ if (!isArr(list)) {
25
+ err("field", path, `${path} must be an array`);
26
+ return;
27
+ }
28
+ list.forEach((raw, i) => {
29
+ const p = `${path}[${i}]`;
30
+ if (!isObj(raw)) {
31
+ err("asset", p, "asset must be an object");
32
+ return;
33
+ }
34
+ const id = raw[idField];
35
+ if (!isStr(id)) {
36
+ err("asset_id", `${p}.${idField}`, `${idField} required`);
37
+ return;
38
+ }
39
+ if (idKind.has(id))
40
+ err("dup_id", `${p}.${idField}`, `duplicate id ${id}`);
41
+ idKind.set(id, kind);
42
+ if (!isStr(raw[nameField]))
43
+ err("asset_name", `${p}.${nameField}`, `${nameField} required`);
44
+ if (!isStr(raw.importance) || !IMPORTANCE_TIERS.includes(raw.importance))
45
+ err("importance", `${p}.importance`, `importance must be one of ${IMPORTANCE_TIERS.join("|")}`);
46
+ if (!isStr(raw.description))
47
+ err("asset_desc", `${p}.description`, "description must be a string");
48
+ const ids = new Set();
49
+ let defaults = 0;
50
+ if (!isArr(raw.states) || raw.states.length === 0)
51
+ err("states", `${p}.states`, "states must be a non-empty array");
52
+ else
53
+ raw.states.forEach((st, j) => {
54
+ const sp = `${p}.states[${j}]`;
55
+ if (!isObj(st) || !isStr(st.state_id)) {
56
+ err("state_id", sp, "state_id required");
57
+ return;
58
+ }
59
+ if (ids.has(st.state_id))
60
+ err("dup_state", sp, `duplicate state_id ${st.state_id}`);
61
+ ids.add(st.state_id);
62
+ if (st.state_id === "default")
63
+ defaults++;
64
+ if (!isStr(st.state_name))
65
+ err("state_name", `${sp}.state_name`, "state_name required");
66
+ });
67
+ if (isArr(raw.states) && defaults !== 1)
68
+ err("default_state", `${p}.states`, `exactly one 'default' state required, found ${defaults}`);
69
+ stateIds.set(id, ids);
70
+ });
71
+ };
72
+ collect(doc.actors, "actor", "actor_id", "actor_name", "$.actors");
73
+ collect(doc.locations, "location", "location_id", "location_name", "$.locations");
74
+ collect(doc.props, "prop", "prop_id", "prop_name", "$.props");
75
+ const refState = (assetId, stateId, kind, path) => {
76
+ if (idKind.get(assetId) !== kind) {
77
+ err("ref", path, `${kind} ${assetId} not found`);
78
+ return;
79
+ }
80
+ if (stateId !== undefined && (!isStr(stateId) || !stateIds.get(assetId)?.has(stateId)))
81
+ err("state_ref", path, `state ${String(stateId)} not materialized on ${assetId}`);
82
+ };
83
+ const checkEntityList = (list, kind, idField, path) => {
84
+ if (list === undefined) {
85
+ err("field", path, `${path} required (may be empty array)`);
86
+ return;
87
+ }
88
+ if (!isArr(list)) {
89
+ err("field", path, `${path} must be an array`);
90
+ return;
91
+ }
92
+ list.forEach((ref, i) => {
93
+ if (!isObj(ref) || !isStr(ref[idField])) {
94
+ err("ref", `${path}[${i}]`, `${idField} required`);
95
+ return;
96
+ }
97
+ refState(ref[idField], ref.state_id, kind, `${path}[${i}]`);
98
+ });
99
+ };
100
+ const checkAction = (action, path) => {
101
+ if (!isObj(action)) {
102
+ err("action", path, "action must be an object");
103
+ return;
104
+ }
105
+ for (const bad of ACTION_LEGACY)
106
+ if (bad in action)
107
+ err("legacy_field", `${path}.${bad}`, `v3 forbids action.${bad}`);
108
+ const type = action.type;
109
+ if (type !== "action" && type !== "dialogue" && type !== "inner_thought" && type !== "transition")
110
+ err("action_type", `${path}.type`, `invalid action type ${String(type)}`);
111
+ if (!isStr(action.content))
112
+ err("content", `${path}.content`, "content must be a plain-text string");
113
+ if (type === "dialogue" || type === "inner_thought") {
114
+ const sp = action.speaker;
115
+ if (!isObj(sp))
116
+ err("speaker", `${path}.speaker`, "dialogue/inner_thought needs a speaker");
117
+ else if ("kind" in sp) {
118
+ if (!isStr(sp.kind) || !NON_ACTOR_SPEAKER_KINDS.includes(sp.kind))
119
+ err("speaker_kind", `${path}.speaker.kind`, "invalid non-actor speaker kind");
120
+ }
121
+ else if (isStr(sp.actor_id))
122
+ refState(sp.actor_id, sp.state_id, "actor", `${path}.speaker`);
123
+ else
124
+ err("speaker", `${path}.speaker`, "speaker needs actor_id or kind");
125
+ }
126
+ };
127
+ const episodes = doc.episodes;
128
+ if (!isArr(episodes))
129
+ err("episodes", "$.episodes", "episodes must be an array");
130
+ else
131
+ episodes.forEach((ep, ei) => {
132
+ const ep_p = `$.episodes[${ei}]`;
133
+ if (!isObj(ep) || !isStr(ep.episode_id)) {
134
+ err("episode_id", ep_p, "episode_id required");
135
+ return;
136
+ }
137
+ if (!isArr(ep.scenes)) {
138
+ err("scenes", `${ep_p}.scenes`, "scenes must be an array");
139
+ return;
140
+ }
141
+ ep.scenes.forEach((sc, si) => {
142
+ const sc_p = `${ep_p}.scenes[${si}]`;
143
+ if (!isObj(sc)) {
144
+ err("scene", sc_p, "scene must be an object");
145
+ return;
146
+ }
147
+ if ("context" in sc)
148
+ err("legacy_field", `${sc_p}.context`, "v3 forbids scene.context");
149
+ if (!isStr(sc.scene_id))
150
+ err("scene_id", sc_p, "scene_id required");
151
+ const loc = sc.location;
152
+ if (loc !== null) {
153
+ if (!isObj(loc) || !isStr(loc.location_id))
154
+ err("location", `${sc_p}.location`, "location must be null or {location_id}");
155
+ else
156
+ refState(loc.location_id, loc.state_id, "location", `${sc_p}.location`);
157
+ }
158
+ checkEntityList(sc.actors, "actor", "actor_id", `${sc_p}.actors`);
159
+ checkEntityList(sc.props, "prop", "prop_id", `${sc_p}.props`);
160
+ if (!isArr(sc.actions))
161
+ err("actions", `${sc_p}.actions`, "actions must be an array");
162
+ else
163
+ sc.actions.forEach((a, ai) => checkAction(a, `${sc_p}.actions[${ai}]`));
164
+ });
165
+ });
166
+ return { ok: errors.length === 0, errors, warnings };
167
+ }
168
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/domain/ingest/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { VideoEpisodeDoc } from "./video-records.js";
2
+ export interface ActorAgg {
3
+ name: string;
4
+ episodes: number[];
5
+ appearances: string[];
6
+ anchors: string[];
7
+ voices: string[];
8
+ roles: string[];
9
+ states: string[];
10
+ }
11
+ export interface AssetAgg {
12
+ name: string;
13
+ episodes: number[];
14
+ descs: string[];
15
+ }
16
+ export interface ContextData {
17
+ episodes: number[];
18
+ actors: ActorAgg[];
19
+ locations: AssetAgg[];
20
+ props: AssetAgg[];
21
+ }
22
+ export declare function aggregateContext(docs: VideoEpisodeDoc[]): ContextData;
23
+ export declare function renderContextMd(ctx: ContextData): string;