@lingjingai/scriptctl 0.49.16 → 0.51.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 (525) hide show
  1. package/README.md +8 -2
  2. package/changes/0.50.0.md +63 -0
  3. package/changes/0.51.0.md +24 -0
  4. package/dist/cli/register-batch.d.ts +3 -0
  5. package/dist/cli/register-batch.js +28 -0
  6. package/dist/cli/register-batch.js.map +1 -0
  7. package/dist/cli/register-edits.d.ts +4 -0
  8. package/dist/cli/register-edits.js +226 -0
  9. package/dist/cli/register-edits.js.map +1 -0
  10. package/dist/cli/register-query.d.ts +4 -0
  11. package/dist/cli/register-query.js +93 -0
  12. package/dist/cli/register-query.js.map +1 -0
  13. package/dist/cli/register-tools.d.ts +3 -0
  14. package/dist/cli/register-tools.js +23 -0
  15. package/dist/cli/register-tools.js.map +1 -0
  16. package/dist/cli/register-workflows.d.ts +4 -0
  17. package/dist/cli/register-workflows.js +71 -0
  18. package/dist/cli/register-workflows.js.map +1 -0
  19. package/dist/cli/registry.d.ts +14 -0
  20. package/dist/cli/registry.js +65 -0
  21. package/dist/cli/registry.js.map +1 -0
  22. package/dist/cli.d.ts +3 -0
  23. package/dist/cli.js +146 -575
  24. package/dist/cli.js.map +1 -1
  25. package/dist/common.d.ts +12 -38
  26. package/dist/common.js +5 -11
  27. package/dist/common.js.map +1 -1
  28. package/dist/domain/authoring/apply.d.ts +1 -33
  29. package/dist/domain/authoring/apply.js +1 -783
  30. package/dist/domain/authoring/apply.js.map +1 -1
  31. package/dist/domain/authoring/export.d.ts +1 -7
  32. package/dist/domain/authoring/export.js +1 -84
  33. package/dist/domain/authoring/export.js.map +1 -1
  34. package/dist/domain/authoring/parser.d.ts +2 -3
  35. package/dist/domain/authoring/parser.js +2 -914
  36. package/dist/domain/authoring/parser.js.map +1 -1
  37. package/dist/domain/authoring/serializer.d.ts +1 -2
  38. package/dist/domain/authoring/serializer.js +1 -243
  39. package/dist/domain/authoring/serializer.js.map +1 -1
  40. package/dist/domain/authoring/shared/bracket.d.ts +4 -0
  41. package/dist/domain/authoring/shared/bracket.js +95 -0
  42. package/dist/domain/authoring/shared/bracket.js.map +1 -0
  43. package/dist/domain/authoring/shared/types.d.ts +12 -0
  44. package/dist/domain/authoring/shared/types.js +2 -0
  45. package/dist/domain/authoring/shared/types.js.map +1 -0
  46. package/dist/domain/authoring/types.d.ts +2 -87
  47. package/dist/domain/authoring/types.js +2 -1
  48. package/dist/domain/authoring/types.js.map +1 -1
  49. package/dist/domain/authoring/v3/apply.d.ts +33 -0
  50. package/dist/domain/authoring/v3/apply.js +784 -0
  51. package/dist/domain/authoring/v3/apply.js.map +1 -0
  52. package/dist/domain/authoring/v3/export.d.ts +7 -0
  53. package/dist/domain/authoring/v3/export.js +85 -0
  54. package/dist/domain/authoring/v3/export.js.map +1 -0
  55. package/dist/domain/authoring/v3/parser.d.ts +3 -0
  56. package/dist/domain/authoring/v3/parser.js +823 -0
  57. package/dist/domain/authoring/v3/parser.js.map +1 -0
  58. package/dist/domain/authoring/v3/serializer.d.ts +2 -0
  59. package/dist/domain/authoring/v3/serializer.js +244 -0
  60. package/dist/domain/authoring/v3/serializer.js.map +1 -0
  61. package/dist/domain/authoring/v3/types.d.ts +76 -0
  62. package/dist/domain/authoring/v3/types.js +2 -0
  63. package/dist/domain/authoring/v3/types.js.map +1 -0
  64. package/dist/domain/authoring/v4/apply.d.ts +40 -0
  65. package/dist/domain/authoring/v4/apply.js +451 -0
  66. package/dist/domain/authoring/v4/apply.js.map +1 -0
  67. package/dist/domain/authoring/v4/parser.d.ts +2 -0
  68. package/dist/domain/authoring/v4/parser.js +729 -0
  69. package/dist/domain/authoring/v4/parser.js.map +1 -0
  70. package/dist/domain/authoring/v4/serializer.d.ts +6 -0
  71. package/dist/domain/authoring/v4/serializer.js +280 -0
  72. package/dist/domain/authoring/v4/serializer.js.map +1 -0
  73. package/dist/domain/authoring/v4/types.d.ts +50 -0
  74. package/dist/domain/authoring/v4/types.js +2 -0
  75. package/dist/domain/authoring/v4/types.js.map +1 -0
  76. package/dist/domain/ingest/apply-plan.d.ts +1 -1
  77. package/dist/domain/ingest/assembler.d.ts +9 -0
  78. package/dist/domain/ingest/assembler.js +98 -36
  79. package/dist/domain/ingest/assembler.js.map +1 -1
  80. package/dist/domain/ingest/asset-audit.d.ts +50 -0
  81. package/dist/domain/ingest/asset-audit.js +196 -0
  82. package/dist/domain/ingest/asset-audit.js.map +1 -0
  83. package/dist/domain/ingest/production-validation.d.ts +5 -4
  84. package/dist/domain/ingest/production-validation.js +10 -25
  85. package/dist/domain/ingest/production-validation.js.map +1 -1
  86. package/dist/domain/ingest/records.d.ts +1 -1
  87. package/dist/domain/ingest/records.js +1 -1
  88. package/dist/domain/ingest/records.js.map +1 -1
  89. package/dist/domain/ingest/serial-context.d.ts +1 -1
  90. package/dist/domain/ingest/validation.d.ts +1 -11
  91. package/dist/domain/ingest/validation.js +1 -199
  92. package/dist/domain/ingest/validation.js.map +1 -1
  93. package/dist/domain/ingest/video-apply.js +68 -45
  94. package/dist/domain/ingest/video-apply.js.map +1 -1
  95. package/dist/domain/script/address.d.ts +1 -32
  96. package/dist/domain/script/address.js +1 -144
  97. package/dist/domain/script/address.js.map +1 -1
  98. package/dist/domain/script/dispatch.d.ts +14 -0
  99. package/dist/domain/script/dispatch.js +45 -0
  100. package/dist/domain/script/dispatch.js.map +1 -0
  101. package/dist/domain/script/lookups.d.ts +1 -33
  102. package/dist/domain/script/lookups.js +1 -316
  103. package/dist/domain/script/lookups.js.map +1 -1
  104. package/dist/domain/script/parse.d.ts +1 -3
  105. package/dist/domain/script/parse.js +1 -164
  106. package/dist/domain/script/parse.js.map +1 -1
  107. package/dist/domain/script/patch/apply.d.ts +1 -2
  108. package/dist/domain/script/patch/apply.js +1 -30
  109. package/dist/domain/script/patch/apply.js.map +1 -1
  110. package/dist/domain/script/patch/helpers.d.ts +1 -17
  111. package/dist/domain/script/patch/helpers.js +1 -210
  112. package/dist/domain/script/patch/helpers.js.map +1 -1
  113. package/dist/domain/script/patch/inline-speaker.d.ts +1 -2
  114. package/dist/domain/script/patch/inline-speaker.js +1 -49
  115. package/dist/domain/script/patch/inline-speaker.js.map +1 -1
  116. package/dist/domain/script/patch/ops-action.d.ts +1 -12
  117. package/dist/domain/script/patch/ops-action.js +1 -366
  118. package/dist/domain/script/patch/ops-action.js.map +1 -1
  119. package/dist/domain/script/patch/ops-asset.d.ts +1 -14
  120. package/dist/domain/script/patch/ops-asset.js +1 -364
  121. package/dist/domain/script/patch/ops-asset.js.map +1 -1
  122. package/dist/domain/script/patch/ops-dialogue.d.ts +1 -2
  123. package/dist/domain/script/patch/ops-dialogue.js +1 -25
  124. package/dist/domain/script/patch/ops-dialogue.js.map +1 -1
  125. package/dist/domain/script/patch/ops-extend.d.ts +1 -8
  126. package/dist/domain/script/patch/ops-extend.js +1 -110
  127. package/dist/domain/script/patch/ops-extend.js.map +1 -1
  128. package/dist/domain/script/patch/ops-meta.d.ts +1 -5
  129. package/dist/domain/script/patch/ops-meta.js +1 -81
  130. package/dist/domain/script/patch/ops-meta.js.map +1 -1
  131. package/dist/domain/script/patch/ops-scene.d.ts +1 -6
  132. package/dist/domain/script/patch/ops-scene.js +1 -350
  133. package/dist/domain/script/patch/ops-scene.js.map +1 -1
  134. package/dist/domain/script/patch/ops-state.d.ts +1 -8
  135. package/dist/domain/script/patch/ops-state.js +1 -164
  136. package/dist/domain/script/patch/ops-state.js.map +1 -1
  137. package/dist/domain/script/patch/registry.d.ts +1 -2
  138. package/dist/domain/script/patch/registry.js +1 -52
  139. package/dist/domain/script/patch/registry.js.map +1 -1
  140. package/dist/domain/script/patch/types.d.ts +1 -10
  141. package/dist/domain/script/patch/types.js +1 -1
  142. package/dist/domain/script/patch/types.js.map +1 -1
  143. package/dist/domain/script/refs.d.ts +1 -4
  144. package/dist/domain/script/refs.js +1 -63
  145. package/dist/domain/script/refs.js.map +1 -1
  146. package/dist/domain/script/scene-refs.d.ts +1 -3
  147. package/dist/domain/script/scene-refs.js +1 -34
  148. package/dist/domain/script/scene-refs.js.map +1 -1
  149. package/dist/domain/script/schema.d.ts +1 -6
  150. package/dist/domain/script/schema.js +1 -55
  151. package/dist/domain/script/schema.js.map +1 -1
  152. package/dist/domain/script/selector.d.ts +1 -45
  153. package/dist/domain/script/selector.js +1 -184
  154. package/dist/domain/script/selector.js.map +1 -1
  155. package/dist/domain/script/shared/regex.d.ts +2 -0
  156. package/dist/domain/script/shared/regex.js +7 -0
  157. package/dist/domain/script/shared/regex.js.map +1 -0
  158. package/dist/domain/script/shared/types.d.ts +18 -0
  159. package/dist/domain/script/shared/types.js +9 -0
  160. package/dist/domain/script/shared/types.js.map +1 -0
  161. package/dist/domain/script/shared/validation.d.ts +10 -0
  162. package/dist/domain/script/shared/validation.js +2 -0
  163. package/dist/domain/script/shared/validation.js.map +1 -0
  164. package/dist/domain/script/shared.js +4 -6
  165. package/dist/domain/script/shared.js.map +1 -1
  166. package/dist/domain/script/types.d.ts +1 -123
  167. package/dist/domain/script/types.js +1 -8
  168. package/dist/domain/script/types.js.map +1 -1
  169. package/dist/domain/script/v3/address.d.ts +32 -0
  170. package/dist/domain/script/v3/address.js +136 -0
  171. package/dist/domain/script/v3/address.js.map +1 -0
  172. package/dist/domain/script/v3/lookups.d.ts +33 -0
  173. package/dist/domain/script/v3/lookups.js +316 -0
  174. package/dist/domain/script/v3/lookups.js.map +1 -0
  175. package/dist/domain/script/v3/ordinal.d.ts +8 -0
  176. package/dist/domain/script/v3/ordinal.js +91 -0
  177. package/dist/domain/script/v3/ordinal.js.map +1 -0
  178. package/dist/domain/script/v3/parse.d.ts +3 -0
  179. package/dist/domain/script/v3/parse.js +164 -0
  180. package/dist/domain/script/v3/parse.js.map +1 -0
  181. package/dist/domain/script/v3/patch/apply.d.ts +2 -0
  182. package/dist/domain/script/v3/patch/apply.js +31 -0
  183. package/dist/domain/script/v3/patch/apply.js.map +1 -0
  184. package/dist/domain/script/v3/patch/helpers.d.ts +17 -0
  185. package/dist/domain/script/v3/patch/helpers.js +209 -0
  186. package/dist/domain/script/v3/patch/helpers.js.map +1 -0
  187. package/dist/domain/script/v3/patch/inline-speaker.d.ts +2 -0
  188. package/dist/domain/script/v3/patch/inline-speaker.js +50 -0
  189. package/dist/domain/script/v3/patch/inline-speaker.js.map +1 -0
  190. package/dist/domain/script/v3/patch/ops-action.d.ts +12 -0
  191. package/dist/domain/script/v3/patch/ops-action.js +367 -0
  192. package/dist/domain/script/v3/patch/ops-action.js.map +1 -0
  193. package/dist/domain/script/v3/patch/ops-asset.d.ts +14 -0
  194. package/dist/domain/script/v3/patch/ops-asset.js +365 -0
  195. package/dist/domain/script/v3/patch/ops-asset.js.map +1 -0
  196. package/dist/domain/script/v3/patch/ops-dialogue.d.ts +2 -0
  197. package/dist/domain/script/v3/patch/ops-dialogue.js +26 -0
  198. package/dist/domain/script/v3/patch/ops-dialogue.js.map +1 -0
  199. package/dist/domain/script/v3/patch/ops-extend.d.ts +8 -0
  200. package/dist/domain/script/v3/patch/ops-extend.js +111 -0
  201. package/dist/domain/script/v3/patch/ops-extend.js.map +1 -0
  202. package/dist/domain/script/v3/patch/ops-meta.d.ts +5 -0
  203. package/dist/domain/script/v3/patch/ops-meta.js +82 -0
  204. package/dist/domain/script/v3/patch/ops-meta.js.map +1 -0
  205. package/dist/domain/script/v3/patch/ops-scene.d.ts +6 -0
  206. package/dist/domain/script/v3/patch/ops-scene.js +351 -0
  207. package/dist/domain/script/v3/patch/ops-scene.js.map +1 -0
  208. package/dist/domain/script/v3/patch/ops-state.d.ts +8 -0
  209. package/dist/domain/script/v3/patch/ops-state.js +165 -0
  210. package/dist/domain/script/v3/patch/ops-state.js.map +1 -0
  211. package/dist/domain/script/v3/patch/registry.d.ts +2 -0
  212. package/dist/domain/script/v3/patch/registry.js +53 -0
  213. package/dist/domain/script/v3/patch/registry.js.map +1 -0
  214. package/dist/domain/script/v3/patch/types.d.ts +10 -0
  215. package/dist/domain/script/v3/patch/types.js +2 -0
  216. package/dist/domain/script/v3/patch/types.js.map +1 -0
  217. package/dist/domain/script/v3/refs.d.ts +4 -0
  218. package/dist/domain/script/v3/refs.js +64 -0
  219. package/dist/domain/script/v3/refs.js.map +1 -0
  220. package/dist/domain/script/v3/scene-refs.d.ts +3 -0
  221. package/dist/domain/script/v3/scene-refs.js +35 -0
  222. package/dist/domain/script/v3/scene-refs.js.map +1 -0
  223. package/dist/domain/script/v3/schema.d.ts +6 -0
  224. package/dist/domain/script/v3/schema.js +56 -0
  225. package/dist/domain/script/v3/schema.js.map +1 -0
  226. package/dist/domain/script/v3/selector.d.ts +44 -0
  227. package/dist/domain/script/v3/selector.js +178 -0
  228. package/dist/domain/script/v3/selector.js.map +1 -0
  229. package/dist/domain/script/v3/types.d.ts +106 -0
  230. package/dist/domain/script/v3/types.js +2 -0
  231. package/dist/domain/script/v3/types.js.map +1 -0
  232. package/dist/domain/script/v3/validation.d.ts +3 -0
  233. package/dist/domain/script/v3/validation.js +200 -0
  234. package/dist/domain/script/v3/validation.js.map +1 -0
  235. package/dist/domain/script/v4/address.d.ts +61 -0
  236. package/dist/domain/script/v4/address.js +99 -0
  237. package/dist/domain/script/v4/address.js.map +1 -0
  238. package/dist/domain/script/v4/factory.d.ts +2 -0
  239. package/dist/domain/script/v4/factory.js +13 -0
  240. package/dist/domain/script/v4/factory.js.map +1 -0
  241. package/dist/domain/script/v4/from-v3.d.ts +29 -0
  242. package/dist/domain/script/v4/from-v3.js +307 -0
  243. package/dist/domain/script/v4/from-v3.js.map +1 -0
  244. package/dist/domain/script/v4/ids.d.ts +27 -0
  245. package/dist/domain/script/v4/ids.js +62 -0
  246. package/dist/domain/script/v4/ids.js.map +1 -0
  247. package/dist/domain/script/v4/ordinal.d.ts +3 -0
  248. package/dist/domain/script/v4/ordinal.js +66 -0
  249. package/dist/domain/script/v4/ordinal.js.map +1 -0
  250. package/dist/domain/script/v4/parse.d.ts +3 -0
  251. package/dist/domain/script/v4/parse.js +17 -0
  252. package/dist/domain/script/v4/parse.js.map +1 -0
  253. package/dist/domain/script/v4/patch/apply.d.ts +3 -0
  254. package/dist/domain/script/v4/patch/apply.js +24 -0
  255. package/dist/domain/script/v4/patch/apply.js.map +1 -0
  256. package/dist/domain/script/v4/patch/helpers.d.ts +32 -0
  257. package/dist/domain/script/v4/patch/helpers.js +138 -0
  258. package/dist/domain/script/v4/patch/helpers.js.map +1 -0
  259. package/dist/domain/script/v4/patch/ops-action.d.ts +13 -0
  260. package/dist/domain/script/v4/patch/ops-action.js +376 -0
  261. package/dist/domain/script/v4/patch/ops-action.js.map +1 -0
  262. package/dist/domain/script/v4/patch/ops-asset.d.ts +17 -0
  263. package/dist/domain/script/v4/patch/ops-asset.js +617 -0
  264. package/dist/domain/script/v4/patch/ops-asset.js.map +1 -0
  265. package/dist/domain/script/v4/patch/ops-extend.d.ts +11 -0
  266. package/dist/domain/script/v4/patch/ops-extend.js +86 -0
  267. package/dist/domain/script/v4/patch/ops-extend.js.map +1 -0
  268. package/dist/domain/script/v4/patch/ops-meta.d.ts +5 -0
  269. package/dist/domain/script/v4/patch/ops-meta.js +49 -0
  270. package/dist/domain/script/v4/patch/ops-meta.js.map +1 -0
  271. package/dist/domain/script/v4/patch/ops-scene-ref.d.ts +3 -0
  272. package/dist/domain/script/v4/patch/ops-scene-ref.js +98 -0
  273. package/dist/domain/script/v4/patch/ops-scene-ref.js.map +1 -0
  274. package/dist/domain/script/v4/patch/ops-structure.d.ts +6 -0
  275. package/dist/domain/script/v4/patch/ops-structure.js +236 -0
  276. package/dist/domain/script/v4/patch/ops-structure.js.map +1 -0
  277. package/dist/domain/script/v4/patch/registry.d.ts +2 -0
  278. package/dist/domain/script/v4/patch/registry.js +50 -0
  279. package/dist/domain/script/v4/patch/registry.js.map +1 -0
  280. package/dist/domain/script/v4/patch/schema.d.ts +7 -0
  281. package/dist/domain/script/v4/patch/schema.js +75 -0
  282. package/dist/domain/script/v4/patch/schema.js.map +1 -0
  283. package/dist/domain/script/v4/patch/types.d.ts +10 -0
  284. package/dist/domain/script/v4/patch/types.js +2 -0
  285. package/dist/domain/script/v4/patch/types.js.map +1 -0
  286. package/dist/domain/script/v4/selector.d.ts +11 -0
  287. package/dist/domain/script/v4/selector.js +124 -0
  288. package/dist/domain/script/v4/selector.js.map +1 -0
  289. package/dist/domain/script/v4/types.d.ts +120 -0
  290. package/dist/domain/script/v4/types.js +2 -0
  291. package/dist/domain/script/v4/types.js.map +1 -0
  292. package/dist/domain/script/v4/validation.d.ts +2 -0
  293. package/dist/domain/script/v4/validation.js +378 -0
  294. package/dist/domain/script/v4/validation.js.map +1 -0
  295. package/dist/infra/ingest/video-discovery.js +7 -4
  296. package/dist/infra/ingest/video-discovery.js.map +1 -1
  297. package/dist/infra/script-output-store.js +6 -11
  298. package/dist/infra/script-output-store.js.map +1 -1
  299. package/dist/infra/script-working-copy.js +15 -16
  300. package/dist/infra/script-working-copy.js.map +1 -1
  301. package/dist/llm/config.js +5 -4
  302. package/dist/llm/config.js.map +1 -1
  303. package/dist/llm/registry.d.ts +1 -0
  304. package/dist/llm/registry.js +3 -0
  305. package/dist/llm/registry.js.map +1 -1
  306. package/dist/llm/router.js +6 -8
  307. package/dist/llm/router.js.map +1 -1
  308. package/dist/llm/tasks/ingest/asset-audit.d.ts +6 -0
  309. package/dist/llm/tasks/ingest/asset-audit.js +164 -0
  310. package/dist/llm/tasks/ingest/asset-audit.js.map +1 -0
  311. package/dist/llm/tasks/ingest/asset-curate.d.ts +1 -1
  312. package/dist/llm/tasks/ingest/text-normalize.js +3 -3
  313. package/dist/llm/tasks/ingest/text-normalize.js.map +1 -1
  314. package/dist/llm/tasks/ingest/video-serial.js +3 -3
  315. package/dist/llm/tasks/ingest/video-serial.js.map +1 -1
  316. package/dist/llm/types.d.ts +1 -1
  317. package/dist/llm/types.js.map +1 -1
  318. package/dist/output.d.ts +2 -3
  319. package/dist/output.js +72 -109
  320. package/dist/output.js.map +1 -1
  321. package/dist/usecases/changelog.d.ts +2 -2
  322. package/dist/usecases/changelog.js +28 -36
  323. package/dist/usecases/changelog.js.map +1 -1
  324. package/dist/usecases/doctor.d.ts +2 -2
  325. package/dist/usecases/doctor.js +3 -5
  326. package/dist/usecases/doctor.js.map +1 -1
  327. package/dist/usecases/ingest/command.d.ts +2 -2
  328. package/dist/usecases/ingest/command.js +23 -6
  329. package/dist/usecases/ingest/command.js.map +1 -1
  330. package/dist/usecases/ingest/final-asset-audit.d.ts +39 -0
  331. package/dist/usecases/ingest/final-asset-audit.js +88 -0
  332. package/dist/usecases/ingest/final-asset-audit.js.map +1 -0
  333. package/dist/usecases/ingest/pass5-extract.js +5 -4
  334. package/dist/usecases/ingest/pass5-extract.js.map +1 -1
  335. package/dist/usecases/ingest/pass5-govern.js +13 -11
  336. package/dist/usecases/ingest/pass5-govern.js.map +1 -1
  337. package/dist/usecases/ingest/pipeline.js +77 -23
  338. package/dist/usecases/ingest/pipeline.js.map +1 -1
  339. package/dist/usecases/ingest/serial-govern.d.ts +2 -1
  340. package/dist/usecases/ingest/serial-govern.js +16 -8
  341. package/dist/usecases/ingest/serial-govern.js.map +1 -1
  342. package/dist/usecases/ingest/status.d.ts +2 -2
  343. package/dist/usecases/ingest/status.js +1 -1
  344. package/dist/usecases/ingest/status.js.map +1 -1
  345. package/dist/usecases/ingest/video-pipeline.js +121 -29
  346. package/dist/usecases/ingest/video-pipeline.js.map +1 -1
  347. package/dist/usecases/ingest/view-command.d.ts +2 -2
  348. package/dist/usecases/ingest/view-command.js +7 -6
  349. package/dist/usecases/ingest/view-command.js.map +1 -1
  350. package/dist/usecases/ingest/view-server.d.ts +2 -2
  351. package/dist/usecases/ingest/view-server.js +9 -7
  352. package/dist/usecases/ingest/view-server.js.map +1 -1
  353. package/dist/usecases/script/actions.d.ts +2 -2
  354. package/dist/usecases/script/actions.js +106 -11
  355. package/dist/usecases/script/actions.js.map +1 -1
  356. package/dist/usecases/script/actor.d.ts +2 -2
  357. package/dist/usecases/script/actor.js +3 -4
  358. package/dist/usecases/script/actor.js.map +1 -1
  359. package/dist/usecases/script/actors.d.ts +2 -2
  360. package/dist/usecases/script/actors.js +18 -9
  361. package/dist/usecases/script/actors.js.map +1 -1
  362. package/dist/usecases/script/add-actor.d.ts +2 -2
  363. package/dist/usecases/script/add-episode.d.ts +2 -2
  364. package/dist/usecases/script/add-location.d.ts +2 -2
  365. package/dist/usecases/script/add-prop.d.ts +2 -2
  366. package/dist/usecases/script/alias.d.ts +2 -2
  367. package/dist/usecases/script/alias.js +13 -14
  368. package/dist/usecases/script/alias.js.map +1 -1
  369. package/dist/usecases/script/assets.d.ts +2 -2
  370. package/dist/usecases/script/assets.js +29 -5
  371. package/dist/usecases/script/assets.js.map +1 -1
  372. package/dist/usecases/script/audit-assets.d.ts +4 -0
  373. package/dist/usecases/script/audit-assets.js +37 -0
  374. package/dist/usecases/script/audit-assets.js.map +1 -0
  375. package/dist/usecases/script/command-constraints.d.ts +36 -0
  376. package/dist/usecases/script/command-constraints.js +114 -0
  377. package/dist/usecases/script/command-constraints.js.map +1 -0
  378. package/dist/usecases/script/context.d.ts +2 -2
  379. package/dist/usecases/script/context.js +34 -8
  380. package/dist/usecases/script/context.js.map +1 -1
  381. package/dist/usecases/script/create.d.ts +2 -2
  382. package/dist/usecases/script/create.js +5 -6
  383. package/dist/usecases/script/create.js.map +1 -1
  384. package/dist/usecases/script/delete.d.ts +2 -2
  385. package/dist/usecases/script/delete.js +15 -15
  386. package/dist/usecases/script/delete.js.map +1 -1
  387. package/dist/usecases/script/describe.d.ts +2 -2
  388. package/dist/usecases/script/describe.js +13 -12
  389. package/dist/usecases/script/describe.js.map +1 -1
  390. package/dist/usecases/script/dialogue.d.ts +2 -2
  391. package/dist/usecases/script/dialogue.js +18 -9
  392. package/dist/usecases/script/dialogue.js.map +1 -1
  393. package/dist/usecases/script/dispatch.d.ts +3 -0
  394. package/dist/usecases/script/dispatch.js +10 -0
  395. package/dist/usecases/script/dispatch.js.map +1 -0
  396. package/dist/usecases/script/do.d.ts +2 -2
  397. package/dist/usecases/script/do.js +105 -45
  398. package/dist/usecases/script/do.js.map +1 -1
  399. package/dist/usecases/script/emotion.d.ts +2 -2
  400. package/dist/usecases/script/emotion.js +14 -3
  401. package/dist/usecases/script/emotion.js.map +1 -1
  402. package/dist/usecases/script/episodes.d.ts +2 -2
  403. package/dist/usecases/script/episodes.js +19 -8
  404. package/dist/usecases/script/episodes.js.map +1 -1
  405. package/dist/usecases/script/export-authoring.d.ts +2 -2
  406. package/dist/usecases/script/export-authoring.js +47 -26
  407. package/dist/usecases/script/export-authoring.js.map +1 -1
  408. package/dist/usecases/script/extend.d.ts +2 -2
  409. package/dist/usecases/script/extend.js +43 -31
  410. package/dist/usecases/script/extend.js.map +1 -1
  411. package/dist/usecases/script/ids.d.ts +2 -2
  412. package/dist/usecases/script/ids.js +68 -21
  413. package/dist/usecases/script/ids.js.map +1 -1
  414. package/dist/usecases/script/importance.d.ts +2 -2
  415. package/dist/usecases/script/importance.js +3 -4
  416. package/dist/usecases/script/importance.js.map +1 -1
  417. package/dist/usecases/script/insert.d.ts +2 -2
  418. package/dist/usecases/script/insert.js +80 -46
  419. package/dist/usecases/script/insert.js.map +1 -1
  420. package/dist/usecases/script/issues.d.ts +2 -2
  421. package/dist/usecases/script/issues.js +10 -2
  422. package/dist/usecases/script/issues.js.map +1 -1
  423. package/dist/usecases/script/lib.d.ts +62 -7
  424. package/dist/usecases/script/lib.js +782 -184
  425. package/dist/usecases/script/lib.js.map +1 -1
  426. package/dist/usecases/script/locations.d.ts +2 -2
  427. package/dist/usecases/script/locations.js +18 -9
  428. package/dist/usecases/script/locations.js.map +1 -1
  429. package/dist/usecases/script/merge.d.ts +2 -2
  430. package/dist/usecases/script/merge.js +17 -17
  431. package/dist/usecases/script/merge.js.map +1 -1
  432. package/dist/usecases/script/move.d.ts +2 -2
  433. package/dist/usecases/script/move.js +30 -13
  434. package/dist/usecases/script/move.js.map +1 -1
  435. package/dist/usecases/script/parenthetical.d.ts +3 -0
  436. package/dist/usecases/script/parenthetical.js +52 -0
  437. package/dist/usecases/script/parenthetical.js.map +1 -0
  438. package/dist/usecases/script/props.d.ts +2 -2
  439. package/dist/usecases/script/props.js +18 -9
  440. package/dist/usecases/script/props.js.map +1 -1
  441. package/dist/usecases/script/refs.d.ts +2 -2
  442. package/dist/usecases/script/refs.js +61 -11
  443. package/dist/usecases/script/refs.js.map +1 -1
  444. package/dist/usecases/script/rename.d.ts +2 -2
  445. package/dist/usecases/script/rename.js +13 -12
  446. package/dist/usecases/script/rename.js.map +1 -1
  447. package/dist/usecases/script/replace.d.ts +2 -2
  448. package/dist/usecases/script/replace.js +6 -8
  449. package/dist/usecases/script/replace.js.map +1 -1
  450. package/dist/usecases/script/role.d.ts +2 -2
  451. package/dist/usecases/script/role.js +3 -4
  452. package/dist/usecases/script/role.js.map +1 -1
  453. package/dist/usecases/script/scenes.d.ts +2 -2
  454. package/dist/usecases/script/scenes.js +35 -7
  455. package/dist/usecases/script/scenes.js.map +1 -1
  456. package/dist/usecases/script/script-patch.d.ts +2 -2
  457. package/dist/usecases/script/script-patch.js +219 -72
  458. package/dist/usecases/script/script-patch.js.map +1 -1
  459. package/dist/usecases/script/script-validate.d.ts +2 -2
  460. package/dist/usecases/script/script-validate.js +11 -7
  461. package/dist/usecases/script/script-validate.js.map +1 -1
  462. package/dist/usecases/script/session.d.ts +3 -0
  463. package/dist/usecases/script/session.js +74 -65
  464. package/dist/usecases/script/session.js.map +1 -1
  465. package/dist/usecases/script/split.d.ts +2 -2
  466. package/dist/usecases/script/split.js +18 -14
  467. package/dist/usecases/script/split.js.map +1 -1
  468. package/dist/usecases/script/state-add.d.ts +2 -2
  469. package/dist/usecases/script/state-add.js +3 -4
  470. package/dist/usecases/script/state-add.js.map +1 -1
  471. package/dist/usecases/script/state-delete.d.ts +2 -2
  472. package/dist/usecases/script/state-delete.js +3 -4
  473. package/dist/usecases/script/state-delete.js.map +1 -1
  474. package/dist/usecases/script/state-rename.d.ts +2 -2
  475. package/dist/usecases/script/state-rename.js +3 -4
  476. package/dist/usecases/script/state-rename.js.map +1 -1
  477. package/dist/usecases/script/states.d.ts +2 -2
  478. package/dist/usecases/script/states.js +91 -20
  479. package/dist/usecases/script/states.js.map +1 -1
  480. package/dist/usecases/script/summary.d.ts +2 -2
  481. package/dist/usecases/script/summary.js +21 -2
  482. package/dist/usecases/script/summary.js.map +1 -1
  483. package/dist/usecases/script/synopsis-generate.d.ts +2 -2
  484. package/dist/usecases/script/synopsis-generate.js +38 -39
  485. package/dist/usecases/script/synopsis-generate.js.map +1 -1
  486. package/dist/usecases/script/synopsis.d.ts +2 -2
  487. package/dist/usecases/script/synopsis.js +20 -16
  488. package/dist/usecases/script/synopsis.js.map +1 -1
  489. package/dist/usecases/script/transition.d.ts +2 -2
  490. package/dist/usecases/script/transition.js +3 -4
  491. package/dist/usecases/script/transition.js.map +1 -1
  492. package/dist/usecases/script/type.d.ts +2 -2
  493. package/dist/usecases/script/type.js +3 -4
  494. package/dist/usecases/script/type.js.map +1 -1
  495. package/dist/usecases/script/v3/mutations.d.ts +2 -0
  496. package/dist/usecases/script/v3/mutations.js +5 -0
  497. package/dist/usecases/script/v3/mutations.js.map +1 -0
  498. package/dist/usecases/script/v4/mutations.d.ts +2 -0
  499. package/dist/usecases/script/v4/mutations.js +6 -0
  500. package/dist/usecases/script/v4/mutations.js.map +1 -0
  501. package/dist/usecases/script/v4/queries.d.ts +15 -0
  502. package/dist/usecases/script/v4/queries.js +191 -0
  503. package/dist/usecases/script/v4/queries.js.map +1 -0
  504. package/dist/usecases/script/working-copy.d.ts +4 -4
  505. package/dist/usecases/script/working-copy.js +98 -94
  506. package/dist/usecases/script/working-copy.js.map +1 -1
  507. package/dist/usecases/script/worldview.d.ts +2 -2
  508. package/dist/usecases/script/worldview.js +3 -4
  509. package/dist/usecases/script/worldview.js.map +1 -1
  510. package/dist/usecases/script/write-authoring.d.ts +2 -2
  511. package/dist/usecases/script/write-authoring.js +125 -50
  512. package/dist/usecases/script/write-authoring.js.map +1 -1
  513. package/dist/usecases/update.d.ts +2 -2
  514. package/dist/usecases/update.js +32 -47
  515. package/dist/usecases/update.js.map +1 -1
  516. package/package.json +3 -2
  517. package/skills/scriptctl/SKILL.md +128 -282
  518. package/skills/scriptctl/references/atomic-edit-workflow.md +23 -38
  519. package/skills/scriptctl/references/bulk-authoring.md +35 -154
  520. package/skills/scriptctl/references/ingest-workflow.md +12 -11
  521. package/skills/scriptctl/references/production-writing-standard.md +38 -67
  522. package/skills/scriptctl/references/state-reference-repair.md +19 -42
  523. package/dist/help-text.d.ts +0 -2
  524. package/dist/help-text.js +0 -1112
  525. package/dist/help-text.js.map +0 -1
@@ -0,0 +1,33 @@
1
+ import { type Dict } from "../shared.js";
2
+ export declare function findAction(script: Dict, epId: string, sceneId: string, actionIndex: number): Dict;
3
+ export declare function findEpisode(script: Dict, epId: string): Dict;
4
+ export declare function findScene(script: Dict, epId: string, sceneId: string): Dict;
5
+ /**
6
+ * Minimal schema-v3 script skeleton: every required top-level field present,
7
+ * all collections empty. It is the starting point for building a script
8
+ * bottom-up with the atomic add/insert verbs instead of assembling it from
9
+ * source material (direct) or md (parse). `worldview`/`style`/`title` are
10
+ * present-but-empty so the field-presence checks pass; they get filled in
11
+ * later via `worldview` / `patch`. A blank script validates clean: NO_EPISODES
12
+ * is a completeness warning (`incomplete_ok`), not a blocker. v3 has no speaker
13
+ * roster (dialogue speakers are inline on each action).
14
+ */
15
+ export declare function blankScript(title?: string): Dict;
16
+ export declare function resolveAsset(items: Dict[], idKey: string, nameKey: string, raw: string): Dict | null;
17
+ export declare const ASSET_KEY_MAP: Record<string, [string, string, string]>;
18
+ export declare function assetKeys(assetType: string): [string, string, string];
19
+ export declare function resolvePatchAsset(script: Dict, op: Dict, assetType?: string | null): [Dict, string, string];
20
+ export declare function nextStateId(script: Dict): string;
21
+ export declare function normalizeStates(script: Dict, rawStates: unknown, assetKind?: string): Dict[];
22
+ export declare function ensureRefId(script: Dict, assetType: string, rawId: unknown, opts?: {
23
+ allowNone?: boolean;
24
+ }): string | null;
25
+ export declare function idKeyForKind(kind: string): string;
26
+ export declare function pluralForKind(kind: string): string;
27
+ export declare const ASSET_ID_PREFIX: Record<string, string>;
28
+ export declare function nextSeqId(existingIds: Iterable<unknown>, prefix: string): string;
29
+ export declare function nextSceneId(script: Dict): string;
30
+ export declare function nextAssetId(script: Dict, kind: string): string;
31
+ export declare function nextEpisodeId(script: Dict): string;
32
+ export declare function sceneIdExists(script: Dict, sceneId: string): boolean;
33
+ export declare function pushAsset(script: Dict, kind: string, op: Dict): Dict;
@@ -0,0 +1,316 @@
1
+ import { CliError, EXIT_USAGE, fmtId, } from "../../../common.js";
2
+ import { cleanName, stateLabelError } from "../text-util.js";
3
+ import { asList, isDict, isList, opErr, strOf } from "../shared.js";
4
+ export function findAction(script, epId, sceneId, actionIndex) {
5
+ for (const ep of asList(script["episodes"])) {
6
+ if (ep["episode_id"] !== epId)
7
+ continue;
8
+ for (const scene of asList(ep["scenes"])) {
9
+ if (scene["scene_id"] === sceneId) {
10
+ const actions = asList(scene["actions"]);
11
+ if (actionIndex >= 0 && actionIndex < actions.length)
12
+ return actions[actionIndex];
13
+ }
14
+ }
15
+ }
16
+ throw new CliError("Action not found.", {
17
+ exitCode: EXIT_USAGE,
18
+ errorCode: "PATCH_BLOCKED_ACTION_NOT_FOUND",
19
+ hint: "Inspect episodes and fix the patch.",
20
+ data: { expected: ["existing episode_id, scene_id, action_index"], actual: [`${epId} ${sceneId} ${actionIndex}`] },
21
+ });
22
+ }
23
+ export function findEpisode(script, epId) {
24
+ for (const ep of asList(script["episodes"])) {
25
+ if (ep["episode_id"] === epId)
26
+ return ep;
27
+ }
28
+ throw new CliError("Episode not found.", {
29
+ exitCode: EXIT_USAGE,
30
+ errorCode: "PATCH_BLOCKED_EPISODE_NOT_FOUND",
31
+ hint: "Inspect episodes and fix the patch.",
32
+ data: { expected: ["existing episode_id"], actual: [epId] },
33
+ });
34
+ }
35
+ export function findScene(script, epId, sceneId) {
36
+ const ep = findEpisode(script, epId);
37
+ for (const scene of asList(ep["scenes"])) {
38
+ if (scene["scene_id"] === sceneId)
39
+ return scene;
40
+ }
41
+ throw new CliError("Scene not found.", {
42
+ exitCode: EXIT_USAGE,
43
+ errorCode: "PATCH_BLOCKED_SCENE_NOT_FOUND",
44
+ hint: "Inspect episodes and fix the patch.",
45
+ data: { expected: ["existing episode_id and scene_id"], actual: [`${epId} ${sceneId}`] },
46
+ });
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // blank scaffold
50
+ // ---------------------------------------------------------------------------
51
+ /**
52
+ * Minimal schema-v3 script skeleton: every required top-level field present,
53
+ * all collections empty. It is the starting point for building a script
54
+ * bottom-up with the atomic add/insert verbs instead of assembling it from
55
+ * source material (direct) or md (parse). `worldview`/`style`/`title` are
56
+ * present-but-empty so the field-presence checks pass; they get filled in
57
+ * later via `worldview` / `patch`. A blank script validates clean: NO_EPISODES
58
+ * is a completeness warning (`incomplete_ok`), not a blocker. v3 has no speaker
59
+ * roster (dialogue speakers are inline on each action).
60
+ */
61
+ export function blankScript(title = "") {
62
+ return {
63
+ version: 3,
64
+ title: title,
65
+ worldview: "",
66
+ style: "",
67
+ actors: [],
68
+ locations: [],
69
+ props: [],
70
+ episodes: [],
71
+ };
72
+ }
73
+ // Completeness vs. integrity. A script can be structurally sound but unfinished
74
+ // (no episodes yet, an empty episode/scene, a scene without a location, an asset
75
+ // without a description). Those gaps are emitted as `severity: "warning"` with
76
+ // `incomplete_ok: true` directly at their source below — they never block, so an
77
+ // unfinished-but-sound script is editable AND publishable. Only integrity
78
+ // violations (dangling refs, duplicate ids, invalid enums, missing ids/names —
79
+ // things that would corrupt the normalized DB graph) are `severity: "error"`.
80
+ // One SCHEMA_ENTITY_FIELD_MISSING issue for a missing asset field. A missing
81
+ // description is a completeness gap (warning); a missing id/name is an identity
82
+ export function resolveAsset(items, idKey, nameKey, raw) {
83
+ for (const item of items) {
84
+ if (raw === item[idKey] || raw === item[nameKey])
85
+ return item;
86
+ }
87
+ return null;
88
+ }
89
+ export const ASSET_KEY_MAP = {
90
+ actor: ["actors", "actor_id", "actor_name"],
91
+ location: ["locations", "location_id", "location_name"],
92
+ prop: ["props", "prop_id", "prop_name"],
93
+ };
94
+ export function assetKeys(assetType) {
95
+ const entry = ASSET_KEY_MAP[assetType];
96
+ if (!entry) {
97
+ throw new CliError("Asset type invalid.", {
98
+ exitCode: EXIT_USAGE,
99
+ errorCode: "PATCH_BLOCKED_ASSET_TYPE_INVALID",
100
+ hint: "Fix the patch operation and rerun patch.",
101
+ data: { expected: ["asset_type: actor, location, or prop"], actual: [`asset_type: ${assetType}`] },
102
+ });
103
+ }
104
+ return entry;
105
+ }
106
+ export function resolvePatchAsset(script, op, assetType = null) {
107
+ const kind = strOf(assetType || op["asset_type"]);
108
+ const [key, idKey, nameKey] = assetKeys(kind);
109
+ const raw = op[idKey] ?? op["id"] ?? op["name"] ?? op[nameKey];
110
+ const asset = resolveAsset(asList(script[key]), idKey, nameKey, strOf(raw));
111
+ if (!asset) {
112
+ throw new CliError("Asset not found.", {
113
+ exitCode: EXIT_USAGE,
114
+ errorCode: "PATCH_BLOCKED_ASSET_NOT_FOUND",
115
+ hint: "Inspect assets and fix the patch.",
116
+ data: { expected: [`existing ${idKey} or ${nameKey}`], actual: [JSON.stringify(op)] },
117
+ });
118
+ }
119
+ return [asset, idKey, nameKey];
120
+ }
121
+ export function nextStateId(script) {
122
+ const ids = [];
123
+ for (const key of ["actors", "locations", "props"]) {
124
+ for (const asset of asList(script[key])) {
125
+ for (const state of asList(asset["states"]))
126
+ ids.push(state["state_id"]);
127
+ }
128
+ }
129
+ return nextSeqId(ids, "st");
130
+ }
131
+ export function normalizeStates(script, rawStates, assetKind = "") {
132
+ if (!isList(rawStates)) {
133
+ throw new CliError("States invalid.", {
134
+ exitCode: EXIT_USAGE,
135
+ errorCode: "PATCH_BLOCKED_STATES_INVALID",
136
+ hint: "Fix the patch operation and rerun patch.",
137
+ data: { expected: ["states: array of state names or {state_id,state_name} objects"], actual: [typeof rawStates] },
138
+ });
139
+ }
140
+ let maxSeen = 0;
141
+ for (const key of ["actors", "locations", "props"]) {
142
+ for (const asset of asList(script[key])) {
143
+ for (const state of asList(asset["states"])) {
144
+ const m = /^st_(\d+)$/.exec(strOf(state["state_id"]));
145
+ if (m)
146
+ maxSeen = Math.max(maxSeen, parseInt(m[1], 10));
147
+ }
148
+ }
149
+ }
150
+ const states = [];
151
+ const seenNames = new Set();
152
+ for (const raw of rawStates) {
153
+ let name = "";
154
+ let sid = "";
155
+ if (typeof raw === "string") {
156
+ name = raw.trim();
157
+ maxSeen += 1;
158
+ sid = fmtId("st", maxSeen);
159
+ }
160
+ else if (isDict(raw)) {
161
+ name = strOf(raw["state_name"] || raw["name"]).trim();
162
+ sid = strOf(raw["state_id"] || raw["id"]).trim();
163
+ if (!sid) {
164
+ maxSeen += 1;
165
+ sid = fmtId("st", maxSeen);
166
+ }
167
+ }
168
+ else
169
+ continue;
170
+ if (!name || seenNames.has(name))
171
+ continue;
172
+ if (assetKind === "actor") {
173
+ const reason = stateLabelError(name);
174
+ if (reason) {
175
+ throw new CliError("State label invalid.", {
176
+ exitCode: EXIT_USAGE,
177
+ errorCode: "STATE_LABEL_INVALID",
178
+ hint: "Do not combine multiple states into one label.",
179
+ data: { expected: ["one clear state label"], actual: [name] },
180
+ });
181
+ }
182
+ }
183
+ seenNames.add(name);
184
+ states.push({ state_id: sid, state_name: name, description: "" });
185
+ }
186
+ return states;
187
+ }
188
+ export function ensureRefId(script, assetType, rawId, opts = {}) {
189
+ const allowNone = opts.allowNone ?? false;
190
+ if (rawId === null && allowNone)
191
+ return null;
192
+ const value = strOf(rawId).trim();
193
+ if (!value && allowNone)
194
+ return null;
195
+ const [key, idKey] = assetKeys(assetType);
196
+ const valid = new Set();
197
+ for (const item of asList(script[key]))
198
+ valid.add(strOf(item[idKey]));
199
+ if (!valid.has(value)) {
200
+ throw new CliError("Reference target not found.", {
201
+ exitCode: EXIT_USAGE,
202
+ errorCode: "PATCH_BLOCKED_REFERENCE_TARGET_NOT_FOUND",
203
+ hint: "Inspect assets and fix the patch.",
204
+ data: { expected: [`existing ${idKey}`], actual: [`${idKey}: ${value || "<empty>"}`] },
205
+ });
206
+ }
207
+ return value;
208
+ }
209
+ export function idKeyForKind(kind) {
210
+ const map = { actor: "actor_id", location: "location_id", prop: "prop_id" };
211
+ return map[kind];
212
+ }
213
+ export function pluralForKind(kind) {
214
+ const map = { actor: "actors", location: "locations", prop: "props" };
215
+ return map[kind];
216
+ }
217
+ // Asset id prefixes. props use `prp_` (not `prop_`); mirrors direct-init output.
218
+ export const ASSET_ID_PREFIX = { actor: "act", location: "loc", prop: "prp" };
219
+ // Next free `<prefix>_NNN` id given the existing ids in a collection. Scans for
220
+ // the max NNN so a manually-chosen id (e.g. act_007) never collides with a later
221
+ // auto-id. The single id-allocation routine behind nextScene/Asset/Episode/State.
222
+ export function nextSeqId(existingIds, prefix) {
223
+ const re = new RegExp(`^${prefix}_(\\d+)$`);
224
+ let maxSeen = 0;
225
+ for (const raw of existingIds) {
226
+ const m = re.exec(strOf(raw));
227
+ if (m)
228
+ maxSeen = Math.max(maxSeen, parseInt(m[1], 10));
229
+ }
230
+ return fmtId(prefix, maxSeen + 1);
231
+ }
232
+ export function nextSceneId(script) {
233
+ const ids = asList(script["episodes"]).flatMap((ep) => asList(ep["scenes"]).map((s) => s["scene_id"]));
234
+ return nextSeqId(ids, "scn");
235
+ }
236
+ export function nextAssetId(script, kind) {
237
+ const [key, idKey] = assetKeys(kind);
238
+ return nextSeqId(asList(script[key]).map((item) => item[idKey]), ASSET_ID_PREFIX[kind]);
239
+ }
240
+ export function nextEpisodeId(script) {
241
+ return nextSeqId(asList(script["episodes"]).map((ep) => ep["episode_id"]), "ep");
242
+ }
243
+ export function sceneIdExists(script, sceneId) {
244
+ for (const ep of asList(script["episodes"])) {
245
+ for (const scene of asList(ep["scenes"])) {
246
+ if (scene["scene_id"] === sceneId)
247
+ return true;
248
+ }
249
+ }
250
+ return false;
251
+ }
252
+ // Shared body for actor.add / location.add / prop.add: validate the name,
253
+ // allocate or accept an id, reject duplicates, and append a minimal entity
254
+ // ({id, name, description, states:[]}). The caller layers on kind-specific
255
+ // fields (actor role_type/aliases). Returns the pushed entity so the caller can
256
+ // extend it. description defaults to "" — an empty description is a completeness
257
+ // warning, not a hard error, so you can register an asset now and describe it
258
+ // later.
259
+ export function pushAsset(script, kind, op) {
260
+ const [collKey, idKey, nameKey] = assetKeys(kind);
261
+ const name = strOf(op["name"] ?? op[nameKey]).trim();
262
+ if (!name) {
263
+ throw opErr("SCRIPT OP BLOCKED: Asset name empty", "Asset name empty.", {
264
+ required: ["name"], received: [JSON.stringify(op)],
265
+ nextSteps: [`Provide a ${kind} name.`], op: `${kind}.add`, errorCode: "ASSET_NAME_EMPTY",
266
+ });
267
+ }
268
+ // name is already whitespace-trimmed; cleanName additionally strips trailing/
269
+ // leading punctuation (:,、…) and embedded 【】() state annotations. Reuse the
270
+ // same errorCode validateScript uses for this rule (ASSET_NAME_HAS_STATE_ANNOTATION)
271
+ // so op-time and validate-time speak one vocabulary; the message stays accurate
272
+ // for the punctuation-only case too. Suggest the canonical form when there is one
273
+ // (a name that is entirely punctuation/annotation reduces to "").
274
+ const canonical = cleanName(name);
275
+ if (canonical !== name) {
276
+ const suggestion = canonical
277
+ ? `Use "${canonical}", and register durable looks with state-add instead of putting them in the name.`
278
+ : "Provide a real name (this one is only punctuation/annotation); register durable looks with state-add.";
279
+ throw opErr("SCRIPT OP BLOCKED: Asset name not canonical", "Asset name is not canonical (trailing/leading punctuation or an embedded state annotation).", {
280
+ required: [canonical ? `canonical name, e.g. "${canonical}"` : "a canonical name without punctuation/annotation"],
281
+ received: [name],
282
+ nextSteps: [suggestion], op: `${kind}.add`, errorCode: "ASSET_NAME_HAS_STATE_ANNOTATION",
283
+ });
284
+ }
285
+ const id = strOf(op[idKey] ?? op["id"]).trim() || nextAssetId(script, kind);
286
+ if (!isList(script[collKey]))
287
+ script[collKey] = [];
288
+ const coll = script[collKey];
289
+ if (coll.some((a) => strOf(a[idKey]) === id)) {
290
+ throw opErr("SCRIPT OP BLOCKED: Asset id exists", "Asset id exists.", {
291
+ required: ["unused id"], received: [id],
292
+ nextSteps: ["Use another --id or omit it to auto-allocate."], op: `${kind}.add`, errorCode: "ASSET_ID_EXISTS",
293
+ });
294
+ }
295
+ // v3 requires an importance tier and exactly one 'default' state per asset;
296
+ // seed both so a freshly-added asset validates clean. importance defaults to
297
+ // featured (a manually-registered asset is presumed a real character/place/
298
+ // prop); pass importance: background for a 龙套/背景.
299
+ const rawImp = strOf(op["importance"]).trim();
300
+ if (rawImp && rawImp !== "featured" && rawImp !== "background") {
301
+ throw opErr("SCRIPT OP BLOCKED: Importance invalid", "Importance invalid.", {
302
+ required: ["importance: featured or background"], received: [rawImp],
303
+ nextSteps: ["Use featured (主角/配角) or background (龙套/背景)."], op: `${kind}.add`, errorCode: "IMPORTANCE_INVALID",
304
+ });
305
+ }
306
+ const entity = {
307
+ [idKey]: id,
308
+ [nameKey]: name,
309
+ importance: rawImp || "featured",
310
+ description: strOf(op["description"]).trim(),
311
+ states: [{ state_id: "default", state_name: "default", description: "" }],
312
+ };
313
+ coll.push(entity);
314
+ return entity;
315
+ }
316
+ //# sourceMappingURL=lookups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookups.js","sourceRoot":"","sources":["../../../../src/domain/script/v3/lookups.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACI,UAAU,EAEH,KAAK,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAoB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGtF,MAAM,UAAU,UAAU,CAAC,MAAY,EAAE,IAAY,EAAE,OAAe,EAAE,WAAmB;IACzF,KAAK,MAAM,EAAE,IAAI,MAAM,CAAO,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAClD,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,IAAI;YAAE,SAAS;QACxC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC/C,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,OAAO,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,MAAM,CAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC/C,IAAI,WAAW,IAAI,CAAC,IAAI,WAAW,GAAG,OAAO,CAAC,MAAM;oBAAE,OAAO,OAAO,CAAC,WAAW,CAAE,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE;QAChC,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,gCAAgC;QAC3C,IAAI,EAAE,qCAAqC;QAC3C,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,6CAA6C,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC,EAAE;KACnH,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAY,EAAE,IAAY;IACpD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAO,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAClD,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;IAC3C,CAAC;IACD,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE;QACjC,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,iCAAiC;QAC5C,IAAI,EAAE,qCAAqC;QAC3C,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;KAC5D,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAY,EAAE,IAAY,EAAE,OAAe;IACnE,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC/C,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;IAClD,CAAC;IACD,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE;QAC/B,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,+BAA+B;QAC1C,IAAI,EAAE,qCAAqC;QAC3C,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,kCAAkC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,EAAE;KACzF,CAAC,CAAC;AACX,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,KAAK,GAAG,EAAE;IACpC,OAAO;QACL,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,iFAAiF;AACjF,+EAA+E;AAC/E,iFAAiF;AACjF,0EAA0E;AAC1E,+EAA+E;AAC/E,8EAA8E;AAE9E,6EAA6E;AAC7E,gFAAgF;AAEhF,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,KAAa,EAAE,OAAe,EAAE,GAAW;IACrF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;IAChE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAA6C;IACrE,KAAK,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC;IAC3C,QAAQ,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,eAAe,CAAC;IACvD,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC;CACxC,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE;YAClC,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,kCAAkC;YAC7C,IAAI,EAAE,0CAA0C;YAChD,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,sCAAsC,CAAC,EAAE,MAAM,EAAE,CAAC,eAAe,SAAS,EAAE,CAAC,EAAE;SACnG,CAAC,CAAC;IACX,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAY,EAAE,EAAQ,EAAE,YAA2B,IAAI;IACvF,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAClF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE;YAC/B,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,+BAA+B;YAC1C,IAAI,EAAE,mCAAmC;YACzC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,YAAY,KAAK,OAAO,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE;SACtF,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAY;IACtC,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAO,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAY,EAAE,SAAkB,EAAE,YAAoB,EAAE;IACtF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE;YAC9B,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,8BAA8B;YACzC,IAAI,EAAE,0CAA0C;YAChD,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,+DAA+D,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,SAAS,CAAC,EAAE;SAClH,CAAC,CAAC;IACX,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAClD,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACtD,IAAI,CAAC;oBAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAW,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,CAAC;YACb,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtD,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC,CAAC;gBACb,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;;YAAM,SAAS;QAChB,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC3C,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE;oBACnC,QAAQ,EAAE,UAAU;oBACpB,SAAS,EAAE,qBAAqB;oBAChC,IAAI,EAAE,gDAAgD;oBACtD,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;iBAC9D,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAY,EAAE,SAAiB,EAAE,KAAc,EAAE,OAAgC,EAAE;IAC7G,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC1C,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,KAAK,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,QAAQ,CAAC,6BAA6B,EAAE;YAC1C,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,0CAA0C;YACrD,IAAI,EAAE,mCAAmC;YACzC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,YAAY,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,KAAK,KAAK,IAAI,SAAS,EAAE,CAAC,EAAE;SACvF,CAAC,CAAC;IACX,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,GAAG,GAA2B,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACpG,OAAO,GAAG,CAAC,IAAI,CAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAA2B,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC9F,OAAO,GAAG,CAAC,IAAI,CAAE,CAAC;AACpB,CAAC;AAGD,iFAAiF;AACjF,MAAM,CAAC,MAAM,eAAe,GAA2B,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAEtG,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,MAAM,UAAU,SAAS,CAAC,WAA8B,EAAE,MAAc;IACtE,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,MAAM,UAAU,CAAC,CAAC;IAC5C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC;YAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAY;IACtC,MAAM,GAAG,GAAG,MAAM,CAAO,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACnH,OAAO,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAY,EAAE,IAAY;IACpD,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,SAAS,CAAC,MAAM,CAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,IAAI,CAAE,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAY;IACxC,OAAO,SAAS,CAAC,MAAM,CAAO,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAY,EAAE,OAAe;IACzD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAO,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC/C,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0EAA0E;AAC1E,2EAA2E;AAC3E,2EAA2E;AAC3E,gFAAgF;AAChF,iFAAiF;AACjF,8EAA8E;AAC9E,SAAS;AACT,MAAM,UAAU,SAAS,CAAC,MAAY,EAAE,IAAY,EAAE,EAAQ;IAC5D,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,KAAK,CAAC,qCAAqC,EAAE,mBAAmB,EAAE;YACtE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAClD,SAAS,EAAE,CAAC,aAAa,IAAI,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE,SAAS,EAAE,kBAAkB;SACzF,CAAC,CAAC;IACL,CAAC;IACD,8EAA8E;IAC9E,4EAA4E;IAC5E,qFAAqF;IACrF,gFAAgF;IAChF,kFAAkF;IAClF,kEAAkE;IAClE,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,SAAS;YAC1B,CAAC,CAAC,QAAQ,SAAS,mFAAmF;YACtG,CAAC,CAAC,uGAAuG,CAAC;QAC5G,MAAM,KAAK,CAAC,6CAA6C,EAAE,6FAA6F,EAAE;YACxJ,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAyB,SAAS,GAAG,CAAC,CAAC,CAAC,iDAAiD,CAAC;YACjH,QAAQ,EAAE,CAAC,IAAI,CAAC;YAChB,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE,SAAS,EAAE,iCAAiC;SACzF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAE,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAW,CAAC;IACvC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,KAAK,CAAC,oCAAoC,EAAE,kBAAkB,EAAE;YACpE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACvC,SAAS,EAAE,CAAC,+CAA+C,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE,SAAS,EAAE,iBAAiB;SAC9G,CAAC,CAAC;IACL,CAAC;IACD,4EAA4E;IAC5E,6EAA6E;IAC7E,4EAA4E;IAC5E,kDAAkD;IAClD,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,MAAM,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC/D,MAAM,KAAK,CAAC,uCAAuC,EAAE,qBAAqB,EAAE;YAC1E,QAAQ,EAAE,CAAC,oCAAoC,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC;YACpE,SAAS,EAAE,CAAC,6CAA6C,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE,SAAS,EAAE,oBAAoB;SAC/G,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAS;QACnB,CAAC,KAAK,CAAC,EAAE,EAAE;QACX,CAAC,OAAO,CAAC,EAAE,IAAI;QACf,UAAU,EAAE,MAAM,IAAI,UAAU;QAChC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE;QAC5C,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;KAC1E,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type Dict } from "../shared.js";
2
+ import { type InSelector } from "./selector.js";
3
+ import type { ScriptV3 } from "../types.js";
4
+ type V3QueryScript = ScriptV3 | Dict;
5
+ export declare function resolveV3Ordinal(script: V3QueryScript, raw: string): string;
6
+ export declare function normalizeV3QuerySelector(script: V3QueryScript, rawValue: unknown): string;
7
+ export declare function parseV3QuerySelector(script: V3QueryScript, rawValue: unknown): InSelector;
8
+ export {};
@@ -0,0 +1,91 @@
1
+ import { CliError, EXIT_USAGE } from "../../../common.js";
2
+ import { asList, strOf } from "../shared.js";
3
+ import { parseInSelector } from "./selector.js";
4
+ function invalid(raw, message) {
5
+ throw new CliError(message, {
6
+ exitCode: EXIT_USAGE,
7
+ errorCode: "ORDINAL_ANCHOR_INVALID",
8
+ data: { actual: [raw], expected: [
9
+ "@ep:N | @ep:N/scn:N | @ep:N/scn:N/ac:N | @scn:N | @scn:N/ac:N | @ac:N",
10
+ ] },
11
+ });
12
+ }
13
+ function position(raw, anchor) {
14
+ if (!/^[1-9]\d*$/.test(raw))
15
+ invalid(anchor, "Ordinal positions are 1-based positive integers.");
16
+ return Number(raw) - 1;
17
+ }
18
+ export function resolveV3Ordinal(script, raw) {
19
+ const episodes = asList(script["episodes"]);
20
+ let match = /^@ep:(\d+)$/.exec(raw);
21
+ if (match) {
22
+ const episode = episodes[position(match[1], raw)];
23
+ if (!episode)
24
+ invalid(raw, "Episode ordinal is outside the current script.");
25
+ return strOf(episode["episode_id"]);
26
+ }
27
+ match = /^@ep:(\d+)\/scn:(\d+)$/.exec(raw);
28
+ if (match) {
29
+ const episode = episodes[position(match[1], raw)];
30
+ const scene = asList(episode?.["scenes"])[position(match[2], raw)];
31
+ if (!episode || !scene)
32
+ invalid(raw, "Episode-local scene ordinal is outside the current script.");
33
+ return `${strOf(episode["episode_id"])}/${strOf(scene["scene_id"])}`;
34
+ }
35
+ match = /^@ep:(\d+)\/scn:(\d+)\/ac:(\d+)$/.exec(raw);
36
+ if (match) {
37
+ const episode = episodes[position(match[1], raw)];
38
+ const scene = asList(episode?.["scenes"])[position(match[2], raw)];
39
+ const actionIndex = position(match[3], raw);
40
+ if (!episode || !scene || !asList(scene["actions"])[actionIndex])
41
+ invalid(raw, "Episode-local action ordinal is outside the current script.");
42
+ return `${strOf(episode["episode_id"])}/${strOf(scene["scene_id"])}#${actionIndex}`;
43
+ }
44
+ const scenes = episodes.flatMap((episode) => asList(episode["scenes"]).map((scene) => ({ episode, scene })));
45
+ match = /^@scn:(\d+)$/.exec(raw);
46
+ if (match) {
47
+ const row = scenes[position(match[1], raw)];
48
+ if (!row)
49
+ invalid(raw, "Global scene ordinal is outside the current script.");
50
+ return `${strOf(row.episode["episode_id"])}/${strOf(row.scene["scene_id"])}`;
51
+ }
52
+ match = /^@scn:(\d+)\/ac:(\d+)$/.exec(raw);
53
+ if (match) {
54
+ const row = scenes[position(match[1], raw)];
55
+ const actionIndex = position(match[2], raw);
56
+ if (!row || !asList(row.scene["actions"])[actionIndex])
57
+ invalid(raw, "Scene-local action ordinal is outside the current script.");
58
+ return `${strOf(row.episode["episode_id"])}/${strOf(row.scene["scene_id"])}#${actionIndex}`;
59
+ }
60
+ match = /^@ac:(\d+)$/.exec(raw);
61
+ if (match) {
62
+ const actions = scenes.flatMap((row) => asList(row.scene["actions"]).map((_, actionIndex) => ({ ...row, actionIndex })));
63
+ const row = actions[position(match[1], raw)];
64
+ if (!row)
65
+ invalid(raw, "Global action ordinal is outside the current script.");
66
+ return `${strOf(row.episode["episode_id"])}/${strOf(row.scene["scene_id"])}#${row.actionIndex}`;
67
+ }
68
+ return invalid(raw, "Ordinal anchor syntax is not supported.");
69
+ }
70
+ export function normalizeV3QuerySelector(script, rawValue) {
71
+ const raw = typeof rawValue === "string" ? rawValue.trim() : "";
72
+ if (!raw || raw === "*")
73
+ return raw;
74
+ return raw.split(",").map((segmentValue) => {
75
+ const segment = segmentValue.trim();
76
+ const parts = segment.split("..");
77
+ if (parts.length > 2) {
78
+ if (segment.includes("@"))
79
+ invalid(segment, "Selector region has too many range delimiters.");
80
+ return segment;
81
+ }
82
+ return parts.map((part) => {
83
+ const endpoint = part.trim();
84
+ return endpoint.startsWith("@") ? resolveV3Ordinal(script, endpoint) : endpoint;
85
+ }).join("..");
86
+ }).join(",");
87
+ }
88
+ export function parseV3QuerySelector(script, rawValue) {
89
+ return parseInSelector(normalizeV3QuerySelector(script, rawValue));
90
+ }
91
+ //# sourceMappingURL=ordinal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ordinal.js","sourceRoot":"","sources":["../../../../src/domain/script/v3/ordinal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type ScriptV3 } from "./types.js";
2
+ export declare function isScriptV3(value: unknown): value is ScriptV3;
3
+ export declare function requireScriptV3(value: unknown): ScriptV3;
@@ -0,0 +1,164 @@
1
+ import { CliError, EXIT_INPUT } from "../../../common.js";
2
+ import { ACTION_TYPE_SET, IMPORTANCE_TIER_SET, NON_ACTOR_SPEAKER_KIND_SET, } from "./types.js";
3
+ function isRecord(value) {
4
+ return value !== null && typeof value === "object" && !Array.isArray(value);
5
+ }
6
+ function optionalString(record, key) {
7
+ return record[key] === undefined || typeof record[key] === "string";
8
+ }
9
+ function isJsonValue(value) {
10
+ if (value === null
11
+ || typeof value === "string"
12
+ || typeof value === "number"
13
+ || typeof value === "boolean")
14
+ return true;
15
+ if (Array.isArray(value))
16
+ return value.every(isJsonValue);
17
+ return isRecord(value) && Object.values(value).every(isJsonValue);
18
+ }
19
+ function hasValidExtension(record) {
20
+ return record.extend === undefined
21
+ || (isRecord(record.extend) && Object.values(record.extend).every(isJsonValue));
22
+ }
23
+ function isState(value) {
24
+ return isRecord(value)
25
+ && typeof value.state_id === "string"
26
+ && typeof value.state_name === "string"
27
+ && typeof value.description === "string"
28
+ && hasValidExtension(value);
29
+ }
30
+ function isActor(value) {
31
+ return isRecord(value)
32
+ && typeof value.actor_id === "string"
33
+ && typeof value.actor_name === "string"
34
+ && typeof value.description === "string"
35
+ && typeof value.importance === "string"
36
+ && IMPORTANCE_TIER_SET.has(value.importance)
37
+ && (value.aliases === undefined || (Array.isArray(value.aliases) && value.aliases.every((item) => typeof item === "string")))
38
+ && (value.role_type === undefined || value.role_type === "主角" || value.role_type === "配角")
39
+ && Array.isArray(value.states)
40
+ && value.states.every(isState)
41
+ && hasValidExtension(value);
42
+ }
43
+ function isLocation(value) {
44
+ return isRecord(value)
45
+ && typeof value.location_id === "string"
46
+ && typeof value.location_name === "string"
47
+ && typeof value.description === "string"
48
+ && typeof value.importance === "string"
49
+ && IMPORTANCE_TIER_SET.has(value.importance)
50
+ && (value.aliases === undefined || (Array.isArray(value.aliases) && value.aliases.every((item) => typeof item === "string")))
51
+ && Array.isArray(value.states)
52
+ && value.states.every(isState)
53
+ && hasValidExtension(value);
54
+ }
55
+ function isProp(value) {
56
+ return isRecord(value)
57
+ && typeof value.prop_id === "string"
58
+ && typeof value.prop_name === "string"
59
+ && typeof value.description === "string"
60
+ && typeof value.importance === "string"
61
+ && IMPORTANCE_TIER_SET.has(value.importance)
62
+ && (value.aliases === undefined || (Array.isArray(value.aliases) && value.aliases.every((item) => typeof item === "string")))
63
+ && Array.isArray(value.states)
64
+ && value.states.every(isState)
65
+ && hasValidExtension(value);
66
+ }
67
+ function isAction(value) {
68
+ if (!isRecord(value)
69
+ || typeof value.type !== "string"
70
+ || !ACTION_TYPE_SET.has(value.type)
71
+ || typeof value.content !== "string"
72
+ || !optionalString(value, "emotion"))
73
+ return false;
74
+ if (value.speaker !== undefined) {
75
+ if (!isRecord(value.speaker))
76
+ return false;
77
+ if (typeof value.speaker.actor_id === "string") {
78
+ if (!optionalString(value.speaker, "state_id"))
79
+ return false;
80
+ }
81
+ else if (typeof value.speaker.kind === "string") {
82
+ if (!NON_ACTOR_SPEAKER_KIND_SET.has(value.speaker.kind) || !optionalString(value.speaker, "label"))
83
+ return false;
84
+ }
85
+ else {
86
+ return false;
87
+ }
88
+ }
89
+ if (value.transition_prompt !== undefined) {
90
+ if (!isRecord(value.transition_prompt)
91
+ || typeof value.transition_prompt.target !== "string"
92
+ || typeof value.transition_prompt.process !== "string"
93
+ || typeof value.transition_prompt.contrast !== "string")
94
+ return false;
95
+ }
96
+ return hasValidExtension(value);
97
+ }
98
+ function isScene(value) {
99
+ if (!isRecord(value)
100
+ || typeof value.scene_id !== "string"
101
+ || !Array.isArray(value.actors)
102
+ || !Array.isArray(value.props)
103
+ || !Array.isArray(value.actions)
104
+ || !value.actions.every(isAction))
105
+ return false;
106
+ if (!value.actors.every((ref) => isRecord(ref) && typeof ref.actor_id === "string" && optionalString(ref, "state_id")))
107
+ return false;
108
+ if (!value.props.every((ref) => isRecord(ref) && typeof ref.prop_id === "string" && optionalString(ref, "state_id")))
109
+ return false;
110
+ if (value.location !== null
111
+ && (!isRecord(value.location)
112
+ || typeof value.location.location_id !== "string"
113
+ || !optionalString(value.location, "state_id")))
114
+ return false;
115
+ if (value.environment !== undefined
116
+ && (!isRecord(value.environment)
117
+ || !optionalString(value.environment, "space")
118
+ || !optionalString(value.environment, "time")))
119
+ return false;
120
+ return hasValidExtension(value);
121
+ }
122
+ function isEpisode(value) {
123
+ return isRecord(value)
124
+ && typeof value.episode_id === "string"
125
+ && optionalString(value, "title")
126
+ && optionalString(value, "synopsis")
127
+ && Array.isArray(value.scenes)
128
+ && value.scenes.every(isScene)
129
+ && hasValidExtension(value);
130
+ }
131
+ export function isScriptV3(value) {
132
+ return isRecord(value)
133
+ && value.version === 3
134
+ && typeof value.title === "string"
135
+ && typeof value.worldview === "string"
136
+ && typeof value.style === "string"
137
+ && optionalString(value, "worldview_raw")
138
+ && optionalString(value, "synopsis")
139
+ && optionalString(value, "logline")
140
+ && optionalString(value, "theme")
141
+ && (value.main_characters === undefined
142
+ || (Array.isArray(value.main_characters)
143
+ && value.main_characters.every((item) => isRecord(item) && typeof item.name === "string" && typeof item.role === "string")))
144
+ && Array.isArray(value.actors)
145
+ && value.actors.every(isActor)
146
+ && Array.isArray(value.locations)
147
+ && value.locations.every(isLocation)
148
+ && Array.isArray(value.props)
149
+ && value.props.every(isProp)
150
+ && Array.isArray(value.episodes)
151
+ && value.episodes.every(isEpisode)
152
+ && hasValidExtension(value);
153
+ }
154
+ export function requireScriptV3(value) {
155
+ if (isScriptV3(value))
156
+ return value;
157
+ throw new CliError("The local file is not a structurally readable Script v3 document.", {
158
+ exitCode: EXIT_INPUT,
159
+ errorCode: "SCRIPT_V3_SHAPE_INVALID",
160
+ hint: "Repair the local Script v3 structure, then rerun authoring.",
161
+ data: { expected: ["Script v3 with typed assets, episodes, scenes, and actions"], actual: [Array.isArray(value) ? "array" : typeof value] },
162
+ });
163
+ }
164
+ //# sourceMappingURL=parse.js.map