@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,210 @@
1
+ // Deterministic Pass5 coverage check + apply (§9.6/§9.9). Consumes a governance
2
+ // plan (per-asset keep/merge + canonical naming + importance tier) and rewrites
3
+ // the provisional script into the canonical one: merges identities, unions
4
+ // aliases/states, tags importance (survivor = highest tier of its merge group),
5
+ // then materializes state via governDeterministic. Nothing is dropped — bit
6
+ // parts stay as background-tier assets. Pure: input never mutated; any plan
7
+ // inconsistency throws (§12.3).
8
+ import { governDeterministic } from "./govern.js";
9
+ export class PlanError extends Error {
10
+ }
11
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
12
+ const isArr = (v) => Array.isArray(v);
13
+ const KIND_ID_FIELD = { actor: "actor_id", location: "location_id", prop: "prop_id" };
14
+ const TIER_RANK = { featured: 2, background: 1 };
15
+ const rankToTier = (r) => (r >= 2 ? "featured" : "background");
16
+ function indexAssets(doc) {
17
+ const kindOf = new Map();
18
+ const assetOf = new Map();
19
+ for (const kind of ["actor", "location", "prop"]) {
20
+ const list = doc[`${kind}s`];
21
+ if (!isArr(list))
22
+ continue;
23
+ for (const a of list) {
24
+ if (!isObj(a))
25
+ continue;
26
+ const id = a[KIND_ID_FIELD[kind]];
27
+ if (typeof id === "string") {
28
+ kindOf.set(id, kind);
29
+ assetOf.set(id, a);
30
+ }
31
+ }
32
+ }
33
+ return { kindOf, assetOf };
34
+ }
35
+ // Resolve each provisional id to its surviving canonical id (following merge
36
+ // chains). Detects cycles, unknown targets, cross-kind merges. No drops.
37
+ function resolveFinal(plan, kindOf) {
38
+ const byId = new Map();
39
+ for (const d of plan.decisions) {
40
+ if (byId.has(d.provisional_id))
41
+ throw new PlanError(`duplicate decision for ${d.provisional_id}`);
42
+ byId.set(d.provisional_id, d);
43
+ }
44
+ for (const id of kindOf.keys())
45
+ if (!byId.has(id))
46
+ throw new PlanError(`no decision for asset ${id}`);
47
+ const final = new Map();
48
+ const resolve = (id, seen) => {
49
+ const cached = final.get(id);
50
+ if (cached)
51
+ return cached;
52
+ if (seen.has(id))
53
+ throw new PlanError(`merge cycle at ${id}`);
54
+ seen.add(id);
55
+ const d = byId.get(id);
56
+ if (!d)
57
+ throw new PlanError(`decision references unknown asset ${id}`);
58
+ let result;
59
+ if (d.action === "keep")
60
+ result = id;
61
+ else {
62
+ if (!d.merge_into)
63
+ throw new PlanError(`merge for ${id} missing merge_into`);
64
+ if (kindOf.get(d.merge_into) !== kindOf.get(id))
65
+ throw new PlanError(`cross-kind merge ${id} → ${d.merge_into}`);
66
+ result = resolve(d.merge_into, seen);
67
+ }
68
+ final.set(id, result);
69
+ return result;
70
+ };
71
+ for (const id of byId.keys())
72
+ resolve(id, new Set());
73
+ return final;
74
+ }
75
+ export function checkPlanCoverage(doc, plan) {
76
+ if (!isObj(doc))
77
+ throw new PlanError("script must be an object");
78
+ resolveFinal(plan, indexAssets(doc).kindOf);
79
+ }
80
+ // Identity merge + reference rewrite + importance tag, WITHOUT the final default/
81
+ // materialize step (governDeterministic runs after, in applyPlan).
82
+ export function applyPlanRaw(input, plan) {
83
+ if (!isObj(input))
84
+ throw new PlanError("script must be an object");
85
+ checkPlanCoverage(input, plan);
86
+ const doc = JSON.parse(JSON.stringify(input));
87
+ const { kindOf, assetOf } = indexAssets(doc);
88
+ const final = resolveFinal(plan, kindOf);
89
+ const tierOf = (id) => TIER_RANK[plan.importance[id] ?? "featured"]; // unclassified → featured (don't hide a real asset)
90
+ // When two merged assets share a state NAME, the merged copy's state_id is
91
+ // deduped away; scene refs that used it must repoint to the survivor's
92
+ // same-named state_id or they dangle (state not materialized).
93
+ const stateRemap = new Map();
94
+ for (const kind of ["actor", "location", "prop"]) {
95
+ const idField = KIND_ID_FIELD[kind];
96
+ const nameField = `${kind}_name`;
97
+ const survivors = [];
98
+ const merged = new Map();
99
+ for (const [id, f] of final) {
100
+ if (kindOf.get(id) !== kind)
101
+ continue;
102
+ if (f === id)
103
+ survivors.push(assetOf.get(id));
104
+ else {
105
+ if (!merged.has(f))
106
+ merged.set(f, []);
107
+ merged.get(f).push(assetOf.get(id));
108
+ }
109
+ }
110
+ for (const s of survivors) {
111
+ const id = s[idField];
112
+ const info = plan.canonical[id];
113
+ const aliasSet = new Set(isArr(s.aliases) ? s.aliases : []);
114
+ const stateNames = new Set((isArr(s.states) ? s.states : []).filter(isObj).map((st) => String(st.state_name)));
115
+ const states = (isArr(s.states) ? s.states : []).filter(isObj);
116
+ let rank = tierOf(id);
117
+ for (const m of merged.get(id) ?? []) {
118
+ rank = Math.max(rank, tierOf(m[idField]));
119
+ if (typeof m[nameField] === "string")
120
+ aliasSet.add(m[nameField]);
121
+ for (const a of isArr(m.aliases) ? m.aliases : [])
122
+ aliasSet.add(a);
123
+ for (const st of (isArr(m.states) ? m.states : []).filter(isObj)) {
124
+ const nm = String(st.state_name);
125
+ if (st.state_id !== "default" && !stateNames.has(nm)) {
126
+ stateNames.add(nm);
127
+ states.push({ state_id: st.state_id, state_name: nm, description: st.description ?? "" });
128
+ }
129
+ }
130
+ }
131
+ // Record deduped merged state_ids → survivor's same-named state_id.
132
+ const nameToId = new Map();
133
+ for (const st of states) {
134
+ const nm = String(st.state_name);
135
+ if (!nameToId.has(nm))
136
+ nameToId.set(nm, String(st.state_id));
137
+ }
138
+ for (const m of merged.get(id) ?? []) {
139
+ for (const st of (isArr(m.states) ? m.states : []).filter(isObj)) {
140
+ const oldId = String(st.state_id);
141
+ if (oldId === "default")
142
+ continue;
143
+ const newId = nameToId.get(String(st.state_name));
144
+ if (newId && newId !== oldId)
145
+ stateRemap.set(oldId, newId);
146
+ }
147
+ }
148
+ if (info?.name) {
149
+ aliasSet.add(s[nameField]);
150
+ s[nameField] = info.name;
151
+ }
152
+ if (info?.aliases)
153
+ for (const a of info.aliases)
154
+ aliasSet.add(a);
155
+ aliasSet.delete(s[nameField]);
156
+ s.aliases = [...aliasSet];
157
+ s.states = states;
158
+ s.importance = rankToTier(rank);
159
+ }
160
+ doc[`${kind}s`] = survivors;
161
+ }
162
+ // Rewrite scene references against the merge map (merged assets dedup; first
163
+ // ref's state_id wins). content is plain text and untouched.
164
+ const remapRefs = (list, idField) => {
165
+ const out = [];
166
+ const seen = new Set();
167
+ for (const ref of isArr(list) ? list : []) {
168
+ if (!isObj(ref) || typeof ref[idField] !== "string")
169
+ continue;
170
+ const f = final.get(ref[idField]);
171
+ if (!f || seen.has(f))
172
+ continue;
173
+ seen.add(f);
174
+ const stateId = typeof ref.state_id === "string" ? (stateRemap.get(ref.state_id) ?? ref.state_id) : undefined;
175
+ out.push({ [idField]: f, ...(stateId !== undefined ? { state_id: stateId } : {}) });
176
+ }
177
+ return out;
178
+ };
179
+ for (const ep of isArr(doc.episodes) ? doc.episodes : []) {
180
+ if (!isObj(ep) || !isArr(ep.scenes))
181
+ continue;
182
+ for (const sc of ep.scenes) {
183
+ if (!isObj(sc))
184
+ continue;
185
+ if (isObj(sc.location) && typeof sc.location.location_id === "string") {
186
+ const f = final.get(sc.location.location_id);
187
+ if (f) {
188
+ const st = typeof sc.location.state_id === "string" ? (stateRemap.get(sc.location.state_id) ?? sc.location.state_id) : undefined;
189
+ sc.location = { location_id: f, ...(st !== undefined ? { state_id: st } : {}) };
190
+ }
191
+ }
192
+ sc.actors = remapRefs(sc.actors, "actor_id");
193
+ sc.props = remapRefs(sc.props, "prop_id");
194
+ for (const ac of isArr(sc.actions) ? sc.actions : []) {
195
+ if (isObj(ac) && isObj(ac.speaker) && typeof ac.speaker.actor_id === "string") {
196
+ const f = final.get(ac.speaker.actor_id);
197
+ if (f)
198
+ ac.speaker.actor_id = f;
199
+ if (typeof ac.speaker.state_id === "string" && stateRemap.has(ac.speaker.state_id))
200
+ ac.speaker.state_id = stateRemap.get(ac.speaker.state_id);
201
+ }
202
+ }
203
+ }
204
+ }
205
+ return doc;
206
+ }
207
+ export function applyPlan(input, plan) {
208
+ return governDeterministic(applyPlanRaw(input, plan));
209
+ }
210
+ //# sourceMappingURL=apply-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-plan.js","sourceRoot":"","sources":["../../../src/domain/ingest/apply-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { NameStateRef, IngestRecord, SpeakerRef } from "./records.js";
2
+ export declare class AssembleError extends Error {
3
+ }
4
+ export type ProvisionalOccurrence = {
5
+ episode: number;
6
+ scene: number;
7
+ };
8
+ export type ProvisionalAsset = {
9
+ provisional_id: string;
10
+ kind: "actor" | "location" | "prop";
11
+ names: string[];
12
+ states: Array<{
13
+ name: string;
14
+ id: string;
15
+ }>;
16
+ occurrences: ProvisionalOccurrence[];
17
+ };
18
+ export type NameScene = {
19
+ scene_id: string;
20
+ environment?: {
21
+ space?: string;
22
+ time?: string;
23
+ };
24
+ location: NameStateRef | null;
25
+ actors: NameStateRef[];
26
+ props: NameStateRef[];
27
+ actions: Array<{
28
+ type: string;
29
+ content: string;
30
+ speaker?: SpeakerRef;
31
+ emotion?: string;
32
+ extend?: Record<string, unknown>;
33
+ }>;
34
+ };
35
+ export type NameScript = {
36
+ title: string;
37
+ episodes: Array<{
38
+ episode_id: string;
39
+ title?: string;
40
+ scenes: NameScene[];
41
+ }>;
42
+ };
43
+ export type AssembleResult = {
44
+ script: NameScript;
45
+ notes: Array<{
46
+ content: string;
47
+ category?: string;
48
+ source: unknown;
49
+ }>;
50
+ };
51
+ export declare function assemble(records: IngestRecord[], opts?: {
52
+ title?: string;
53
+ }): AssembleResult;
54
+ export declare function assignProvisionalIds(name: NameScript): {
55
+ script: Record<string, unknown>;
56
+ assets: ProvisionalAsset[];
57
+ };
@@ -0,0 +1,181 @@
1
+ // Deterministic assembler (§8): merged JSONL records → provisional Script v3.
2
+ // Two steps: (1) assemble() builds a name-based script skeleton (plain-text
3
+ // content; scene-level cast = declared `人物:` ∪ dialogue speakers; declared
4
+ // props); (2) assignProvisionalIds() turns names into provisional ids and builds
5
+ // the Pass5 evidence roster. pass5-extract augments the name-based scene cast
6
+ // between the two steps. Pure and byte-stable. Strict: body before any scene
7
+ // throws (no synthetic fallback).
8
+ export class AssembleError extends Error {
9
+ }
10
+ const pad = (n) => String(n).padStart(3, "0");
11
+ const norm = (s) => s.normalize("NFC").replace(/\s+/g, " ").trim();
12
+ export function assemble(records, opts = {}) {
13
+ const episodes = [];
14
+ const notes = [];
15
+ let curEpisode = null;
16
+ let curScene = null;
17
+ let epNo = 0;
18
+ let scnNo = 0;
19
+ const addActor = (scene, ref) => {
20
+ const existing = scene.actors.find((a) => norm(a.name) === norm(ref.name));
21
+ if (!existing)
22
+ scene.actors.push(ref);
23
+ else if (ref.state && !existing.state)
24
+ existing.state = ref.state;
25
+ };
26
+ for (const rec of records) {
27
+ switch (rec.kind) {
28
+ case "episode": {
29
+ epNo++;
30
+ curEpisode = { episode_id: `ep_${pad(epNo)}`, scenes: [] };
31
+ if (rec.title !== undefined)
32
+ curEpisode.title = rec.title;
33
+ episodes.push(curEpisode);
34
+ curScene = null;
35
+ break;
36
+ }
37
+ case "scene": {
38
+ if (!curEpisode)
39
+ throw new AssembleError("scene before any episode");
40
+ scnNo++;
41
+ curScene = {
42
+ scene_id: `scn_${pad(scnNo)}`,
43
+ location: rec.location ? { ...rec.location } : null,
44
+ actors: (rec.actors ?? []).map((a) => ({ ...a })),
45
+ props: (rec.props ?? []).map((p) => ({ ...p })),
46
+ actions: [],
47
+ };
48
+ if (rec.environment)
49
+ curScene.environment = rec.environment;
50
+ curEpisode.scenes.push(curScene);
51
+ break;
52
+ }
53
+ case "note":
54
+ notes.push({ content: rec.content, ...(rec.category ? { category: rec.category } : {}), source: rec.source });
55
+ break;
56
+ case "action":
57
+ case "transition": {
58
+ if (!curScene)
59
+ throw new AssembleError(`${rec.kind} before any scene`);
60
+ curScene.actions.push({ type: rec.kind, content: rec.content });
61
+ break;
62
+ }
63
+ case "dialogue":
64
+ case "inner_thought": {
65
+ if (!curScene)
66
+ throw new AssembleError(`${rec.kind} before any scene`);
67
+ const action = { type: rec.kind, content: rec.content, speaker: rec.speaker };
68
+ if (rec.emotion !== undefined)
69
+ action.emotion = rec.emotion;
70
+ curScene.actions.push(action);
71
+ // An actor speaker is present in the scene.
72
+ if ("name" in rec.speaker)
73
+ addActor(curScene, rec.speaker.state !== undefined ? { name: rec.speaker.name, state: rec.speaker.state } : { name: rec.speaker.name });
74
+ break;
75
+ }
76
+ }
77
+ }
78
+ return { script: { title: opts.title ?? "", episodes }, notes };
79
+ }
80
+ class Registry {
81
+ prefix;
82
+ kind;
83
+ nextStateId;
84
+ byNorm = new Map();
85
+ order = [];
86
+ constructor(prefix, kind, nextStateId) {
87
+ this.prefix = prefix;
88
+ this.kind = kind;
89
+ this.nextStateId = nextStateId;
90
+ }
91
+ ensure(name, occ) {
92
+ const key = norm(name);
93
+ let a = this.byNorm.get(key);
94
+ if (!a) {
95
+ a = { provisional_id: `${this.prefix}_${pad(this.order.length + 1)}`, kind: this.kind, names: [], states: [], occurrences: [] };
96
+ this.byNorm.set(key, a);
97
+ this.order.push(a);
98
+ }
99
+ if (!a.names.includes(name))
100
+ a.names.push(name);
101
+ a.occurrences.push(occ);
102
+ return a;
103
+ }
104
+ stateId(a, state) {
105
+ const key = norm(state);
106
+ const existing = a.states.find((s) => norm(s.name) === key);
107
+ if (existing)
108
+ return existing.id;
109
+ const id = this.nextStateId();
110
+ a.states.push({ name: state, id });
111
+ return id;
112
+ }
113
+ list() { return this.order; }
114
+ }
115
+ function emitStates(a) {
116
+ const out = [{ state_id: "default", state_name: "default", description: "" }];
117
+ for (const s of a.states)
118
+ out.push({ state_id: s.id, state_name: s.name, description: "" });
119
+ return out;
120
+ }
121
+ // Deterministically assign provisional ids to a (possibly extract-augmented)
122
+ // name-based script; returns the provisional v3 doc + evidence roster.
123
+ export function assignProvisionalIds(name) {
124
+ let stateSeq = 0;
125
+ const nextStateId = () => `st_${pad(++stateSeq)}`; // globally unique across all assets
126
+ const actors = new Registry("act", "actor", nextStateId);
127
+ const locations = new Registry("loc", "location", nextStateId);
128
+ const props = new Registry("prp", "prop", nextStateId);
129
+ const idState = (reg, ref, occ, idKey) => {
130
+ const a = reg.ensure(ref.name, occ);
131
+ const out = { [idKey]: a.provisional_id };
132
+ if (ref.state !== undefined)
133
+ out.state_id = reg.stateId(a, ref.state);
134
+ return out;
135
+ };
136
+ const episodes = name.episodes.map((ep, ei) => ({
137
+ episode_id: ep.episode_id,
138
+ ...(ep.title ? { title: ep.title } : {}),
139
+ scenes: ep.scenes.map((sc, si) => {
140
+ const occ = { episode: ei, scene: si };
141
+ const location = sc.location ? idState(locations, sc.location, occ, "location_id") : null;
142
+ const sceneActors = sc.actors.map((a) => idState(actors, a, occ, "actor_id"));
143
+ const sceneProps = sc.props.map((p) => idState(props, p, occ, "prop_id"));
144
+ const actions = sc.actions.map((ac) => {
145
+ const out = { type: ac.type, content: ac.content };
146
+ if (ac.speaker) {
147
+ if ("name" in ac.speaker) {
148
+ const a = actors.ensure(ac.speaker.name, occ);
149
+ const sp = { actor_id: a.provisional_id };
150
+ if (ac.speaker.state !== undefined)
151
+ sp.state_id = actors.stateId(a, ac.speaker.state);
152
+ out.speaker = sp;
153
+ }
154
+ else
155
+ out.speaker = ac.speaker.label !== undefined ? { kind: ac.speaker.kind, label: ac.speaker.label } : { kind: ac.speaker.kind };
156
+ }
157
+ if (ac.emotion !== undefined)
158
+ out.emotion = ac.emotion;
159
+ // Carry through free-form extend (e.g. video timestamps) so it survives
160
+ // into the final v3 product; text ingest never sets it.
161
+ if (ac.extend !== undefined)
162
+ out.extend = ac.extend;
163
+ return out;
164
+ });
165
+ return { scene_id: sc.scene_id, ...(sc.environment ? { environment: sc.environment } : {}), location, actors: sceneActors, props: sceneProps, actions };
166
+ }),
167
+ }));
168
+ const mkAssets = (reg, idKey, nameKey) => reg.list().map((a) => ({ [idKey]: a.provisional_id, [nameKey]: a.names[0] ?? a.provisional_id, aliases: a.names.slice(1), description: "", states: emitStates(a) }));
169
+ const script = {
170
+ version: 3,
171
+ title: name.title,
172
+ worldview: "",
173
+ style: "",
174
+ actors: mkAssets(actors, "actor_id", "actor_name"),
175
+ locations: mkAssets(locations, "location_id", "location_name"),
176
+ props: mkAssets(props, "prop_id", "prop_name"),
177
+ episodes,
178
+ };
179
+ return { script, assets: [...actors.list(), ...locations.list(), ...props.list()] };
180
+ }
181
+ //# sourceMappingURL=assembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembler.js","sourceRoot":"","sources":["../../../src/domain/ingest/assembler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type Chunk = {
2
+ index: number;
3
+ core_line_start: number;
4
+ core_line_end: number;
5
+ text: string;
6
+ };
7
+ export declare function chunkSource(text: string, opts?: {
8
+ maxChars?: number;
9
+ }): Chunk[];
@@ -0,0 +1,38 @@
1
+ // Deterministic source chunker (§pass1-prepare). Splits normalized (LF) source
2
+ // text into contiguous, non-overlapping chunks at paragraph (blank-line)
3
+ // boundaries under a char budget. It does NOT interpret episode/scene structure
4
+ // — that is pass2-normalize's job. Lines carry stable 0-based indices; a chunk's
5
+ // core range is the half-open [core_line_start, core_line_end). Cuts fall only on
6
+ // line boundaries, so no Unicode code point is ever split.
7
+ const DEFAULT_MAX_CHARS = 500;
8
+ export function chunkSource(text, opts = {}) {
9
+ const maxChars = opts.maxChars ?? DEFAULT_MAX_CHARS;
10
+ const lines = text.split("\n");
11
+ const chunks = [];
12
+ let start = 0;
13
+ let acc = 0;
14
+ const push = (end) => {
15
+ chunks.push({
16
+ index: chunks.length,
17
+ core_line_start: start,
18
+ core_line_end: end,
19
+ text: lines.slice(start, end).join("\n"),
20
+ });
21
+ start = end;
22
+ acc = 0;
23
+ };
24
+ for (let i = 0; i < lines.length; i++) {
25
+ acc += lines[i].length + 1;
26
+ const next = lines[i + 1];
27
+ // Cut once over budget, but only at a paragraph boundary (blank next line or
28
+ // end of source) so a paragraph is never split across chunks.
29
+ if (acc >= maxChars && (next === undefined || next.trim() === ""))
30
+ push(i + 1);
31
+ }
32
+ if (start < lines.length)
33
+ push(lines.length);
34
+ return chunks;
35
+ }
36
+ // ponytail: no context-only windows yet — normalize sees whole chunk text.
37
+ // Add a prefix/suffix context band if cross-chunk pronoun resolution needs it.
38
+ //# sourceMappingURL=chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../../src/domain/ingest/chunker.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,yEAAyE;AACzE,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,2DAA2D;AAS3D,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAA8B,EAAE;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,eAAe,EAAE,KAAK;YACtB,aAAa,EAAE,GAAG;YAClB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SACzC,CAAC,CAAC;QACH,KAAK,GAAG,GAAG,CAAC;QACZ,GAAG,GAAG,CAAC,CAAC;IACV,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,6EAA6E;QAC7E,8DAA8D;QAC9D,IAAI,GAAG,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;YAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM;QAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2EAA2E;AAC3E,+EAA+E"}
@@ -0,0 +1,5 @@
1
+ export declare function buildFlatLines(doc: unknown, nameOf: (actorId: string) => string): string[];
2
+ export declare function evidenceFor(lines: string[], names: string[], opts?: {
3
+ maxHits?: number;
4
+ radius?: number;
5
+ }): string;
@@ -0,0 +1,66 @@
1
+ // Deterministic evidence extraction for Pass5 curate (§9). Builds a flat,
2
+ // document-ordered list of content lines (dialogue rendered "name:content" so a
3
+ // speaker's own lines are searchable), then for an asset gathers a few
4
+ // occurrences of its name as ±radius line windows. Pure string search — no model.
5
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
6
+ const isArr = (v) => Array.isArray(v);
7
+ const S = (v) => (typeof v === "string" ? v : "");
8
+ // Ordered content lines across the whole script. Dialogue/inner_thought lines
9
+ // are prefixed with the speaker name so an actor's own speech is greppable by
10
+ // name even when the line text doesn't repeat it.
11
+ export function buildFlatLines(doc, nameOf) {
12
+ const out = [];
13
+ if (!isObj(doc))
14
+ return out;
15
+ for (const ep of isArr(doc.episodes) ? doc.episodes : []) {
16
+ if (!isObj(ep) || !isArr(ep.scenes))
17
+ continue;
18
+ for (const sc of ep.scenes) {
19
+ if (!isObj(sc) || !isArr(sc.actions))
20
+ continue;
21
+ for (const ac of sc.actions) {
22
+ if (!isObj(ac))
23
+ continue;
24
+ const content = S(ac.content);
25
+ if (ac.type === "dialogue" || ac.type === "inner_thought") {
26
+ const sp = ac.speaker;
27
+ const who = isObj(sp)
28
+ ? (typeof sp.actor_id === "string" ? nameOf(sp.actor_id) : `${S(sp.kind)}${sp.label ? `:${S(sp.label)}` : ""}`)
29
+ : "";
30
+ out.push(`${who}:${content}`);
31
+ }
32
+ else {
33
+ out.push(content);
34
+ }
35
+ }
36
+ }
37
+ }
38
+ return out;
39
+ }
40
+ // Up to `maxHits` occurrences of any of `names` in `lines`, each expanded to a
41
+ // ±radius window; overlapping windows are merged. Returns the joined excerpt.
42
+ export function evidenceFor(lines, names, opts = {}) {
43
+ const maxHits = opts.maxHits ?? 6;
44
+ const radius = opts.radius ?? 2;
45
+ const needles = names.filter((n) => n && n.length >= 1);
46
+ const hits = [];
47
+ for (let i = 0; i < lines.length && hits.length < maxHits; i++) {
48
+ if (needles.some((n) => lines[i].includes(n)))
49
+ hits.push(i);
50
+ }
51
+ if (hits.length === 0)
52
+ return "";
53
+ // Merge windows.
54
+ const ranges = [];
55
+ for (const h of hits) {
56
+ const lo = Math.max(0, h - radius);
57
+ const hi = Math.min(lines.length - 1, h + radius);
58
+ const last = ranges[ranges.length - 1];
59
+ if (last && lo <= last[1] + 1)
60
+ last[1] = Math.max(last[1], hi);
61
+ else
62
+ ranges.push([lo, hi]);
63
+ }
64
+ return ranges.map(([lo, hi]) => lines.slice(lo, hi + 1).join("\n")).join("\n…\n");
65
+ }
66
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../../src/domain/ingest/evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ type Obj = Record<string, unknown>;
2
+ export declare function governDeterministic(input: unknown): Obj;
3
+ export {};