@lingjingai/scriptctl 0.56.0 → 0.57.1

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 (33) hide show
  1. package/changes/0.57.0.md +14 -0
  2. package/changes/0.57.1.md +13 -0
  3. package/dist/cli/register-workflows.js +8 -0
  4. package/dist/cli/register-workflows.js.map +1 -1
  5. package/dist/domain/ingest/video-apply.js +15 -1
  6. package/dist/domain/ingest/video-apply.js.map +1 -1
  7. package/dist/domain/ingest/video-context.d.ts +2 -0
  8. package/dist/domain/ingest/video-context.js +8 -1
  9. package/dist/domain/ingest/video-context.js.map +1 -1
  10. package/dist/domain/ingest/video-serial-md.js +14 -1
  11. package/dist/domain/ingest/video-serial-md.js.map +1 -1
  12. package/dist/infra/ingest/workspace-lock.d.ts +1 -0
  13. package/dist/infra/ingest/workspace-lock.js +32 -0
  14. package/dist/infra/ingest/workspace-lock.js.map +1 -0
  15. package/dist/llm/tasks/ingest/video-serial.js +13 -1
  16. package/dist/llm/tasks/ingest/video-serial.js.map +1 -1
  17. package/dist/usecases/ingest/command.js +5 -0
  18. package/dist/usecases/ingest/command.js.map +1 -1
  19. package/dist/usecases/ingest/skip-video-episode.d.ts +4 -0
  20. package/dist/usecases/ingest/skip-video-episode.js +112 -0
  21. package/dist/usecases/ingest/skip-video-episode.js.map +1 -0
  22. package/dist/usecases/ingest/status.d.ts +12 -0
  23. package/dist/usecases/ingest/status.js +36 -8
  24. package/dist/usecases/ingest/status.js.map +1 -1
  25. package/dist/usecases/ingest/video-pipeline.d.ts +38 -0
  26. package/dist/usecases/ingest/video-pipeline.js +83 -34
  27. package/dist/usecases/ingest/video-pipeline.js.map +1 -1
  28. package/dist/usecases/ingest/video-skip-state.d.ts +29 -0
  29. package/dist/usecases/ingest/video-skip-state.js +148 -0
  30. package/dist/usecases/ingest/video-skip-state.js.map +1 -0
  31. package/package.json +1 -1
  32. package/skills/scriptctl/SKILL.md +2 -2
  33. package/skills/scriptctl/references/ingest-workflow.md +26 -4
@@ -0,0 +1,112 @@
1
+ import * as path from "node:path";
2
+ import { CliError, EXIT_INPUT, EXIT_OK } from "../../common.js";
3
+ import { emptyContext } from "../../domain/ingest/video-context.js";
4
+ import { emptyV4IdentityMap } from "../../domain/script/v4/from-v3.js";
5
+ import { withIngestWorkspaceLock } from "../../infra/ingest/workspace-lock.js";
6
+ import { WorkspaceStore } from "../../infra/ingest/workspace-store.js";
7
+ import { parseIngestErrorSidecar } from "./failure.js";
8
+ import { deriveIngestStatus } from "./status.js";
9
+ import { deriveVideoTitle, migrateVideoManifest, publishFinalizedVideoWorkspace, readCurrentVideoManifest, } from "./video-pipeline.js";
10
+ import { assertVideoSkipSources, readVideoSkipLedger, reconcileVideoSkips, writeVideoSkipLedger, } from "./video-skip-state.js";
11
+ function inputError(message, code, hint, actual) {
12
+ return new CliError(message, {
13
+ exitCode: EXIT_INPUT,
14
+ errorCode: code,
15
+ hint,
16
+ data: { actual },
17
+ });
18
+ }
19
+ function episodeOf(value) {
20
+ const episode = Number(value);
21
+ if (!Number.isInteger(episode) || episode <= 0) {
22
+ throw inputError("--episode must be a positive integer.", "INGEST_SKIP_EPISODE_INVALID", "Pass the current next_episode from `scriptctl ingest status`.", [String(value)]);
23
+ }
24
+ return episode;
25
+ }
26
+ async function skipVideoEpisodeUnlocked(workspacePath, episode, reason) {
27
+ const store = new WorkspaceStore(workspacePath);
28
+ if (!store.has("manifest.json")) {
29
+ throw inputError("The ingest workspace does not exist.", "INGEST_SKIP_WORKSPACE_MISSING", "Run video ingest first, then retry the failed episode or skip it.", [workspacePath]);
30
+ }
31
+ const header = store.readJson("manifest.json");
32
+ if (header.source?.kind === "text") {
33
+ throw inputError("Only video ingest episodes can be skipped.", "INGEST_SKIP_WRONG_PIPELINE", "Use skip only with a video ingest workspace.", [workspacePath]);
34
+ }
35
+ const manifest = readCurrentVideoManifest(store);
36
+ if (!manifest) {
37
+ throw inputError("The video ingest manifest is missing.", "INGEST_SKIP_WORKSPACE_MISSING", "Run video ingest first.", [workspacePath]);
38
+ }
39
+ const sourceEpisode = manifest.episodes.find((candidate) => candidate.episode === episode);
40
+ if (!sourceEpisode) {
41
+ throw inputError("The requested episode is not in the video source.", "INGEST_SKIP_EPISODE_NOT_FOUND", "Pass an episode listed in manifest.json.", [`episode=${episode}`]);
42
+ }
43
+ const ledger = readVideoSkipLedger(store);
44
+ assertVideoSkipSources(ledger.episodes, manifest.episodes);
45
+ let ctx = store.has("context.json") ? store.readJson("context.json") : emptyContext();
46
+ const existing = ledger.episodes.find((record) => record.episode === episode);
47
+ if (existing) {
48
+ const currentManifest = migrateVideoManifest(store, manifest);
49
+ ctx = reconcileVideoSkips(store, ctx, ledger.episodes);
50
+ const identityMap = store.has("v4_identity_map.json")
51
+ ? store.readJson("v4_identity_map.json")
52
+ : emptyV4IdentityMap();
53
+ publishFinalizedVideoWorkspace(store, currentManifest.episodes, ctx, deriveVideoTitle(currentManifest.source.path), identityMap, ledger.episodes);
54
+ return false;
55
+ }
56
+ const nextEpisode = ctx.lastEpisode + 1;
57
+ if (episode !== nextEpisode) {
58
+ throw inputError("Only the next unresolved video episode can be skipped.", "INGEST_SKIP_NOT_NEXT", "Read status.next_episode and skip exactly that episode.", [`requested=${episode}`, `next_episode=${nextEpisode}`]);
59
+ }
60
+ const episodeRel = `ep/ep_${String(episode).padStart(3, "0")}`;
61
+ if (store.has(`${episodeRel}.json`)) {
62
+ throw inputError("A parsed episode cannot be skipped.", "INGEST_SKIP_ALREADY_PARSED", "Continue ingest from the next unresolved episode.", [`episode=${episode}`]);
63
+ }
64
+ if (!store.has(`${episodeRel}.error.json`)) {
65
+ throw inputError("The episode has no recorded ingest failure.", "INGEST_SKIP_FAILURE_REQUIRED", "Run ingest for this episode first; a typed error sidecar is required before manual skip.", [`episode=${episode}`]);
66
+ }
67
+ const sidecar = parseIngestErrorSidecar(store.readJson(`${episodeRel}.error.json`));
68
+ if (!sidecar || sidecar.unit.episode !== episode) {
69
+ throw inputError("The episode error sidecar is invalid.", "INGEST_SKIP_FAILURE_INVALID", "Regenerate the typed failure by rerunning video ingest.", [`${episodeRel}.error.json`]);
70
+ }
71
+ const record = {
72
+ episode,
73
+ skipped_at: new Date().toISOString(),
74
+ reason,
75
+ source_sha256: sourceEpisode.sha256,
76
+ failure: sidecar.failure,
77
+ attempts: sidecar.attempts,
78
+ };
79
+ const currentManifest = migrateVideoManifest(store, manifest);
80
+ writeVideoSkipLedger(store, { schema_version: 1, episodes: [...ledger.episodes, record] });
81
+ ctx = reconcileVideoSkips(store, ctx, [...ledger.episodes, record]);
82
+ const identityMap = store.has("v4_identity_map.json")
83
+ ? store.readJson("v4_identity_map.json")
84
+ : emptyV4IdentityMap();
85
+ publishFinalizedVideoWorkspace(store, currentManifest.episodes, ctx, deriveVideoTitle(currentManifest.source.path), identityMap, [...ledger.episodes, record]);
86
+ return true;
87
+ }
88
+ export async function commandSkipVideoEpisode(opts) {
89
+ const workspacePath = path.resolve(typeof opts["workspace_path"] === "string" ? opts["workspace_path"] : "workspace");
90
+ const episode = episodeOf(opts["episode"]);
91
+ const reason = typeof opts["reason"] === "string" ? opts["reason"].trim() : "";
92
+ if (!reason) {
93
+ throw inputError("--reason is required.", "INGEST_SKIP_REASON_REQUIRED", "Record why this episode cannot be parsed.", ["--reason <text>"]);
94
+ }
95
+ const changed = await withIngestWorkspaceLock(workspacePath, () => skipVideoEpisodeUnlocked(workspacePath, episode, reason));
96
+ const status = deriveIngestStatus(workspacePath);
97
+ return [{
98
+ text: changed
99
+ ? `Episode ${episode} skipped; ingest can continue at episode ${status.next_episode ?? "end"}.`
100
+ : `Episode ${episode} was already skipped; no changes made.`,
101
+ data: {
102
+ workspace: workspacePath,
103
+ episode,
104
+ changed,
105
+ skipped_episodes: status.skipped_episodes ?? [],
106
+ complete: status.complete ?? false,
107
+ next_episode: status.next_episode ?? null,
108
+ script_path: path.join(workspacePath, "script.json"),
109
+ },
110
+ }, EXIT_OK];
111
+ }
112
+ //# sourceMappingURL=skip-video-episode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skip-video-episode.js","sourceRoot":"","sources":["../../../src/usecases/ingest/skip-video-episode.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,13 @@ export interface IngestFailureSummary {
21
21
  terminal: number;
22
22
  by_type: Partial<Record<FailureType, number>>;
23
23
  }
24
+ export interface IngestSkipSummary {
25
+ episode: number;
26
+ skipped_at: string;
27
+ reason: string;
28
+ failure_type: FailureType;
29
+ failure_code: string;
30
+ }
24
31
  export interface IngestStatus {
25
32
  workspace: string;
26
33
  exists: boolean;
@@ -43,6 +50,11 @@ export interface IngestStatus {
43
50
  remaining?: number;
44
51
  complete?: boolean;
45
52
  next_episode?: number | null;
53
+ parsed?: number;
54
+ skipped?: number;
55
+ skipped_episodes?: number[];
56
+ has_skips?: boolean;
57
+ skips?: IngestSkipSummary[];
46
58
  }
47
59
  export declare function deriveIngestStatus(workspacePath: string): IngestStatus;
48
60
  export declare function commandIngestStatus(opts: Dict): [CommandOutput, number];
@@ -8,8 +8,10 @@ import * as fs from "node:fs";
8
8
  import * as path from "node:path";
9
9
  import { EXIT_OK } from "../../common.js";
10
10
  import { createOperationalFailure, } from "../../failures.js";
11
+ import { WorkspaceStore } from "../../infra/ingest/workspace-store.js";
11
12
  import { parseIngestErrorSidecar, } from "./failure.js";
12
13
  import { summarizeTimings } from "./timings.js";
14
+ import { readVideoSkipLedger } from "./video-skip-state.js";
13
15
  const strOf = (v) => (v === null || v === undefined ? "" : String(v));
14
16
  function readTimings(root) {
15
17
  try {
@@ -65,8 +67,11 @@ function legacyError(pass, unit, message) {
65
67
  };
66
68
  }
67
69
  // Collect the error sidecars a failed run leaves behind (cleared on unit success).
68
- function collectErrors(root, pass) {
69
- return listSuffix(root, pass, ".error.json").map((name) => {
70
+ function collectErrors(root, pass, ignoredUnits = new Set()) {
71
+ return listSuffix(root, pass, ".error.json").filter((name) => {
72
+ const unit = name.replace(/\.error\.json$/, "");
73
+ return !ignoredUnits.has(unit);
74
+ }).map((name) => {
70
75
  const unit = name.replace(/\.error\.json$/, "");
71
76
  try {
72
77
  const value = JSON.parse(fs.readFileSync(path.join(root, pass, name), "utf-8"));
@@ -139,16 +144,20 @@ function textPasses(root, manifest) {
139
144
  ];
140
145
  return { passes, units: normalize };
141
146
  }
142
- function videoPasses(root, manifest) {
147
+ function videoPasses(root, manifest, skips) {
143
148
  const total = manifest.episodes?.length ?? 0;
149
+ const skippedEpisodes = new Set(skips.map((record) => record.episode));
144
150
  let acceptedPrefix = 0;
151
+ let parsed = 0;
145
152
  try {
146
153
  const context = JSON.parse(fs.readFileSync(path.join(root, "context.json"), "utf-8"));
147
154
  const lastEpisode = typeof context.lastEpisode === "number" && Number.isInteger(context.lastEpisode)
148
155
  ? Math.min(Math.max(context.lastEpisode, 0), total)
149
156
  : 0;
150
157
  for (let episode = 1; episode <= lastEpisode; episode += 1) {
151
- if (!has(root, `ep/ep_${String(episode).padStart(3, "0")}.json`))
158
+ if (has(root, `ep/ep_${String(episode).padStart(3, "0")}.json`))
159
+ parsed += 1;
160
+ else if (!skippedEpisodes.has(episode))
152
161
  break;
153
162
  acceptedPrefix = episode;
154
163
  }
@@ -161,13 +170,16 @@ function videoPasses(root, manifest) {
161
170
  const serial = {
162
171
  total,
163
172
  done: acceptedPrefix,
164
- failed: countSuffix(root, "ep", ".error.json"),
173
+ failed: listSuffix(root, "ep", ".error.json").filter((name) => {
174
+ const match = name.match(/^ep_(\d+)\.error\.json$/);
175
+ return !match || !skippedEpisodes.has(Number(match[1]));
176
+ }).length,
165
177
  };
166
178
  const passes = [
167
179
  { name: "serial", done: total > 0 && serial.done >= total && serial.failed === 0, unit: serial },
168
180
  { name: "finalize", done: readFinalizedVideoEpisodeCount(root) === acceptedPrefix },
169
181
  ];
170
- return { passes, units: serial };
182
+ return { passes, units: serial, parsed };
171
183
  }
172
184
  export function deriveIngestStatus(workspacePath) {
173
185
  const root = path.resolve(workspacePath);
@@ -180,9 +192,12 @@ export function deriveIngestStatus(workspacePath) {
180
192
  };
181
193
  }
182
194
  const kind = manifest.source?.kind === "text" ? "text" : "video";
183
- const { passes, units } = kind === "text" ? textPasses(root, manifest) : videoPasses(root, manifest);
195
+ const skipRecords = kind === "video" ? readVideoSkipLedger(new WorkspaceStore(root)).episodes : [];
196
+ const video = kind === "video" ? videoPasses(root, manifest, skipRecords) : null;
197
+ const { passes, units } = kind === "text" ? textPasses(root, manifest) : video;
184
198
  const errorPasses = kind === "text" ? ["pass2"] : ["ep"];
185
- const errors = errorPasses.flatMap((p) => collectErrors(root, p));
199
+ const skippedUnits = new Set(skipRecords.map((record) => `ep_${String(record.episode).padStart(3, "0")}`));
200
+ const errors = errorPasses.flatMap((pass) => collectErrors(root, pass, skippedUnits));
186
201
  const script = has(root, "script.json");
187
202
  const validation = readValidation(root);
188
203
  if (validation && !validation.ok) {
@@ -215,6 +230,17 @@ export function deriveIngestStatus(workspacePath) {
215
230
  remaining: Math.max(0, units.total - units.done),
216
231
  complete: units.total > 0 && units.done >= units.total && units.failed === 0,
217
232
  next_episode: units.done >= units.total ? null : units.done + 1,
233
+ parsed: video?.parsed ?? 0,
234
+ skipped: skipRecords.filter((record) => record.episode <= units.done).length,
235
+ skipped_episodes: skipRecords.map((record) => record.episode),
236
+ has_skips: skipRecords.length > 0,
237
+ skips: skipRecords.map((record) => ({
238
+ episode: record.episode,
239
+ skipped_at: record.skipped_at,
240
+ reason: record.reason,
241
+ failure_type: record.failure.failure_type,
242
+ failure_code: record.failure.failure_code,
243
+ })),
218
244
  }
219
245
  : {};
220
246
  return {
@@ -238,6 +264,8 @@ function humanLines(s) {
238
264
  lines.push(timingLine(s.timings));
239
265
  if (s.validation)
240
266
  lines.push(`validation: ${s.validation.ok ? "ok" : `${s.validation.errors} errors`}, ${s.validation.warnings} warnings`);
267
+ if (s.has_skips)
268
+ lines.push(`skipped episodes: ${s.skipped_episodes?.join(", ")}`);
241
269
  if (s.state === "failed") {
242
270
  for (const error of s.errors.slice(0, 3)) {
243
271
  lines.push(`${error.unit}: ${error.failure_type}/${error.failure_code} · ${error.retryable ? "retryable" : "terminal"}`);
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/usecases/ingest/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/usecases/ingest/status.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,12 @@
1
+ import { type VideoSourceEpisodeIdentity } from "../../domain/ingest/video-source-evolution.js";
2
+ import { type V4IdentityMap } from "../../domain/script/v4/from-v3.js";
3
+ import { validateScriptV4 } from "../../domain/script/v4/validation.js";
4
+ import { type RunContext } from "../../domain/ingest/video-context.js";
5
+ import type { VideoEpisodeDoc } from "../../domain/ingest/video-records.js";
6
+ import { WorkspaceStore } from "../../infra/ingest/workspace-store.js";
1
7
  import { type LlmTaskExecutor, type VideoUploadMode } from "../../llm/types.js";
8
+ import { type VideoSkipRecord } from "./video-skip-state.js";
9
+ export declare const VIDEO_PIPELINE_VERSION = "13";
2
10
  export interface VideoIngestOptions {
3
11
  sourcePath: string;
4
12
  workspacePath: string;
@@ -14,6 +22,8 @@ export interface VideoIngestReport {
14
22
  episodes: number;
15
23
  processed: number;
16
24
  reused: number;
25
+ skipped: number;
26
+ skippedEpisodes: number[];
17
27
  completed: number;
18
28
  remaining: number;
19
29
  complete: boolean;
@@ -31,5 +41,33 @@ export interface VideoIngestReport {
31
41
  warnings: number;
32
42
  };
33
43
  }
44
+ export type VideoSourceKind = "video-file" | "video-directory";
45
+ export interface VideoIngestManifest {
46
+ version: 2;
47
+ pipeline_version: string;
48
+ updated: string;
49
+ source: {
50
+ kind: VideoSourceKind;
51
+ path: string;
52
+ sha256: string;
53
+ };
54
+ episodes: VideoSourceEpisodeIdentity[];
55
+ fps: number;
56
+ }
34
57
  export declare function assertInlineVideoSize(filePath: string, episode: number): void;
58
+ export declare function readCurrentVideoManifest(store: WorkspaceStore): VideoIngestManifest | null;
59
+ export declare function migrateVideoManifest(store: WorkspaceStore, manifest: VideoIngestManifest): VideoIngestManifest;
60
+ interface FinalizeResult {
61
+ initial: Record<string, unknown>;
62
+ final: Record<string, unknown>;
63
+ idMap: unknown;
64
+ validation: ReturnType<typeof validateScriptV4>;
65
+ identityMap: V4IdentityMap;
66
+ }
67
+ export declare function finalizeVideoScript(docs: VideoEpisodeDoc[], ctx: RunContext, title: string, priorIdentity: V4IdentityMap, skips?: readonly VideoSkipRecord[]): FinalizeResult;
68
+ export declare function publishFinalizedVideoWorkspace(store: WorkspaceStore, episodes: ReadonlyArray<{
69
+ episode: number;
70
+ }>, ctx: RunContext, title: string, identityMap: V4IdentityMap, skips: readonly VideoSkipRecord[]): FinalizeResult;
35
71
  export declare function runVideoIngest(opts: VideoIngestOptions): Promise<VideoIngestReport>;
72
+ export declare function deriveVideoTitle(sourcePath: string): string;
73
+ export {};
@@ -31,11 +31,14 @@ import { discoverEpisodes } from "../../infra/ingest/video-discovery.js";
31
31
  import { snapshotVideoSource, videoSourceFingerprint, } from "../../infra/ingest/video-source-snapshot.js";
32
32
  import { transcodeForUpload } from "../../infra/ingest/video-transcode.js";
33
33
  import { WorkspaceStore } from "../../infra/ingest/workspace-store.js";
34
+ import { withIngestWorkspaceLock } from "../../infra/ingest/workspace-lock.js";
34
35
  import { runVideoSerial } from "../../llm/tasks/ingest/video-serial.js";
35
36
  import { MAX_INLINE_VIDEO_BYTES, } from "../../llm/types.js";
36
37
  import { UsageLedger } from "./usage-report.js";
37
38
  import { createEpisodeErrorSidecar, recoveryHint } from "./failure.js";
38
- const PIPELINE_VERSION = "12"; // production behavior beats + canonical identity evolution
39
+ import { assertVideoSkipSources, markSkippedEpisodes, readAcceptedVideoDocs, readVideoSkipLedger, reconcileVideoSkips, } from "./video-skip-state.js";
40
+ export const VIDEO_PIPELINE_VERSION = "13"; // manual skip ledger + crash-safe skipped context checkpoints
41
+ const COMPATIBLE_VIDEO_PIPELINE_VERSIONS = new Set(["12", VIDEO_PIPELINE_VERSION]);
39
42
  const pad = (n) => String(n).padStart(3, "0");
40
43
  function fileSize(p) {
41
44
  try {
@@ -75,20 +78,31 @@ function sourceMismatch(reason) {
75
78
  data: { actual: [reason] },
76
79
  });
77
80
  }
78
- function readCurrentManifest(store) {
81
+ export function readCurrentVideoManifest(store) {
79
82
  if (!store.has("manifest.json"))
80
83
  return null;
81
84
  const header = store.readJson("manifest.json");
82
- if (header.pipeline_version !== PIPELINE_VERSION) {
85
+ if (!header.pipeline_version || !COMPATIBLE_VIDEO_PIPELINE_VERSIONS.has(header.pipeline_version)) {
83
86
  throw new CliError("This workspace uses an incompatible video-ingest pipeline.", {
84
87
  exitCode: EXIT_INPUT,
85
88
  errorCode: "INGEST_PIPELINE_MISMATCH",
86
89
  hint: "Choose a fresh --workspace-path and run ingest again.",
87
- data: { actual: [`workspace pipeline ${header.pipeline_version ?? "(missing)"}; current ${PIPELINE_VERSION}`] },
90
+ data: { actual: [`workspace pipeline ${header.pipeline_version ?? "(missing)"}; current ${VIDEO_PIPELINE_VERSION}`] },
88
91
  });
89
92
  }
90
93
  return store.readJson("manifest.json");
91
94
  }
95
+ export function migrateVideoManifest(store, manifest) {
96
+ if (manifest.pipeline_version === VIDEO_PIPELINE_VERSION)
97
+ return manifest;
98
+ const migrated = {
99
+ ...manifest,
100
+ pipeline_version: VIDEO_PIPELINE_VERSION,
101
+ updated: new Date().toISOString(),
102
+ };
103
+ store.writeJson("manifest.json", migrated);
104
+ return migrated;
105
+ }
92
106
  function checkSourceRoot(previous, sourceKind, sourcePath) {
93
107
  if (!previous)
94
108
  return;
@@ -118,6 +132,7 @@ function checkLifecycle(store, previous, episodes, force) {
118
132
  "timing.jsonl",
119
133
  "usage.json",
120
134
  "v4_identity_map.json",
135
+ "skipped.json",
121
136
  ])
122
137
  fs.rmSync(store.path(f), { force: true });
123
138
  }
@@ -155,6 +170,23 @@ function renameDocs(docs, alias) {
155
170
  for (const sc of c.scenes) {
156
171
  for (const ch of sc.characters)
157
172
  ch.name = applyRename(ch.name, alias) ?? ch.name;
173
+ if (sc.location)
174
+ sc.location = applyRename(sc.location, alias) ?? sc.location;
175
+ // Rename props through the alias map, then collapse any pairs that now
176
+ // share a canonical name (surface A + surface B → same entity).
177
+ const renamedProps = [];
178
+ const seenProps = new Set();
179
+ for (const prop of sc.props) {
180
+ const name = (applyRename(prop, alias) ?? prop).trim();
181
+ if (!name)
182
+ continue;
183
+ const key = name.normalize("NFC").replace(/\s+/g, " ").trim().toLowerCase();
184
+ if (seenProps.has(key))
185
+ continue;
186
+ seenProps.add(key);
187
+ renamedProps.push(name);
188
+ }
189
+ sc.props = renamedProps;
158
190
  for (const an of sc.anchors) {
159
191
  an.speaker = applyRename(an.speaker, alias);
160
192
  if (an.kind === "act")
@@ -198,7 +230,7 @@ function videoIdentityKeys(assets, registry) {
198
230
  }
199
231
  // Deterministic tail shared with text ingest. Pure (no LLM); ms-fast, so it runs
200
232
  // after every episode (streaming) and once at the end (gated on validation).
201
- function finalizeScript(docs, ctx, title, priorIdentity) {
233
+ export function finalizeVideoScript(docs, ctx, title, priorIdentity, skips = []) {
202
234
  const alias = buildAliasMap(ctx.registry);
203
235
  const renamed = renameDocs(docs, alias);
204
236
  const nameScript = docsToNameScript(renamed, title);
@@ -217,23 +249,41 @@ function finalizeScript(docs, ctx, title, priorIdentity) {
217
249
  ...identityKeys,
218
250
  });
219
251
  const scriptV4 = converted.script;
252
+ markSkippedEpisodes(scriptV4, skips);
220
253
  const structuralValidation = validateScriptV4(scriptV4);
221
254
  const validation = {
222
255
  ...structuralValidation,
223
- warnings: [...structuralValidation.warnings, ...validateProductionStandard(scriptV4)],
256
+ warnings: [
257
+ ...structuralValidation.warnings,
258
+ ...validateProductionStandard(scriptV4),
259
+ ...skips.map((record) => ({
260
+ code: "episode_skipped",
261
+ path: `$.episodes[${record.episode - 1}]`,
262
+ message: `Episode ${record.episode} was manually skipped: ${record.reason}`,
263
+ })),
264
+ ],
224
265
  };
225
266
  return { initial: script, final: scriptV4, idMap, validation, identityMap: converted.identityMap };
226
267
  }
227
- function readDocs(store, episodes) {
228
- const docs = [];
229
- for (const e of episodes) {
230
- const rel = `ep/ep_${pad(e.episode)}.json`;
231
- if (store.has(rel))
232
- docs.push(store.readJson(rel));
268
+ export function publishFinalizedVideoWorkspace(store, episodes, ctx, title, identityMap, skips) {
269
+ const finalized = finalizeVideoScript(readAcceptedVideoDocs(store, episodes, ctx.lastEpisode, skips), ctx, title, identityMap, skips.filter((record) => record.episode <= ctx.lastEpisode));
270
+ const { initial, final, idMap, validation } = finalized;
271
+ store.writeJson("script.initial.json", initial);
272
+ store.writeJson("id_map.json", idMap);
273
+ store.writeJson("validation.json", validation);
274
+ store.writeJson("v4_identity_map.json", finalized.identityMap);
275
+ if (!validation.ok) {
276
+ throw new CliError("Final script.json failed validation.", {
277
+ exitCode: EXIT_INPUT,
278
+ errorCode: "INGEST_VALIDATION_FAILED",
279
+ hint: "Inspect validation.json.",
280
+ data: { actual: validation.errors.slice(0, 5).map((error) => `${error.path}: ${error.message}`) },
281
+ });
233
282
  }
234
- return docs;
283
+ store.writeJson("script.json", final);
284
+ return finalized;
235
285
  }
236
- export async function runVideoIngest(opts) {
286
+ async function runVideoIngestUnlocked(opts) {
237
287
  const resolved = resolveSource(opts.sourcePath);
238
288
  if (resolved.kind === "text")
239
289
  throw new CliError("runVideoIngest received a text source.", {
@@ -257,14 +307,14 @@ export async function runVideoIngest(opts) {
257
307
  const sig = opts.signal;
258
308
  const store = new WorkspaceStore(opts.workspacePath);
259
309
  store.ensure();
260
- const previousManifest = readCurrentManifest(store);
310
+ const previousManifest = readCurrentVideoManifest(store);
261
311
  const sourcePath = path.resolve(resolved.path);
262
312
  checkSourceRoot(previousManifest, resolved.kind, sourcePath);
263
313
  const sourceEpisodes = snapshotVideoSource(episodes);
264
314
  checkLifecycle(store, previousManifest, sourceEpisodes, force);
265
315
  const manifest = {
266
316
  version: 2,
267
- pipeline_version: PIPELINE_VERSION,
317
+ pipeline_version: VIDEO_PIPELINE_VERSION,
268
318
  updated: new Date().toISOString(),
269
319
  source: {
270
320
  kind: resolved.kind,
@@ -279,8 +329,13 @@ export async function runVideoIngest(opts) {
279
329
  let runStatus = "failed";
280
330
  try {
281
331
  let port = null;
282
- const title = deriveTitle(opts.sourcePath);
332
+ const title = deriveVideoTitle(opts.sourcePath);
283
333
  let ctx = !force && store.has("context.json") ? store.readJson("context.json") : emptyContext();
334
+ const skipLedger = readVideoSkipLedger(store);
335
+ assertVideoSkipSources(skipLedger.episodes, sourceEpisodes);
336
+ if (!force)
337
+ reconcileVideoSkips(store, ctx, skipLedger.episodes);
338
+ const skippedEpisodes = new Set(skipLedger.episodes.map((record) => record.episode));
284
339
  let identityMap = !force && store.has("v4_identity_map.json")
285
340
  ? store.readJson("v4_identity_map.json")
286
341
  : emptyV4IdentityMap();
@@ -289,6 +344,8 @@ export async function runVideoIngest(opts) {
289
344
  // ===== Stage S: serial per-episode parse =====
290
345
  for (const e of episodes) {
291
346
  const rel = `ep/ep_${pad(e.episode)}.json`;
347
+ if (!force && skippedEpisodes.has(e.episode) && e.episode <= ctx.lastEpisode)
348
+ continue;
292
349
  // Resume: skip only when the episode's content exists AND the running context
293
350
  // already accounts for it (a crash between the two writes → rerun this ep).
294
351
  if (!force && store.has(rel) && e.episode <= ctx.lastEpisode) {
@@ -393,7 +450,7 @@ export async function runVideoIngest(opts) {
393
450
  // Streaming: rebuild script.json incrementally so the editor sees it grow.
394
451
  // Best-effort — the gated finalize below is authoritative.
395
452
  try {
396
- const streaming = finalizeScript(readDocs(store, episodes), ctx, title, identityMap);
453
+ const streaming = finalizeVideoScript(readAcceptedVideoDocs(store, episodes, ctx.lastEpisode, skipLedger.episodes), ctx, title, identityMap, skipLedger.episodes.filter((record) => record.episode <= ctx.lastEpisode));
397
454
  if (streaming.validation.ok) {
398
455
  identityMap = streaming.identityMap;
399
456
  // Publish the identity checkpoint first. A crash may leave the map ahead
@@ -409,21 +466,8 @@ export async function runVideoIngest(opts) {
409
466
  const remaining = episodes.length - completed;
410
467
  const complete = remaining === 0;
411
468
  const nextEpisode = complete ? null : episodes[completed]?.episode ?? null;
412
- const finalized = finalizeScript(readDocs(store, episodes.slice(0, completed)), ctx, title, identityMap);
413
- const { initial, final, idMap, validation } = finalized;
414
- store.writeJson("script.initial.json", initial);
415
- store.writeJson("id_map.json", idMap);
416
- store.writeJson("validation.json", validation);
417
- store.writeJson("v4_identity_map.json", finalized.identityMap);
418
- if (!validation.ok) {
419
- throw new CliError("Final script.json failed validation.", {
420
- exitCode: EXIT_INPUT,
421
- errorCode: "INGEST_VALIDATION_FAILED",
422
- hint: "Inspect validation.json.",
423
- data: { actual: validation.errors.slice(0, 5).map((e) => `${e.path}: ${e.message}`) },
424
- });
425
- }
426
- store.writeJson("script.json", final);
469
+ const finalized = publishFinalizedVideoWorkspace(store, episodes.slice(0, completed), ctx, title, identityMap, skipLedger.episodes);
470
+ const { final, validation } = finalized;
427
471
  const g = final;
428
472
  runStatus = "succeeded";
429
473
  return {
@@ -431,6 +475,8 @@ export async function runVideoIngest(opts) {
431
475
  episodes: episodes.length,
432
476
  processed,
433
477
  reused,
478
+ skipped: skipLedger.episodes.length,
479
+ skippedEpisodes: skipLedger.episodes.map((record) => record.episode),
434
480
  completed,
435
481
  remaining,
436
482
  complete,
@@ -445,7 +491,10 @@ export async function runVideoIngest(opts) {
445
491
  usage.finish(runStatus);
446
492
  }
447
493
  }
448
- function deriveTitle(sourcePath) {
494
+ export async function runVideoIngest(opts) {
495
+ return withIngestWorkspaceLock(opts.workspacePath, () => runVideoIngestUnlocked(opts));
496
+ }
497
+ export function deriveVideoTitle(sourcePath) {
449
498
  const base = path.basename(sourcePath, path.extname(sourcePath));
450
499
  return base || "";
451
500
  }