@lingjingai/scriptctl 0.20.0 → 0.22.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 (208) hide show
  1. package/dist/cli.js +105 -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 +33 -8
  57. package/dist/help-text.js.map +1 -1
  58. package/dist/infra/script-output-store.d.ts +46 -10
  59. package/dist/infra/script-output-store.js +83 -11
  60. package/dist/infra/script-output-store.js.map +1 -1
  61. package/dist/output.d.ts +1 -1
  62. package/dist/output.js +11 -1
  63. package/dist/output.js.map +1 -1
  64. package/dist/usecases/direct.js +1 -1
  65. package/dist/usecases/direct.js.map +1 -1
  66. package/dist/usecases/doctor.js +32 -22
  67. package/dist/usecases/doctor.js.map +1 -1
  68. package/dist/usecases/parse.js +10 -3
  69. package/dist/usecases/parse.js.map +1 -1
  70. package/dist/usecases/script/actions.d.ts +3 -0
  71. package/dist/usecases/script/actions.js +71 -0
  72. package/dist/usecases/script/actions.js.map +1 -0
  73. package/dist/usecases/script/actor.d.ts +3 -0
  74. package/dist/usecases/script/actor.js +27 -0
  75. package/dist/usecases/script/actor.js.map +1 -0
  76. package/dist/usecases/script/actors.d.ts +3 -0
  77. package/dist/usecases/script/actors.js +15 -0
  78. package/dist/usecases/script/actors.js.map +1 -0
  79. package/dist/usecases/script/add-actor.d.ts +3 -0
  80. package/dist/usecases/script/add-actor.js +13 -0
  81. package/dist/usecases/script/add-actor.js.map +1 -0
  82. package/dist/usecases/script/add-episode.d.ts +3 -0
  83. package/dist/usecases/script/add-episode.js +9 -0
  84. package/dist/usecases/script/add-episode.js.map +1 -0
  85. package/dist/usecases/script/add-location.d.ts +3 -0
  86. package/dist/usecases/script/add-location.js +11 -0
  87. package/dist/usecases/script/add-location.js.map +1 -0
  88. package/dist/usecases/script/add-prop.d.ts +3 -0
  89. package/dist/usecases/script/add-prop.js +11 -0
  90. package/dist/usecases/script/add-prop.js.map +1 -0
  91. package/dist/usecases/script/add-speaker.d.ts +3 -0
  92. package/dist/usecases/script/add-speaker.js +22 -0
  93. package/dist/usecases/script/add-speaker.js.map +1 -0
  94. package/dist/usecases/script/alias.d.ts +3 -0
  95. package/dist/usecases/script/alias.js +40 -0
  96. package/dist/usecases/script/alias.js.map +1 -0
  97. package/dist/usecases/script/assets.d.ts +3 -0
  98. package/dist/usecases/script/assets.js +21 -0
  99. package/dist/usecases/script/assets.js.map +1 -0
  100. package/dist/usecases/script/context.d.ts +3 -0
  101. package/dist/usecases/script/context.js +20 -0
  102. package/dist/usecases/script/context.js.map +1 -0
  103. package/dist/usecases/script/create.d.ts +3 -0
  104. package/dist/usecases/script/create.js +67 -0
  105. package/dist/usecases/script/create.js.map +1 -0
  106. package/dist/usecases/script/delete.d.ts +3 -0
  107. package/dist/usecases/script/delete.js +79 -0
  108. package/dist/usecases/script/delete.js.map +1 -0
  109. package/dist/usecases/script/describe.d.ts +3 -0
  110. package/dist/usecases/script/describe.js +31 -0
  111. package/dist/usecases/script/describe.js.map +1 -0
  112. package/dist/usecases/script/dialogue.d.ts +3 -0
  113. package/dist/usecases/script/dialogue.js +28 -0
  114. package/dist/usecases/script/dialogue.js.map +1 -0
  115. package/dist/usecases/script/do.d.ts +3 -0
  116. package/dist/usecases/script/do.js +130 -0
  117. package/dist/usecases/script/do.js.map +1 -0
  118. package/dist/usecases/script/episodes.d.ts +3 -0
  119. package/dist/usecases/script/episodes.js +36 -0
  120. package/dist/usecases/script/episodes.js.map +1 -0
  121. package/dist/usecases/script/export.d.ts +3 -0
  122. package/dist/usecases/script/export.js +117 -0
  123. package/dist/usecases/script/export.js.map +1 -0
  124. package/dist/usecases/script/insert.d.ts +3 -0
  125. package/dist/usecases/script/insert.js +87 -0
  126. package/dist/usecases/script/insert.js.map +1 -0
  127. package/dist/usecases/script/issues.d.ts +3 -0
  128. package/dist/usecases/script/issues.js +27 -0
  129. package/dist/usecases/script/issues.js.map +1 -0
  130. package/dist/usecases/script/lib.d.ts +77 -0
  131. package/dist/usecases/script/lib.js +849 -0
  132. package/dist/usecases/script/lib.js.map +1 -0
  133. package/dist/usecases/script/locations.d.ts +3 -0
  134. package/dist/usecases/script/locations.js +15 -0
  135. package/dist/usecases/script/locations.js.map +1 -0
  136. package/dist/usecases/script/merge.d.ts +3 -0
  137. package/dist/usecases/script/merge.js +43 -0
  138. package/dist/usecases/script/merge.js.map +1 -0
  139. package/dist/usecases/script/move.d.ts +3 -0
  140. package/dist/usecases/script/move.js +33 -0
  141. package/dist/usecases/script/move.js.map +1 -0
  142. package/dist/usecases/script/overlap.d.ts +3 -0
  143. package/dist/usecases/script/overlap.js +21 -0
  144. package/dist/usecases/script/overlap.js.map +1 -0
  145. package/dist/usecases/script/props.d.ts +3 -0
  146. package/dist/usecases/script/props.js +15 -0
  147. package/dist/usecases/script/props.js.map +1 -0
  148. package/dist/usecases/script/refs.d.ts +3 -0
  149. package/dist/usecases/script/refs.js +61 -0
  150. package/dist/usecases/script/refs.js.map +1 -0
  151. package/dist/usecases/script/rename.d.ts +3 -0
  152. package/dist/usecases/script/rename.js +17 -0
  153. package/dist/usecases/script/rename.js.map +1 -0
  154. package/dist/usecases/script/replace.d.ts +3 -0
  155. package/dist/usecases/script/replace.js +35 -0
  156. package/dist/usecases/script/replace.js.map +1 -0
  157. package/dist/usecases/script/role.d.ts +3 -0
  158. package/dist/usecases/script/role.js +17 -0
  159. package/dist/usecases/script/role.js.map +1 -0
  160. package/dist/usecases/script/scenes.d.ts +3 -0
  161. package/dist/usecases/script/scenes.js +45 -0
  162. package/dist/usecases/script/scenes.js.map +1 -0
  163. package/dist/usecases/script/script-patch.d.ts +3 -0
  164. package/dist/usecases/script/script-patch.js +187 -0
  165. package/dist/usecases/script/script-patch.js.map +1 -0
  166. package/dist/usecases/script/script-validate.d.ts +3 -0
  167. package/dist/usecases/script/script-validate.js +30 -0
  168. package/dist/usecases/script/script-validate.js.map +1 -0
  169. package/dist/usecases/script/session.d.ts +56 -0
  170. package/dist/usecases/script/session.js +568 -0
  171. package/dist/usecases/script/session.js.map +1 -0
  172. package/dist/usecases/script/speakers.d.ts +3 -0
  173. package/dist/usecases/script/speakers.js +28 -0
  174. package/dist/usecases/script/speakers.js.map +1 -0
  175. package/dist/usecases/script/split.d.ts +3 -0
  176. package/dist/usecases/script/split.js +37 -0
  177. package/dist/usecases/script/split.js.map +1 -0
  178. package/dist/usecases/script/state-add.d.ts +3 -0
  179. package/dist/usecases/script/state-add.js +23 -0
  180. package/dist/usecases/script/state-add.js.map +1 -0
  181. package/dist/usecases/script/state-change.d.ts +3 -0
  182. package/dist/usecases/script/state-change.js +24 -0
  183. package/dist/usecases/script/state-change.js.map +1 -0
  184. package/dist/usecases/script/state-delete.d.ts +3 -0
  185. package/dist/usecases/script/state-delete.js +23 -0
  186. package/dist/usecases/script/state-delete.js.map +1 -0
  187. package/dist/usecases/script/state-rename.d.ts +3 -0
  188. package/dist/usecases/script/state-rename.js +17 -0
  189. package/dist/usecases/script/state-rename.js.map +1 -0
  190. package/dist/usecases/script/summary.d.ts +3 -0
  191. package/dist/usecases/script/summary.js +45 -0
  192. package/dist/usecases/script/summary.js.map +1 -0
  193. package/dist/usecases/script/transition.d.ts +3 -0
  194. package/dist/usecases/script/transition.js +24 -0
  195. package/dist/usecases/script/transition.js.map +1 -0
  196. package/dist/usecases/script/type.d.ts +3 -0
  197. package/dist/usecases/script/type.js +24 -0
  198. package/dist/usecases/script/type.js.map +1 -0
  199. package/dist/usecases/script/worldview.d.ts +3 -0
  200. package/dist/usecases/script/worldview.js +18 -0
  201. package/dist/usecases/script/worldview.js.map +1 -0
  202. package/package.json +1 -1
  203. package/dist/domain/script-core.d.ts +0 -78
  204. package/dist/domain/script-core.js +0 -3026
  205. package/dist/domain/script-core.js.map +0 -1
  206. package/dist/usecases/script.d.ts +0 -67
  207. package/dist/usecases/script.js +0 -2348
  208. package/dist/usecases/script.js.map +0 -1
@@ -0,0 +1,568 @@
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, resolveOutputModeOrThrow, } 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
+ /**
84
+ * Validate that the target-selection flags on `opts` are coherent, throwing a
85
+ * CliError on any contradiction. The SINGLE conflict gate for every file-capable
86
+ * entry point (loadScriptForEdit AND commandCreate) — neither may resolve a
87
+ * target without passing through here, so a store flag can never be silently
88
+ * dropped on the local-file branch (the wrong-target write this design forbids).
89
+ *
90
+ * `--remote`/`--local`/`--project-group-no` select a STORE; `--script-path`/
91
+ * `--draft` select a local FILE. The two are mutually exclusive. `--draft` and
92
+ * `--script-path` are two different local files, also mutually exclusive.
93
+ */
94
+ export function assertTargetCoherent(opts) {
95
+ const draft = Boolean(opts["draft"]);
96
+ const scriptPath = strOf(opts["script_path"]).trim() !== "";
97
+ const remote = Boolean(opts["remote"]);
98
+ const local = Boolean(opts["local"]);
99
+ const projectGroup = strOf(opts["project_group_no"]).trim() !== "";
100
+ const targetFlagConflict = (received) => new CliError("SCRIPT BLOCKED: target flag conflict", "The selected output-target flags are mutually exclusive.", {
101
+ exitCode: EXIT_USAGE,
102
+ required: ["one of: --script-path/--draft (a local file), or --remote/--local (the store)"],
103
+ received,
104
+ nextSteps: ["Keep a single target selector and drop the others."],
105
+ errorCode: "TARGET_FLAG_CONFLICT",
106
+ });
107
+ // Most fundamental first, so the message names the real contradiction even
108
+ // when several conflicting flags are passed at once.
109
+ if (remote && local)
110
+ throw targetFlagConflict(["--remote", "--local"]);
111
+ if (draft && scriptPath) {
112
+ throw new CliError("SCRIPT BLOCKED: --draft conflicts with --script-path", "--draft conflicts with --script-path.", {
113
+ exitCode: EXIT_USAGE,
114
+ required: ["either --draft (the direct draft) or --script-path (a named local file), not both"],
115
+ received: ["--draft", "--script-path"],
116
+ nextSteps: ["Drop one of the two flags and retry."],
117
+ errorCode: "DRAFT_FLAG_CONFLICT",
118
+ });
119
+ }
120
+ if ((remote || local) && (draft || scriptPath)) {
121
+ throw targetFlagConflict([remote ? "--remote" : "--local", draft ? "--draft" : "--script-path"]);
122
+ }
123
+ // A project group names a REMOTE target, so it cannot combine with any local
124
+ // target — a local file (--draft/--script-path) OR the local store (--local).
125
+ // `--remote --project-group-no` is the one valid pairing and is left alone.
126
+ if (projectGroup && (draft || scriptPath || local)) {
127
+ throw targetFlagConflict([
128
+ "--project-group-no",
129
+ draft ? "--draft" : scriptPath ? "--script-path" : "--local",
130
+ ]);
131
+ }
132
+ }
133
+ export function scriptOutputClient(opts) {
134
+ const mode = resolveOutputModeOrThrow({
135
+ remote: opts["remote"],
136
+ local: opts["local"],
137
+ projectGroupNo: opts["project_group_no"],
138
+ });
139
+ try {
140
+ if (mode === "local") {
141
+ return LocalScriptOutputStore.fromEnv(strOf(opts["workspace_path"]).trim() || undefined);
142
+ }
143
+ return RemoteScriptOutputStore.fromEnv(strOf(opts["project_group_no"]).trim() || null);
144
+ }
145
+ catch (exc) {
146
+ // ScriptOutputApiError carries a `configMissing` discriminator so callers
147
+ // can show the user which slot is unconfigured without naming the env var.
148
+ if (exc instanceof ScriptOutputApiError) {
149
+ const { title, message } = describeConfigMissing(mode, exc.configMissing);
150
+ throw new CliError(title, message, {
151
+ exitCode: EXIT_INPUT,
152
+ required: [
153
+ mode === "local"
154
+ ? "SCRIPTCTL_OUTPUT_DIR"
155
+ : "AWB_BASE_URL, LINGJING_AWB_ACCESS_KEY, and SANDBOX_PROJECT_GROUP_NO (or --project-group-no)",
156
+ ],
157
+ received: [exc.message, `configMissing: ${exc.configMissing ?? "unknown"}`],
158
+ nextSteps: ["Run `scriptctl doctor` to identify missing configuration."],
159
+ errorCode: "SCRIPT_API_CONFIG_MISSING",
160
+ });
161
+ }
162
+ // Belt-and-suspenders: anything else that escapes RemoteScriptOutputStore.fromEnv
163
+ // (a TypeError on a malformed gateway URL, future programmer errors) still
164
+ // surfaces as a clean CliError envelope rather than the generic
165
+ // "RUNTIME FAILED: Unexpected error" path in cli.ts.
166
+ const raw = exc instanceof Error ? exc.message : String(exc);
167
+ throw new CliError(mode === "local"
168
+ ? "SCRIPT API BLOCKED: local output dir not configured"
169
+ : "SCRIPT API BLOCKED: gateway not configured", mode === "local"
170
+ ? "Local output dir is not configured for this environment."
171
+ : "Gateway is not configured for this environment.", {
172
+ exitCode: EXIT_INPUT,
173
+ required: [mode === "local" ? "valid local output dir" : "valid gateway configuration"],
174
+ received: [raw],
175
+ nextSteps: ["Run `scriptctl doctor` to identify missing configuration."],
176
+ errorCode: "SCRIPT_API_CONFIG_MISSING",
177
+ });
178
+ }
179
+ }
180
+ function describeConfigMissing(mode, slot) {
181
+ // Mode wins over slot — if the caller is in local mode, the failure is
182
+ // unambiguously about the output dir even if the underlying error tagged
183
+ // the slot differently.
184
+ // NOTE: this early return short-circuits the exhaustive switch below. New
185
+ // ConfigMissingSlot values for remote-mode callers are guarded by the
186
+ // switch (TS will flag a missing case); values intended for local-mode-only
187
+ // callers must be handled explicitly above this guard.
188
+ if (mode === "local") {
189
+ return {
190
+ title: "SCRIPT API BLOCKED: local output dir missing",
191
+ message: "Local output dir is not configured. Set `SCRIPTCTL_OUTPUT_DIR` to a writable directory.",
192
+ };
193
+ }
194
+ // Unknown / unspecified failures in remote mode default to the gateway
195
+ // bucket — keeps the pre-0.7.0 UX stable.
196
+ if (slot === null) {
197
+ return {
198
+ title: "SCRIPT API BLOCKED: gateway not configured",
199
+ message: "Gateway is not configured for this environment.",
200
+ };
201
+ }
202
+ // After the two guards above, `slot` is narrowed to ConfigMissingSlot. TS
203
+ // exhaustiveness on the switch means adding a new slot without handling it
204
+ // here is a compile error — `assertNever` makes the intent explicit.
205
+ switch (slot) {
206
+ case "output":
207
+ return {
208
+ title: "SCRIPT API BLOCKED: local output dir missing",
209
+ message: "Local output dir is not configured. Set `SCRIPTCTL_OUTPUT_DIR` to a writable directory.",
210
+ };
211
+ case "project":
212
+ return {
213
+ title: "SCRIPT API BLOCKED: project identifier missing",
214
+ message: "Project identifier is not configured. Pass `--project-group-no <id>` or configure the project for this environment.",
215
+ };
216
+ case "access":
217
+ return {
218
+ title: "SCRIPT API BLOCKED: access credential missing",
219
+ message: "Access credential is not configured for this environment.",
220
+ };
221
+ case "gateway":
222
+ return {
223
+ title: "SCRIPT API BLOCKED: gateway not configured",
224
+ message: "Gateway is not configured for this environment.",
225
+ };
226
+ default:
227
+ return assertNever(slot);
228
+ }
229
+ }
230
+ function assertNever(x) {
231
+ throw new Error(`describeConfigMissing: unhandled ConfigMissingSlot ${JSON.stringify(x)}`);
232
+ }
233
+ export function apiErrorToCli(title, exc) {
234
+ const rawMessage = exc.message || "script-output API failed";
235
+ // Use the gateway's own canonical Chinese keywords as the only signal. Free
236
+ // text like "revision" or "not found" can leak in from upstream proxies,
237
+ // DNS errors ("name not found"), or HTTP 404 routing mismatches — matching on
238
+ // those substrings would misroute auth/network failures into the conflict /
239
+ // missing-script UX. The fake-gateway contract is `code:9001` + Chinese
240
+ // keyword for both conflict and missing, so the keyword is precise enough.
241
+ const isConflict = rawMessage.includes("版本冲突");
242
+ const isMissing = rawMessage.includes("剧本不存在");
243
+ const publicMessage = isConflict
244
+ ? "Script has been updated by another revision; reload and retry."
245
+ : isMissing
246
+ ? "Script not found on the gateway."
247
+ : "Gateway request failed.";
248
+ return new CliError(title, publicMessage, {
249
+ exitCode: exc.status !== null && exc.status >= 500 ? EXIT_RUNTIME : EXIT_INPUT,
250
+ required: ["successful script-output gateway request"],
251
+ received: [rawMessage, `status: ${exc.status ?? "<unknown>"}`],
252
+ nextSteps: [
253
+ isConflict
254
+ ? "Reload the latest script revision and retry."
255
+ : isMissing
256
+ ? "Run `scriptctl direct export` to publish a script first."
257
+ : "Run `scriptctl doctor` to verify gateway configuration; retry if it was transient.",
258
+ ],
259
+ errorCode: isConflict
260
+ ? "SCRIPT_REVISION_CONFLICT"
261
+ : isMissing
262
+ ? "SCRIPT_NOT_FOUND"
263
+ : "SCRIPT_API_FAILED",
264
+ });
265
+ }
266
+ export async function currentRevisionOrZero(client) {
267
+ try {
268
+ const revision = await client.getRevision();
269
+ if (!revision)
270
+ return 0;
271
+ return Number(revision["revision"] ?? 0);
272
+ }
273
+ catch (exc) {
274
+ if (exc instanceof ScriptOutputApiError) {
275
+ throw apiErrorToCli("SCRIPT API BLOCKED: Revision query failed", exc);
276
+ }
277
+ throw exc;
278
+ }
279
+ }
280
+ export async function loadRemoteScript(opts, workspace) {
281
+ const client = scriptOutputClient(opts);
282
+ let script;
283
+ let revision;
284
+ try {
285
+ script = await client.getScript();
286
+ revision = await client.getRevision();
287
+ }
288
+ catch (exc) {
289
+ if (exc instanceof ScriptOutputApiError) {
290
+ throw apiErrorToCli("SCRIPT API BLOCKED: Script query failed", exc);
291
+ }
292
+ throw exc;
293
+ }
294
+ if (script === null) {
295
+ throw new CliError("SCRIPT BLOCKED: Final script not found", "No script has been published for this project.", {
296
+ exitCode: EXIT_INPUT,
297
+ required: ["existing script-output project document"],
298
+ received: [`projectGroupNo=${client.projectGroupNo}`],
299
+ nextSteps: ["Run `scriptctl direct export` first, or pass `--script-path` to edit a local intermediate script JSON."],
300
+ errorCode: "SCRIPT_NOT_FOUND",
301
+ });
302
+ }
303
+ if (!isDict(script)) {
304
+ throw new CliError("SCRIPT BLOCKED: script root invalid", "script root invalid.", {
305
+ exitCode: EXIT_USAGE,
306
+ required: ["script root object"],
307
+ received: [typeof script],
308
+ nextSteps: ["Replace the final script with a valid script document object."],
309
+ errorCode: "SCRIPT_ROOT_INVALID",
310
+ });
311
+ }
312
+ return new ScriptEditSession({
313
+ workspace,
314
+ script,
315
+ client,
316
+ projectGroupNo: client.projectGroupNo,
317
+ revision: Number((revision ?? {})["revision"] ?? 0),
318
+ });
319
+ }
320
+ export async function loadScriptForEdit(opts) {
321
+ const workspace = strOf(opts["workspace_path"] || "workspace");
322
+ // --draft is the blessed entrance for editing the direct intermediate draft:
323
+ // it resolves to script.initial.json without exposing the storage path to the
324
+ // agent. It is mutually exclusive with the raw --script-path and the DB-mode
325
+ // --project-group-no (both name a different target).
326
+ // Single conflict gate (shared with commandCreate): rejects any contradictory
327
+ // mix of --script-path / --draft / --remote / --local / --project-group-no
328
+ // BEFORE we branch file-vs-store, so a store flag can never be silently
329
+ // dropped on the local-file path.
330
+ assertTargetCoherent(opts);
331
+ const draft = Boolean(opts["draft"]);
332
+ let draftPath = null;
333
+ if (draft) {
334
+ draftPath = path.join(directDir(workspace), "script.initial.json");
335
+ if (!exists(draftPath)) {
336
+ throw new CliError("SCRIPT BLOCKED: Draft script not found", "Direct draft script not found.", {
337
+ exitCode: EXIT_INPUT,
338
+ required: ["a direct draft produced by `direct init`"],
339
+ received: [draftPath],
340
+ nextSteps: ["Run `scriptctl direct init` first, then edit with --draft."],
341
+ errorCode: "SCRIPT_NOT_FOUND",
342
+ });
343
+ }
344
+ }
345
+ // Resolve the local file from --draft or --script-path WITHOUT mutating opts:
346
+ // commandAlias loads twice with the same opts, and writing script_path back
347
+ // would make the second load see a phantom --script-path and reject --draft.
348
+ if (!draftPath && !opts["script_path"]) {
349
+ return loadRemoteScript(opts, workspace);
350
+ }
351
+ const p = draftPath ?? scriptJsonPath(opts);
352
+ if (!exists(p)) {
353
+ throw new CliError("SCRIPT BLOCKED: Local script file not found", "Local script file not found.", {
354
+ exitCode: EXIT_INPUT,
355
+ required: ["--script-path existing local script JSON"],
356
+ received: [p],
357
+ nextSteps: ["Pass --script-path to an existing local intermediate script JSON, or omit --script-path to use DB-backed script-output."],
358
+ errorCode: "SCRIPT_NOT_FOUND",
359
+ });
360
+ }
361
+ let data;
362
+ try {
363
+ data = readJson(p);
364
+ }
365
+ catch (exc) {
366
+ throw new CliError("SCRIPT BLOCKED: script JSON invalid", "script JSON invalid.", {
367
+ exitCode: EXIT_INPUT,
368
+ required: ["valid JSON"],
369
+ received: [`${p}: ${exc.message}`],
370
+ nextSteps: ["Fix the local script JSON syntax before editing."],
371
+ errorCode: "SCRIPT_JSON_INVALID",
372
+ });
373
+ }
374
+ if (!isDict(data)) {
375
+ throw new CliError("SCRIPT BLOCKED: script root invalid", "script root invalid.", {
376
+ exitCode: EXIT_USAGE,
377
+ required: ["script root object"],
378
+ received: [Array.isArray(data) ? "array" : typeof data],
379
+ nextSteps: ["Use a valid script document object."],
380
+ errorCode: "SCRIPT_ROOT_INVALID",
381
+ });
382
+ }
383
+ return new ScriptEditSession({ workspace, scriptPath: p, script: data });
384
+ }
385
+ export function validateSession(session, opts = {}) {
386
+ const requireSource = opts.requireSource ?? false;
387
+ if (!session.remote) {
388
+ // Validate the IN-MEMORY script, not what's on disk. On a dry-run the edits
389
+ // live only in session.script (never written), so reading session.scriptPath
390
+ // would validate the stale pre-edit file and report a misleading "would pass".
391
+ return validateScript(session.workspace, null, { requireSource, scriptData: session.script });
392
+ }
393
+ const tmpPath = path.join(os.tmpdir(), `scriptctl-db-script-${randomUUID()}.json`);
394
+ try {
395
+ fs.writeFileSync(tmpPath, JSON.stringify(session.script, null, 2) + "\n", "utf-8");
396
+ const validation = validateScript(session.workspace, tmpPath, { requireSource });
397
+ validation["script_path"] = session.artifactLabel;
398
+ writeJson(path.join(directDir(session.workspace), "validation.json"), validation);
399
+ return validation;
400
+ }
401
+ finally {
402
+ try {
403
+ fs.unlinkSync(tmpPath);
404
+ }
405
+ catch {
406
+ // ignore
407
+ }
408
+ }
409
+ }
410
+ function validationIssuePath(issue) {
411
+ if (issue["path"])
412
+ return strOf(issue["path"]);
413
+ const parts = [];
414
+ if (issue["episode"] !== null && issue["episode"] !== undefined)
415
+ parts.push(strOf(issue["episode"]));
416
+ if (issue["scene"] !== null && issue["scene"] !== undefined)
417
+ parts.push(strOf(issue["scene"]));
418
+ if (issue["action_index"] !== null && issue["action_index"] !== undefined)
419
+ parts.push(`action[${issue["action_index"]}]`);
420
+ return parts.length > 0 ? parts.join("/") : null;
421
+ }
422
+ function validationIssueSeverity(raw) {
423
+ const severity = strOf(raw || "info");
424
+ if (severity === "blocking" || severity === "error")
425
+ return "error";
426
+ if (severity === "warning")
427
+ return "warning";
428
+ return "info";
429
+ }
430
+ function validationToApiPayload(validation) {
431
+ const issues = asList(validation["issues"]);
432
+ const status = validation["passed"] ? "valid" : "invalid";
433
+ const summary = {
434
+ passed: Boolean(validation["passed"]),
435
+ hasBlocking: Boolean(validation["has_blocking"]),
436
+ stats: validation["stats"] ?? {},
437
+ issueCount: issues.length,
438
+ };
439
+ const apiIssues = [];
440
+ for (const issue of issues) {
441
+ if (!isDict(issue))
442
+ continue;
443
+ const payload = { ...issue };
444
+ for (const key of ["severity", "code", "path", "summary", "repair_hint"])
445
+ delete payload[key];
446
+ apiIssues.push({
447
+ severity: validationIssueSeverity(issue["severity"]),
448
+ code: strOf(issue["code"] || "SCRIPT_VALIDATION_ISSUE"),
449
+ path: validationIssuePath(issue),
450
+ summary: strOf(issue["summary"]),
451
+ repairHint: issue["repair_hint"],
452
+ payload,
453
+ });
454
+ }
455
+ return [status, summary, apiIssues];
456
+ }
457
+ export async function syncValidationResult(session, validation, revision) {
458
+ if (!session.remote || session.client === null)
459
+ return;
460
+ const targetRevision = Number(revision ?? session.revision ?? 0);
461
+ if (targetRevision <= 0)
462
+ return;
463
+ const [status, summary, issues] = validationToApiPayload(validation);
464
+ try {
465
+ await session.client.saveValidationResult({
466
+ revision: targetRevision,
467
+ validationStatus: status,
468
+ validationSummary: summary,
469
+ issues,
470
+ });
471
+ }
472
+ catch (exc) {
473
+ if (exc instanceof ScriptOutputApiError) {
474
+ throw apiErrorToCli("SCRIPT API BLOCKED: Validation sync failed", exc);
475
+ }
476
+ throw exc;
477
+ }
478
+ }
479
+ // Idempotency key for gateway writes. Returns the agent-provided --request-id
480
+ // when present, otherwise derives a deterministic key from (op, post-mutation
481
+ // script content). baseRevision is intentionally NOT in the hash: in a
482
+ // partial-success retry the client reloads at a new baseRevision but the
483
+ // post-mutation script is identical, so the hash matches and the gateway can
484
+ // dedupe. The cost of including baseRevision (an old version of this code)
485
+ // was that retries produced different ids and committed redundant no-op
486
+ // revisions to the gateway history.
487
+ export function requestIdForScriptWrite(opts, op, payload) {
488
+ const explicit = strOf(opts["request_id"]).trim();
489
+ if (explicit)
490
+ return explicit;
491
+ const canonical = JSON.stringify(sortDeep({
492
+ op,
493
+ script: payload.script,
494
+ }));
495
+ return `scriptctl:${op}:${sha256Text(canonical)}`;
496
+ }
497
+ export async function saveScriptSession(session, opts, op) {
498
+ if (!session.remote) {
499
+ writeJson(session.scriptPath, session.script);
500
+ return [null, false];
501
+ }
502
+ if (session.client === null)
503
+ throw new Error("remote script session missing client");
504
+ const baseRevision = Number(session.revision ?? 0);
505
+ const requestId = requestIdForScriptWrite(opts, op, { script: session.script });
506
+ let res;
507
+ try {
508
+ res = await session.client.replaceScript({
509
+ requestId,
510
+ baseRevision,
511
+ script: session.script,
512
+ source: "ctl",
513
+ });
514
+ }
515
+ catch (exc) {
516
+ if (exc instanceof ScriptOutputApiError) {
517
+ throw apiErrorToCli("SCRIPT API BLOCKED: Script write failed", exc);
518
+ }
519
+ throw exc;
520
+ }
521
+ session.revision = Number(res["revision"] ?? session.revision ?? 0);
522
+ return [session.revision, Boolean(res["idempotent"])];
523
+ }
524
+ export function scriptSourceText(workspace) {
525
+ const sourcePath = path.join(workspace, "source.txt");
526
+ return exists(sourcePath) ? readText(sourcePath) : "";
527
+ }
528
+ export function patchOperationsFromPayload(payload) {
529
+ let operations;
530
+ if (isList(payload)) {
531
+ operations = payload;
532
+ }
533
+ else if (isDict(payload) && isList(payload["ops"])) {
534
+ operations = payload["ops"];
535
+ }
536
+ else if (isDict(payload) && isList(payload["operations"])) {
537
+ operations = payload["operations"];
538
+ }
539
+ else if (isDict(payload)) {
540
+ operations = [payload];
541
+ }
542
+ else {
543
+ throw new CliError("PATCH BLOCKED: Patch schema invalid", "Patch schema invalid.", {
544
+ exitCode: EXIT_USAGE,
545
+ required: ["object, array, object with ops[], or object with operations[]"],
546
+ received: [Array.isArray(payload) ? "array" : typeof payload],
547
+ nextSteps: ["Fix patch JSON and rerun patch."],
548
+ });
549
+ }
550
+ if (operations.some((op) => !isDict(op))) {
551
+ throw new CliError("PATCH BLOCKED: Patch operation invalid", "Patch operation invalid.", {
552
+ exitCode: EXIT_USAGE,
553
+ required: ["each operation must be an object"],
554
+ received: [JSON.stringify(operations).slice(0, 500)],
555
+ nextSteps: ["Fix patch JSON and rerun patch."],
556
+ });
557
+ }
558
+ return operations;
559
+ }
560
+ // ---------------------------------------------------------------------------
561
+ // commandScriptValidate / commandScriptInspect
562
+ // ---------------------------------------------------------------------------
563
+ // ===========================================================================
564
+ // do — verb-script transaction (the agent-friendly alternative to JSON patch)
565
+ // ===========================================================================
566
+ // Minimal shell-like tokenizer: whitespace-split honoring "..."/'...' quoting
567
+ // and backslash escapes. Enough to carry screenplay content with spaces/quotes.
568
+ //# 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]>;