@aicopycoders/exodus 2026.7.200-beta.11 → 2026.7.200-beta.12
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/assets/docs/CLAUDE.md +1 -0
- package/assets/docs/PIPELINES.md +26 -0
- package/assets/skills/exodus/SKILL.md +4 -1
- package/assets/skills/exodus-workflow/SKILL.md +235 -61
- package/dist/bin/exodus.js +2 -0
- package/dist/commands/bank.d.ts +87 -0
- package/dist/commands/bank.js +346 -0
- package/dist/commands/session.d.ts +55 -0
- package/dist/commands/session.js +202 -0
- package/dist/commands/workflow.d.ts +186 -4
- package/dist/commands/workflow.js +1355 -45
- package/dist/lib/client.d.ts +8 -1
- package/dist/lib/client.js +30 -6
- package/dist/lib/route-support.d.ts +4 -0
- package/dist/lib/route-support.js +22 -0
- package/dist/lib/workflowText.d.ts +3 -0
- package/dist/lib/workflowText.js +113 -0
- package/package.json +5 -2
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
import { type ApiResponse } from "../lib/client.js";
|
|
2
2
|
import { type PollOptions, type PollResult } from "../lib/poll.js";
|
|
3
|
+
import { type Channel } from "../lib/channel.js";
|
|
3
4
|
export declare const helpText: string;
|
|
4
|
-
export type WorkflowNodeKind = "brief" | "bot" | "primer" | "image" | "rig" | "storyboard" | "reference" | "scene-frames" | "video" | "voiceover" | "output" | "show-set" | "show-cast" | "show-voices" | "product-truth";
|
|
5
|
+
export type WorkflowNodeKind = "brief" | "bot" | "primer" | "image" | "rig" | "storyboard" | "reference" | "scene-frames" | "video" | "voiceover" | "output" | "push" | "gate" | "call" | "show-set" | "show-cast" | "show-voices" | "product-truth" | "transform";
|
|
6
|
+
export type WorkflowSlotState = "locked" | "auto" | "ask" | "inferred";
|
|
7
|
+
export interface WorkflowSlot {
|
|
8
|
+
id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
state: WorkflowSlotState;
|
|
11
|
+
nodeId: string;
|
|
12
|
+
configKey: string;
|
|
13
|
+
value?: string;
|
|
14
|
+
hint?: string;
|
|
15
|
+
}
|
|
5
16
|
export interface WorkflowNode {
|
|
6
17
|
id: string;
|
|
7
18
|
kind: WorkflowNodeKind;
|
|
@@ -18,6 +29,16 @@ export interface WorkflowEdge {
|
|
|
18
29
|
target: string;
|
|
19
30
|
targetHandle: string;
|
|
20
31
|
}
|
|
32
|
+
export type WorkflowTriggerEvent = "winner-promoted";
|
|
33
|
+
export type WorkflowTrigger = {
|
|
34
|
+
type: "event";
|
|
35
|
+
event: WorkflowTriggerEvent;
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
} | {
|
|
38
|
+
type: "cron";
|
|
39
|
+
cron: string;
|
|
40
|
+
enabled: boolean;
|
|
41
|
+
};
|
|
21
42
|
export interface WorkflowContractJson {
|
|
22
43
|
contract: "exodus-workflow";
|
|
23
44
|
version: number;
|
|
@@ -25,6 +46,8 @@ export interface WorkflowContractJson {
|
|
|
25
46
|
updatedAt?: string;
|
|
26
47
|
name: string;
|
|
27
48
|
description?: string;
|
|
49
|
+
slots?: WorkflowSlot[];
|
|
50
|
+
triggers?: WorkflowTrigger[];
|
|
28
51
|
nodes: WorkflowNode[];
|
|
29
52
|
edges: WorkflowEdge[];
|
|
30
53
|
}
|
|
@@ -43,7 +66,7 @@ export interface WorkflowImportResult {
|
|
|
43
66
|
unresolved: UnresolvedWorkflowRef[];
|
|
44
67
|
warnings: string[];
|
|
45
68
|
}
|
|
46
|
-
export type GraphIssueCode = "bad-shape" | "unknown-kind" | "duplicate-node-id" | "dangling-edge" | "unknown-port" | "type-mismatch" | "duplicate-input" | "cycle" | "missing-required-input" | "bad-config";
|
|
69
|
+
export type GraphIssueCode = "bad-shape" | "unknown-kind" | "duplicate-node-id" | "dangling-edge" | "unknown-port" | "type-mismatch" | "duplicate-input" | "session-fan-out" | "cycle" | "missing-required-input" | "bad-config" | "bad-slot" | "bad-trigger";
|
|
47
70
|
export interface GraphIssue {
|
|
48
71
|
code: GraphIssueCode;
|
|
49
72
|
message: string;
|
|
@@ -59,7 +82,7 @@ export interface WorkflowImportError {
|
|
|
59
82
|
issues?: GraphIssue[];
|
|
60
83
|
currentUpdatedAt?: string;
|
|
61
84
|
}
|
|
62
|
-
export type WorkflowPortType = "text" | "primer" | "image" | "rig" | "storyboard" | "frames" | "video" | "audio" | "show";
|
|
85
|
+
export type WorkflowPortType = "text" | "primer" | "image" | "rig" | "storyboard" | "frames" | "video" | "audio" | "show" | "session";
|
|
63
86
|
export type WorkflowPrimerKind = "body" | "hook" | "headline" | "summary";
|
|
64
87
|
export type WorkflowDurationSpec = {
|
|
65
88
|
kind: "fixed";
|
|
@@ -74,6 +97,8 @@ export interface CatalogVideoModel {
|
|
|
74
97
|
label: string;
|
|
75
98
|
durations: WorkflowDurationSpec;
|
|
76
99
|
audioTogglable: boolean;
|
|
100
|
+
aspectRatios: string[];
|
|
101
|
+
resolutions: string[];
|
|
77
102
|
}
|
|
78
103
|
export type WorkflowParamKind = "select" | "text" | "textarea" | "toggle" | "number" | "multiselect";
|
|
79
104
|
export interface CatalogInput {
|
|
@@ -104,7 +129,6 @@ export interface CatalogBot {
|
|
|
104
129
|
inputs: CatalogInput[];
|
|
105
130
|
params: CatalogParam[];
|
|
106
131
|
outputType: string;
|
|
107
|
-
splitsOutput: boolean;
|
|
108
132
|
}
|
|
109
133
|
export interface WorkflowCatalog {
|
|
110
134
|
catalog: "exodus-workflow-catalog";
|
|
@@ -130,6 +154,12 @@ export interface WorkflowCatalog {
|
|
|
130
154
|
summaryOnlySlugs: string[];
|
|
131
155
|
notes: string;
|
|
132
156
|
};
|
|
157
|
+
promptBot: {
|
|
158
|
+
slug: "prompt";
|
|
159
|
+
configKey: "promptText";
|
|
160
|
+
inputs: CatalogInput[];
|
|
161
|
+
notes: string;
|
|
162
|
+
};
|
|
133
163
|
}
|
|
134
164
|
export type WorkflowBriefSource = "text" | "swipe-ad" | "swipe-bundle" | "organic-url" | "ad-url";
|
|
135
165
|
export interface WorkflowInputDescriptor {
|
|
@@ -149,6 +179,7 @@ export interface WorkflowOutputDescriptor {
|
|
|
149
179
|
label: string;
|
|
150
180
|
nodeId: string;
|
|
151
181
|
botSlug?: string;
|
|
182
|
+
port?: string;
|
|
152
183
|
}
|
|
153
184
|
export interface WorkflowDescribeResponse {
|
|
154
185
|
workflowId: string;
|
|
@@ -161,6 +192,15 @@ export interface WorkflowDescribeResponse {
|
|
|
161
192
|
}>;
|
|
162
193
|
outputs: WorkflowOutputDescriptor[];
|
|
163
194
|
}
|
|
195
|
+
export interface WorkflowTemplateListItem {
|
|
196
|
+
key: string;
|
|
197
|
+
label: string;
|
|
198
|
+
description: string;
|
|
199
|
+
module?: string;
|
|
200
|
+
}
|
|
201
|
+
export interface WorkflowTemplatesResponse {
|
|
202
|
+
templates: WorkflowTemplateListItem[];
|
|
203
|
+
}
|
|
164
204
|
export interface WorkflowListItem {
|
|
165
205
|
_id: string;
|
|
166
206
|
name: string;
|
|
@@ -175,12 +215,23 @@ export interface WorkflowListItem {
|
|
|
175
215
|
export interface WorkflowListResponse {
|
|
176
216
|
workflows: WorkflowListItem[];
|
|
177
217
|
}
|
|
218
|
+
export interface WorkflowVersion {
|
|
219
|
+
version: number;
|
|
220
|
+
name: string;
|
|
221
|
+
savedAt: string;
|
|
222
|
+
savedByName?: string;
|
|
223
|
+
}
|
|
224
|
+
export interface WorkflowVersionsResponse {
|
|
225
|
+
versions: WorkflowVersion[];
|
|
226
|
+
}
|
|
178
227
|
export type WorkflowRunStatus = "queued" | "running" | "awaiting-review" | "completed" | "partial" | "failed" | "canceled";
|
|
179
228
|
export type WorkflowNodeRunStatus = "idle" | "running" | "done" | "failed" | "skipped";
|
|
180
229
|
export type WorkflowArtifact = {
|
|
181
230
|
type: "text";
|
|
182
231
|
text: string;
|
|
183
232
|
label?: string;
|
|
233
|
+
port?: string;
|
|
234
|
+
humanEdited?: boolean;
|
|
184
235
|
} | {
|
|
185
236
|
type: "primer";
|
|
186
237
|
text: string;
|
|
@@ -224,6 +275,22 @@ export interface WorkflowCounts {
|
|
|
224
275
|
skipped: number;
|
|
225
276
|
total: number;
|
|
226
277
|
}
|
|
278
|
+
export interface WorkflowRunSession {
|
|
279
|
+
sessionId: string;
|
|
280
|
+
nodeId: string;
|
|
281
|
+
title: string;
|
|
282
|
+
botSlug: string;
|
|
283
|
+
}
|
|
284
|
+
export type WorkflowPauseReason = "taste" | "repair" | "slots" | "call";
|
|
285
|
+
export interface WorkflowPendingSlot {
|
|
286
|
+
id: string;
|
|
287
|
+
label?: string;
|
|
288
|
+
state?: string;
|
|
289
|
+
nodeId?: string;
|
|
290
|
+
configKey?: string;
|
|
291
|
+
value?: string;
|
|
292
|
+
hint?: string;
|
|
293
|
+
}
|
|
227
294
|
export interface WorkflowRun {
|
|
228
295
|
_id: string;
|
|
229
296
|
workflowId: string;
|
|
@@ -239,16 +306,25 @@ export interface WorkflowRun {
|
|
|
239
306
|
isTerminal: boolean;
|
|
240
307
|
nodes: WorkflowRunNode[];
|
|
241
308
|
outputs?: WorkflowRunOutput[];
|
|
309
|
+
sessions?: WorkflowRunSession[];
|
|
310
|
+
pauseReason?: WorkflowPauseReason;
|
|
311
|
+
pausedNodeId?: string;
|
|
312
|
+
pendingSlots?: WorkflowPendingSlot[];
|
|
242
313
|
}
|
|
243
314
|
export type WorkflowRunProjection = Omit<WorkflowRun, "nodes"> & {
|
|
244
315
|
nodes?: never;
|
|
245
316
|
};
|
|
246
317
|
export interface WorkflowRunDeps {
|
|
247
318
|
get: (path: string) => Promise<ApiResponse<unknown>>;
|
|
319
|
+
getText: (path: string) => Promise<ApiResponse<string>>;
|
|
248
320
|
post: (path: string, body: unknown) => Promise<ApiResponse<unknown>>;
|
|
249
321
|
readFile: (path: string) => string;
|
|
250
322
|
writeFile: (path: string, text: string) => void;
|
|
251
323
|
poll: (opts: PollOptions) => Promise<PollResult>;
|
|
324
|
+
postDashboard?: (path: string, body: unknown, opts?: {
|
|
325
|
+
timeoutMs?: number;
|
|
326
|
+
}) => Promise<ApiResponse<unknown>>;
|
|
327
|
+
dashboardUrl?: string;
|
|
252
328
|
}
|
|
253
329
|
export interface FlowResult {
|
|
254
330
|
code: number;
|
|
@@ -256,21 +332,28 @@ export interface FlowResult {
|
|
|
256
332
|
}
|
|
257
333
|
interface RunFlowOptions {
|
|
258
334
|
inputs: Record<string, string>;
|
|
335
|
+
terminalNodeIds?: string[];
|
|
259
336
|
wait: boolean;
|
|
260
337
|
json: boolean;
|
|
261
338
|
onProgressLine?: (line: string) => void;
|
|
262
339
|
}
|
|
340
|
+
export declare function formatPauseNotice(pauseReason: WorkflowPauseReason | undefined, runId: string, dashboardUrl: string): string[];
|
|
263
341
|
export declare function parseInputFlags(args: string[], readFile?: (path: string) => string): Record<string, string>;
|
|
342
|
+
export declare function parseTerminalFlags(args: string[]): string[];
|
|
264
343
|
export declare function formatWorkflowList(workflows: WorkflowListItem[]): string;
|
|
265
344
|
export declare function formatRecentRuns(runs: WorkflowRunProjection[]): string;
|
|
345
|
+
export declare function formatWorkflowVersions(versions: WorkflowVersion[]): string;
|
|
266
346
|
export declare function formatImportSummary(result: WorkflowImportResult, mode?: {
|
|
267
347
|
dryRun?: boolean;
|
|
268
348
|
update?: boolean;
|
|
349
|
+
validate?: boolean;
|
|
269
350
|
}): string;
|
|
270
351
|
export declare function formatWorkflowRun(run: WorkflowRun): string;
|
|
271
352
|
export declare function formatDescribe(res: WorkflowDescribeResponse): string;
|
|
272
353
|
export declare function formatBotsList(catalog: WorkflowCatalog, category?: string): string;
|
|
273
354
|
export declare function formatBotDetail(bot: CatalogBot): string;
|
|
355
|
+
export declare function formatTemplatesList(templates: WorkflowTemplateListItem[]): string;
|
|
356
|
+
export declare function formatSchema(payload: Record<string, unknown>): string;
|
|
274
357
|
export declare function resolveWorkflowId(ref: string, deps: WorkflowRunDeps): Promise<string>;
|
|
275
358
|
export declare function listFlow(json: boolean, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
276
359
|
export declare function describeFlow(workflowRef: string, opts: {
|
|
@@ -288,11 +371,110 @@ export declare function statusFlow(opts: {
|
|
|
288
371
|
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
289
372
|
export declare function exportFlow(workflowRef: string, opts: {
|
|
290
373
|
out?: string;
|
|
374
|
+
json?: boolean;
|
|
375
|
+
version?: number;
|
|
376
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
377
|
+
export declare function parseVersionFlag(flags: Record<string, string | boolean>): number | undefined;
|
|
378
|
+
export declare function versionsFlow(workflowRef: string, opts: {
|
|
379
|
+
json: boolean;
|
|
380
|
+
}, deps: WorkflowRunDeps, channel?: Channel): Promise<FlowResult>;
|
|
381
|
+
export declare function triggerExpect(t: WorkflowTrigger): {
|
|
382
|
+
type: string;
|
|
383
|
+
event?: string;
|
|
384
|
+
cron?: string;
|
|
385
|
+
};
|
|
386
|
+
export declare function formatTriggers(triggers: WorkflowTrigger[]): string;
|
|
387
|
+
export declare function triggersListFlow(workflowRef: string, opts: {
|
|
388
|
+
json: boolean;
|
|
389
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
390
|
+
export declare function triggersSetEnabledFlow(workflowRef: string, n: number, enabled: boolean, opts: {
|
|
391
|
+
json: boolean;
|
|
392
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
393
|
+
export declare function triggersFireFlow(workflowRef: string, opts: {
|
|
394
|
+
n?: number;
|
|
395
|
+
text?: string;
|
|
396
|
+
wait: boolean;
|
|
397
|
+
json: boolean;
|
|
398
|
+
onProgressLine?: (line: string) => void;
|
|
291
399
|
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
292
400
|
export declare function importFlow(file: string, opts: {
|
|
293
401
|
dryRun: boolean;
|
|
294
402
|
json: boolean;
|
|
295
403
|
update?: string;
|
|
296
404
|
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
405
|
+
export declare function validateFlow(file: string, opts: {
|
|
406
|
+
json: boolean;
|
|
407
|
+
update?: string;
|
|
408
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
409
|
+
export declare function templatesListFlow(json: boolean, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
410
|
+
export declare function templatesExportFlow(key: string, opts: {
|
|
411
|
+
out?: string;
|
|
412
|
+
json?: boolean;
|
|
413
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
414
|
+
export declare function schemaFlow(opts: {
|
|
415
|
+
json: boolean;
|
|
416
|
+
kind?: string;
|
|
417
|
+
face?: string;
|
|
418
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
419
|
+
export interface WorkflowInboxRow {
|
|
420
|
+
_id: string;
|
|
421
|
+
workflowId: string;
|
|
422
|
+
workflowName: string;
|
|
423
|
+
pausedNodeId?: string;
|
|
424
|
+
pausedNodeKind?: string;
|
|
425
|
+
pauseReason?: "taste" | "repair" | "slots";
|
|
426
|
+
counts?: WorkflowCounts;
|
|
427
|
+
createdAt: number | string;
|
|
428
|
+
queuedAt?: number | string;
|
|
429
|
+
hasShow?: boolean;
|
|
430
|
+
invocationMode?: "live" | "background";
|
|
431
|
+
triggeredBy?: {
|
|
432
|
+
type: "event" | "cron";
|
|
433
|
+
event?: string;
|
|
434
|
+
};
|
|
435
|
+
pendingSlotsCount?: number;
|
|
436
|
+
}
|
|
437
|
+
export interface WorkflowInboxResponse {
|
|
438
|
+
runs: WorkflowInboxRow[];
|
|
439
|
+
}
|
|
440
|
+
export declare function formatAge(value: number | string | undefined, now?: number): string;
|
|
441
|
+
export declare function parkBadge(pauseReason: string | undefined): string;
|
|
442
|
+
export declare function invocationBadge(row: WorkflowInboxRow): string;
|
|
443
|
+
export declare function formatInbox(rows: WorkflowInboxRow[], now?: number): string;
|
|
444
|
+
export declare function inboxFlow(json: boolean, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
445
|
+
export declare function gateShowFlow(runId: string, opts: {
|
|
446
|
+
json: boolean;
|
|
447
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
448
|
+
export declare function gatePickFlow(runId: string, numbers: number[], opts: {
|
|
449
|
+
json: boolean;
|
|
450
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
451
|
+
export declare function gateEditFlow(runId: string, n: number, sources: {
|
|
452
|
+
text?: string;
|
|
453
|
+
file?: string;
|
|
454
|
+
stdin?: string;
|
|
455
|
+
}, opts: {
|
|
456
|
+
json: boolean;
|
|
457
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
458
|
+
export declare function gatePushFlow(runId: string, message: string, opts: {
|
|
459
|
+
json: boolean;
|
|
460
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
461
|
+
export declare function gateApproveFlow(runId: string, opts: {
|
|
462
|
+
wait: boolean;
|
|
463
|
+
json: boolean;
|
|
464
|
+
onProgressLine?: (line: string) => void;
|
|
465
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
466
|
+
export declare function gateRejectFlow(runId: string, opts: {
|
|
467
|
+
reason?: string;
|
|
468
|
+
json: boolean;
|
|
469
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
470
|
+
export declare function repairFlow(runId: string, action: "retry" | "skip" | "kill", opts: {
|
|
471
|
+
wait: boolean;
|
|
472
|
+
json: boolean;
|
|
473
|
+
onProgressLine?: (line: string) => void;
|
|
474
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
475
|
+
export declare function parseSlotFlags(args: string[]): Record<string, string>;
|
|
476
|
+
export declare function answerFlow(runId: string, values: Record<string, string>, opts: {
|
|
477
|
+
json: boolean;
|
|
478
|
+
}, deps: WorkflowRunDeps): Promise<FlowResult>;
|
|
297
479
|
export declare function run(flags: Record<string, string | boolean>): Promise<void>;
|
|
298
480
|
export {};
|