@aicopycoders/exodus 2026.9.2000-beta.6 → 2026.9.2000-beta.7

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.
@@ -156,6 +156,10 @@ export interface NodeItem {
156
156
  take: number;
157
157
  outcome: string;
158
158
  label: string;
159
+ displacedHistory?: {
160
+ title: string;
161
+ lines: string[];
162
+ };
159
163
  };
160
164
  artifact?: ArtifactSubset;
161
165
  }
@@ -6,7 +6,7 @@ import { displayRunStatus, formatApiError } from "../lib/format.js";
6
6
  import { missingRouteLine } from "../lib/route-support.js";
7
7
  import { hasBinary } from "../lib/preflight.js";
8
8
  import { ASSET_UPLOAD_POLICY, pauseAheadLine, } from "./workflow.js";
9
- import { HELPER_LEDGER_BASE } from "../lib/helperLedgerBase.js";
9
+ import { HELPER_LEDGER_BASE, SET_OPTION_LEDGER_BASE } from "../lib/helperLedgerBase.js";
10
10
  export const helpText = `
11
11
  exodus video — make a video ad from a saved workflow, pull every piece, upload your cut
12
12
 
@@ -184,6 +184,14 @@ export function renderQcTakeHistory(takes) {
184
184
  });
185
185
  return lines;
186
186
  }
187
+ function printDisplacedHistory(lines, lastRedo) {
188
+ const history = lastRedo.displacedHistory;
189
+ if (!history)
190
+ return;
191
+ lines.push(` ${history.title}`);
192
+ for (const line of history.lines)
193
+ lines.push(` ${line}`);
194
+ }
187
195
  export function asVideoRun(data) {
188
196
  const run = (data ?? {});
189
197
  return { ...run, nodes: Array.isArray(run.nodes) ? run.nodes : [] };
@@ -507,7 +515,9 @@ function keyframeDownload(sceneIndex, imageUrl) {
507
515
  function reservedCastFrames(items) {
508
516
  const byIndex = new Map();
509
517
  for (const item of items) {
510
- if (item.itemKind === "frame" && item.sceneIndex >= CAST_LEDGER_BASE) {
518
+ if (item.itemKind === "frame" &&
519
+ item.sceneIndex >= CAST_LEDGER_BASE &&
520
+ item.sceneIndex < SET_OPTION_LEDGER_BASE) {
511
521
  byIndex.set(item.sceneIndex, item);
512
522
  }
513
523
  }
@@ -1143,15 +1153,19 @@ export async function statusFlow(runId, json, deps) {
1143
1153
  for (const sceneIndex of [...byScene.keys()].sort((a, b) => a - b)) {
1144
1154
  const row = byScene.get(sceneIndex);
1145
1155
  lines.push(`${String(sceneIndex).padEnd(5)} ${itemWord(row.clip).padEnd(8)} ${itemWord(row.voiceover).padEnd(8)} ${itemWord(row.frame)}`);
1146
- if (row.clip?.lastRedo)
1156
+ if (row.clip?.lastRedo) {
1147
1157
  lines.push(` clip: ${row.clip.lastRedo.label}`);
1158
+ printDisplacedHistory(lines, row.clip.lastRedo);
1159
+ }
1148
1160
  if (row.clip?.lastRedo || row.clip?.flagged) {
1149
1161
  for (const line of renderQcTakeHistory(clipQcOf(row.clip))) {
1150
1162
  lines.push(` ${line}`);
1151
1163
  }
1152
1164
  }
1153
- if (row.voiceover?.lastRedo)
1165
+ if (row.voiceover?.lastRedo) {
1154
1166
  lines.push(` voice: ${row.voiceover.lastRedo.label}`);
1167
+ printDisplacedHistory(lines, row.voiceover.lastRedo);
1168
+ }
1155
1169
  if (row.frame?.lastRedo)
1156
1170
  lines.push(` picture: ${row.frame.lastRedo.label}`);
1157
1171
  for (const finding of row.clip?.findings ?? []) {
@@ -1 +1,3 @@
1
1
  export declare const HELPER_LEDGER_BASE = 900000;
2
+ export declare const SET_OPTION_LEDGER_BASE = 920000;
3
+ export declare const CAST_OPTION_LEDGER_BASE = 960000;
@@ -1 +1,3 @@
1
1
  export const HELPER_LEDGER_BASE = 900000;
2
+ export const SET_OPTION_LEDGER_BASE = 920000;
3
+ export const CAST_OPTION_LEDGER_BASE = 960000;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aicopycoders/exodus",
3
- "version": "2026.9.2000-beta.6",
3
+ "version": "2026.9.2000-beta.7",
4
4
  "description": "CLI + Claude Code skills for the Copycoders Exodus ad pipeline",
5
5
  "repository": {
6
6
  "type": "git",