@lingjingai/scriptctl 0.35.0 → 0.36.1

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 (364) hide show
  1. package/README.md +21 -5
  2. package/changes/0.36.0.md +24 -0
  3. package/dist/bin.js +0 -0
  4. package/dist/cli.d.ts +2 -1
  5. package/dist/cli.js +52 -128
  6. package/dist/cli.js.map +1 -1
  7. package/dist/common.d.ts +0 -16
  8. package/dist/common.js +2 -342
  9. package/dist/common.js.map +1 -1
  10. package/dist/domain/ingest/apply-plan.d.ts +23 -0
  11. package/dist/domain/ingest/apply-plan.js +210 -0
  12. package/dist/domain/ingest/apply-plan.js.map +1 -0
  13. package/dist/domain/ingest/assembler.d.ts +57 -0
  14. package/dist/domain/ingest/assembler.js +181 -0
  15. package/dist/domain/ingest/assembler.js.map +1 -0
  16. package/dist/domain/ingest/chunker.d.ts +9 -0
  17. package/dist/domain/ingest/chunker.js +38 -0
  18. package/dist/domain/ingest/chunker.js.map +1 -0
  19. package/dist/domain/ingest/evidence.d.ts +5 -0
  20. package/dist/domain/ingest/evidence.js +66 -0
  21. package/dist/domain/ingest/evidence.js.map +1 -0
  22. package/dist/domain/ingest/govern.d.ts +3 -0
  23. package/dist/domain/ingest/govern.js +127 -0
  24. package/dist/domain/ingest/govern.js.map +1 -0
  25. package/dist/domain/ingest/jsonl-parser.d.ts +6 -0
  26. package/dist/domain/ingest/jsonl-parser.js +187 -0
  27. package/dist/domain/ingest/jsonl-parser.js.map +1 -0
  28. package/dist/domain/ingest/markdown-parser.d.ts +6 -0
  29. package/dist/domain/ingest/markdown-parser.js +186 -0
  30. package/dist/domain/ingest/markdown-parser.js.map +1 -0
  31. package/dist/domain/ingest/records.d.ts +71 -0
  32. package/dist/domain/ingest/records.js +9 -0
  33. package/dist/domain/ingest/records.js.map +1 -0
  34. package/dist/domain/ingest/renumber.d.ts +14 -0
  35. package/dist/domain/ingest/renumber.js +130 -0
  36. package/dist/domain/ingest/renumber.js.map +1 -0
  37. package/dist/domain/ingest/script-v3.d.ts +94 -0
  38. package/dist/domain/ingest/script-v3.js +7 -0
  39. package/dist/domain/ingest/script-v3.js.map +1 -0
  40. package/dist/domain/ingest/state-reconcile.d.ts +11 -0
  41. package/dist/domain/ingest/state-reconcile.js +90 -0
  42. package/dist/domain/ingest/state-reconcile.js.map +1 -0
  43. package/dist/domain/ingest/validation.d.ts +11 -0
  44. package/dist/domain/ingest/validation.js +168 -0
  45. package/dist/domain/ingest/validation.js.map +1 -0
  46. package/dist/domain/ingest/video-aggregate.d.ts +23 -0
  47. package/dist/domain/ingest/video-aggregate.js +89 -0
  48. package/dist/domain/ingest/video-aggregate.js.map +1 -0
  49. package/dist/domain/ingest/video-apply.d.ts +37 -0
  50. package/dist/domain/ingest/video-apply.js +236 -0
  51. package/dist/domain/ingest/video-apply.js.map +1 -0
  52. package/dist/domain/ingest/video-md-parser.d.ts +2 -0
  53. package/dist/domain/ingest/video-md-parser.js +233 -0
  54. package/dist/domain/ingest/video-md-parser.js.map +1 -0
  55. package/dist/domain/ingest/video-records.d.ts +56 -0
  56. package/dist/domain/ingest/video-records.js +9 -0
  57. package/dist/domain/ingest/video-records.js.map +1 -0
  58. package/dist/domain/loom/index.d.ts +2 -1
  59. package/dist/domain/loom/index.js +12 -10
  60. package/dist/domain/loom/index.js.map +1 -1
  61. package/dist/domain/loom/types.d.ts +3 -2
  62. package/dist/domain/script/lookups.d.ts +3 -2
  63. package/dist/domain/script/lookups.js +25 -8
  64. package/dist/domain/script/lookups.js.map +1 -1
  65. package/dist/domain/script/patch/apply.js +2 -2
  66. package/dist/domain/script/patch/apply.js.map +1 -1
  67. package/dist/domain/script/patch/helpers.d.ts +3 -7
  68. package/dist/domain/script/patch/helpers.js +23 -96
  69. package/dist/domain/script/patch/helpers.js.map +1 -1
  70. package/dist/domain/script/patch/ops-action.d.ts +0 -2
  71. package/dist/domain/script/patch/ops-action.js +34 -100
  72. package/dist/domain/script/patch/ops-action.js.map +1 -1
  73. package/dist/domain/script/patch/ops-asset.d.ts +1 -0
  74. package/dist/domain/script/patch/ops-asset.js +102 -155
  75. package/dist/domain/script/patch/ops-asset.js.map +1 -1
  76. package/dist/domain/script/patch/ops-dialogue.d.ts +1 -4
  77. package/dist/domain/script/patch/ops-dialogue.js +43 -220
  78. package/dist/domain/script/patch/ops-dialogue.js.map +1 -1
  79. package/dist/domain/script/patch/ops-extend.js +8 -2
  80. package/dist/domain/script/patch/ops-extend.js.map +1 -1
  81. package/dist/domain/script/patch/ops-meta.js.map +1 -1
  82. package/dist/domain/script/patch/ops-scene.js +26 -39
  83. package/dist/domain/script/patch/ops-scene.js.map +1 -1
  84. package/dist/domain/script/patch/ops-state.d.ts +3 -3
  85. package/dist/domain/script/patch/ops-state.js +33 -49
  86. package/dist/domain/script/patch/ops-state.js.map +1 -1
  87. package/dist/domain/script/patch/registry.js +9 -13
  88. package/dist/domain/script/patch/registry.js.map +1 -1
  89. package/dist/domain/script/refs.js +23 -111
  90. package/dist/domain/script/refs.js.map +1 -1
  91. package/dist/domain/script/scene-refs.d.ts +3 -0
  92. package/dist/domain/script/scene-refs.js +35 -0
  93. package/dist/domain/script/scene-refs.js.map +1 -0
  94. package/dist/domain/script/schema.js +17 -21
  95. package/dist/domain/script/schema.js.map +1 -1
  96. package/dist/domain/script/text-util.d.ts +7 -0
  97. package/dist/domain/script/text-util.js +91 -0
  98. package/dist/domain/script/text-util.js.map +1 -0
  99. package/dist/help-text.js +117 -410
  100. package/dist/help-text.js.map +1 -1
  101. package/dist/infra/converters.js +1 -1
  102. package/dist/infra/converters.js.map +1 -1
  103. package/dist/infra/episode-title.d.ts +4 -0
  104. package/dist/infra/episode-title.js +129 -0
  105. package/dist/infra/episode-title.js.map +1 -0
  106. package/dist/infra/ingest/review-renderer.d.ts +1 -0
  107. package/dist/infra/ingest/review-renderer.js +431 -0
  108. package/dist/infra/ingest/review-renderer.js.map +1 -0
  109. package/dist/infra/ingest/source-resolver.d.ts +21 -0
  110. package/dist/infra/ingest/source-resolver.js +51 -0
  111. package/dist/infra/ingest/source-resolver.js.map +1 -0
  112. package/dist/infra/ingest/text-reader.d.ts +3 -0
  113. package/dist/infra/ingest/text-reader.js +27 -0
  114. package/dist/infra/ingest/text-reader.js.map +1 -0
  115. package/dist/infra/ingest/video-discovery.d.ts +8 -0
  116. package/dist/infra/ingest/video-discovery.js +60 -0
  117. package/dist/infra/ingest/video-discovery.js.map +1 -0
  118. package/dist/infra/ingest/workspace-store.d.ts +18 -0
  119. package/dist/infra/ingest/workspace-store.js +70 -0
  120. package/dist/infra/ingest/workspace-store.js.map +1 -0
  121. package/dist/infra/llm/anthropic-model.d.ts +11 -0
  122. package/dist/infra/llm/anthropic-model.js +109 -0
  123. package/dist/infra/llm/anthropic-model.js.map +1 -0
  124. package/dist/infra/llm/gemini-upload.d.ts +9 -0
  125. package/dist/infra/llm/gemini-upload.js +94 -0
  126. package/dist/infra/llm/gemini-upload.js.map +1 -0
  127. package/dist/infra/llm/gemini-video-model.d.ts +47 -0
  128. package/dist/infra/llm/gemini-video-model.js +163 -0
  129. package/dist/infra/llm/gemini-video-model.js.map +1 -0
  130. package/dist/infra/llm/openai-compatible-model.d.ts +14 -0
  131. package/dist/infra/llm/openai-compatible-model.js +157 -0
  132. package/dist/infra/llm/openai-compatible-model.js.map +1 -0
  133. package/dist/infra/llm/retry.d.ts +5 -0
  134. package/dist/infra/llm/retry.js +20 -0
  135. package/dist/infra/llm/retry.js.map +1 -0
  136. package/dist/llm/composition.d.ts +5 -0
  137. package/dist/llm/composition.js +5 -0
  138. package/dist/llm/composition.js.map +1 -0
  139. package/dist/llm/config.d.ts +26 -0
  140. package/dist/llm/config.js +201 -0
  141. package/dist/llm/config.js.map +1 -0
  142. package/dist/llm/registry.d.ts +44 -0
  143. package/dist/llm/registry.js +48 -0
  144. package/dist/llm/registry.js.map +1 -0
  145. package/dist/llm/router.d.ts +23 -0
  146. package/dist/llm/router.js +0 -0
  147. package/dist/llm/router.js.map +1 -0
  148. package/dist/llm/tasks/ingest/asset-curate.d.ts +13 -0
  149. package/dist/llm/tasks/ingest/asset-curate.js +45 -0
  150. package/dist/llm/tasks/ingest/asset-curate.js.map +1 -0
  151. package/dist/llm/tasks/ingest/asset-extract.d.ts +12 -0
  152. package/dist/llm/tasks/ingest/asset-extract.js +51 -0
  153. package/dist/llm/tasks/ingest/asset-extract.js.map +1 -0
  154. package/dist/llm/tasks/ingest/asset-govern.d.ts +22 -0
  155. package/dist/llm/tasks/ingest/asset-govern.js +143 -0
  156. package/dist/llm/tasks/ingest/asset-govern.js.map +1 -0
  157. package/dist/llm/tasks/ingest/mention-resolve.d.ts +9 -0
  158. package/dist/llm/tasks/ingest/mention-resolve.js +39 -0
  159. package/dist/llm/tasks/ingest/mention-resolve.js.map +1 -0
  160. package/dist/llm/tasks/ingest/plot-speaker.d.ts +11 -0
  161. package/dist/llm/tasks/ingest/plot-speaker.js +72 -0
  162. package/dist/llm/tasks/ingest/plot-speaker.js.map +1 -0
  163. package/dist/llm/tasks/ingest/roster-merge.d.ts +46 -0
  164. package/dist/llm/tasks/ingest/roster-merge.js +235 -0
  165. package/dist/llm/tasks/ingest/roster-merge.js.map +1 -0
  166. package/dist/llm/tasks/ingest/state-merge.d.ts +10 -0
  167. package/dist/llm/tasks/ingest/state-merge.js +84 -0
  168. package/dist/llm/tasks/ingest/state-merge.js.map +1 -0
  169. package/dist/llm/tasks/ingest/state-reconcile.d.ts +8 -0
  170. package/dist/llm/tasks/ingest/state-reconcile.js +44 -0
  171. package/dist/llm/tasks/ingest/state-reconcile.js.map +1 -0
  172. package/dist/llm/tasks/ingest/text-normalize.d.ts +10 -0
  173. package/dist/llm/tasks/ingest/text-normalize.js +89 -0
  174. package/dist/llm/tasks/ingest/text-normalize.js.map +1 -0
  175. package/dist/llm/tasks/ingest/video-correct.d.ts +30 -0
  176. package/dist/llm/tasks/ingest/video-correct.js +144 -0
  177. package/dist/llm/tasks/ingest/video-correct.js.map +1 -0
  178. package/dist/llm/tasks/ingest/video-transcribe.d.ts +4 -0
  179. package/dist/llm/tasks/ingest/video-transcribe.js +105 -0
  180. package/dist/llm/tasks/ingest/video-transcribe.js.map +1 -0
  181. package/dist/llm/tasks/schemas.d.ts +5 -0
  182. package/dist/llm/tasks/schemas.js +107 -0
  183. package/dist/llm/tasks/schemas.js.map +1 -0
  184. package/dist/llm/types.d.ts +97 -0
  185. package/dist/llm/types.js +13 -0
  186. package/dist/llm/types.js.map +1 -0
  187. package/dist/usecases/doctor.d.ts +1 -1
  188. package/dist/usecases/doctor.js +62 -9
  189. package/dist/usecases/doctor.js.map +1 -1
  190. package/dist/usecases/ingest/command.d.ts +5 -0
  191. package/dist/usecases/ingest/command.js +64 -0
  192. package/dist/usecases/ingest/command.js.map +1 -0
  193. package/dist/usecases/ingest/fanout.d.ts +10 -0
  194. package/dist/usecases/ingest/fanout.js +23 -0
  195. package/dist/usecases/ingest/fanout.js.map +1 -0
  196. package/dist/usecases/ingest/pass4-mention-resolve.d.ts +11 -0
  197. package/dist/usecases/ingest/pass4-mention-resolve.js +52 -0
  198. package/dist/usecases/ingest/pass4-mention-resolve.js.map +1 -0
  199. package/dist/usecases/ingest/pass5-extract.d.ts +7 -0
  200. package/dist/usecases/ingest/pass5-extract.js +50 -0
  201. package/dist/usecases/ingest/pass5-extract.js.map +1 -0
  202. package/dist/usecases/ingest/pass5-govern.d.ts +13 -0
  203. package/dist/usecases/ingest/pass5-govern.js +155 -0
  204. package/dist/usecases/ingest/pass5-govern.js.map +1 -0
  205. package/dist/usecases/ingest/pipeline.d.ts +28 -0
  206. package/dist/usecases/ingest/pipeline.js +144 -0
  207. package/dist/usecases/ingest/pipeline.js.map +1 -0
  208. package/dist/usecases/ingest/publish-command.d.ts +4 -0
  209. package/dist/usecases/ingest/publish-command.js +77 -0
  210. package/dist/usecases/ingest/publish-command.js.map +1 -0
  211. package/dist/usecases/ingest/status.d.ts +39 -0
  212. package/dist/usecases/ingest/status.js +155 -0
  213. package/dist/usecases/ingest/status.js.map +1 -0
  214. package/dist/usecases/ingest/video-pass3.d.ts +26 -0
  215. package/dist/usecases/ingest/video-pass3.js +0 -0
  216. package/dist/usecases/ingest/video-pass3.js.map +1 -0
  217. package/dist/usecases/ingest/video-pipeline.d.ts +32 -0
  218. package/dist/usecases/ingest/video-pipeline.js +202 -0
  219. package/dist/usecases/ingest/video-pipeline.js.map +1 -0
  220. package/dist/usecases/ingest/view-command.d.ts +4 -0
  221. package/dist/usecases/ingest/view-command.js +51 -0
  222. package/dist/usecases/ingest/view-command.js.map +1 -0
  223. package/dist/usecases/script/actions.js +2 -2
  224. package/dist/usecases/script/actions.js.map +1 -1
  225. package/dist/usecases/script/actor.js.map +1 -1
  226. package/dist/usecases/script/actors.js.map +1 -1
  227. package/dist/usecases/script/add-actor.js.map +1 -1
  228. package/dist/usecases/script/add-episode.js.map +1 -1
  229. package/dist/usecases/script/add-location.js.map +1 -1
  230. package/dist/usecases/script/add-prop.js.map +1 -1
  231. package/dist/usecases/script/alias.js.map +1 -1
  232. package/dist/usecases/script/assets.js.map +1 -1
  233. package/dist/usecases/script/context.js.map +1 -1
  234. package/dist/usecases/script/create.js +3 -6
  235. package/dist/usecases/script/create.js.map +1 -1
  236. package/dist/usecases/script/delete.js.map +1 -1
  237. package/dist/usecases/script/describe.js.map +1 -1
  238. package/dist/usecases/script/dialogue.js +6 -13
  239. package/dist/usecases/script/dialogue.js.map +1 -1
  240. package/dist/usecases/script/do.js +1 -1
  241. package/dist/usecases/script/do.js.map +1 -1
  242. package/dist/usecases/script/episodes.js.map +1 -1
  243. package/dist/usecases/script/{add-speaker.d.ts → importance.d.ts} +1 -1
  244. package/dist/usecases/script/importance.js +17 -0
  245. package/dist/usecases/script/importance.js.map +1 -0
  246. package/dist/usecases/script/insert.js.map +1 -1
  247. package/dist/usecases/script/issues.js.map +1 -1
  248. package/dist/usecases/script/lib.d.ts +8 -6
  249. package/dist/usecases/script/lib.js +81 -97
  250. package/dist/usecases/script/lib.js.map +1 -1
  251. package/dist/usecases/script/locations.js.map +1 -1
  252. package/dist/usecases/script/merge.js.map +1 -1
  253. package/dist/usecases/script/move.js.map +1 -1
  254. package/dist/usecases/script/props.js.map +1 -1
  255. package/dist/usecases/script/refs.js.map +1 -1
  256. package/dist/usecases/script/rename.js.map +1 -1
  257. package/dist/usecases/script/replace.js.map +1 -1
  258. package/dist/usecases/script/role.js.map +1 -1
  259. package/dist/usecases/script/scenes.js +8 -15
  260. package/dist/usecases/script/scenes.js.map +1 -1
  261. package/dist/usecases/script/script-patch.js +1 -1
  262. package/dist/usecases/script/script-patch.js.map +1 -1
  263. package/dist/usecases/script/script-validate.js +1 -1
  264. package/dist/usecases/script/script-validate.js.map +1 -1
  265. package/dist/usecases/script/session.d.ts +4 -4
  266. package/dist/usecases/script/session.js +57 -78
  267. package/dist/usecases/script/session.js.map +1 -1
  268. package/dist/usecases/script/split.js.map +1 -1
  269. package/dist/usecases/script/state-add.js.map +1 -1
  270. package/dist/usecases/script/state-delete.js.map +1 -1
  271. package/dist/usecases/script/state-rename.js.map +1 -1
  272. package/dist/usecases/script/summary.js.map +1 -1
  273. package/dist/usecases/script/synopsis-generate.d.ts +4 -5
  274. package/dist/usecases/script/synopsis-generate.js +30 -46
  275. package/dist/usecases/script/synopsis-generate.js.map +1 -1
  276. package/dist/usecases/script/transition.js.map +1 -1
  277. package/dist/usecases/script/type.js.map +1 -1
  278. package/dist/usecases/script/worldview.js.map +1 -1
  279. package/package.json +21 -17
  280. package/skills/scriptctl/SKILL.md +140 -120
  281. package/skills/scriptctl/references/atomic-write-workflow.md +12 -9
  282. package/skills/scriptctl/references/ingest-workflow.md +85 -0
  283. package/skills/scriptctl/references/state-reference-repair.md +26 -39
  284. package/dist/domain/direct/runner.d.ts +0 -25
  285. package/dist/domain/direct/runner.js +0 -88
  286. package/dist/domain/direct/runner.js.map +0 -1
  287. package/dist/domain/direct/stage.d.ts +0 -108
  288. package/dist/domain/direct/stage.js +0 -134
  289. package/dist/domain/direct/stage.js.map +0 -1
  290. package/dist/domain/direct/stages/asset-curation.d.ts +0 -2
  291. package/dist/domain/direct/stages/asset-curation.js +0 -10
  292. package/dist/domain/direct/stages/asset-curation.js.map +0 -1
  293. package/dist/domain/direct/stages/batch-extract.d.ts +0 -2
  294. package/dist/domain/direct/stages/batch-extract.js +0 -12
  295. package/dist/domain/direct/stages/batch-extract.js.map +0 -1
  296. package/dist/domain/direct/stages/batch-plan.d.ts +0 -2
  297. package/dist/domain/direct/stages/batch-plan.js +0 -9
  298. package/dist/domain/direct/stages/batch-plan.js.map +0 -1
  299. package/dist/domain/direct/stages/episode-merge.d.ts +0 -2
  300. package/dist/domain/direct/stages/episode-merge.js +0 -11
  301. package/dist/domain/direct/stages/episode-merge.js.map +0 -1
  302. package/dist/domain/direct/stages/episode-plan.d.ts +0 -2
  303. package/dist/domain/direct/stages/episode-plan.js +0 -9
  304. package/dist/domain/direct/stages/episode-plan.js.map +0 -1
  305. package/dist/domain/direct/stages/episode-synopsis.d.ts +0 -2
  306. package/dist/domain/direct/stages/episode-synopsis.js +0 -12
  307. package/dist/domain/direct/stages/episode-synopsis.js.map +0 -1
  308. package/dist/domain/direct/stages/episode-titles.d.ts +0 -2
  309. package/dist/domain/direct/stages/episode-titles.js +0 -12
  310. package/dist/domain/direct/stages/episode-titles.js.map +0 -1
  311. package/dist/domain/direct/stages/index.d.ts +0 -19
  312. package/dist/domain/direct/stages/index.js +0 -41
  313. package/dist/domain/direct/stages/index.js.map +0 -1
  314. package/dist/domain/direct/stages/metadata.d.ts +0 -2
  315. package/dist/domain/direct/stages/metadata.js +0 -11
  316. package/dist/domain/direct/stages/metadata.js.map +0 -1
  317. package/dist/domain/direct/stages/script-merge.d.ts +0 -2
  318. package/dist/domain/direct/stages/script-merge.js +0 -15
  319. package/dist/domain/direct/stages/script-merge.js.map +0 -1
  320. package/dist/domain/direct/stages/script-synopsis.d.ts +0 -2
  321. package/dist/domain/direct/stages/script-synopsis.js +0 -12
  322. package/dist/domain/direct/stages/script-synopsis.js.map +0 -1
  323. package/dist/domain/direct/stages/source-prepare.d.ts +0 -2
  324. package/dist/domain/direct/stages/source-prepare.js +0 -9
  325. package/dist/domain/direct/stages/source-prepare.js.map +0 -1
  326. package/dist/domain/direct/stages/state-binding.d.ts +0 -2
  327. package/dist/domain/direct/stages/state-binding.js +0 -9
  328. package/dist/domain/direct/stages/state-binding.js.map +0 -1
  329. package/dist/domain/direct/stages/state-curation.d.ts +0 -2
  330. package/dist/domain/direct/stages/state-curation.js +0 -10
  331. package/dist/domain/direct/stages/state-curation.js.map +0 -1
  332. package/dist/domain/direct/stages/validate.d.ts +0 -2
  333. package/dist/domain/direct/stages/validate.js +0 -10
  334. package/dist/domain/direct/stages/validate.js.map +0 -1
  335. package/dist/domain/direct-core.d.ts +0 -313
  336. package/dist/domain/direct-core.js +0 -8514
  337. package/dist/domain/direct-core.js.map +0 -1
  338. package/dist/domain/script/validate.d.ts +0 -22
  339. package/dist/domain/script/validate.js +0 -997
  340. package/dist/domain/script/validate.js.map +0 -1
  341. package/dist/infra/providers.d.ts +0 -97
  342. package/dist/infra/providers.js +0 -1396
  343. package/dist/infra/providers.js.map +0 -1
  344. package/dist/usecases/direct.d.ts +0 -27
  345. package/dist/usecases/direct.js +0 -4172
  346. package/dist/usecases/direct.js.map +0 -1
  347. package/dist/usecases/parse.d.ts +0 -15
  348. package/dist/usecases/parse.js +0 -429
  349. package/dist/usecases/parse.js.map +0 -1
  350. package/dist/usecases/script/add-speaker.js +0 -22
  351. package/dist/usecases/script/add-speaker.js.map +0 -1
  352. package/dist/usecases/script/export.d.ts +0 -3
  353. package/dist/usecases/script/export.js +0 -111
  354. package/dist/usecases/script/export.js.map +0 -1
  355. package/dist/usecases/script/overlap.d.ts +0 -3
  356. package/dist/usecases/script/overlap.js +0 -21
  357. package/dist/usecases/script/overlap.js.map +0 -1
  358. package/dist/usecases/script/speakers.d.ts +0 -3
  359. package/dist/usecases/script/speakers.js +0 -28
  360. package/dist/usecases/script/speakers.js.map +0 -1
  361. package/dist/usecases/script/state-change.d.ts +0 -3
  362. package/dist/usecases/script/state-change.js +0 -24
  363. package/dist/usecases/script/state-change.js.map +0 -1
  364. package/skills/scriptctl/references/direct-workflow.md +0 -72
@@ -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":"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"}
@@ -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;
@@ -0,0 +1,89 @@
1
+ // Cross-episode context aggregation (§10.2 pass3, ported from cezhi-verify 03).
2
+ // Deterministic — no LLM. Sums each name's cross-episode occurrences + anchors +
3
+ // roles + states into a working roster. Names that might be the same person
4
+ // (江文博/江总) are NOT auto-merged here; that is the roster-merge layer's job.
5
+ function pushUniq(arr, v) {
6
+ const s = (v ?? "").trim();
7
+ if (s && !arr.includes(s))
8
+ arr.push(s);
9
+ }
10
+ function aggActors(docs) {
11
+ const map = new Map();
12
+ for (const d of docs) {
13
+ const stateByOwner = new Map();
14
+ for (const s of d.actorStates) {
15
+ if (!stateByOwner.has(s.owner))
16
+ stateByOwner.set(s.owner, []);
17
+ stateByOwner.get(s.owner).push(s.state);
18
+ }
19
+ for (const a of d.actors) {
20
+ if (!map.has(a.name))
21
+ map.set(a.name, { name: a.name, episodes: [], appearances: [], anchors: [], voices: [], roles: [], states: [] });
22
+ const g = map.get(a.name);
23
+ g.episodes.push(d.episode);
24
+ pushUniq(g.appearances, a.appearance);
25
+ pushUniq(g.anchors, a.anchor);
26
+ pushUniq(g.voices, a.voice);
27
+ pushUniq(g.roles, a.role);
28
+ for (const st of stateByOwner.get(a.name) ?? [])
29
+ pushUniq(g.states, st);
30
+ }
31
+ }
32
+ return [...map.values()].sort((x, y) => y.episodes.length - x.episodes.length || x.name.localeCompare(y.name));
33
+ }
34
+ function aggAssets(docs, key) {
35
+ const map = new Map();
36
+ for (const d of docs)
37
+ for (const it of d[key]) {
38
+ if (!map.has(it.name))
39
+ map.set(it.name, { name: it.name, episodes: [], descs: [] });
40
+ const g = map.get(it.name);
41
+ g.episodes.push(d.episode);
42
+ pushUniq(g.descs, it.desc);
43
+ }
44
+ return [...map.values()].sort((x, y) => y.episodes.length - x.episodes.length);
45
+ }
46
+ export function aggregateContext(docs) {
47
+ return {
48
+ episodes: docs.map((d) => d.episode),
49
+ actors: aggActors(docs),
50
+ locations: aggAssets(docs, "locations"),
51
+ props: aggAssets(docs, "props"),
52
+ };
53
+ }
54
+ // Compact per-episode-two context markdown (unmerged) — kept for parity/debug;
55
+ // the merged variant (video-roster.renderMergedContextMd) is what pass4 consumes.
56
+ export function renderContextMd(ctx) {
57
+ const L = [];
58
+ L.push("# 跨集资产 CONTEXT(用于校正命名与引用)", "");
59
+ L.push("说明:这是前几集汇总的花名册。第二遍请对照原视频,把本集里被字幕带偏或未点名的角色,", "校正到下面的规范名;同一个人在不同集用了不同称呼(如「江文博」vs「江总」)的,判断是否同人。", "");
60
+ L.push("## 人物", "");
61
+ for (const a of ctx.actors) {
62
+ L.push(`### ${a.name} (出现于 ep ${a.episodes.join("/")})`);
63
+ if (a.roles.length)
64
+ L.push(`- 作用: ${a.roles.join(" | ")}`);
65
+ if (a.anchors.length)
66
+ L.push(`- 锚点: ${a.anchors.join(" | ")}`);
67
+ if (a.appearances.length)
68
+ L.push(`- 外观: ${a.appearances[0]}`);
69
+ if (a.voices.length)
70
+ L.push(`- 声线: ${a.voices.join(" | ")}`);
71
+ if (a.states.length)
72
+ L.push(`- 已知造型: ${a.states.join("、")}`);
73
+ L.push("");
74
+ }
75
+ if (ctx.locations.length) {
76
+ L.push("## 场景", "");
77
+ for (const l of ctx.locations)
78
+ L.push(`- ${l.name}(ep ${l.episodes.join("/")}): ${l.descs[0] ?? ""}`);
79
+ L.push("");
80
+ }
81
+ if (ctx.props.length) {
82
+ L.push("## 道具", "");
83
+ for (const p of ctx.props)
84
+ L.push(`- ${p.name}(ep ${p.episodes.join("/")}): ${p.descs[0] ?? ""}`);
85
+ L.push("");
86
+ }
87
+ return L.join("\n");
88
+ }
89
+ //# sourceMappingURL=video-aggregate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-aggregate.js","sourceRoot":"","sources":["../../../src/domain/ingest/video-aggregate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { NameScript } from "./assembler.js";
2
+ import type { VideoEpisodeDoc } from "./video-records.js";
3
+ export interface EpCorrection {
4
+ name_fixes: Array<{
5
+ from: string;
6
+ to: string;
7
+ }>;
8
+ same_person: Array<{
9
+ names: string[];
10
+ }>;
11
+ speaker_fixes: Array<{
12
+ ts?: string;
13
+ from: string;
14
+ to: string;
15
+ }>;
16
+ dialogue_fixes: Array<{
17
+ ts?: string;
18
+ wrong: string;
19
+ right: string;
20
+ }>;
21
+ }
22
+ export interface ApplyInput {
23
+ correctionsByEp: Map<number, EpCorrection>;
24
+ plotFixesByEp: Map<number, Array<{
25
+ ts?: string;
26
+ from: string;
27
+ to: string;
28
+ }>>;
29
+ aliasToCanon: Record<string, string>;
30
+ rosterStates: Record<string, Record<string, string>>;
31
+ }
32
+ export declare function buildRenameMap(corrections: Array<{
33
+ c: EpCorrection;
34
+ }>, nameWeight: Map<string, number>, rosterAliasToCanon: Map<string, string>): Map<string, string>;
35
+ export declare function applyRename(name: string | undefined, map: Map<string, string>): string | undefined;
36
+ export declare function applyCorrections(docsIn: VideoEpisodeDoc[], input: ApplyInput): VideoEpisodeDoc[];
37
+ export declare function docsToNameScript(docs: VideoEpisodeDoc[], title: string): NameScript;