@lingjingai/scriptctl 0.19.2 → 0.21.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 (210) hide show
  1. package/dist/cli.js +99 -11
  2. package/dist/cli.js.map +1 -1
  3. package/dist/common.d.ts +4 -1
  4. package/dist/common.js +37 -27
  5. package/dist/common.js.map +1 -1
  6. package/dist/domain/direct-core.d.ts +6 -3
  7. package/dist/domain/direct-core.js +89 -72
  8. package/dist/domain/direct-core.js.map +1 -1
  9. package/dist/domain/script/address.d.ts +30 -0
  10. package/dist/domain/script/address.js +141 -0
  11. package/dist/domain/script/address.js.map +1 -0
  12. package/dist/domain/script/lookups.d.ts +33 -0
  13. package/dist/domain/script/lookups.js +309 -0
  14. package/dist/domain/script/lookups.js.map +1 -0
  15. package/dist/domain/script/patch/apply.d.ts +4 -0
  16. package/dist/domain/script/patch/apply.js +38 -0
  17. package/dist/domain/script/patch/apply.js.map +1 -0
  18. package/dist/domain/script/patch/helpers.d.ts +11 -0
  19. package/dist/domain/script/patch/helpers.js +141 -0
  20. package/dist/domain/script/patch/helpers.js.map +1 -0
  21. package/dist/domain/script/patch/ops-action.d.ts +12 -0
  22. package/dist/domain/script/patch/ops-action.js +371 -0
  23. package/dist/domain/script/patch/ops-action.js.map +1 -0
  24. package/dist/domain/script/patch/ops-asset.d.ts +13 -0
  25. package/dist/domain/script/patch/ops-asset.js +363 -0
  26. package/dist/domain/script/patch/ops-asset.js.map +1 -0
  27. package/dist/domain/script/patch/ops-dialogue.d.ts +5 -0
  28. package/dist/domain/script/patch/ops-dialogue.js +233 -0
  29. package/dist/domain/script/patch/ops-dialogue.js.map +1 -0
  30. package/dist/domain/script/patch/ops-meta.d.ts +3 -0
  31. package/dist/domain/script/patch/ops-meta.js +47 -0
  32. package/dist/domain/script/patch/ops-meta.js.map +1 -0
  33. package/dist/domain/script/patch/ops-scene.d.ts +6 -0
  34. package/dist/domain/script/patch/ops-scene.js +345 -0
  35. package/dist/domain/script/patch/ops-scene.js.map +1 -0
  36. package/dist/domain/script/patch/ops-state.d.ts +8 -0
  37. package/dist/domain/script/patch/ops-state.js +146 -0
  38. package/dist/domain/script/patch/ops-state.js.map +1 -0
  39. package/dist/domain/script/patch/registry.d.ts +2 -0
  40. package/dist/domain/script/patch/registry.js +50 -0
  41. package/dist/domain/script/patch/registry.js.map +1 -0
  42. package/dist/domain/script/patch/types.d.ts +10 -0
  43. package/dist/domain/script/patch/types.js +2 -0
  44. package/dist/domain/script/patch/types.js.map +1 -0
  45. package/dist/domain/script/refs.d.ts +4 -0
  46. package/dist/domain/script/refs.js +152 -0
  47. package/dist/domain/script/refs.js.map +1 -0
  48. package/dist/domain/script/schema.d.ts +6 -0
  49. package/dist/domain/script/schema.js +53 -0
  50. package/dist/domain/script/schema.js.map +1 -0
  51. package/dist/domain/script/selector.d.ts +45 -0
  52. package/dist/domain/script/selector.js +187 -0
  53. package/dist/domain/script/selector.js.map +1 -0
  54. package/dist/domain/script/shared.d.ts +15 -0
  55. package/dist/domain/script/shared.js +37 -0
  56. package/dist/domain/script/shared.js.map +1 -0
  57. package/dist/domain/script/validate.d.ts +22 -0
  58. package/dist/domain/script/validate.js +844 -0
  59. package/dist/domain/script/validate.js.map +1 -0
  60. package/dist/help-text.js +21 -4
  61. package/dist/help-text.js.map +1 -1
  62. package/dist/infra/providers.d.ts +2 -0
  63. package/dist/infra/providers.js +81 -35
  64. package/dist/infra/providers.js.map +1 -1
  65. package/dist/output.d.ts +1 -1
  66. package/dist/output.js +11 -1
  67. package/dist/output.js.map +1 -1
  68. package/dist/usecases/direct.js +1 -1
  69. package/dist/usecases/direct.js.map +1 -1
  70. package/dist/usecases/parse.js +1 -1
  71. package/dist/usecases/parse.js.map +1 -1
  72. package/dist/usecases/script/actions.d.ts +3 -0
  73. package/dist/usecases/script/actions.js +71 -0
  74. package/dist/usecases/script/actions.js.map +1 -0
  75. package/dist/usecases/script/actor.d.ts +3 -0
  76. package/dist/usecases/script/actor.js +27 -0
  77. package/dist/usecases/script/actor.js.map +1 -0
  78. package/dist/usecases/script/actors.d.ts +3 -0
  79. package/dist/usecases/script/actors.js +15 -0
  80. package/dist/usecases/script/actors.js.map +1 -0
  81. package/dist/usecases/script/add-actor.d.ts +3 -0
  82. package/dist/usecases/script/add-actor.js +13 -0
  83. package/dist/usecases/script/add-actor.js.map +1 -0
  84. package/dist/usecases/script/add-episode.d.ts +3 -0
  85. package/dist/usecases/script/add-episode.js +9 -0
  86. package/dist/usecases/script/add-episode.js.map +1 -0
  87. package/dist/usecases/script/add-location.d.ts +3 -0
  88. package/dist/usecases/script/add-location.js +11 -0
  89. package/dist/usecases/script/add-location.js.map +1 -0
  90. package/dist/usecases/script/add-prop.d.ts +3 -0
  91. package/dist/usecases/script/add-prop.js +11 -0
  92. package/dist/usecases/script/add-prop.js.map +1 -0
  93. package/dist/usecases/script/add-speaker.d.ts +3 -0
  94. package/dist/usecases/script/add-speaker.js +22 -0
  95. package/dist/usecases/script/add-speaker.js.map +1 -0
  96. package/dist/usecases/script/alias.d.ts +3 -0
  97. package/dist/usecases/script/alias.js +40 -0
  98. package/dist/usecases/script/alias.js.map +1 -0
  99. package/dist/usecases/script/assets.d.ts +3 -0
  100. package/dist/usecases/script/assets.js +21 -0
  101. package/dist/usecases/script/assets.js.map +1 -0
  102. package/dist/usecases/script/context.d.ts +3 -0
  103. package/dist/usecases/script/context.js +20 -0
  104. package/dist/usecases/script/context.js.map +1 -0
  105. package/dist/usecases/script/create.d.ts +3 -0
  106. package/dist/usecases/script/create.js +81 -0
  107. package/dist/usecases/script/create.js.map +1 -0
  108. package/dist/usecases/script/delete.d.ts +3 -0
  109. package/dist/usecases/script/delete.js +79 -0
  110. package/dist/usecases/script/delete.js.map +1 -0
  111. package/dist/usecases/script/describe.d.ts +3 -0
  112. package/dist/usecases/script/describe.js +31 -0
  113. package/dist/usecases/script/describe.js.map +1 -0
  114. package/dist/usecases/script/dialogue.d.ts +3 -0
  115. package/dist/usecases/script/dialogue.js +28 -0
  116. package/dist/usecases/script/dialogue.js.map +1 -0
  117. package/dist/usecases/script/do.d.ts +3 -0
  118. package/dist/usecases/script/do.js +130 -0
  119. package/dist/usecases/script/do.js.map +1 -0
  120. package/dist/usecases/script/episodes.d.ts +3 -0
  121. package/dist/usecases/script/episodes.js +36 -0
  122. package/dist/usecases/script/episodes.js.map +1 -0
  123. package/dist/usecases/script/export.d.ts +3 -0
  124. package/dist/usecases/script/export.js +117 -0
  125. package/dist/usecases/script/export.js.map +1 -0
  126. package/dist/usecases/script/insert.d.ts +3 -0
  127. package/dist/usecases/script/insert.js +87 -0
  128. package/dist/usecases/script/insert.js.map +1 -0
  129. package/dist/usecases/script/issues.d.ts +3 -0
  130. package/dist/usecases/script/issues.js +27 -0
  131. package/dist/usecases/script/issues.js.map +1 -0
  132. package/dist/usecases/script/lib.d.ts +77 -0
  133. package/dist/usecases/script/lib.js +849 -0
  134. package/dist/usecases/script/lib.js.map +1 -0
  135. package/dist/usecases/script/locations.d.ts +3 -0
  136. package/dist/usecases/script/locations.js +15 -0
  137. package/dist/usecases/script/locations.js.map +1 -0
  138. package/dist/usecases/script/merge.d.ts +3 -0
  139. package/dist/usecases/script/merge.js +43 -0
  140. package/dist/usecases/script/merge.js.map +1 -0
  141. package/dist/usecases/script/move.d.ts +3 -0
  142. package/dist/usecases/script/move.js +33 -0
  143. package/dist/usecases/script/move.js.map +1 -0
  144. package/dist/usecases/script/overlap.d.ts +3 -0
  145. package/dist/usecases/script/overlap.js +21 -0
  146. package/dist/usecases/script/overlap.js.map +1 -0
  147. package/dist/usecases/script/props.d.ts +3 -0
  148. package/dist/usecases/script/props.js +15 -0
  149. package/dist/usecases/script/props.js.map +1 -0
  150. package/dist/usecases/script/refs.d.ts +3 -0
  151. package/dist/usecases/script/refs.js +61 -0
  152. package/dist/usecases/script/refs.js.map +1 -0
  153. package/dist/usecases/script/rename.d.ts +3 -0
  154. package/dist/usecases/script/rename.js +17 -0
  155. package/dist/usecases/script/rename.js.map +1 -0
  156. package/dist/usecases/script/replace.d.ts +3 -0
  157. package/dist/usecases/script/replace.js +35 -0
  158. package/dist/usecases/script/replace.js.map +1 -0
  159. package/dist/usecases/script/role.d.ts +3 -0
  160. package/dist/usecases/script/role.js +17 -0
  161. package/dist/usecases/script/role.js.map +1 -0
  162. package/dist/usecases/script/scenes.d.ts +3 -0
  163. package/dist/usecases/script/scenes.js +45 -0
  164. package/dist/usecases/script/scenes.js.map +1 -0
  165. package/dist/usecases/script/script-patch.d.ts +3 -0
  166. package/dist/usecases/script/script-patch.js +187 -0
  167. package/dist/usecases/script/script-patch.js.map +1 -0
  168. package/dist/usecases/script/script-validate.d.ts +3 -0
  169. package/dist/usecases/script/script-validate.js +30 -0
  170. package/dist/usecases/script/script-validate.js.map +1 -0
  171. package/dist/usecases/script/session.d.ts +44 -0
  172. package/dist/usecases/script/session.js +527 -0
  173. package/dist/usecases/script/session.js.map +1 -0
  174. package/dist/usecases/script/speakers.d.ts +3 -0
  175. package/dist/usecases/script/speakers.js +28 -0
  176. package/dist/usecases/script/speakers.js.map +1 -0
  177. package/dist/usecases/script/split.d.ts +3 -0
  178. package/dist/usecases/script/split.js +37 -0
  179. package/dist/usecases/script/split.js.map +1 -0
  180. package/dist/usecases/script/state-add.d.ts +3 -0
  181. package/dist/usecases/script/state-add.js +23 -0
  182. package/dist/usecases/script/state-add.js.map +1 -0
  183. package/dist/usecases/script/state-change.d.ts +3 -0
  184. package/dist/usecases/script/state-change.js +24 -0
  185. package/dist/usecases/script/state-change.js.map +1 -0
  186. package/dist/usecases/script/state-delete.d.ts +3 -0
  187. package/dist/usecases/script/state-delete.js +23 -0
  188. package/dist/usecases/script/state-delete.js.map +1 -0
  189. package/dist/usecases/script/state-rename.d.ts +3 -0
  190. package/dist/usecases/script/state-rename.js +17 -0
  191. package/dist/usecases/script/state-rename.js.map +1 -0
  192. package/dist/usecases/script/summary.d.ts +3 -0
  193. package/dist/usecases/script/summary.js +45 -0
  194. package/dist/usecases/script/summary.js.map +1 -0
  195. package/dist/usecases/script/transition.d.ts +3 -0
  196. package/dist/usecases/script/transition.js +24 -0
  197. package/dist/usecases/script/transition.js.map +1 -0
  198. package/dist/usecases/script/type.d.ts +3 -0
  199. package/dist/usecases/script/type.js +24 -0
  200. package/dist/usecases/script/type.js.map +1 -0
  201. package/dist/usecases/script/worldview.d.ts +3 -0
  202. package/dist/usecases/script/worldview.js +18 -0
  203. package/dist/usecases/script/worldview.js.map +1 -0
  204. package/package.json +1 -1
  205. package/dist/domain/script-core.d.ts +0 -78
  206. package/dist/domain/script-core.js +0 -3026
  207. package/dist/domain/script-core.js.map +0 -1
  208. package/dist/usecases/script.d.ts +0 -67
  209. package/dist/usecases/script.js +0 -2348
  210. package/dist/usecases/script.js.map +0 -1
@@ -0,0 +1,36 @@
1
+ import { EXIT_OK, } from "../../common.js";
2
+ import { parseInSelector, } from "../../domain/script/selector.js";
3
+ import { asList, strOf, } from "../../domain/script/shared.js";
4
+ import { loadScriptForEdit, parseBound, episodeCharCounts, } from "./session.js";
5
+ import { buildReport, synopsisPreview, episodeInSelector, } from "./lib.js";
6
+ export async function commandEpisodes(opts) {
7
+ const session = await loadScriptForEdit(opts);
8
+ const script = session.script;
9
+ const itemId = strOf(opts["id"]).trim();
10
+ const selector = parseInSelector(strOf(opts["in"]));
11
+ const minChars = parseBound(opts["min_chars"]);
12
+ const maxChars = parseBound(opts["max_chars"]);
13
+ const lines = [];
14
+ for (const ep of asList(script["episodes"])) {
15
+ const epId = strOf(ep["episode_id"]);
16
+ if (itemId && itemId !== epId)
17
+ continue;
18
+ const scenes = asList(ep["scenes"]);
19
+ if (!episodeInSelector(selector, epId, scenes))
20
+ continue;
21
+ let actionCount = 0;
22
+ const chars = episodeCharCounts(scenes);
23
+ for (const scene of scenes)
24
+ actionCount += asList(scene["actions"]).length;
25
+ if (minChars !== null && chars.total < minChars)
26
+ continue;
27
+ if (maxChars !== null && chars.total > maxChars)
28
+ continue;
29
+ const epSynopsis = strOf(ep["synopsis"]).trim();
30
+ const synopsisField = epSynopsis ? `, synopsis=${synopsisPreview(epSynopsis, 60)}` : "";
31
+ lines.push(`${ep["episode_id"]}: scenes=${scenes.length}, actions=${actionCount}, chars=${chars.total} (dialogue=${chars.dialogue}, action=${chars.action}), title=${ep["title"] || "-"}${synopsisField}`);
32
+ }
33
+ return [buildReport("query.episodes", "EPISODES", lines, session.artifactLabel, ["Use `scriptctl scenes --in <ep>` to drill in, or edit verbs to mutate."]), EXIT_OK];
34
+ }
35
+ // ----- scenes ---------------------------------------------------------------
36
+ //# sourceMappingURL=episodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episodes.js","sourceRoot":"","sources":["../../../src/usecases/script/episodes.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,OAAO,GAWR,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAIL,eAAe,GAGhB,MAAM,iCAAiC,CAAC;AAwBzC,OAAO,EACL,MAAM,EAIN,KAAK,GACN,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,iBAAiB,EAC6B,UAAU,EAAE,iBAAiB,GAC5E,MAAM,cAAc,CAAC;AACtB,OAAO,EACwS,WAAW,EAAE,eAAe,EAAE,iBAAiB,GAC7V,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU;IAC9C,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAO,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI;YAAE,SAAS;QACxC,MAAM,MAAM,GAAG,MAAM,CAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC;YAAE,SAAS;QACzD,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3E,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,GAAG,QAAQ;YAAE,SAAS;QAC1D,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,GAAG,QAAQ;YAAE,SAAS;QAC1D,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,KAAK,CAAC,IAAI,CACR,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,MAAM,CAAC,MAAM,aAAa,WAAW,WAAW,KAAK,CAAC,KAAK,cAAc,KAAK,CAAC,QAAQ,YAAY,KAAK,CAAC,MAAM,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,aAAa,EAAE,CAC/L,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,EAC5E,CAAC,wEAAwE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1F,CAAC;AAED,+EAA+E"}
@@ -0,0 +1,3 @@
1
+ import { type Report } from "../../common.js";
2
+ import { type Dict } from "../../domain/script/shared.js";
3
+ export declare function commandExport(opts: Dict): Promise<[Report, number]>;
@@ -0,0 +1,117 @@
1
+ import * as path from "node:path";
2
+ import { CliError, EXIT_INPUT, EXIT_NEEDS_AGENT, EXIT_OK, EXIT_USAGE, directDir, exists, readJson, sha256Text, } from "../../common.js";
3
+ import { validateScript } from "../../domain/script/validate.js";
4
+ import { ScriptOutputApiError, } from "../../infra/script-output-store.js";
5
+ import { readRunState, summarizeIssues, updateRunState, } from "../direct.js";
6
+ import { sortDeep } from "../../domain/direct-core.js";
7
+ import { asList, isDict, strOf, } from "../../domain/script/shared.js";
8
+ import { ScriptEditSession, scriptOutputClient, apiErrorToCli, currentRevisionOrZero, syncValidationResult, } from "./session.js";
9
+ export async function commandExport(opts) {
10
+ const workspace = strOf(opts["workspace_path"] || "workspace");
11
+ const force = Boolean(opts["force"]);
12
+ const scriptPath = path.join(directDir(workspace), "script.initial.json");
13
+ if (!exists(scriptPath)) {
14
+ throw new CliError("EXPORT BLOCKED: script.initial.json not found", "script.initial.json not found.", {
15
+ exitCode: EXIT_INPUT,
16
+ required: ["workspace/draft/scriptctl/direct/script.initial.json"],
17
+ received: [scriptPath],
18
+ nextSteps: ["Run scriptctl direct init first."],
19
+ });
20
+ }
21
+ const state = readRunState(workspace);
22
+ const provider = strOf(state["provider"]);
23
+ if (provider === "mock" && process.env.SCRIPTCTL_ALLOW_MOCK_EXPORT !== "1") {
24
+ const report = {
25
+ title: "EXPORT BLOCKED: Mock provider result",
26
+ result: ["script.initial.json was produced by --provider mock and was not exported."],
27
+ artifacts: [path.join(directDir(workspace), "run_state.json")],
28
+ next: ["Rerun init with --provider anthropic for deliverable conversion."],
29
+ };
30
+ return [report, EXIT_NEEDS_AGENT];
31
+ }
32
+ const validation = validateScript(workspace, scriptPath);
33
+ const blockingOrError = Boolean(validation["has_blocking"]) ||
34
+ asList(validation["issues"]).some((it) => isDict(it) && (it["severity"] === "blocking" || it["severity"] === "error"));
35
+ if (!validation["passed"] && (!force || blockingOrError)) {
36
+ const title = force
37
+ ? "EXPORT BLOCKED: Validation errors require repair"
38
+ : "EXPORT BLOCKED: Validation needs agent repair";
39
+ const report = {
40
+ title,
41
+ result: ["script.initial.json was not exported."],
42
+ artifacts: [path.join(directDir(workspace), "validation.json")],
43
+ issues: summarizeIssues(asList(validation["issues"])),
44
+ next: ["Inspect issues and apply structured patches, then validate/export."],
45
+ };
46
+ return [report, EXIT_NEEDS_AGENT];
47
+ }
48
+ let script;
49
+ try {
50
+ script = readJson(scriptPath);
51
+ }
52
+ catch (exc) {
53
+ throw new CliError("EXPORT BLOCKED: script.initial.json invalid", "script.initial.json invalid.", {
54
+ exitCode: EXIT_INPUT,
55
+ required: ["valid script.initial.json"],
56
+ received: [`${scriptPath}: ${exc.message}`],
57
+ nextSteps: ["Fix script.initial.json or rerun direct init."],
58
+ errorCode: "SCRIPT_JSON_INVALID",
59
+ });
60
+ }
61
+ if (!isDict(script)) {
62
+ throw new CliError("EXPORT BLOCKED: script root invalid", "script root invalid.", {
63
+ exitCode: EXIT_USAGE,
64
+ required: ["script root object"],
65
+ received: [Array.isArray(script) ? "array" : typeof script],
66
+ nextSteps: ["Use a valid script document object."],
67
+ errorCode: "SCRIPT_ROOT_INVALID",
68
+ });
69
+ }
70
+ const client = scriptOutputClient(opts);
71
+ const baseRevision = await currentRevisionOrZero(client);
72
+ // Sorted-keys serialization mirrors Python json.dumps(sort_keys=True, separators=(",",":"))
73
+ const sortedScript = sortDeep(script);
74
+ const scriptHash = sha256Text(JSON.stringify(sortedScript));
75
+ const requestId = strOf(opts["request_id"]).trim() || `scriptctl-direct-export:${scriptHash}`;
76
+ let replaceRes;
77
+ try {
78
+ replaceRes = await client.replaceScript({
79
+ requestId,
80
+ baseRevision,
81
+ script,
82
+ source: "ctl",
83
+ });
84
+ }
85
+ catch (exc) {
86
+ if (exc instanceof ScriptOutputApiError) {
87
+ throw apiErrorToCli("SCRIPT API BLOCKED: Export write failed", exc);
88
+ }
89
+ throw exc;
90
+ }
91
+ const revision = Number(replaceRes["revision"] ?? 0);
92
+ const remoteSession = new ScriptEditSession({
93
+ workspace,
94
+ script,
95
+ client,
96
+ projectGroupNo: client.projectGroupNo,
97
+ revision,
98
+ });
99
+ await syncValidationResult(remoteSession, validation, revision);
100
+ const outputLabel = remoteSession.artifactLabel;
101
+ updateRunState(workspace, { status: "exported", output_path: outputLabel });
102
+ const report = {
103
+ title: "EXPORT COMPLETE: Final script stored in DB",
104
+ result: [
105
+ `validation: ${validation["passed"] ? "passed" : "forced"}`,
106
+ `base_revision: ${baseRevision}`,
107
+ `revision: ${revision}`,
108
+ `idempotent: ${String(Boolean(replaceRes["idempotent"])).toLowerCase()}`,
109
+ ],
110
+ artifacts: [outputLabel, path.join(directDir(workspace), "validation.json")],
111
+ next: ["Proceed to downstream asset or footage stages."],
112
+ };
113
+ return [report, EXIT_OK];
114
+ }
115
+ // sortDeep is the canonical helper in domain/direct-core; re-exported here for
116
+ // back-compat with existing importers of `usecases/script`.
117
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/usecases/script/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Report } from "../../common.js";
2
+ import { type Dict } from "../../domain/script/shared.js";
3
+ export declare function commandInsert(opts: Dict): Promise<[Report, number]>;
@@ -0,0 +1,87 @@
1
+ import { CliError, EXIT_USAGE, } from "../../common.js";
2
+ import { parseAnyAddress, } from "../../domain/script/address.js";
3
+ import { asList, } from "../../domain/script/shared.js";
4
+ import { applySingleScriptOp, } from "./lib.js";
5
+ export async function commandInsert(opts) {
6
+ const args = asList(opts["_args"]);
7
+ if (args.length < 1) {
8
+ throw new CliError("VERB BLOCKED: Insert address missing", "Insert address missing.", {
9
+ exitCode: EXIT_USAGE,
10
+ required: ["<addr>: ep_NNN/scn_NNN (action insert) or ep_NNN (scene insert)"],
11
+ received: ["<empty>"],
12
+ nextSteps: ["Example: scriptctl insert ep_001/scn_001 --type action --content \"...\""],
13
+ errorCode: "ADDRESS_MISSING",
14
+ });
15
+ }
16
+ const addr = parseAnyAddress(args[0]);
17
+ // Per-kind flag whitelist. Silently dropping mismatched flags hid two
18
+ // real bugs:
19
+ // - scene insert was ignoring --scene-id (the user lost custom IDs).
20
+ // - mixing action + scene insert flags (`--type` with episode addr, or
21
+ // `--location` with scene addr) ran the wrong dispatch silently.
22
+ const flagsUsed = {
23
+ type: opts["type"] !== undefined,
24
+ content: opts["content"] !== undefined,
25
+ actor: (opts["actor_id"] ?? opts["actor"]) !== undefined,
26
+ speaker: (opts["speaker_id"] ?? opts["speaker"]) !== undefined,
27
+ location: opts["location"] !== undefined,
28
+ time: opts["time"] !== undefined,
29
+ space: opts["space"] !== undefined,
30
+ "scene-id": opts["scene_id"] !== undefined,
31
+ };
32
+ function rejectFlags(kind, allowed) {
33
+ const allow = new Set(allowed);
34
+ const bad = [];
35
+ for (const f of Object.keys(flagsUsed)) {
36
+ if (flagsUsed[f] && !allow.has(f))
37
+ bad.push(`--${f}`);
38
+ }
39
+ if (bad.length > 0) {
40
+ throw new CliError("VERB BLOCKED: flag not applicable", `${bad.join(", ")} cannot be used with ${kind} insert.`, {
41
+ exitCode: EXIT_USAGE,
42
+ required: [`for ${kind} insert: ${allowed.map((f) => `--${f}`).join(" / ")}`],
43
+ received: bad,
44
+ nextSteps: ["Drop the unsupported flag(s) and retry."],
45
+ errorCode: "INSERT_FLAG_INVALID",
46
+ });
47
+ }
48
+ }
49
+ if (addr.kind === "scene") {
50
+ rejectFlags("action", ["type", "content", "actor", "speaker"]);
51
+ return applySingleScriptOp(opts, {
52
+ op: "action.insert",
53
+ at: args[0],
54
+ type: opts["type"],
55
+ content: opts["content"],
56
+ at_index: opts["at_index"] ?? opts["at"],
57
+ before: opts["before"],
58
+ after: opts["after"],
59
+ actor_id: opts["actor_id"] ?? opts["actor"],
60
+ speaker_id: opts["speaker_id"] ?? opts["speaker"],
61
+ });
62
+ }
63
+ if (addr.kind === "episode") {
64
+ rejectFlags("scene", ["location", "time", "space", "scene-id"]);
65
+ return applySingleScriptOp(opts, {
66
+ op: "scene.insert",
67
+ at: addr.episodeId,
68
+ location: opts["location"],
69
+ time: opts["time"],
70
+ space: opts["space"],
71
+ // Forward --scene-id (was previously silently dropped — scene.insert op
72
+ // reads `scene_id` to honor user-supplied ids for round-trip stability).
73
+ scene_id: opts["scene_id"],
74
+ at_index: opts["at_index"] ?? opts["at"],
75
+ before: opts["before"],
76
+ after: opts["after"],
77
+ });
78
+ }
79
+ throw new CliError("VERB BLOCKED: insert cannot operate on this address", "insert cannot operate on this address.", {
80
+ exitCode: EXIT_USAGE,
81
+ required: ["ep_NNN (scene insert) or ep_NNN/scn_NNN (action insert)"],
82
+ received: [args[0]],
83
+ nextSteps: ["Use an episode or scene address."],
84
+ errorCode: "ADDRESS_UNSUPPORTED",
85
+ });
86
+ }
87
+ //# sourceMappingURL=insert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert.js","sourceRoot":"","sources":["../../../src/usecases/script/insert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Report } from "../../common.js";
2
+ import { type Dict } from "../../domain/script/shared.js";
3
+ export declare function commandIssues(opts: Dict): Promise<[Report, number]>;
@@ -0,0 +1,27 @@
1
+ import { EXIT_OK, } from "../../common.js";
2
+ import { asList, strOf, } from "../../domain/script/shared.js";
3
+ import { loadScriptForEdit, validateSession, } from "./session.js";
4
+ import { buildReport, } from "./lib.js";
5
+ export async function commandIssues(opts) {
6
+ const session = await loadScriptForEdit(opts);
7
+ const severityFilter = strOf(opts["severity"]).trim();
8
+ const codeFilter = strOf(opts["code"]).trim();
9
+ const validation = validateSession(session);
10
+ const lines = [];
11
+ for (const issue of asList(validation["issues"])) {
12
+ if (severityFilter && severityFilter !== strOf(issue["severity"]))
13
+ continue;
14
+ if (codeFilter && codeFilter !== strOf(issue["code"]))
15
+ continue;
16
+ const whereParts = [];
17
+ for (const k of ["episode", "scene", "action_index"]) {
18
+ if (issue[k] !== null && issue[k] !== undefined)
19
+ whereParts.push(strOf(issue[k]));
20
+ }
21
+ const where = whereParts.join(" ");
22
+ lines.push(`${issue["severity"]} ${issue["code"]}: ${issue["summary"]}${where ? ` [${where}]` : ""}`);
23
+ }
24
+ return [buildReport("query.issues", "ISSUES", lines, session.artifactLabel, ["Use the relevant edit verb to repair each issue."]), EXIT_OK];
25
+ }
26
+ // ----- refs (unified reverse lookup) ----------------------------------------
27
+ //# sourceMappingURL=issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../../src/usecases/script/issues.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,OAAO,GAWR,MAAM,iBAAiB,CAAC;AAmCzB,OAAO,EACL,MAAM,EAIN,KAAK,GACN,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,iBAAiB,EAAE,eAAe,GAEnC,MAAM,cAAc,CAAC;AACtB,OAAO,EACwS,WAAW,GACzT,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU;IAC5C,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACvD,IAAI,cAAc,IAAI,cAAc,KAAK,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAAE,SAAS;QAC5E,IAAI,UAAU,IAAI,UAAU,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAAE,SAAS;QAChE,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;YACrD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;gBAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,EACxE,CAAC,kDAAkD,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,+EAA+E"}
@@ -0,0 +1,77 @@
1
+ import { CliError, type Report } from "../../common.js";
2
+ import { type InSelector } from "../../domain/script/selector.js";
3
+ import { sortDeep } from "../../domain/direct-core.js";
4
+ import { type Dict } from "../../domain/script/shared.js";
5
+ import { ScriptEditSession } from "./session.js";
6
+ export interface DoToken {
7
+ text: string;
8
+ quoted: boolean;
9
+ }
10
+ export declare function tokenizeLine(line: string): DoToken[];
11
+ export declare const DO_BOOL_FLAGS: Record<string, Set<string>>;
12
+ export declare const DO_REPEAT_FLAGS: Record<string, Set<string>>;
13
+ export interface ParsedDoLine {
14
+ verb: string;
15
+ args: string[];
16
+ flags: Dict;
17
+ }
18
+ export declare function parseDoLine(tokens: DoToken[]): ParsedDoLine;
19
+ export declare function doErr(detail: string): CliError;
20
+ export declare function stateChangeTemplate(target: string, f: {
21
+ to?: unknown;
22
+ from?: unknown;
23
+ effective?: unknown;
24
+ clear?: boolean;
25
+ }): Dict;
26
+ export declare function transitionTemplate(target: string, f: {
27
+ process?: unknown;
28
+ contrast?: unknown;
29
+ clear?: boolean;
30
+ }): Dict;
31
+ export declare function contextTemplate(target: string, f: {
32
+ state?: unknown;
33
+ clear?: boolean;
34
+ remove?: boolean;
35
+ }): Dict;
36
+ export declare function dialogueTemplate(speakers: string[], f: {
37
+ delivery?: unknown;
38
+ }): Dict;
39
+ export declare function lineToOp(verb: string, args: string[], flags: Dict): Dict;
40
+ export declare function actionAddress(epId: string, sceneId: string, idx: number): string;
41
+ export declare function formatInspectAction(epId: string, sceneId: string, idx: number, action: Dict): string;
42
+ export declare const SKIPPABLE_EDIT_CODES: Set<string>;
43
+ export declare function applySingleScriptOp(opts: Dict, op: Dict): Promise<[Report, number]>;
44
+ export declare function summarizeScriptOp(_script: Dict, op: Dict): string;
45
+ export declare function regexPattern(raw: string): string;
46
+ export declare function applySelectorEdits(opts: Dict, template: Dict, verbLabel: string): Promise<[Report, number]>;
47
+ export { sortDeep };
48
+ export declare function speakerSourceActorMap(script: Dict): Map<string, string>;
49
+ export declare function speakerIdsInAction(action: Dict): Set<string>;
50
+ export declare function actorIdsInAction(action: Dict, speakerToActor: Map<string, string>): Set<string>;
51
+ export declare function buildGrepMatcher(raw: string): ((hay: string) => boolean) | null;
52
+ export declare function buildReport(op: string, title: string, lines: string[], artifactLabel: string, next: string[]): Report;
53
+ export declare function synopsisPreview(text: string, limit: number): string;
54
+ export declare function episodeInSelector(selector: InSelector, epId: string, scenes: Dict[]): boolean;
55
+ export declare function nameMaps(script: Dict): {
56
+ actor: Map<string, string>;
57
+ location: Map<string, string>;
58
+ prop: Map<string, string>;
59
+ };
60
+ export declare function formatScene(epId: string, scene: Dict, names: ReturnType<typeof nameMaps>): string;
61
+ export interface ActionTarget {
62
+ epId: string;
63
+ sceneId: string;
64
+ idx: number;
65
+ action: Dict;
66
+ }
67
+ export declare const HAS_FILTERS: Set<string>;
68
+ export declare function resolveActionTargets(script: Dict, opts: Dict): ActionTarget[];
69
+ export declare function selectionHasAnyFilter(opts: Dict): boolean;
70
+ export declare function listAssetsByKind(script: Dict, kind: "actor" | "location" | "prop", opts: {
71
+ id: string;
72
+ name: string;
73
+ selector: InSelector;
74
+ }): string[];
75
+ export declare function splitSpeakerList(raw: unknown): string[];
76
+ export declare function blankCreateReport(session: ScriptEditSession, validation: Dict, idempotent: boolean | null): Report;
77
+ export declare function requireNameArg(opts: Dict, verb: string, example: string): string;