@lingjingai/scriptctl 0.20.0 → 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 (203) hide show
  1. package/dist/cli.js +99 -11
  2. package/dist/cli.js.map +1 -1
  3. package/dist/common.d.ts +1 -0
  4. package/dist/common.js.map +1 -1
  5. package/dist/domain/script/address.d.ts +30 -0
  6. package/dist/domain/script/address.js +141 -0
  7. package/dist/domain/script/address.js.map +1 -0
  8. package/dist/domain/script/lookups.d.ts +33 -0
  9. package/dist/domain/script/lookups.js +309 -0
  10. package/dist/domain/script/lookups.js.map +1 -0
  11. package/dist/domain/script/patch/apply.d.ts +4 -0
  12. package/dist/domain/script/patch/apply.js +38 -0
  13. package/dist/domain/script/patch/apply.js.map +1 -0
  14. package/dist/domain/script/patch/helpers.d.ts +11 -0
  15. package/dist/domain/script/patch/helpers.js +141 -0
  16. package/dist/domain/script/patch/helpers.js.map +1 -0
  17. package/dist/domain/script/patch/ops-action.d.ts +12 -0
  18. package/dist/domain/script/patch/ops-action.js +371 -0
  19. package/dist/domain/script/patch/ops-action.js.map +1 -0
  20. package/dist/domain/script/patch/ops-asset.d.ts +13 -0
  21. package/dist/domain/script/patch/ops-asset.js +363 -0
  22. package/dist/domain/script/patch/ops-asset.js.map +1 -0
  23. package/dist/domain/script/patch/ops-dialogue.d.ts +5 -0
  24. package/dist/domain/script/patch/ops-dialogue.js +233 -0
  25. package/dist/domain/script/patch/ops-dialogue.js.map +1 -0
  26. package/dist/domain/script/patch/ops-meta.d.ts +3 -0
  27. package/dist/domain/script/patch/ops-meta.js +47 -0
  28. package/dist/domain/script/patch/ops-meta.js.map +1 -0
  29. package/dist/domain/script/patch/ops-scene.d.ts +6 -0
  30. package/dist/domain/script/patch/ops-scene.js +345 -0
  31. package/dist/domain/script/patch/ops-scene.js.map +1 -0
  32. package/dist/domain/script/patch/ops-state.d.ts +8 -0
  33. package/dist/domain/script/patch/ops-state.js +146 -0
  34. package/dist/domain/script/patch/ops-state.js.map +1 -0
  35. package/dist/domain/script/patch/registry.d.ts +2 -0
  36. package/dist/domain/script/patch/registry.js +50 -0
  37. package/dist/domain/script/patch/registry.js.map +1 -0
  38. package/dist/domain/script/patch/types.d.ts +10 -0
  39. package/dist/domain/script/patch/types.js +2 -0
  40. package/dist/domain/script/patch/types.js.map +1 -0
  41. package/dist/domain/script/refs.d.ts +4 -0
  42. package/dist/domain/script/refs.js +152 -0
  43. package/dist/domain/script/refs.js.map +1 -0
  44. package/dist/domain/script/schema.d.ts +6 -0
  45. package/dist/domain/script/schema.js +53 -0
  46. package/dist/domain/script/schema.js.map +1 -0
  47. package/dist/domain/script/selector.d.ts +45 -0
  48. package/dist/domain/script/selector.js +187 -0
  49. package/dist/domain/script/selector.js.map +1 -0
  50. package/dist/domain/script/shared.d.ts +15 -0
  51. package/dist/domain/script/shared.js +37 -0
  52. package/dist/domain/script/shared.js.map +1 -0
  53. package/dist/domain/script/validate.d.ts +22 -0
  54. package/dist/domain/script/validate.js +844 -0
  55. package/dist/domain/script/validate.js.map +1 -0
  56. package/dist/help-text.js +21 -4
  57. package/dist/help-text.js.map +1 -1
  58. package/dist/output.d.ts +1 -1
  59. package/dist/output.js +11 -1
  60. package/dist/output.js.map +1 -1
  61. package/dist/usecases/direct.js +1 -1
  62. package/dist/usecases/direct.js.map +1 -1
  63. package/dist/usecases/parse.js +1 -1
  64. package/dist/usecases/parse.js.map +1 -1
  65. package/dist/usecases/script/actions.d.ts +3 -0
  66. package/dist/usecases/script/actions.js +71 -0
  67. package/dist/usecases/script/actions.js.map +1 -0
  68. package/dist/usecases/script/actor.d.ts +3 -0
  69. package/dist/usecases/script/actor.js +27 -0
  70. package/dist/usecases/script/actor.js.map +1 -0
  71. package/dist/usecases/script/actors.d.ts +3 -0
  72. package/dist/usecases/script/actors.js +15 -0
  73. package/dist/usecases/script/actors.js.map +1 -0
  74. package/dist/usecases/script/add-actor.d.ts +3 -0
  75. package/dist/usecases/script/add-actor.js +13 -0
  76. package/dist/usecases/script/add-actor.js.map +1 -0
  77. package/dist/usecases/script/add-episode.d.ts +3 -0
  78. package/dist/usecases/script/add-episode.js +9 -0
  79. package/dist/usecases/script/add-episode.js.map +1 -0
  80. package/dist/usecases/script/add-location.d.ts +3 -0
  81. package/dist/usecases/script/add-location.js +11 -0
  82. package/dist/usecases/script/add-location.js.map +1 -0
  83. package/dist/usecases/script/add-prop.d.ts +3 -0
  84. package/dist/usecases/script/add-prop.js +11 -0
  85. package/dist/usecases/script/add-prop.js.map +1 -0
  86. package/dist/usecases/script/add-speaker.d.ts +3 -0
  87. package/dist/usecases/script/add-speaker.js +22 -0
  88. package/dist/usecases/script/add-speaker.js.map +1 -0
  89. package/dist/usecases/script/alias.d.ts +3 -0
  90. package/dist/usecases/script/alias.js +40 -0
  91. package/dist/usecases/script/alias.js.map +1 -0
  92. package/dist/usecases/script/assets.d.ts +3 -0
  93. package/dist/usecases/script/assets.js +21 -0
  94. package/dist/usecases/script/assets.js.map +1 -0
  95. package/dist/usecases/script/context.d.ts +3 -0
  96. package/dist/usecases/script/context.js +20 -0
  97. package/dist/usecases/script/context.js.map +1 -0
  98. package/dist/usecases/script/create.d.ts +3 -0
  99. package/dist/usecases/script/create.js +81 -0
  100. package/dist/usecases/script/create.js.map +1 -0
  101. package/dist/usecases/script/delete.d.ts +3 -0
  102. package/dist/usecases/script/delete.js +79 -0
  103. package/dist/usecases/script/delete.js.map +1 -0
  104. package/dist/usecases/script/describe.d.ts +3 -0
  105. package/dist/usecases/script/describe.js +31 -0
  106. package/dist/usecases/script/describe.js.map +1 -0
  107. package/dist/usecases/script/dialogue.d.ts +3 -0
  108. package/dist/usecases/script/dialogue.js +28 -0
  109. package/dist/usecases/script/dialogue.js.map +1 -0
  110. package/dist/usecases/script/do.d.ts +3 -0
  111. package/dist/usecases/script/do.js +130 -0
  112. package/dist/usecases/script/do.js.map +1 -0
  113. package/dist/usecases/script/episodes.d.ts +3 -0
  114. package/dist/usecases/script/episodes.js +36 -0
  115. package/dist/usecases/script/episodes.js.map +1 -0
  116. package/dist/usecases/script/export.d.ts +3 -0
  117. package/dist/usecases/script/export.js +117 -0
  118. package/dist/usecases/script/export.js.map +1 -0
  119. package/dist/usecases/script/insert.d.ts +3 -0
  120. package/dist/usecases/script/insert.js +87 -0
  121. package/dist/usecases/script/insert.js.map +1 -0
  122. package/dist/usecases/script/issues.d.ts +3 -0
  123. package/dist/usecases/script/issues.js +27 -0
  124. package/dist/usecases/script/issues.js.map +1 -0
  125. package/dist/usecases/script/lib.d.ts +77 -0
  126. package/dist/usecases/script/lib.js +849 -0
  127. package/dist/usecases/script/lib.js.map +1 -0
  128. package/dist/usecases/script/locations.d.ts +3 -0
  129. package/dist/usecases/script/locations.js +15 -0
  130. package/dist/usecases/script/locations.js.map +1 -0
  131. package/dist/usecases/script/merge.d.ts +3 -0
  132. package/dist/usecases/script/merge.js +43 -0
  133. package/dist/usecases/script/merge.js.map +1 -0
  134. package/dist/usecases/script/move.d.ts +3 -0
  135. package/dist/usecases/script/move.js +33 -0
  136. package/dist/usecases/script/move.js.map +1 -0
  137. package/dist/usecases/script/overlap.d.ts +3 -0
  138. package/dist/usecases/script/overlap.js +21 -0
  139. package/dist/usecases/script/overlap.js.map +1 -0
  140. package/dist/usecases/script/props.d.ts +3 -0
  141. package/dist/usecases/script/props.js +15 -0
  142. package/dist/usecases/script/props.js.map +1 -0
  143. package/dist/usecases/script/refs.d.ts +3 -0
  144. package/dist/usecases/script/refs.js +61 -0
  145. package/dist/usecases/script/refs.js.map +1 -0
  146. package/dist/usecases/script/rename.d.ts +3 -0
  147. package/dist/usecases/script/rename.js +17 -0
  148. package/dist/usecases/script/rename.js.map +1 -0
  149. package/dist/usecases/script/replace.d.ts +3 -0
  150. package/dist/usecases/script/replace.js +35 -0
  151. package/dist/usecases/script/replace.js.map +1 -0
  152. package/dist/usecases/script/role.d.ts +3 -0
  153. package/dist/usecases/script/role.js +17 -0
  154. package/dist/usecases/script/role.js.map +1 -0
  155. package/dist/usecases/script/scenes.d.ts +3 -0
  156. package/dist/usecases/script/scenes.js +45 -0
  157. package/dist/usecases/script/scenes.js.map +1 -0
  158. package/dist/usecases/script/script-patch.d.ts +3 -0
  159. package/dist/usecases/script/script-patch.js +187 -0
  160. package/dist/usecases/script/script-patch.js.map +1 -0
  161. package/dist/usecases/script/script-validate.d.ts +3 -0
  162. package/dist/usecases/script/script-validate.js +30 -0
  163. package/dist/usecases/script/script-validate.js.map +1 -0
  164. package/dist/usecases/script/session.d.ts +44 -0
  165. package/dist/usecases/script/session.js +527 -0
  166. package/dist/usecases/script/session.js.map +1 -0
  167. package/dist/usecases/script/speakers.d.ts +3 -0
  168. package/dist/usecases/script/speakers.js +28 -0
  169. package/dist/usecases/script/speakers.js.map +1 -0
  170. package/dist/usecases/script/split.d.ts +3 -0
  171. package/dist/usecases/script/split.js +37 -0
  172. package/dist/usecases/script/split.js.map +1 -0
  173. package/dist/usecases/script/state-add.d.ts +3 -0
  174. package/dist/usecases/script/state-add.js +23 -0
  175. package/dist/usecases/script/state-add.js.map +1 -0
  176. package/dist/usecases/script/state-change.d.ts +3 -0
  177. package/dist/usecases/script/state-change.js +24 -0
  178. package/dist/usecases/script/state-change.js.map +1 -0
  179. package/dist/usecases/script/state-delete.d.ts +3 -0
  180. package/dist/usecases/script/state-delete.js +23 -0
  181. package/dist/usecases/script/state-delete.js.map +1 -0
  182. package/dist/usecases/script/state-rename.d.ts +3 -0
  183. package/dist/usecases/script/state-rename.js +17 -0
  184. package/dist/usecases/script/state-rename.js.map +1 -0
  185. package/dist/usecases/script/summary.d.ts +3 -0
  186. package/dist/usecases/script/summary.js +45 -0
  187. package/dist/usecases/script/summary.js.map +1 -0
  188. package/dist/usecases/script/transition.d.ts +3 -0
  189. package/dist/usecases/script/transition.js +24 -0
  190. package/dist/usecases/script/transition.js.map +1 -0
  191. package/dist/usecases/script/type.d.ts +3 -0
  192. package/dist/usecases/script/type.js +24 -0
  193. package/dist/usecases/script/type.js.map +1 -0
  194. package/dist/usecases/script/worldview.d.ts +3 -0
  195. package/dist/usecases/script/worldview.js +18 -0
  196. package/dist/usecases/script/worldview.js.map +1 -0
  197. package/package.json +1 -1
  198. package/dist/domain/script-core.d.ts +0 -78
  199. package/dist/domain/script-core.js +0 -3026
  200. package/dist/domain/script-core.js.map +0 -1
  201. package/dist/usecases/script.d.ts +0 -67
  202. package/dist/usecases/script.js +0 -2348
  203. package/dist/usecases/script.js.map +0 -1
@@ -0,0 +1,527 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ import { randomUUID } from "node:crypto";
5
+ import { CliError, EXIT_INPUT, EXIT_RUNTIME, EXIT_USAGE, directDir, exists, readJson, readText, scriptJsonPath, sha256Text, writeJson, } from "../../common.js";
6
+ import { validateScript } from "../../domain/script/validate.js";
7
+ import { RemoteScriptOutputStore } from "../../infra/script-output-api.js";
8
+ import { LocalScriptOutputStore } from "../../infra/local-script-output-store.js";
9
+ import { ScriptOutputApiError, resolveOutputMode, } from "../../infra/script-output-store.js";
10
+ import { sortDeep } from "../../domain/direct-core.js";
11
+ import { asList, isDict, isList, strOf, } from "../../domain/script/shared.js";
12
+ export function parseBound(v) {
13
+ if (v === null || v === undefined || v === "")
14
+ return null;
15
+ const n = Number(v);
16
+ if (!Number.isFinite(n)) {
17
+ throw new CliError("SCRIPT INSPECT BLOCKED: Bound invalid", "--min-chars / --max-chars must be a non-negative integer.", {
18
+ exitCode: EXIT_USAGE,
19
+ required: ["non-negative integer"],
20
+ received: [strOf(v)],
21
+ nextSteps: ["Pass --min-chars 1000 (positive integer)."],
22
+ errorCode: "INSPECT_BOUND_INVALID",
23
+ });
24
+ }
25
+ return Math.max(0, Math.floor(n));
26
+ }
27
+ // Count characters in an episode's actions. Splits dialogue-class (`dialogue`,
28
+ // `inner_thought`) from narrative/screen-text (`action`) so agents can answer
29
+ // "which episodes exceed N spoken chars" vs. raw size. Overlap dialogue stores
30
+ // content on `lines[].content`; non-overlap stores it on `content`.
31
+ export function episodeCharCounts(scenes) {
32
+ let dialogue = 0;
33
+ let action = 0;
34
+ for (const scene of scenes) {
35
+ for (const a of asList(scene["actions"])) {
36
+ const kind = strOf(a["type"]).trim();
37
+ let chars = strOf(a["content"]).length;
38
+ for (const line of asList(a["lines"])) {
39
+ chars += strOf(line["content"]).length;
40
+ }
41
+ if (kind === "dialogue" || kind === "inner_thought")
42
+ dialogue += chars;
43
+ else
44
+ action += chars;
45
+ }
46
+ }
47
+ return { total: dialogue + action, dialogue, action };
48
+ }
49
+ // ---------------------------------------------------------------------------
50
+ // ScriptEditSession
51
+ // ---------------------------------------------------------------------------
52
+ export class ScriptEditSession {
53
+ workspace;
54
+ script;
55
+ scriptPath;
56
+ client;
57
+ projectGroupNo;
58
+ revision;
59
+ constructor(opts) {
60
+ this.workspace = opts.workspace;
61
+ this.script = opts.script;
62
+ this.scriptPath = opts.scriptPath ?? null;
63
+ this.client = opts.client ?? null;
64
+ this.projectGroupNo = opts.projectGroupNo ?? null;
65
+ this.revision = opts.revision ?? null;
66
+ }
67
+ get remote() {
68
+ return this.client !== null;
69
+ }
70
+ get artifactLabel() {
71
+ if (this.remote) {
72
+ // Public label — strips the internal `db:/script-output/project-groups/`
73
+ // storage prefix (which leaks implementation), but keeps the project id
74
+ // and revision so two different project groups at the same revision stay
75
+ // distinguishable in user-visible report.artifacts entries. The project
76
+ // id is not a secret: the user supplies it themselves via
77
+ // `--project-group-no` or env config.
78
+ return `script-output/${this.projectGroupNo}@revision/${this.revision ?? 0}`;
79
+ }
80
+ return this.scriptPath ?? "";
81
+ }
82
+ }
83
+ export function scriptOutputClient(opts) {
84
+ const mode = resolveOutputMode().mode;
85
+ try {
86
+ if (mode === "local") {
87
+ return LocalScriptOutputStore.fromEnv(strOf(opts["workspace_path"]).trim() || undefined);
88
+ }
89
+ return RemoteScriptOutputStore.fromEnv(strOf(opts["project_group_no"]).trim() || null);
90
+ }
91
+ catch (exc) {
92
+ // ScriptOutputApiError carries a `configMissing` discriminator so callers
93
+ // can show the user which slot is unconfigured without naming the env var.
94
+ if (exc instanceof ScriptOutputApiError) {
95
+ const { title, message } = describeConfigMissing(mode, exc.configMissing);
96
+ throw new CliError(title, message, {
97
+ exitCode: EXIT_INPUT,
98
+ required: [
99
+ mode === "local"
100
+ ? "SCRIPTCTL_OUTPUT_DIR"
101
+ : "AWB_BASE_URL, LINGJING_AWB_ACCESS_KEY, and SANDBOX_PROJECT_GROUP_NO (or --project-group-no)",
102
+ ],
103
+ received: [exc.message, `configMissing: ${exc.configMissing ?? "unknown"}`],
104
+ nextSteps: ["Run `scriptctl doctor` to identify missing configuration."],
105
+ errorCode: "SCRIPT_API_CONFIG_MISSING",
106
+ });
107
+ }
108
+ // Belt-and-suspenders: anything else that escapes RemoteScriptOutputStore.fromEnv
109
+ // (a TypeError on a malformed gateway URL, future programmer errors) still
110
+ // surfaces as a clean CliError envelope rather than the generic
111
+ // "RUNTIME FAILED: Unexpected error" path in cli.ts.
112
+ const raw = exc instanceof Error ? exc.message : String(exc);
113
+ throw new CliError(mode === "local"
114
+ ? "SCRIPT API BLOCKED: local output dir not configured"
115
+ : "SCRIPT API BLOCKED: gateway not configured", mode === "local"
116
+ ? "Local output dir is not configured for this environment."
117
+ : "Gateway is not configured for this environment.", {
118
+ exitCode: EXIT_INPUT,
119
+ required: [mode === "local" ? "valid local output dir" : "valid gateway configuration"],
120
+ received: [raw],
121
+ nextSteps: ["Run `scriptctl doctor` to identify missing configuration."],
122
+ errorCode: "SCRIPT_API_CONFIG_MISSING",
123
+ });
124
+ }
125
+ }
126
+ function describeConfigMissing(mode, slot) {
127
+ // Mode wins over slot — if the caller is in local mode, the failure is
128
+ // unambiguously about the output dir even if the underlying error tagged
129
+ // the slot differently.
130
+ // NOTE: this early return short-circuits the exhaustive switch below. New
131
+ // ConfigMissingSlot values for remote-mode callers are guarded by the
132
+ // switch (TS will flag a missing case); values intended for local-mode-only
133
+ // callers must be handled explicitly above this guard.
134
+ if (mode === "local") {
135
+ return {
136
+ title: "SCRIPT API BLOCKED: local output dir missing",
137
+ message: "Local output dir is not configured. Set `SCRIPTCTL_OUTPUT_DIR` to a writable directory.",
138
+ };
139
+ }
140
+ // Unknown / unspecified failures in remote mode default to the gateway
141
+ // bucket — keeps the pre-0.7.0 UX stable.
142
+ if (slot === null) {
143
+ return {
144
+ title: "SCRIPT API BLOCKED: gateway not configured",
145
+ message: "Gateway is not configured for this environment.",
146
+ };
147
+ }
148
+ // After the two guards above, `slot` is narrowed to ConfigMissingSlot. TS
149
+ // exhaustiveness on the switch means adding a new slot without handling it
150
+ // here is a compile error — `assertNever` makes the intent explicit.
151
+ switch (slot) {
152
+ case "output":
153
+ return {
154
+ title: "SCRIPT API BLOCKED: local output dir missing",
155
+ message: "Local output dir is not configured. Set `SCRIPTCTL_OUTPUT_DIR` to a writable directory.",
156
+ };
157
+ case "project":
158
+ return {
159
+ title: "SCRIPT API BLOCKED: project identifier missing",
160
+ message: "Project identifier is not configured. Pass `--project-group-no <id>` or configure the project for this environment.",
161
+ };
162
+ case "access":
163
+ return {
164
+ title: "SCRIPT API BLOCKED: access credential missing",
165
+ message: "Access credential is not configured for this environment.",
166
+ };
167
+ case "gateway":
168
+ return {
169
+ title: "SCRIPT API BLOCKED: gateway not configured",
170
+ message: "Gateway is not configured for this environment.",
171
+ };
172
+ default:
173
+ return assertNever(slot);
174
+ }
175
+ }
176
+ function assertNever(x) {
177
+ throw new Error(`describeConfigMissing: unhandled ConfigMissingSlot ${JSON.stringify(x)}`);
178
+ }
179
+ export function apiErrorToCli(title, exc) {
180
+ const rawMessage = exc.message || "script-output API failed";
181
+ // Use the gateway's own canonical Chinese keywords as the only signal. Free
182
+ // text like "revision" or "not found" can leak in from upstream proxies,
183
+ // DNS errors ("name not found"), or HTTP 404 routing mismatches — matching on
184
+ // those substrings would misroute auth/network failures into the conflict /
185
+ // missing-script UX. The fake-gateway contract is `code:9001` + Chinese
186
+ // keyword for both conflict and missing, so the keyword is precise enough.
187
+ const isConflict = rawMessage.includes("版本冲突");
188
+ const isMissing = rawMessage.includes("剧本不存在");
189
+ const publicMessage = isConflict
190
+ ? "Script has been updated by another revision; reload and retry."
191
+ : isMissing
192
+ ? "Script not found on the gateway."
193
+ : "Gateway request failed.";
194
+ return new CliError(title, publicMessage, {
195
+ exitCode: exc.status !== null && exc.status >= 500 ? EXIT_RUNTIME : EXIT_INPUT,
196
+ required: ["successful script-output gateway request"],
197
+ received: [rawMessage, `status: ${exc.status ?? "<unknown>"}`],
198
+ nextSteps: [
199
+ isConflict
200
+ ? "Reload the latest script revision and retry."
201
+ : isMissing
202
+ ? "Run `scriptctl direct export` to publish a script first."
203
+ : "Run `scriptctl doctor` to verify gateway configuration; retry if it was transient.",
204
+ ],
205
+ errorCode: isConflict
206
+ ? "SCRIPT_REVISION_CONFLICT"
207
+ : isMissing
208
+ ? "SCRIPT_NOT_FOUND"
209
+ : "SCRIPT_API_FAILED",
210
+ });
211
+ }
212
+ export async function currentRevisionOrZero(client) {
213
+ try {
214
+ const revision = await client.getRevision();
215
+ if (!revision)
216
+ return 0;
217
+ return Number(revision["revision"] ?? 0);
218
+ }
219
+ catch (exc) {
220
+ if (exc instanceof ScriptOutputApiError) {
221
+ throw apiErrorToCli("SCRIPT API BLOCKED: Revision query failed", exc);
222
+ }
223
+ throw exc;
224
+ }
225
+ }
226
+ export async function loadRemoteScript(opts, workspace) {
227
+ const client = scriptOutputClient(opts);
228
+ let script;
229
+ let revision;
230
+ try {
231
+ script = await client.getScript();
232
+ revision = await client.getRevision();
233
+ }
234
+ catch (exc) {
235
+ if (exc instanceof ScriptOutputApiError) {
236
+ throw apiErrorToCli("SCRIPT API BLOCKED: Script query failed", exc);
237
+ }
238
+ throw exc;
239
+ }
240
+ if (script === null) {
241
+ throw new CliError("SCRIPT BLOCKED: Final script not found", "No script has been published for this project.", {
242
+ exitCode: EXIT_INPUT,
243
+ required: ["existing script-output project document"],
244
+ received: [`projectGroupNo=${client.projectGroupNo}`],
245
+ nextSteps: ["Run `scriptctl direct export` first, or pass `--script-path` to edit a local intermediate script JSON."],
246
+ errorCode: "SCRIPT_NOT_FOUND",
247
+ });
248
+ }
249
+ if (!isDict(script)) {
250
+ throw new CliError("SCRIPT BLOCKED: script root invalid", "script root invalid.", {
251
+ exitCode: EXIT_USAGE,
252
+ required: ["script root object"],
253
+ received: [typeof script],
254
+ nextSteps: ["Replace the final script with a valid script document object."],
255
+ errorCode: "SCRIPT_ROOT_INVALID",
256
+ });
257
+ }
258
+ return new ScriptEditSession({
259
+ workspace,
260
+ script,
261
+ client,
262
+ projectGroupNo: client.projectGroupNo,
263
+ revision: Number((revision ?? {})["revision"] ?? 0),
264
+ });
265
+ }
266
+ export async function loadScriptForEdit(opts) {
267
+ const workspace = strOf(opts["workspace_path"] || "workspace");
268
+ // --draft is the blessed entrance for editing the direct intermediate draft:
269
+ // it resolves to script.initial.json without exposing the storage path to the
270
+ // agent. It is mutually exclusive with the raw --script-path and the DB-mode
271
+ // --project-group-no (both name a different target).
272
+ const draft = Boolean(opts["draft"]);
273
+ let draftPath = null;
274
+ if (draft) {
275
+ if (opts["script_path"]) {
276
+ throw new CliError("SCRIPT BLOCKED: --draft conflicts with --script-path", "--draft conflicts with --script-path.", {
277
+ exitCode: EXIT_USAGE,
278
+ required: ["either --draft (edit the direct draft) or --script-path (edit a named local script), not both"],
279
+ received: ["--draft and --script-path"],
280
+ nextSteps: ["Drop one of the two flags and retry."],
281
+ errorCode: "DRAFT_FLAG_CONFLICT",
282
+ });
283
+ }
284
+ if (opts["project_group_no"]) {
285
+ throw new CliError("SCRIPT BLOCKED: --draft conflicts with --project-group-no", "--draft conflicts with --project-group-no.", {
286
+ exitCode: EXIT_USAGE,
287
+ required: ["either --draft (edit the local direct draft) or --project-group-no (edit the DB script), not both"],
288
+ received: ["--draft and --project-group-no"],
289
+ nextSteps: ["Drop one of the two flags and retry."],
290
+ errorCode: "DRAFT_FLAG_CONFLICT",
291
+ });
292
+ }
293
+ draftPath = path.join(directDir(workspace), "script.initial.json");
294
+ if (!exists(draftPath)) {
295
+ throw new CliError("SCRIPT BLOCKED: Draft script not found", "Direct draft script not found.", {
296
+ exitCode: EXIT_INPUT,
297
+ required: ["a direct draft produced by `direct init`"],
298
+ received: [draftPath],
299
+ nextSteps: ["Run `scriptctl direct init` first, then edit with --draft."],
300
+ errorCode: "SCRIPT_NOT_FOUND",
301
+ });
302
+ }
303
+ }
304
+ // Resolve the local file from --draft or --script-path WITHOUT mutating opts:
305
+ // commandAlias loads twice with the same opts, and writing script_path back
306
+ // would make the second load see a phantom --script-path and reject --draft.
307
+ if (!draftPath && !opts["script_path"]) {
308
+ return loadRemoteScript(opts, workspace);
309
+ }
310
+ const p = draftPath ?? scriptJsonPath(opts);
311
+ if (!exists(p)) {
312
+ throw new CliError("SCRIPT BLOCKED: Local script file not found", "Local script file not found.", {
313
+ exitCode: EXIT_INPUT,
314
+ required: ["--script-path existing local script JSON"],
315
+ received: [p],
316
+ nextSteps: ["Pass --script-path to an existing local intermediate script JSON, or omit --script-path to use DB-backed script-output."],
317
+ errorCode: "SCRIPT_NOT_FOUND",
318
+ });
319
+ }
320
+ let data;
321
+ try {
322
+ data = readJson(p);
323
+ }
324
+ catch (exc) {
325
+ throw new CliError("SCRIPT BLOCKED: script JSON invalid", "script JSON invalid.", {
326
+ exitCode: EXIT_INPUT,
327
+ required: ["valid JSON"],
328
+ received: [`${p}: ${exc.message}`],
329
+ nextSteps: ["Fix the local script JSON syntax before editing."],
330
+ errorCode: "SCRIPT_JSON_INVALID",
331
+ });
332
+ }
333
+ if (!isDict(data)) {
334
+ throw new CliError("SCRIPT BLOCKED: script root invalid", "script root invalid.", {
335
+ exitCode: EXIT_USAGE,
336
+ required: ["script root object"],
337
+ received: [Array.isArray(data) ? "array" : typeof data],
338
+ nextSteps: ["Use a valid script document object."],
339
+ errorCode: "SCRIPT_ROOT_INVALID",
340
+ });
341
+ }
342
+ return new ScriptEditSession({ workspace, scriptPath: p, script: data });
343
+ }
344
+ export function validateSession(session, opts = {}) {
345
+ const requireSource = opts.requireSource ?? false;
346
+ if (!session.remote) {
347
+ // Validate the IN-MEMORY script, not what's on disk. On a dry-run the edits
348
+ // live only in session.script (never written), so reading session.scriptPath
349
+ // would validate the stale pre-edit file and report a misleading "would pass".
350
+ return validateScript(session.workspace, null, { requireSource, scriptData: session.script });
351
+ }
352
+ const tmpPath = path.join(os.tmpdir(), `scriptctl-db-script-${randomUUID()}.json`);
353
+ try {
354
+ fs.writeFileSync(tmpPath, JSON.stringify(session.script, null, 2) + "\n", "utf-8");
355
+ const validation = validateScript(session.workspace, tmpPath, { requireSource });
356
+ validation["script_path"] = session.artifactLabel;
357
+ writeJson(path.join(directDir(session.workspace), "validation.json"), validation);
358
+ return validation;
359
+ }
360
+ finally {
361
+ try {
362
+ fs.unlinkSync(tmpPath);
363
+ }
364
+ catch {
365
+ // ignore
366
+ }
367
+ }
368
+ }
369
+ function validationIssuePath(issue) {
370
+ if (issue["path"])
371
+ return strOf(issue["path"]);
372
+ const parts = [];
373
+ if (issue["episode"] !== null && issue["episode"] !== undefined)
374
+ parts.push(strOf(issue["episode"]));
375
+ if (issue["scene"] !== null && issue["scene"] !== undefined)
376
+ parts.push(strOf(issue["scene"]));
377
+ if (issue["action_index"] !== null && issue["action_index"] !== undefined)
378
+ parts.push(`action[${issue["action_index"]}]`);
379
+ return parts.length > 0 ? parts.join("/") : null;
380
+ }
381
+ function validationIssueSeverity(raw) {
382
+ const severity = strOf(raw || "info");
383
+ if (severity === "blocking" || severity === "error")
384
+ return "error";
385
+ if (severity === "warning")
386
+ return "warning";
387
+ return "info";
388
+ }
389
+ function validationToApiPayload(validation) {
390
+ const issues = asList(validation["issues"]);
391
+ const status = validation["passed"] ? "valid" : "invalid";
392
+ const summary = {
393
+ passed: Boolean(validation["passed"]),
394
+ hasBlocking: Boolean(validation["has_blocking"]),
395
+ stats: validation["stats"] ?? {},
396
+ issueCount: issues.length,
397
+ };
398
+ const apiIssues = [];
399
+ for (const issue of issues) {
400
+ if (!isDict(issue))
401
+ continue;
402
+ const payload = { ...issue };
403
+ for (const key of ["severity", "code", "path", "summary", "repair_hint"])
404
+ delete payload[key];
405
+ apiIssues.push({
406
+ severity: validationIssueSeverity(issue["severity"]),
407
+ code: strOf(issue["code"] || "SCRIPT_VALIDATION_ISSUE"),
408
+ path: validationIssuePath(issue),
409
+ summary: strOf(issue["summary"]),
410
+ repairHint: issue["repair_hint"],
411
+ payload,
412
+ });
413
+ }
414
+ return [status, summary, apiIssues];
415
+ }
416
+ export async function syncValidationResult(session, validation, revision) {
417
+ if (!session.remote || session.client === null)
418
+ return;
419
+ const targetRevision = Number(revision ?? session.revision ?? 0);
420
+ if (targetRevision <= 0)
421
+ return;
422
+ const [status, summary, issues] = validationToApiPayload(validation);
423
+ try {
424
+ await session.client.saveValidationResult({
425
+ revision: targetRevision,
426
+ validationStatus: status,
427
+ validationSummary: summary,
428
+ issues,
429
+ });
430
+ }
431
+ catch (exc) {
432
+ if (exc instanceof ScriptOutputApiError) {
433
+ throw apiErrorToCli("SCRIPT API BLOCKED: Validation sync failed", exc);
434
+ }
435
+ throw exc;
436
+ }
437
+ }
438
+ // Idempotency key for gateway writes. Returns the agent-provided --request-id
439
+ // when present, otherwise derives a deterministic key from (op, post-mutation
440
+ // script content). baseRevision is intentionally NOT in the hash: in a
441
+ // partial-success retry the client reloads at a new baseRevision but the
442
+ // post-mutation script is identical, so the hash matches and the gateway can
443
+ // dedupe. The cost of including baseRevision (an old version of this code)
444
+ // was that retries produced different ids and committed redundant no-op
445
+ // revisions to the gateway history.
446
+ export function requestIdForScriptWrite(opts, op, payload) {
447
+ const explicit = strOf(opts["request_id"]).trim();
448
+ if (explicit)
449
+ return explicit;
450
+ const canonical = JSON.stringify(sortDeep({
451
+ op,
452
+ script: payload.script,
453
+ }));
454
+ return `scriptctl:${op}:${sha256Text(canonical)}`;
455
+ }
456
+ export async function saveScriptSession(session, opts, op) {
457
+ if (!session.remote) {
458
+ writeJson(session.scriptPath, session.script);
459
+ return [null, false];
460
+ }
461
+ if (session.client === null)
462
+ throw new Error("remote script session missing client");
463
+ const baseRevision = Number(session.revision ?? 0);
464
+ const requestId = requestIdForScriptWrite(opts, op, { script: session.script });
465
+ let res;
466
+ try {
467
+ res = await session.client.replaceScript({
468
+ requestId,
469
+ baseRevision,
470
+ script: session.script,
471
+ source: "ctl",
472
+ });
473
+ }
474
+ catch (exc) {
475
+ if (exc instanceof ScriptOutputApiError) {
476
+ throw apiErrorToCli("SCRIPT API BLOCKED: Script write failed", exc);
477
+ }
478
+ throw exc;
479
+ }
480
+ session.revision = Number(res["revision"] ?? session.revision ?? 0);
481
+ return [session.revision, Boolean(res["idempotent"])];
482
+ }
483
+ export function scriptSourceText(workspace) {
484
+ const sourcePath = path.join(workspace, "source.txt");
485
+ return exists(sourcePath) ? readText(sourcePath) : "";
486
+ }
487
+ export function patchOperationsFromPayload(payload) {
488
+ let operations;
489
+ if (isList(payload)) {
490
+ operations = payload;
491
+ }
492
+ else if (isDict(payload) && isList(payload["ops"])) {
493
+ operations = payload["ops"];
494
+ }
495
+ else if (isDict(payload) && isList(payload["operations"])) {
496
+ operations = payload["operations"];
497
+ }
498
+ else if (isDict(payload)) {
499
+ operations = [payload];
500
+ }
501
+ else {
502
+ throw new CliError("PATCH BLOCKED: Patch schema invalid", "Patch schema invalid.", {
503
+ exitCode: EXIT_USAGE,
504
+ required: ["object, array, object with ops[], or object with operations[]"],
505
+ received: [Array.isArray(payload) ? "array" : typeof payload],
506
+ nextSteps: ["Fix patch JSON and rerun patch."],
507
+ });
508
+ }
509
+ if (operations.some((op) => !isDict(op))) {
510
+ throw new CliError("PATCH BLOCKED: Patch operation invalid", "Patch operation invalid.", {
511
+ exitCode: EXIT_USAGE,
512
+ required: ["each operation must be an object"],
513
+ received: [JSON.stringify(operations).slice(0, 500)],
514
+ nextSteps: ["Fix patch JSON and rerun patch."],
515
+ });
516
+ }
517
+ return operations;
518
+ }
519
+ // ---------------------------------------------------------------------------
520
+ // commandScriptValidate / commandScriptInspect
521
+ // ---------------------------------------------------------------------------
522
+ // ===========================================================================
523
+ // do — verb-script transaction (the agent-friendly alternative to JSON patch)
524
+ // ===========================================================================
525
+ // Minimal shell-like tokenizer: whitespace-split honoring "..."/'...' quoting
526
+ // and backslash escapes. Enough to carry screenplay content with spaces/quotes.
527
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/usecases/script/session.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 commandSpeakers(opts: Dict): Promise<[Report, number]>;
@@ -0,0 +1,28 @@
1
+ import { EXIT_OK, } from "../../common.js";
2
+ import { asList, strOf, } from "../../domain/script/shared.js";
3
+ import { loadScriptForEdit, } from "./session.js";
4
+ import { buildReport, } from "./lib.js";
5
+ export async function commandSpeakers(opts) {
6
+ const session = await loadScriptForEdit(opts);
7
+ const script = session.script;
8
+ const idOpt = strOf(opts["id"]).trim();
9
+ const nameOpt = strOf(opts["name"]).trim();
10
+ const kindOpt = strOf(opts["kind"]).trim();
11
+ const lines = [];
12
+ for (const sp of asList(script["speakers"])) {
13
+ const id = strOf(sp["speaker_id"]);
14
+ const name = strOf(sp["display_name"]);
15
+ const sourceKind = strOf(sp["source_kind"]);
16
+ const sourceId = strOf(sp["source_id"]);
17
+ if (idOpt && idOpt !== id)
18
+ continue;
19
+ if (nameOpt && !name.includes(nameOpt))
20
+ continue;
21
+ if (kindOpt && kindOpt !== sourceKind)
22
+ continue;
23
+ lines.push(`${id}: ${name} [${sourceKind}] source=${sourceId || "-"}`);
24
+ }
25
+ return [buildReport("query.speakers", "SPEAKERS", lines, session.artifactLabel, ["Use `scriptctl add-speaker` to register more, or `scriptctl refs <spk_id>` to see usage."]), EXIT_OK];
26
+ }
27
+ // ----- issues ---------------------------------------------------------------
28
+ //# sourceMappingURL=speakers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speakers.js","sourceRoot":"","sources":["../../../src/usecases/script/speakers.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,GAElB,MAAM,cAAc,CAAC;AACtB,OAAO,EACwS,WAAW,GACzT,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,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAO,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QACxC,IAAI,KAAK,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QACpC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACjD,IAAI,OAAO,IAAI,OAAO,KAAK,UAAU;YAAE,SAAS;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,KAAK,UAAU,YAAY,QAAQ,IAAI,GAAG,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,EAC5E,CAAC,0FAA0F,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5G,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 commandSplit(opts: Dict): Promise<[Report, number]>;
@@ -0,0 +1,37 @@
1
+ import { CliError, EXIT_USAGE, } from "../../common.js";
2
+ import { asList, } from "../../domain/script/shared.js";
3
+ import { applySingleScriptOp, } from "./lib.js";
4
+ export async function commandSplit(opts) {
5
+ const args = asList(opts["_args"]);
6
+ if (args.length < 1) {
7
+ throw new CliError("VERB BLOCKED: Scene ref missing", "Scene ref missing.", {
8
+ exitCode: EXIT_USAGE,
9
+ required: ["<ep/scn>"],
10
+ received: ["<empty>"],
11
+ nextSteps: ["Example: scriptctl split ep_001/scn_005 --at 7"],
12
+ errorCode: "ARGS_MISSING",
13
+ });
14
+ }
15
+ // Commander hands back --at as a string; the scene.split handler does a
16
+ // strict typeof === "number" check (no implicit coercion), so we coerce here
17
+ // before dispatch. Without this, every CLI `scriptctl split` invocation
18
+ // would fail with SPLIT_INDEX_INVALID.
19
+ const rawAt = opts["at_index"] ?? opts["at"];
20
+ const atIndex = rawAt === undefined || rawAt === null || rawAt === "" ? undefined : Number(rawAt);
21
+ if (atIndex !== undefined && (!Number.isFinite(atIndex) || !Number.isInteger(atIndex))) {
22
+ throw new CliError("VERB BLOCKED: --at not an integer", "--at must be an integer.", {
23
+ exitCode: EXIT_USAGE,
24
+ required: ["--at <integer>"],
25
+ received: [String(rawAt)],
26
+ nextSteps: ["Pass an integer action index."],
27
+ errorCode: "AT_INDEX_INVALID",
28
+ });
29
+ }
30
+ return applySingleScriptOp(opts, {
31
+ op: "scene.split",
32
+ at: args[0],
33
+ at_index: atIndex,
34
+ new_scene_id: opts["new_scene_id"],
35
+ });
36
+ }
37
+ //# sourceMappingURL=split.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.js","sourceRoot":"","sources":["../../../src/usecases/script/split.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,QAAQ,EAKR,UAAU,GASX,MAAM,iBAAiB,CAAC;AAmCzB,OAAO,EACL,MAAM,GAKP,MAAM,+BAA+B,CAAC;AAMvC,OAAO,EAC+I,mBAAmB,GACxK,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAU;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,iCAAiC,EAAE,oBAAoB,EAAE;YAC1E,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,UAAU,CAAC;YACtB,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,SAAS,EAAE,CAAC,gDAAgD,CAAC;YAC7D,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;IACL,CAAC;IACD,wEAAwE;IACxE,6EAA6E;IAC7E,wEAAwE;IACxE,uCAAuC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClG,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,QAAQ,CAAC,mCAAmC,EAAE,0BAA0B,EAAE;YAClF,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,gBAAgB,CAAC;YAC5B,QAAQ,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzB,SAAS,EAAE,CAAC,+BAA+B,CAAC;YAC5C,SAAS,EAAE,kBAAkB;SAC9B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,mBAAmB,CAAC,IAAI,EAAE;QAC/B,EAAE,EAAE,aAAa;QACjB,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACX,QAAQ,EAAE,OAAO;QACjB,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC;KACnC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Report } from "../../common.js";
2
+ import { type Dict } from "../../domain/script/shared.js";
3
+ export declare function commandStateAdd(opts: Dict): Promise<[Report, number]>;