@atom-workflow-agent/cli 0.1.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.
- package/LICENSE +201 -0
- package/README.md +61 -0
- package/README.zh-CN.md +61 -0
- package/dist/app.d.ts +14 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +172 -0
- package/dist/app.js.map +1 -0
- package/dist/atoms/atom-development-service.d.ts +43 -0
- package/dist/atoms/atom-development-service.d.ts.map +1 -0
- package/dist/atoms/atom-development-service.js +308 -0
- package/dist/atoms/atom-development-service.js.map +1 -0
- package/dist/atoms/atom-development-store.d.ts +70 -0
- package/dist/atoms/atom-development-store.d.ts.map +1 -0
- package/dist/atoms/atom-development-store.js +271 -0
- package/dist/atoms/atom-development-store.js.map +1 -0
- package/dist/commands/doctor.d.ts +38 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +163 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/models.d.ts +16 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +20 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/local/local-project-service.d.ts +63 -0
- package/dist/local/local-project-service.d.ts.map +1 -0
- package/dist/local/local-project-service.js +327 -0
- package/dist/local/local-project-service.js.map +1 -0
- package/dist/logging/create-cli-logger.d.ts +8 -0
- package/dist/logging/create-cli-logger.d.ts.map +1 -0
- package/dist/logging/create-cli-logger.js +11 -0
- package/dist/logging/create-cli-logger.js.map +1 -0
- package/dist/logging/json-logger.d.ts +24 -0
- package/dist/logging/json-logger.d.ts.map +1 -0
- package/dist/logging/json-logger.js +29 -0
- package/dist/logging/json-logger.js.map +1 -0
- package/dist/providers/acp-planning-model-adapter.d.ts +9 -0
- package/dist/providers/acp-planning-model-adapter.d.ts.map +1 -0
- package/dist/providers/acp-planning-model-adapter.js +54 -0
- package/dist/providers/acp-planning-model-adapter.js.map +1 -0
- package/dist/providers/provider-name.d.ts +5 -0
- package/dist/providers/provider-name.d.ts.map +1 -0
- package/dist/providers/provider-name.js +4 -0
- package/dist/providers/provider-name.js.map +1 -0
- package/dist/providers/resolve-provider-config.d.ts +10 -0
- package/dist/providers/resolve-provider-config.d.ts.map +1 -0
- package/dist/providers/resolve-provider-config.js +14 -0
- package/dist/providers/resolve-provider-config.js.map +1 -0
- package/dist/providers/resolve-trae-executable.d.ts +20 -0
- package/dist/providers/resolve-trae-executable.d.ts.map +1 -0
- package/dist/providers/resolve-trae-executable.js +46 -0
- package/dist/providers/resolve-trae-executable.js.map +1 -0
- package/dist/workflow/builtin-atom-packages.d.ts +4 -0
- package/dist/workflow/builtin-atom-packages.d.ts.map +1 -0
- package/dist/workflow/builtin-atom-packages.js +39 -0
- package/dist/workflow/builtin-atom-packages.js.map +1 -0
- package/dist/workflow/planning-cli-service.d.ts +35 -0
- package/dist/workflow/planning-cli-service.d.ts.map +1 -0
- package/dist/workflow/planning-cli-service.js +97 -0
- package/dist/workflow/planning-cli-service.js.map +1 -0
- package/dist/workflow/workflow-command-input.d.ts +25 -0
- package/dist/workflow/workflow-command-input.d.ts.map +1 -0
- package/dist/workflow/workflow-command-input.js +117 -0
- package/dist/workflow/workflow-command-input.js.map +1 -0
- package/dist/workflow/workflow-command-progress.d.ts +6 -0
- package/dist/workflow/workflow-command-progress.d.ts.map +1 -0
- package/dist/workflow/workflow-command-progress.js +81 -0
- package/dist/workflow/workflow-command-progress.js.map +1 -0
- package/dist/workflow/workflow-command-service.d.ts +85 -0
- package/dist/workflow/workflow-command-service.d.ts.map +1 -0
- package/dist/workflow/workflow-command-service.js +2 -0
- package/dist/workflow/workflow-command-service.js.map +1 -0
- package/dist/workflow/workflow-command.d.ts +5 -0
- package/dist/workflow/workflow-command.d.ts.map +1 -0
- package/dist/workflow/workflow-command.js +425 -0
- package/dist/workflow/workflow-command.js.map +1 -0
- package/dist/workflow/workflow-coordinator.d.ts +25 -0
- package/dist/workflow/workflow-coordinator.d.ts.map +1 -0
- package/dist/workflow/workflow-coordinator.js +112 -0
- package/dist/workflow/workflow-coordinator.js.map +1 -0
- package/dist/workflow/workflow-output.d.ts +9 -0
- package/dist/workflow/workflow-output.d.ts.map +1 -0
- package/dist/workflow/workflow-output.js +109 -0
- package/dist/workflow/workflow-output.js.map +1 -0
- package/dist/workflow/workflow-project-config.d.ts +14 -0
- package/dist/workflow/workflow-project-config.d.ts.map +1 -0
- package/dist/workflow/workflow-project-config.js +55 -0
- package/dist/workflow/workflow-project-config.js.map +1 -0
- package/dist/workflow/workflow-service.d.ts +1237 -0
- package/dist/workflow/workflow-service.d.ts.map +1 -0
- package/dist/workflow/workflow-service.js +475 -0
- package/dist/workflow/workflow-service.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { PlanRecordSchema } from "@atom-workflow-agent/contracts";
|
|
2
|
+
import { LocalPlanStore, PlanningController, WorkflowPlanningFailedError, planStoragePaths } from "@atom-workflow-agent/workflow-planner";
|
|
3
|
+
import { LocalWorkflowStore, contentHash, createWorkflowRevision } from "@atom-workflow-agent/workflow-engine";
|
|
4
|
+
const asJson = (value) => JSON.parse(JSON.stringify(value));
|
|
5
|
+
const eventData = (event) => event.data;
|
|
6
|
+
const eventKey = (event) => {
|
|
7
|
+
if (event.type !== "session_update" || event.data === null || typeof event.data !== "object" || Array.isArray(event.data))
|
|
8
|
+
return event.type;
|
|
9
|
+
const update = event.data.update;
|
|
10
|
+
if (update === null || typeof update !== "object" || Array.isArray(update))
|
|
11
|
+
return event.type;
|
|
12
|
+
const updateType = update.sessionUpdate;
|
|
13
|
+
return typeof updateType === "string" ? `${event.type}.${updateType}` : event.type;
|
|
14
|
+
};
|
|
15
|
+
function auditRecord(audit) {
|
|
16
|
+
return {
|
|
17
|
+
catalogIndex: audit.catalogIndex,
|
|
18
|
+
...(audit.capabilityCoverage ? { capabilityCoverage: audit.capabilityCoverage } : {}),
|
|
19
|
+
...(audit.planningCatalog ? { planningCatalog: audit.planningCatalog } : {}),
|
|
20
|
+
...(audit.workspaceSnapshot ? { workspaceSnapshot: audit.workspaceSnapshot } : {}),
|
|
21
|
+
...(audit.plannerDraft ? { plannerDraft: audit.plannerDraft } : {}),
|
|
22
|
+
workspaceAttempts: audit.workspaceAttempts.map(asJson), planningCheckpoint: audit.checkpoint,
|
|
23
|
+
validationFeedback: audit.validationFeedback, planningMetrics: audit.metrics,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** Planning boundary: publishes an immutable Workflow Revision, but never creates or executes a Run. */
|
|
27
|
+
export class WorkflowCoordinator {
|
|
28
|
+
planning;
|
|
29
|
+
plans;
|
|
30
|
+
workflows;
|
|
31
|
+
now;
|
|
32
|
+
constructor(planning, plans, workflows, now = () => new Date()) {
|
|
33
|
+
this.planning = planning;
|
|
34
|
+
this.plans = plans;
|
|
35
|
+
this.workflows = workflows;
|
|
36
|
+
this.now = now;
|
|
37
|
+
}
|
|
38
|
+
async plan(input, resumeRecord) {
|
|
39
|
+
const existing = await this.plans.load(input.planId);
|
|
40
|
+
if (existing && !resumeRecord)
|
|
41
|
+
throw Object.assign(new Error(`Plan already exists: ${input.planId}`), { code: "PLAN_ALREADY_EXISTS", retryable: false });
|
|
42
|
+
if (resumeRecord && existing?.plan.planId !== resumeRecord.plan.planId)
|
|
43
|
+
throw Object.assign(new Error(`Plan resume record mismatch: ${input.planId}`), { code: "PLAN_RESUME_MISMATCH", retryable: false });
|
|
44
|
+
const createdAt = this.now().toISOString();
|
|
45
|
+
const catalogHash = contentHash(input.plannerInput.atomCatalog);
|
|
46
|
+
const initialPlan = PlanRecordSchema.parse({ ...(resumeRecord?.plan ?? {}), schemaVersion: "1.0", planId: input.planId, status: "planning",
|
|
47
|
+
request: { goal: input.goal, cwd: input.cwd, projectScope: input.projectScope ?? input.cwd, hostScope: input.hostScope ?? "local-host", initialWorkflowInputs: input.plannerInput.workflowInputs, context: input.plannerInput.context },
|
|
48
|
+
planner: { provider: input.target.providerId, model: input.target.model, ...(input.planning?.maxPlanningTurns ? { maxPlanningTurns: input.planning.maxPlanningTurns } : {}) },
|
|
49
|
+
catalogHash, inputRevisions: resumeRecord?.plan.inputRevisions ?? [], hashes: resumeRecord?.plan.hashes ?? {}, validationErrors: [], createdAt: resumeRecord?.plan.createdAt ?? createdAt, updatedAt: createdAt, endedAt: undefined, error: undefined });
|
|
50
|
+
const events = [];
|
|
51
|
+
const counts = {};
|
|
52
|
+
let eventTotal = 0;
|
|
53
|
+
const configuredEvent = input.planning?.model?.onEvent;
|
|
54
|
+
const configuredCheckpoint = input.planning?.onCheckpoint;
|
|
55
|
+
const eventCounts = () => {
|
|
56
|
+
const merged = { ...(resumeRecord?.planningEventStats?.byType ?? {}) };
|
|
57
|
+
for (const [key, count] of Object.entries(counts))
|
|
58
|
+
merged[key] = (merged[key] ?? 0) + count;
|
|
59
|
+
return merged;
|
|
60
|
+
};
|
|
61
|
+
const base = (plan, overrides = {}) => ({ schemaVersion: "1.0", plan, plannerInput: input.plannerInput,
|
|
62
|
+
attempts: resumeRecord?.attempts ?? [], validationErrors: [], rawOutputs: resumeRecord?.rawOutputs ?? [], planningEvents: [...(resumeRecord?.planningEvents ?? []), ...events], planningEventStats: { total: (resumeRecord?.planningEventStats?.total ?? 0) + eventTotal, persisted: (resumeRecord?.planningEvents?.length ?? 0) + events.length, byType: eventCounts() }, ...overrides });
|
|
63
|
+
await this.plans.save(base(initialPlan));
|
|
64
|
+
const options = { ...input.planning, promptReferenceDirectory: planStoragePaths(this.plans.rootDirectory, input.planId).directory,
|
|
65
|
+
...(resumeRecord?.planningCheckpoint ? { resumeCheckpoint: resumeRecord.planningCheckpoint } : {}),
|
|
66
|
+
onCheckpoint: async (checkpoint, audit, progress) => {
|
|
67
|
+
const updated = PlanRecordSchema.parse({ ...initialPlan, validationErrors: checkpoint.lastValidationErrors, updatedAt: this.now().toISOString() });
|
|
68
|
+
await this.plans.save(base(updated, { attempts: [...(resumeRecord?.attempts ?? []), ...progress.attempts], validationErrors: checkpoint.lastValidationErrors, rawOutputs: [...(resumeRecord?.rawOutputs ?? []), ...progress.rawOutputs], ...auditRecord(audit) }));
|
|
69
|
+
await configuredCheckpoint?.(checkpoint, audit, progress);
|
|
70
|
+
},
|
|
71
|
+
model: { ...input.planning?.model, onEvent: (event) => {
|
|
72
|
+
eventTotal += 1;
|
|
73
|
+
counts[eventKey(event)] = (counts[eventKey(event)] ?? 0) + 1;
|
|
74
|
+
configuredEvent?.(event);
|
|
75
|
+
if (event.type !== "session_update")
|
|
76
|
+
events.push({ sequence: (resumeRecord?.planningEvents?.length ?? 0) + events.length, timestamp: this.now().toISOString(), type: event.type, providerId: event.providerId, ...("sessionId" in event ? { sessionId: event.sessionId } : {}), data: eventData(event) });
|
|
77
|
+
} },
|
|
78
|
+
};
|
|
79
|
+
try {
|
|
80
|
+
const planned = await this.planning.planAndCompile(input.plannerInput, input.target, options);
|
|
81
|
+
if (Object.keys(planned.workflow.outputs).length === 0)
|
|
82
|
+
throw Object.assign(new Error("Planner produced a Workflow without declared outputs"), { code: "WORKFLOW_OUTPUT_CONTRACT_EMPTY", retryable: true });
|
|
83
|
+
const revision = createWorkflowRevision({ workflowId: input.workflowId, revision: 1, source: { kind: "planner", planId: input.planId }, workflowSpec: planned.workflow, ir: planned.ir, completionMode: "outputs", catalogHash });
|
|
84
|
+
await this.workflows.save({ schemaVersion: "1.0", revision, ir: planned.ir });
|
|
85
|
+
const endedAt = this.now().toISOString();
|
|
86
|
+
const ready = PlanRecordSchema.parse({ ...initialPlan, status: "ready", workflowRevisionId: revision.workflowRevisionId,
|
|
87
|
+
hashes: { ...(planned.audit.plannerDraft ? { draft: contentHash(planned.audit.plannerDraft) } : {}), workflowSpec: revision.workflowSpecHash, workflowIr: revision.workflowIrHash }, validationErrors: [], updatedAt: endedAt, endedAt });
|
|
88
|
+
const record = base(ready, { attempts: [...(resumeRecord?.attempts ?? []), ...planned.attempts], rawOutputs: [...(resumeRecord?.rawOutputs ?? []), ...planned.rawOutputs], validationErrors: [], ...auditRecord(planned.audit) });
|
|
89
|
+
await this.plans.save(record);
|
|
90
|
+
return record;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
const failure = error instanceof WorkflowPlanningFailedError ? error : undefined;
|
|
94
|
+
const phase = failure?.audit.checkpoint.phase;
|
|
95
|
+
const status = phase === "blocked_missing_atom" ? "blocked_missing_atom" : phase === "blocked_missing_input" ? "blocked_missing_input" : "failed";
|
|
96
|
+
const endedAt = this.now().toISOString();
|
|
97
|
+
const code = typeof error?.code === "string" ? error.code : "WORKFLOW_PLANNING_FAILED";
|
|
98
|
+
const failed = PlanRecordSchema.parse({ ...initialPlan, status, validationErrors: failure?.validationErrors ?? [], updatedAt: endedAt, ...(status === "failed" ? { endedAt } : {}), error: { code, message: error instanceof Error ? error.message : String(error), retryable: error?.retryable === true } });
|
|
99
|
+
await this.plans.save(base(failed, { attempts: failure?.attempts ?? [], validationErrors: failure?.validationErrors ?? [], rawOutputs: failure?.rawOutputs ?? [], ...(failure ? auditRecord(failure.audit) : {}) }));
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async resume(input) {
|
|
104
|
+
const record = await this.plans.load(input.planId);
|
|
105
|
+
if (!record)
|
|
106
|
+
throw Object.assign(new Error(`Plan not found: ${input.planId}`), { code: "PLAN_NOT_FOUND", retryable: false });
|
|
107
|
+
if (!record.planningCheckpoint || !["blocked_missing_input", "blocked_missing_atom", "failed"].includes(record.plan.status))
|
|
108
|
+
throw Object.assign(new Error(`Plan is not resumable: ${input.planId}`), { code: "PLAN_NOT_RESUMABLE", retryable: false });
|
|
109
|
+
return this.plan(input, record);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=workflow-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-coordinator.js","sourceRoot":"","sources":["../../src/workflow/workflow-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface WorkflowOutputOptions {
|
|
2
|
+
readonly full?: boolean;
|
|
3
|
+
readonly includeEvents?: boolean;
|
|
4
|
+
}
|
|
5
|
+
/** Default projection for immutable Workflow records; `--full` exposes the frozen Spec and IR. */
|
|
6
|
+
export declare function formatWorkflowDefinitionOutput(value: unknown, full?: boolean): unknown;
|
|
7
|
+
/** Keeps useful run state while excluding large ACP events, checkpoints, and Planner transcripts. */
|
|
8
|
+
export declare function formatWorkflowOutput(value: unknown, options?: WorkflowOutputOptions): unknown;
|
|
9
|
+
//# sourceMappingURL=workflow-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-output.d.ts","sourceRoot":"","sources":["../../src/workflow/workflow-output.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAmBD,kGAAkG;AAClG,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,UAAQ,GAAG,OAAO,CAcpF;AAYD,qGAAqG;AACrG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CA2DjG"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
function revisionSummary(value) {
|
|
2
|
+
const direct = record(value);
|
|
3
|
+
const revision = record(direct?.revision) ?? direct;
|
|
4
|
+
if (!revision || typeof revision.workflowRevisionId !== "string" || typeof revision.workflowId !== "string")
|
|
5
|
+
return undefined;
|
|
6
|
+
const spec = record(revision.workflowSpec);
|
|
7
|
+
return {
|
|
8
|
+
workflowId: revision.workflowId,
|
|
9
|
+
workflowRevisionId: revision.workflowRevisionId,
|
|
10
|
+
...pick(revision, ["revision"]),
|
|
11
|
+
...(typeof revision.parentRevisionId === "string" ? { parentRevisionId: revision.parentRevisionId } : {}),
|
|
12
|
+
...(typeof spec?.name === "string" ? { name: spec.name } : {}),
|
|
13
|
+
nodeCount: Array.isArray(spec?.nodes) ? spec.nodes.length : 0,
|
|
14
|
+
referencedAtomCount: Array.isArray(revision.referencedAtoms) ? revision.referencedAtoms.length : 0,
|
|
15
|
+
...pick(revision, ["source", "workflowSpecHash", "workflowIrHash", "completionMode", "validation", "createdAt"]),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Default projection for immutable Workflow records; `--full` exposes the frozen Spec and IR. */
|
|
19
|
+
export function formatWorkflowDefinitionOutput(value, full = false) {
|
|
20
|
+
if (full)
|
|
21
|
+
return value;
|
|
22
|
+
const summary = revisionSummary(value);
|
|
23
|
+
if (summary)
|
|
24
|
+
return summary;
|
|
25
|
+
const document = record(value);
|
|
26
|
+
const definition = record(document?.definition);
|
|
27
|
+
if (!definition || !Array.isArray(document?.revisions))
|
|
28
|
+
return value;
|
|
29
|
+
return {
|
|
30
|
+
definition: pick(definition, ["workflowId", "name", "latestRevisionId", "createdAt", "updatedAt"]),
|
|
31
|
+
revisions: document.revisions.flatMap((revision) => {
|
|
32
|
+
const item = revisionSummary(revision);
|
|
33
|
+
return item ? [item] : [];
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function record(value) {
|
|
38
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
39
|
+
? value
|
|
40
|
+
: undefined;
|
|
41
|
+
}
|
|
42
|
+
function pick(source, keys) {
|
|
43
|
+
return Object.fromEntries(keys.flatMap((key) => source[key] === undefined ? [] : [[key, source[key]]]));
|
|
44
|
+
}
|
|
45
|
+
/** Keeps useful run state while excluding large ACP events, checkpoints, and Planner transcripts. */
|
|
46
|
+
export function formatWorkflowOutput(value, options = {}) {
|
|
47
|
+
if (options.full)
|
|
48
|
+
return value;
|
|
49
|
+
const snapshot = record(value);
|
|
50
|
+
const run = record(snapshot?.run);
|
|
51
|
+
if (!snapshot || !run || typeof run.runId !== "string" || typeof run.status !== "string")
|
|
52
|
+
return value;
|
|
53
|
+
const nodeRuns = Array.isArray(snapshot.nodeRuns) ? snapshot.nodeRuns : [];
|
|
54
|
+
const attempts = Array.isArray(snapshot.attempts) ? snapshot.attempts : [];
|
|
55
|
+
const nodes = nodeRuns.flatMap((candidate) => {
|
|
56
|
+
const node = record(candidate);
|
|
57
|
+
if (!node || typeof node.nodeId !== "string")
|
|
58
|
+
return [];
|
|
59
|
+
const attemptCount = attempts.filter((attempt) => record(attempt)?.activationId === node.activationId).length;
|
|
60
|
+
return [{
|
|
61
|
+
...pick(node, ["nodeId", "activationId", "activationIndex", "status", "startedAt", "endedAt", "error"]),
|
|
62
|
+
attemptCount,
|
|
63
|
+
}];
|
|
64
|
+
});
|
|
65
|
+
const signals = Array.isArray(snapshot.signals)
|
|
66
|
+
? snapshot.signals.flatMap((item) => {
|
|
67
|
+
const signal = record(item);
|
|
68
|
+
return signal?.status === "waiting" ? [pick(signal, [
|
|
69
|
+
"signalId", "runId", "workflowRevisionId", "nodeId", "activationId", "attemptId",
|
|
70
|
+
"projectScope", "hostScope", "key", "prompt", "context", "responseSchema",
|
|
71
|
+
"resume", "createdAt", "expiresAt",
|
|
72
|
+
])] : [];
|
|
73
|
+
})
|
|
74
|
+
: [];
|
|
75
|
+
const hostTasks = Array.isArray(snapshot.hostTasks)
|
|
76
|
+
? snapshot.hostTasks.flatMap((item) => {
|
|
77
|
+
const task = record(item);
|
|
78
|
+
const request = record(task?.request);
|
|
79
|
+
return task?.status === "waiting" && request ? [pick(request, [
|
|
80
|
+
"hostTaskId", "atom", "runId", "workflowRevisionId", "nodeId", "activationId",
|
|
81
|
+
"attemptId", "instruction", "input", "context", "artifacts", "expected",
|
|
82
|
+
"projectScope", "hostScope", "resume", "continuation",
|
|
83
|
+
])] : [];
|
|
84
|
+
})
|
|
85
|
+
: [];
|
|
86
|
+
const workflowSpec = record(record(snapshot.revision)?.workflowSpec);
|
|
87
|
+
const summary = {
|
|
88
|
+
schemaVersion: "1.0",
|
|
89
|
+
run: pick(run, [
|
|
90
|
+
"runId", "planId", "status", "goal", "workflowRevisionId", "outputs", "error",
|
|
91
|
+
"createdAt", "startedAt", "updatedAt", "endedAt",
|
|
92
|
+
]),
|
|
93
|
+
workflow: {
|
|
94
|
+
...(typeof workflowSpec?.name === "string" ? { name: workflowSpec.name } : {}),
|
|
95
|
+
nodeCount: nodes.length,
|
|
96
|
+
nodes,
|
|
97
|
+
},
|
|
98
|
+
execution: {
|
|
99
|
+
transitionCount: typeof snapshot.transitionCount === "number" ? snapshot.transitionCount : 0,
|
|
100
|
+
edgeTraversals: record(snapshot.edgeTraversals) ?? {},
|
|
101
|
+
decisions: Array.isArray(snapshot.decisions) ? snapshot.decisions : [],
|
|
102
|
+
},
|
|
103
|
+
pending: { signals, hostTasks },
|
|
104
|
+
};
|
|
105
|
+
if (options.includeEvents)
|
|
106
|
+
summary.events = Array.isArray(snapshot.events) ? snapshot.events : [];
|
|
107
|
+
return summary;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=workflow-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-output.js","sourceRoot":"","sources":["../../src/workflow/workflow-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type AtomDiscoveryConfig } from "@atom-workflow-agent/atom-catalog";
|
|
2
|
+
import { type LocalProviderName } from "../providers/provider-name.js";
|
|
3
|
+
export interface WorkflowProjectConfig {
|
|
4
|
+
readonly planner?: {
|
|
5
|
+
readonly provider?: LocalProviderName;
|
|
6
|
+
readonly model?: string;
|
|
7
|
+
readonly maxPlanningTurns?: number;
|
|
8
|
+
};
|
|
9
|
+
readonly dataDirectory?: string;
|
|
10
|
+
readonly atoms: AtomDiscoveryConfig;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadWorkflowProjectConfig(cwd: string): Promise<WorkflowProjectConfig>;
|
|
13
|
+
export declare function resolveDefaultPlannerModel(provider: LocalProviderName, cwd: string, signal?: AbortSignal): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=workflow-project-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-project-config.d.ts","sourceRoot":"","sources":["../../src/workflow/workflow-project-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAE5F,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;QACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KACpC,CAAC;IACF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;CACrC;AAED,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAkC3F;AAED,wBAAsB,0BAA0B,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAKhI"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { AtomWorkflowError } from "@atom-workflow-agent/contracts";
|
|
4
|
+
import { AtomDiscoveryConfigSchema, } from "@atom-workflow-agent/atom-catalog";
|
|
5
|
+
import { runModelsCommand } from "../commands/models.js";
|
|
6
|
+
import { isLocalProviderName } from "../providers/provider-name.js";
|
|
7
|
+
export async function loadWorkflowProjectConfig(cwd) {
|
|
8
|
+
try {
|
|
9
|
+
const raw = JSON.parse(await readFile(join(cwd, ".atom-workflow-agent", "config.json"), "utf8"));
|
|
10
|
+
const unknownKeys = Object.keys(raw).filter((key) => !["planner", "dataDirectory", "atoms"].includes(key));
|
|
11
|
+
if (unknownKeys.length > 0)
|
|
12
|
+
throw new AtomWorkflowError("PROJECT_CONFIG_INVALID", `Unknown project config keys: ${unknownKeys.join(", ")}`);
|
|
13
|
+
const planner = raw.planner;
|
|
14
|
+
const dataDirectory = raw.dataDirectory;
|
|
15
|
+
if (planner !== undefined && (planner === null || typeof planner !== "object" || Array.isArray(planner))) {
|
|
16
|
+
throw new AtomWorkflowError("PROJECT_CONFIG_INVALID", "planner must be an object");
|
|
17
|
+
}
|
|
18
|
+
if (planner !== undefined) {
|
|
19
|
+
const unknownPlannerKeys = Object.keys(planner).filter((key) => !["provider", "model", "maxPlanningTurns"].includes(key));
|
|
20
|
+
if (unknownPlannerKeys.length > 0)
|
|
21
|
+
throw new AtomWorkflowError("PROJECT_CONFIG_INVALID", `Unknown planner config keys: ${unknownPlannerKeys.join(", ")}`);
|
|
22
|
+
if (planner.model !== undefined && (typeof planner.model !== "string" || planner.model.trim() === "")) {
|
|
23
|
+
throw new AtomWorkflowError("PROJECT_CONFIG_INVALID", "planner.model must be a non-empty string");
|
|
24
|
+
}
|
|
25
|
+
if (planner.maxPlanningTurns !== undefined && (!Number.isInteger(planner.maxPlanningTurns) || planner.maxPlanningTurns < 1 || planner.maxPlanningTurns > 256)) {
|
|
26
|
+
throw new AtomWorkflowError("PROJECT_CONFIG_INVALID", "planner.maxPlanningTurns must be an integer from 1 to 256");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (dataDirectory !== undefined && typeof dataDirectory !== "string")
|
|
30
|
+
throw new AtomWorkflowError("PROJECT_CONFIG_INVALID", "dataDirectory must be a string");
|
|
31
|
+
if (planner?.provider !== undefined && !isLocalProviderName(planner.provider)) {
|
|
32
|
+
throw new AtomWorkflowError("PROJECT_CONFIG_INVALID", `Unsupported planner provider: ${String(planner.provider)}`);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
atoms: AtomDiscoveryConfigSchema.parse(raw.atoms ?? {}),
|
|
36
|
+
...(planner !== undefined ? { planner } : {}),
|
|
37
|
+
...(typeof dataDirectory === "string" ? { dataDirectory } : {}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error.code === "ENOENT")
|
|
42
|
+
return { atoms: AtomDiscoveryConfigSchema.parse({}) };
|
|
43
|
+
if (error instanceof AtomWorkflowError)
|
|
44
|
+
throw error;
|
|
45
|
+
throw new AtomWorkflowError("PROJECT_CONFIG_INVALID", "Failed to parse .atom-workflow-agent/config.json", false, { cause: error });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function resolveDefaultPlannerModel(provider, cwd, signal) {
|
|
49
|
+
const catalog = await runModelsCommand({ providerId: provider, cwd, json: true, ...(signal ? { signal } : {}) });
|
|
50
|
+
const model = catalog.currentModelId ?? catalog.models[0]?.id;
|
|
51
|
+
if (!model)
|
|
52
|
+
throw new AtomWorkflowError("ACP_MODEL_UNAVAILABLE", `No model is available for ${provider}`);
|
|
53
|
+
return model;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=workflow-project-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-project-config.js","sourceRoot":"","sources":["../../src/workflow/workflow-project-config.ts"],"names":[],"mappings":"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"}
|