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