@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.
- package/dist/cli.js +99 -11
- package/dist/cli.js.map +1 -1
- package/dist/common.d.ts +4 -1
- package/dist/common.js +37 -27
- package/dist/common.js.map +1 -1
- package/dist/domain/direct-core.d.ts +6 -3
- package/dist/domain/direct-core.js +89 -72
- package/dist/domain/direct-core.js.map +1 -1
- package/dist/domain/script/address.d.ts +30 -0
- package/dist/domain/script/address.js +141 -0
- package/dist/domain/script/address.js.map +1 -0
- package/dist/domain/script/lookups.d.ts +33 -0
- package/dist/domain/script/lookups.js +309 -0
- package/dist/domain/script/lookups.js.map +1 -0
- package/dist/domain/script/patch/apply.d.ts +4 -0
- package/dist/domain/script/patch/apply.js +38 -0
- package/dist/domain/script/patch/apply.js.map +1 -0
- package/dist/domain/script/patch/helpers.d.ts +11 -0
- package/dist/domain/script/patch/helpers.js +141 -0
- package/dist/domain/script/patch/helpers.js.map +1 -0
- package/dist/domain/script/patch/ops-action.d.ts +12 -0
- package/dist/domain/script/patch/ops-action.js +371 -0
- package/dist/domain/script/patch/ops-action.js.map +1 -0
- package/dist/domain/script/patch/ops-asset.d.ts +13 -0
- package/dist/domain/script/patch/ops-asset.js +363 -0
- package/dist/domain/script/patch/ops-asset.js.map +1 -0
- package/dist/domain/script/patch/ops-dialogue.d.ts +5 -0
- package/dist/domain/script/patch/ops-dialogue.js +233 -0
- package/dist/domain/script/patch/ops-dialogue.js.map +1 -0
- package/dist/domain/script/patch/ops-meta.d.ts +3 -0
- package/dist/domain/script/patch/ops-meta.js +47 -0
- package/dist/domain/script/patch/ops-meta.js.map +1 -0
- package/dist/domain/script/patch/ops-scene.d.ts +6 -0
- package/dist/domain/script/patch/ops-scene.js +345 -0
- package/dist/domain/script/patch/ops-scene.js.map +1 -0
- package/dist/domain/script/patch/ops-state.d.ts +8 -0
- package/dist/domain/script/patch/ops-state.js +146 -0
- package/dist/domain/script/patch/ops-state.js.map +1 -0
- package/dist/domain/script/patch/registry.d.ts +2 -0
- package/dist/domain/script/patch/registry.js +50 -0
- package/dist/domain/script/patch/registry.js.map +1 -0
- package/dist/domain/script/patch/types.d.ts +10 -0
- package/dist/domain/script/patch/types.js +2 -0
- package/dist/domain/script/patch/types.js.map +1 -0
- package/dist/domain/script/refs.d.ts +4 -0
- package/dist/domain/script/refs.js +152 -0
- package/dist/domain/script/refs.js.map +1 -0
- package/dist/domain/script/schema.d.ts +6 -0
- package/dist/domain/script/schema.js +53 -0
- package/dist/domain/script/schema.js.map +1 -0
- package/dist/domain/script/selector.d.ts +45 -0
- package/dist/domain/script/selector.js +187 -0
- package/dist/domain/script/selector.js.map +1 -0
- package/dist/domain/script/shared.d.ts +15 -0
- package/dist/domain/script/shared.js +37 -0
- package/dist/domain/script/shared.js.map +1 -0
- package/dist/domain/script/validate.d.ts +22 -0
- package/dist/domain/script/validate.js +844 -0
- package/dist/domain/script/validate.js.map +1 -0
- package/dist/help-text.js +21 -4
- package/dist/help-text.js.map +1 -1
- package/dist/infra/providers.d.ts +2 -0
- package/dist/infra/providers.js +81 -35
- package/dist/infra/providers.js.map +1 -1
- package/dist/output.d.ts +1 -1
- package/dist/output.js +11 -1
- package/dist/output.js.map +1 -1
- package/dist/usecases/direct.js +1 -1
- package/dist/usecases/direct.js.map +1 -1
- package/dist/usecases/parse.js +1 -1
- package/dist/usecases/parse.js.map +1 -1
- package/dist/usecases/script/actions.d.ts +3 -0
- package/dist/usecases/script/actions.js +71 -0
- package/dist/usecases/script/actions.js.map +1 -0
- package/dist/usecases/script/actor.d.ts +3 -0
- package/dist/usecases/script/actor.js +27 -0
- package/dist/usecases/script/actor.js.map +1 -0
- package/dist/usecases/script/actors.d.ts +3 -0
- package/dist/usecases/script/actors.js +15 -0
- package/dist/usecases/script/actors.js.map +1 -0
- package/dist/usecases/script/add-actor.d.ts +3 -0
- package/dist/usecases/script/add-actor.js +13 -0
- package/dist/usecases/script/add-actor.js.map +1 -0
- package/dist/usecases/script/add-episode.d.ts +3 -0
- package/dist/usecases/script/add-episode.js +9 -0
- package/dist/usecases/script/add-episode.js.map +1 -0
- package/dist/usecases/script/add-location.d.ts +3 -0
- package/dist/usecases/script/add-location.js +11 -0
- package/dist/usecases/script/add-location.js.map +1 -0
- package/dist/usecases/script/add-prop.d.ts +3 -0
- package/dist/usecases/script/add-prop.js +11 -0
- package/dist/usecases/script/add-prop.js.map +1 -0
- package/dist/usecases/script/add-speaker.d.ts +3 -0
- package/dist/usecases/script/add-speaker.js +22 -0
- package/dist/usecases/script/add-speaker.js.map +1 -0
- package/dist/usecases/script/alias.d.ts +3 -0
- package/dist/usecases/script/alias.js +40 -0
- package/dist/usecases/script/alias.js.map +1 -0
- package/dist/usecases/script/assets.d.ts +3 -0
- package/dist/usecases/script/assets.js +21 -0
- package/dist/usecases/script/assets.js.map +1 -0
- package/dist/usecases/script/context.d.ts +3 -0
- package/dist/usecases/script/context.js +20 -0
- package/dist/usecases/script/context.js.map +1 -0
- package/dist/usecases/script/create.d.ts +3 -0
- package/dist/usecases/script/create.js +81 -0
- package/dist/usecases/script/create.js.map +1 -0
- package/dist/usecases/script/delete.d.ts +3 -0
- package/dist/usecases/script/delete.js +79 -0
- package/dist/usecases/script/delete.js.map +1 -0
- package/dist/usecases/script/describe.d.ts +3 -0
- package/dist/usecases/script/describe.js +31 -0
- package/dist/usecases/script/describe.js.map +1 -0
- package/dist/usecases/script/dialogue.d.ts +3 -0
- package/dist/usecases/script/dialogue.js +28 -0
- package/dist/usecases/script/dialogue.js.map +1 -0
- package/dist/usecases/script/do.d.ts +3 -0
- package/dist/usecases/script/do.js +130 -0
- package/dist/usecases/script/do.js.map +1 -0
- package/dist/usecases/script/episodes.d.ts +3 -0
- package/dist/usecases/script/episodes.js +36 -0
- package/dist/usecases/script/episodes.js.map +1 -0
- package/dist/usecases/script/export.d.ts +3 -0
- package/dist/usecases/script/export.js +117 -0
- package/dist/usecases/script/export.js.map +1 -0
- package/dist/usecases/script/insert.d.ts +3 -0
- package/dist/usecases/script/insert.js +87 -0
- package/dist/usecases/script/insert.js.map +1 -0
- package/dist/usecases/script/issues.d.ts +3 -0
- package/dist/usecases/script/issues.js +27 -0
- package/dist/usecases/script/issues.js.map +1 -0
- package/dist/usecases/script/lib.d.ts +77 -0
- package/dist/usecases/script/lib.js +849 -0
- package/dist/usecases/script/lib.js.map +1 -0
- package/dist/usecases/script/locations.d.ts +3 -0
- package/dist/usecases/script/locations.js +15 -0
- package/dist/usecases/script/locations.js.map +1 -0
- package/dist/usecases/script/merge.d.ts +3 -0
- package/dist/usecases/script/merge.js +43 -0
- package/dist/usecases/script/merge.js.map +1 -0
- package/dist/usecases/script/move.d.ts +3 -0
- package/dist/usecases/script/move.js +33 -0
- package/dist/usecases/script/move.js.map +1 -0
- package/dist/usecases/script/overlap.d.ts +3 -0
- package/dist/usecases/script/overlap.js +21 -0
- package/dist/usecases/script/overlap.js.map +1 -0
- package/dist/usecases/script/props.d.ts +3 -0
- package/dist/usecases/script/props.js +15 -0
- package/dist/usecases/script/props.js.map +1 -0
- package/dist/usecases/script/refs.d.ts +3 -0
- package/dist/usecases/script/refs.js +61 -0
- package/dist/usecases/script/refs.js.map +1 -0
- package/dist/usecases/script/rename.d.ts +3 -0
- package/dist/usecases/script/rename.js +17 -0
- package/dist/usecases/script/rename.js.map +1 -0
- package/dist/usecases/script/replace.d.ts +3 -0
- package/dist/usecases/script/replace.js +35 -0
- package/dist/usecases/script/replace.js.map +1 -0
- package/dist/usecases/script/role.d.ts +3 -0
- package/dist/usecases/script/role.js +17 -0
- package/dist/usecases/script/role.js.map +1 -0
- package/dist/usecases/script/scenes.d.ts +3 -0
- package/dist/usecases/script/scenes.js +45 -0
- package/dist/usecases/script/scenes.js.map +1 -0
- package/dist/usecases/script/script-patch.d.ts +3 -0
- package/dist/usecases/script/script-patch.js +187 -0
- package/dist/usecases/script/script-patch.js.map +1 -0
- package/dist/usecases/script/script-validate.d.ts +3 -0
- package/dist/usecases/script/script-validate.js +30 -0
- package/dist/usecases/script/script-validate.js.map +1 -0
- package/dist/usecases/script/session.d.ts +44 -0
- package/dist/usecases/script/session.js +527 -0
- package/dist/usecases/script/session.js.map +1 -0
- package/dist/usecases/script/speakers.d.ts +3 -0
- package/dist/usecases/script/speakers.js +28 -0
- package/dist/usecases/script/speakers.js.map +1 -0
- package/dist/usecases/script/split.d.ts +3 -0
- package/dist/usecases/script/split.js +37 -0
- package/dist/usecases/script/split.js.map +1 -0
- package/dist/usecases/script/state-add.d.ts +3 -0
- package/dist/usecases/script/state-add.js +23 -0
- package/dist/usecases/script/state-add.js.map +1 -0
- package/dist/usecases/script/state-change.d.ts +3 -0
- package/dist/usecases/script/state-change.js +24 -0
- package/dist/usecases/script/state-change.js.map +1 -0
- package/dist/usecases/script/state-delete.d.ts +3 -0
- package/dist/usecases/script/state-delete.js +23 -0
- package/dist/usecases/script/state-delete.js.map +1 -0
- package/dist/usecases/script/state-rename.d.ts +3 -0
- package/dist/usecases/script/state-rename.js +17 -0
- package/dist/usecases/script/state-rename.js.map +1 -0
- package/dist/usecases/script/summary.d.ts +3 -0
- package/dist/usecases/script/summary.js +45 -0
- package/dist/usecases/script/summary.js.map +1 -0
- package/dist/usecases/script/transition.d.ts +3 -0
- package/dist/usecases/script/transition.js +24 -0
- package/dist/usecases/script/transition.js.map +1 -0
- package/dist/usecases/script/type.d.ts +3 -0
- package/dist/usecases/script/type.js +24 -0
- package/dist/usecases/script/type.js.map +1 -0
- package/dist/usecases/script/worldview.d.ts +3 -0
- package/dist/usecases/script/worldview.js +18 -0
- package/dist/usecases/script/worldview.js.map +1 -0
- package/package.json +1 -1
- package/dist/domain/script-core.d.ts +0 -78
- package/dist/domain/script-core.js +0 -3026
- package/dist/domain/script-core.js.map +0 -1
- package/dist/usecases/script.d.ts +0 -67
- package/dist/usecases/script.js +0 -2348
- 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,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,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"}
|