@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 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-provider-config.d.ts","sourceRoot":"","sources":["../../src/providers/resolve-provider-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAE3F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,WAAW,iCAAiC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,iBAAiB,CAAC,CAU5B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { findExecutable } from "@atom-workflow-agent/acp-provider";
|
|
2
|
+
import { createDefaultAcpProviderResolver } from "@atom-workflow-agent/acp-sdk";
|
|
3
|
+
export async function resolveLocalAcpProviderConfig(name, options = {}) {
|
|
4
|
+
const lookup = options.lookup ?? findExecutable;
|
|
5
|
+
const env = options.env ?? process.env;
|
|
6
|
+
const resolver = createDefaultAcpProviderResolver({
|
|
7
|
+
env,
|
|
8
|
+
lookup,
|
|
9
|
+
...(options.homeDirectory ? { homeDirectory: options.homeDirectory } : {}),
|
|
10
|
+
});
|
|
11
|
+
const config = await resolver(name);
|
|
12
|
+
return { ...config, ...(options.model ? { model: options.model } : {}) };
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=resolve-provider-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-provider-config.js","sourceRoot":"","sources":["../../src/providers/resolve-provider-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA0B,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAUhF,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,IAAuB,EACvB,UAA6C,EAAE;IAE/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,QAAQ,GAAG,gCAAgC,CAAC;QAChD,GAAG;QACH,MAAM;QACN,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ResolveTraeExecutableOptions {
|
|
2
|
+
readonly env: NodeJS.ProcessEnv;
|
|
3
|
+
readonly lookup: (command: string) => Promise<string | undefined>;
|
|
4
|
+
readonly homeDirectory: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ResolvedTraeExecutable {
|
|
7
|
+
readonly command: string;
|
|
8
|
+
readonly executable?: string;
|
|
9
|
+
readonly explicitlyConfigured: boolean;
|
|
10
|
+
readonly configuredBy?: "ATOM_WORKFLOW_AGENT_TRAE_ACP_COMMAND" | "ATOM_WORKFLOW_AGENT_TRAEX_ACP_COMMAND";
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Trae's native ACP server is `traecli acp serve`.
|
|
14
|
+
*
|
|
15
|
+
* `traex` and its environment variable remain fallback aliases for existing
|
|
16
|
+
* project configurations. The explicit ~/.local/bin probes cover non-
|
|
17
|
+
* interactive Host shells that do not inherit a user's interactive PATH.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveTraeExecutable(options: ResolveTraeExecutableOptions): Promise<ResolvedTraeExecutable>;
|
|
20
|
+
//# sourceMappingURL=resolve-trae-executable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-trae-executable.d.ts","sourceRoot":"","sources":["../../src/providers/resolve-trae-executable.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,sCAAsC,GAAG,uCAAuC,CAAC;CAC1G;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,sBAAsB,CAAC,CAsCjC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
/**
|
|
3
|
+
* Trae's native ACP server is `traecli acp serve`.
|
|
4
|
+
*
|
|
5
|
+
* `traex` and its environment variable remain fallback aliases for existing
|
|
6
|
+
* project configurations. The explicit ~/.local/bin probes cover non-
|
|
7
|
+
* interactive Host shells that do not inherit a user's interactive PATH.
|
|
8
|
+
*/
|
|
9
|
+
export async function resolveTraeExecutable(options) {
|
|
10
|
+
const canonical = options.env.ATOM_WORKFLOW_AGENT_TRAE_ACP_COMMAND?.trim();
|
|
11
|
+
const legacy = options.env.ATOM_WORKFLOW_AGENT_TRAEX_ACP_COMMAND?.trim();
|
|
12
|
+
const explicit = canonical || legacy;
|
|
13
|
+
const candidates = explicit
|
|
14
|
+
? [explicit]
|
|
15
|
+
: [
|
|
16
|
+
"traecli",
|
|
17
|
+
"traex",
|
|
18
|
+
join(options.homeDirectory, ".local", "bin", "traecli"),
|
|
19
|
+
join(options.homeDirectory, ".local", "bin", "traex"),
|
|
20
|
+
];
|
|
21
|
+
for (const command of candidates) {
|
|
22
|
+
const executable = await options.lookup(command);
|
|
23
|
+
if (executable) {
|
|
24
|
+
return {
|
|
25
|
+
command,
|
|
26
|
+
executable,
|
|
27
|
+
explicitlyConfigured: Boolean(explicit),
|
|
28
|
+
...(canonical
|
|
29
|
+
? { configuredBy: "ATOM_WORKFLOW_AGENT_TRAE_ACP_COMMAND" }
|
|
30
|
+
: legacy
|
|
31
|
+
? { configuredBy: "ATOM_WORKFLOW_AGENT_TRAEX_ACP_COMMAND" }
|
|
32
|
+
: {}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
command: candidates[0],
|
|
38
|
+
explicitlyConfigured: Boolean(explicit),
|
|
39
|
+
...(canonical
|
|
40
|
+
? { configuredBy: "ATOM_WORKFLOW_AGENT_TRAE_ACP_COMMAND" }
|
|
41
|
+
: legacy
|
|
42
|
+
? { configuredBy: "ATOM_WORKFLOW_AGENT_TRAEX_ACP_COMMAND" }
|
|
43
|
+
: {}),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=resolve-trae-executable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-trae-executable.js","sourceRoot":"","sources":["../../src/providers/resolve-trae-executable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAejC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAqC;IAErC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,IAAI,EAAE,CAAC;IAC3E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,IAAI,EAAE,CAAC;IACzE,MAAM,QAAQ,GAAG,SAAS,IAAI,MAAM,CAAC;IACrC,MAAM,UAAU,GAAG,QAAQ;QACzB,CAAC,CAAC,CAAC,QAAQ,CAAC;QACZ,CAAC,CAAC;YACA,SAAS;YACT,OAAO;YACP,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC;YACvD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;SACtD,CAAC;IAEJ,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,OAAO;gBACP,UAAU;gBACV,oBAAoB,EAAE,OAAO,CAAC,QAAQ,CAAC;gBACvC,GAAG,CAAC,SAAS;oBACX,CAAC,CAAC,EAAE,YAAY,EAAE,sCAA+C,EAAE;oBACnE,CAAC,CAAC,MAAM;wBACN,CAAC,CAAC,EAAE,YAAY,EAAE,uCAAgD,EAAE;wBACpE,CAAC,CAAC,EAAE,CAAC;aACV,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,CAAC,CAAE;QACvB,oBAAoB,EAAE,OAAO,CAAC,QAAQ,CAAC;QACvC,GAAG,CAAC,SAAS;YACX,CAAC,CAAC,EAAE,YAAY,EAAE,sCAA+C,EAAE;YACnE,CAAC,CAAC,MAAM;gBACN,CAAC,CAAC,EAAE,YAAY,EAAE,uCAAgD,EAAE;gBACpE,CAAC,CAAC,EAAE,CAAC;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { AtomRegistry, type LoadedAtomPackage } from "@atom-workflow-agent/atom-catalog";
|
|
2
|
+
/** Registers trusted Runtime-owned Atom packages before project sources. */
|
|
3
|
+
export declare function registerBuiltinAtomPackages(registry: AtomRegistry, _cwd: string): Promise<readonly LoadedAtomPackage[]>;
|
|
4
|
+
//# sourceMappingURL=builtin-atom-packages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin-atom-packages.d.ts","sourceRoot":"","sources":["../../src/workflow/builtin-atom-packages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AASzF,4EAA4E;AAC5E,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CA4BvC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { atomKey, AtomWorkflowError } from "@atom-workflow-agent/contracts";
|
|
2
|
+
import { AtomRegistry } from "@atom-workflow-agent/atom-catalog";
|
|
3
|
+
import { atomPackage as selectAtomPackage } from "@atom-workflow-agent/select-atom";
|
|
4
|
+
const BUILTIN_ATOM_PACKAGES = Object.freeze([
|
|
5
|
+
selectAtomPackage,
|
|
6
|
+
]);
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
/** Registers trusted Runtime-owned Atom packages before project sources. */
|
|
9
|
+
export async function registerBuiltinAtomPackages(registry, _cwd) {
|
|
10
|
+
const loaded = [];
|
|
11
|
+
const allKeys = new Set();
|
|
12
|
+
for (const atomPackage of BUILTIN_ATOM_PACKAGES) {
|
|
13
|
+
const sourceId = `builtin:${atomPackage.manifest.id}`;
|
|
14
|
+
const atoms = atomPackage.atoms;
|
|
15
|
+
const atomKeys = atoms.map((atom) => atomKey(atom.manifest));
|
|
16
|
+
for (const key of atomKeys) {
|
|
17
|
+
if (allKeys.has(key)) {
|
|
18
|
+
throw new AtomWorkflowError("BUILTIN_ATOM_DUPLICATE", `Built-in Atom is exported more than once: ${key}`);
|
|
19
|
+
}
|
|
20
|
+
allKeys.add(key);
|
|
21
|
+
}
|
|
22
|
+
const moduleUrl = pathToFileURL(require.resolve("@atom-workflow-agent/select-atom")).href;
|
|
23
|
+
for (const atom of atoms)
|
|
24
|
+
await registry.register(atom, { kind: "module", sourceId, moduleUrl });
|
|
25
|
+
loaded.push({
|
|
26
|
+
sourceId,
|
|
27
|
+
packageId: atomPackage.manifest.id,
|
|
28
|
+
packageVersion: atomPackage.manifest.version,
|
|
29
|
+
atomKeys: [...atomKeys].sort(),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return Object.freeze(loaded.map((item) => Object.freeze({
|
|
33
|
+
...item,
|
|
34
|
+
atomKeys: Object.freeze([...item.atomKeys]),
|
|
35
|
+
})));
|
|
36
|
+
}
|
|
37
|
+
import { createRequire } from "node:module";
|
|
38
|
+
import { pathToFileURL } from "node:url";
|
|
39
|
+
//# sourceMappingURL=builtin-atom-packages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin-atom-packages.js","sourceRoot":"","sources":["../../src/workflow/builtin-atom-packages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAA0B,MAAM,mCAAmC,CAAC;AAEzF,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAEpF,MAAM,qBAAqB,GAA2B,MAAM,CAAC,MAAM,CAAC;IAClE,iBAAiB;CAClB,CAAC,CAAC;AACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,QAAsB,EACtB,IAAY;IAEZ,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,KAAK,MAAM,WAAW,IAAI,qBAAqB,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,WAAW,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;QAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,iBAAiB,CAAC,wBAAwB,EAAE,6CAA6C,GAAG,EAAE,CAAC,CAAC;YAC5G,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1F,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACjG,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ;YACR,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE;YAClC,cAAc,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO;YAC5C,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;QACtD,GAAG,IAAI;QACP,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC5C,CAAC,CAAC,CAAC,CAAC;AACP,CAAC;AACD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type JsonValue, type PlanningDraftTransaction, type PlanningGapReport } from "@atom-workflow-agent/contracts";
|
|
2
|
+
import { AtomRegistry, type LoadedAtomPackage } from "@atom-workflow-agent/atom-catalog";
|
|
3
|
+
import { LocalPlanStore } from "@atom-workflow-agent/workflow-planner";
|
|
4
|
+
export interface PlanningCliServiceOptions {
|
|
5
|
+
readonly cwd: string;
|
|
6
|
+
readonly dataDirectory?: string;
|
|
7
|
+
readonly now?: () => Date;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Catalog-only service for Planner tool subprocesses.
|
|
11
|
+
* It never creates ACP, Runtime, recovery, cache, or Atom instance resources.
|
|
12
|
+
*/
|
|
13
|
+
export declare class PlanningCliService {
|
|
14
|
+
readonly store: LocalPlanStore;
|
|
15
|
+
readonly registry: AtomRegistry;
|
|
16
|
+
private readonly now;
|
|
17
|
+
readonly loadedPackages: readonly LoadedAtomPackage[];
|
|
18
|
+
private constructor();
|
|
19
|
+
static create(options: PlanningCliServiceOptions): Promise<PlanningCliService>;
|
|
20
|
+
inspectWorkspace(planId: string): Promise<JsonValue>;
|
|
21
|
+
workspaceFrontier(planId: string): Promise<JsonValue>;
|
|
22
|
+
searchWorkspaceCatalog(planId: string, query: string): Promise<JsonValue>;
|
|
23
|
+
describeWorkspaceAtom(planId: string, key: string): Promise<JsonValue>;
|
|
24
|
+
applyWorkspaceTransaction(planId: string, transaction: PlanningDraftTransaction): Promise<JsonValue>;
|
|
25
|
+
validateWorkspace(planId: string): Promise<JsonValue>;
|
|
26
|
+
finalizeWorkspace(planId: string, expected: {
|
|
27
|
+
readonly revision: number;
|
|
28
|
+
readonly draftHash: string;
|
|
29
|
+
}): Promise<JsonValue>;
|
|
30
|
+
reportWorkspaceGap(planId: string, report: PlanningGapReport): Promise<JsonValue>;
|
|
31
|
+
private workspace;
|
|
32
|
+
private persistWorkspace;
|
|
33
|
+
dispose(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=planning-cli-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning-cli-service.d.ts","sourceRoot":"","sources":["../../src/workflow/planning-cli-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,YAAY,EAAoB,KAAK,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3G,OAAO,EAAE,cAAc,EAA4B,MAAM,uCAAuC,CAAC;AAIjG,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAID;;;GAGG;AACH,qBAAa,kBAAkB;IAE3B,QAAQ,CAAC,KAAK,EAAE,cAAc;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,QAAQ,CAAC,cAAc,EAAE,SAAS,iBAAiB,EAAE;IAJvD,OAAO;WAOM,MAAM,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAc9E,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAIpD,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAIrD,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAIzE,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAItE,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,wBAAwB,GAAG,OAAO,CAAC,SAAS,CAAC;IAOpG,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAIrD,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAY1H,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;YAWzE,SAAS;YAOT,gBAAgB;IAwB9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CACzB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { AtomWorkflowError, PlanningCheckpointSchema, } from "@atom-workflow-agent/contracts";
|
|
2
|
+
import { AtomRegistry, loadAtomPackages } from "@atom-workflow-agent/atom-catalog";
|
|
3
|
+
import { LocalPlanStore, PlanningWorkspaceService } from "@atom-workflow-agent/workflow-planner";
|
|
4
|
+
import { registerBuiltinAtomPackages } from "./builtin-atom-packages.js";
|
|
5
|
+
import { loadWorkflowProjectConfig } from "./workflow-project-config.js";
|
|
6
|
+
const asJson = (value) => JSON.parse(JSON.stringify(value));
|
|
7
|
+
/**
|
|
8
|
+
* Catalog-only service for Planner tool subprocesses.
|
|
9
|
+
* It never creates ACP, Runtime, recovery, cache, or Atom instance resources.
|
|
10
|
+
*/
|
|
11
|
+
export class PlanningCliService {
|
|
12
|
+
store;
|
|
13
|
+
registry;
|
|
14
|
+
now;
|
|
15
|
+
loadedPackages;
|
|
16
|
+
constructor(store, registry, now, loadedPackages) {
|
|
17
|
+
this.store = store;
|
|
18
|
+
this.registry = registry;
|
|
19
|
+
this.now = now;
|
|
20
|
+
this.loadedPackages = loadedPackages;
|
|
21
|
+
}
|
|
22
|
+
static async create(options) {
|
|
23
|
+
const config = await loadWorkflowProjectConfig(options.cwd);
|
|
24
|
+
const root = options.dataDirectory ?? config.dataDirectory ?? `${options.cwd}/.atom-workflow-agent`;
|
|
25
|
+
const registry = new AtomRegistry();
|
|
26
|
+
const builtin = await registerBuiltinAtomPackages(registry, options.cwd);
|
|
27
|
+
const configured = await loadAtomPackages({ cwd: options.cwd, registry, config: config.atoms });
|
|
28
|
+
return new PlanningCliService(new LocalPlanStore(root), registry, options.now ?? (() => new Date()), Object.freeze([...builtin, ...configured]));
|
|
29
|
+
}
|
|
30
|
+
async inspectWorkspace(planId) {
|
|
31
|
+
return asJson((await this.workspace(planId)).service.inspect());
|
|
32
|
+
}
|
|
33
|
+
async workspaceFrontier(planId) {
|
|
34
|
+
return asJson((await this.workspace(planId)).service.frontier());
|
|
35
|
+
}
|
|
36
|
+
async searchWorkspaceCatalog(planId, query) {
|
|
37
|
+
return asJson((await this.workspace(planId)).service.searchCatalog(query));
|
|
38
|
+
}
|
|
39
|
+
async describeWorkspaceAtom(planId, key) {
|
|
40
|
+
return asJson((await this.workspace(planId)).service.describeAtom(key));
|
|
41
|
+
}
|
|
42
|
+
async applyWorkspaceTransaction(planId, transaction) {
|
|
43
|
+
const active = await this.workspace(planId);
|
|
44
|
+
const result = active.service.applyTransaction(transaction);
|
|
45
|
+
await this.persistWorkspace(active.record, active.service, "workspace");
|
|
46
|
+
return asJson({ result, frontier: active.service.frontier() });
|
|
47
|
+
}
|
|
48
|
+
async validateWorkspace(planId) {
|
|
49
|
+
return asJson((await this.workspace(planId)).service.validate());
|
|
50
|
+
}
|
|
51
|
+
async finalizeWorkspace(planId, expected) {
|
|
52
|
+
const active = await this.workspace(planId);
|
|
53
|
+
const finalized = active.service.finalize(expected);
|
|
54
|
+
await this.persistWorkspace(active.record, active.service, "completed");
|
|
55
|
+
return asJson({
|
|
56
|
+
workspace: finalized.workspace,
|
|
57
|
+
revision: finalized.revision,
|
|
58
|
+
workflow: finalized.workflow,
|
|
59
|
+
ir: finalized.ir,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async reportWorkspaceGap(planId, report) {
|
|
63
|
+
const active = await this.workspace(planId);
|
|
64
|
+
const snapshot = active.service.reportGap(report);
|
|
65
|
+
await this.persistWorkspace(active.record, active.service, report.kind === "missing-atom" ? "blocked_missing_atom" : "blocked_missing_input");
|
|
66
|
+
return asJson(snapshot);
|
|
67
|
+
}
|
|
68
|
+
async workspace(planId) {
|
|
69
|
+
const record = await this.store.load(planId);
|
|
70
|
+
const snapshot = record?.workspaceSnapshot ?? record?.planningCheckpoint?.workspaceSnapshot;
|
|
71
|
+
if (!record || !snapshot)
|
|
72
|
+
throw new AtomWorkflowError("PLANNING_WORKSPACE_NOT_FOUND", `No Planning Workspace exists for plan ${planId}`);
|
|
73
|
+
return { record, service: PlanningWorkspaceService.restore(this.registry, snapshot, { now: this.now }) };
|
|
74
|
+
}
|
|
75
|
+
async persistWorkspace(record, service, phase) {
|
|
76
|
+
const workspaceSnapshot = service.snapshot();
|
|
77
|
+
const plannerDraft = workspaceSnapshot.revisions.at(-1)?.plannerDraft;
|
|
78
|
+
const current = record.planningCheckpoint;
|
|
79
|
+
if (!current)
|
|
80
|
+
throw new AtomWorkflowError("PLANNING_CHECKPOINT_MISSING", "Planning Workspace has no durable checkpoint");
|
|
81
|
+
const planningCheckpoint = PlanningCheckpointSchema.parse({
|
|
82
|
+
...current,
|
|
83
|
+
phase,
|
|
84
|
+
workspaceSnapshot,
|
|
85
|
+
lastValidationErrors: phase === "workspace" || phase === "completed" ? [] : current.lastValidationErrors,
|
|
86
|
+
...(plannerDraft ? { acceptedPlannerDraft: plannerDraft } : {}),
|
|
87
|
+
});
|
|
88
|
+
await this.store.save({
|
|
89
|
+
...record,
|
|
90
|
+
workspaceSnapshot,
|
|
91
|
+
planningCheckpoint,
|
|
92
|
+
...(plannerDraft ? { plannerDraft } : {}),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
dispose() { return this.registry.disposeAll("Planning CLI command completed"); }
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=planning-cli-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning-cli-service.js","sourceRoot":"","sources":["../../src/workflow/planning-cli-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { JsonValue } from "@atom-workflow-agent/contracts";
|
|
2
|
+
import type { WorkflowCommandService } from "./workflow-command-service.js";
|
|
3
|
+
export interface WorkflowCommandIo {
|
|
4
|
+
stdout(text: string): void;
|
|
5
|
+
stderr(text: string): void;
|
|
6
|
+
}
|
|
7
|
+
export interface WorkflowCommandDependencies {
|
|
8
|
+
readonly cwd: string;
|
|
9
|
+
readonly signal?: AbortSignal;
|
|
10
|
+
readonly createService?: (cwd: string, signal?: AbortSignal, dataDirectory?: string) => Promise<WorkflowCommandService>;
|
|
11
|
+
readonly readStdin?: () => Promise<string>;
|
|
12
|
+
readonly readTextFile?: (path: string) => Promise<string>;
|
|
13
|
+
readonly writeTextFile?: (path: string, content: string) => Promise<void>;
|
|
14
|
+
readonly wait?: (ms: number) => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare function writeTextOutput(path: string, content: string, dependencies: WorkflowCommandDependencies): Promise<string>;
|
|
17
|
+
export declare function option(args: readonly string[], name: string): string | undefined;
|
|
18
|
+
export declare function required(args: readonly string[], name: string): string;
|
|
19
|
+
export declare function integerOption(args: readonly string[], name: string, fallback?: number): number | undefined;
|
|
20
|
+
export declare function positiveIntegerOption(args: readonly string[], name: string): number | undefined;
|
|
21
|
+
export declare function jsonSource(source: string, dependencies: WorkflowCommandDependencies): Promise<unknown>;
|
|
22
|
+
export declare function inlineJson(raw: string, optionName: string): unknown;
|
|
23
|
+
export declare function optionalJson(args: readonly string[], fileOption: string, inlineOption: string, dependencies: WorkflowCommandDependencies, fallback: JsonValue): Promise<JsonValue>;
|
|
24
|
+
export declare function startRequest(args: readonly string[], dependencies: WorkflowCommandDependencies): Promise<unknown>;
|
|
25
|
+
//# sourceMappingURL=workflow-command-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-command-input.d.ts","sourceRoot":"","sources":["../../src/workflow/workflow-command-input.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAwB,MAAM,gCAAgC,CAAC;AACtF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACxH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,2BAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ/H;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMhF;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAItE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM1G;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI/F;AAQD,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC,CAW5G;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAGnE;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,2BAA2B,EACzC,QAAQ,EAAE,SAAS,GAClB,OAAO,CAAC,SAAS,CAAC,CAMpB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,YAAY,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BvH"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { isAbsolute, resolve } from "node:path";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
export async function writeTextOutput(path, content, dependencies) {
|
|
5
|
+
const resolved = isAbsolute(path) ? path : resolve(dependencies.cwd, path);
|
|
6
|
+
if (dependencies.writeTextFile)
|
|
7
|
+
await dependencies.writeTextFile(resolved, content);
|
|
8
|
+
else {
|
|
9
|
+
await mkdir(dirname(resolved), { recursive: true });
|
|
10
|
+
await writeFile(resolved, content, "utf8");
|
|
11
|
+
}
|
|
12
|
+
return resolved;
|
|
13
|
+
}
|
|
14
|
+
export function option(args, name) {
|
|
15
|
+
const direct = args.find((arg) => arg.startsWith(`${name}=`));
|
|
16
|
+
if (direct)
|
|
17
|
+
return direct.slice(name.length + 1);
|
|
18
|
+
const index = args.indexOf(name);
|
|
19
|
+
const value = index >= 0 ? args[index + 1] : undefined;
|
|
20
|
+
return value && !value.startsWith("--") ? value : undefined;
|
|
21
|
+
}
|
|
22
|
+
export function required(args, name) {
|
|
23
|
+
const value = option(args, name);
|
|
24
|
+
if (!value)
|
|
25
|
+
throw Object.assign(new Error(`Missing required option: ${name}`), { code: "CLI_INPUT_INVALID" });
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
export function integerOption(args, name, fallback) {
|
|
29
|
+
const raw = option(args, name);
|
|
30
|
+
if (raw === undefined)
|
|
31
|
+
return fallback;
|
|
32
|
+
const value = Number(raw);
|
|
33
|
+
if (!Number.isInteger(value))
|
|
34
|
+
throw Object.assign(new Error(`${name} must be an integer`), { code: "CLI_INPUT_INVALID" });
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
export function positiveIntegerOption(args, name) {
|
|
38
|
+
const value = integerOption(args, name);
|
|
39
|
+
if (value !== undefined && value < 1)
|
|
40
|
+
throw Object.assign(new Error(`${name} must be a positive integer`), { code: "CLI_INPUT_INVALID" });
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
async function defaultReadStdin() {
|
|
44
|
+
const chunks = [];
|
|
45
|
+
for await (const chunk of process.stdin)
|
|
46
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
47
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
48
|
+
}
|
|
49
|
+
export async function jsonSource(source, dependencies) {
|
|
50
|
+
const text = source === "-"
|
|
51
|
+
? await (dependencies.readStdin ?? defaultReadStdin)()
|
|
52
|
+
: await (dependencies.readTextFile ?? ((path) => readFile(path, "utf8")))(isAbsolute(source) ? source : resolve(dependencies.cwd, source));
|
|
53
|
+
if (text.trim().length === 0) {
|
|
54
|
+
throw Object.assign(new Error(source === "-"
|
|
55
|
+
? "stdin was empty; use --goal/--input or --request for a one-shot command, or allocate a PTY before using --request-file -"
|
|
56
|
+
: `JSON file is empty: ${source}`), { code: source === "-" ? "CLI_STDIN_EMPTY" : "CLI_JSON_EMPTY" });
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(text);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
throw Object.assign(new Error(`Invalid JSON from ${source}`), { code: "CLI_JSON_INVALID", cause: error });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function inlineJson(raw, optionName) {
|
|
66
|
+
try {
|
|
67
|
+
return JSON.parse(raw);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
throw Object.assign(new Error(`Invalid JSON in ${optionName}`), { code: "CLI_JSON_INVALID", cause: error });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function optionalJson(args, fileOption, inlineOption, dependencies, fallback) {
|
|
74
|
+
const file = option(args, fileOption);
|
|
75
|
+
if (file)
|
|
76
|
+
return await jsonSource(file, dependencies);
|
|
77
|
+
const inline = option(args, inlineOption);
|
|
78
|
+
if (inline)
|
|
79
|
+
return inlineJson(inline, inlineOption);
|
|
80
|
+
return fallback;
|
|
81
|
+
}
|
|
82
|
+
export async function startRequest(args, dependencies) {
|
|
83
|
+
const file = option(args, "--request-file");
|
|
84
|
+
const inline = option(args, "--request");
|
|
85
|
+
if (file && inline)
|
|
86
|
+
throw Object.assign(new Error("Use either --request or --request-file, not both"), { code: "CLI_INPUT_INVALID" });
|
|
87
|
+
if (file)
|
|
88
|
+
return jsonSource(file, dependencies);
|
|
89
|
+
if (inline)
|
|
90
|
+
return inlineJson(inline, "--request");
|
|
91
|
+
const goal = required(args, "--goal");
|
|
92
|
+
const workflowInputs = await optionalJson(args, "--input-file", "--input", dependencies, {});
|
|
93
|
+
const context = await optionalJson(args, "--context-file", "--context", dependencies, {});
|
|
94
|
+
const maxPlanningTurns = positiveIntegerOption(args, "--planner-max-planning-turns");
|
|
95
|
+
const request = {
|
|
96
|
+
schemaVersion: "1.0",
|
|
97
|
+
goal,
|
|
98
|
+
...(option(args, "--run-id") ? { runId: option(args, "--run-id") } : {}),
|
|
99
|
+
...(option(args, "--cwd") ? { cwd: option(args, "--cwd") } : {}),
|
|
100
|
+
...(option(args, "--project-scope") ? { projectScope: option(args, "--project-scope") } : {}),
|
|
101
|
+
...(option(args, "--host-scope") ? { hostScope: option(args, "--host-scope") } : {}),
|
|
102
|
+
workflowInputs: (() => {
|
|
103
|
+
if (workflowInputs === null || typeof workflowInputs !== "object" || Array.isArray(workflowInputs)) {
|
|
104
|
+
throw Object.assign(new Error("Workflow input must be a JSON object"), { code: "CLI_INPUT_INVALID" });
|
|
105
|
+
}
|
|
106
|
+
return workflowInputs;
|
|
107
|
+
})(),
|
|
108
|
+
context,
|
|
109
|
+
planner: {
|
|
110
|
+
...(option(args, "--planner-provider") ? { provider: option(args, "--planner-provider") } : {}),
|
|
111
|
+
...(option(args, "--planner-model") ? { model: option(args, "--planner-model") } : {}),
|
|
112
|
+
...(maxPlanningTurns !== undefined ? { maxPlanningTurns } : {}),
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
return request;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=workflow-command-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-command-input.js","sourceRoot":"","sources":["../../src/workflow/workflow-command-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AtomDevelopmentExecutionOptions } from "../atoms/atom-development-service.js";
|
|
2
|
+
import type { WorkflowCommandIo } from "./workflow-command-input.js";
|
|
3
|
+
import type { WorkflowServiceExecutionOptions } from "./workflow-service.js";
|
|
4
|
+
export declare function executionOptions(args: readonly string[], io: WorkflowCommandIo): WorkflowServiceExecutionOptions;
|
|
5
|
+
export declare function atomExecutionOptions(args: readonly string[], io: WorkflowCommandIo): AtomDevelopmentExecutionOptions;
|
|
6
|
+
//# sourceMappingURL=workflow-command-progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-command-progress.d.ts","sourceRoot":"","sources":["../../src/workflow/workflow-command-progress.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,+BAA+B,EAA2B,MAAM,uBAAuB,CAAC;AA6CtG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,iBAAiB,GAAG,+BAA+B,CAGhH;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,iBAAiB,GAAG,+BAA+B,CAqBpH"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { positiveIntegerOption } from "./workflow-command-input.js";
|
|
2
|
+
function progressLine(progress) {
|
|
3
|
+
if (progress.type === "planner.started")
|
|
4
|
+
return `[Planner] 正在使用 ${progress.providerId}/${progress.model} 生成 Workflow(plan: ${progress.planId})`;
|
|
5
|
+
if (progress.type === "planner.failed")
|
|
6
|
+
return `[Planner] 规划失败(${progress.code}):${progress.message}`;
|
|
7
|
+
if (progress.type === "planner.model.event") {
|
|
8
|
+
const { event } = progress;
|
|
9
|
+
const data = event.data !== null && typeof event.data === "object" && !Array.isArray(event.data) ? event.data : {};
|
|
10
|
+
switch (event.type) {
|
|
11
|
+
case "process_started": return `[Planner] 模型进程已启动(pid: ${String(data.pid ?? "unknown")})`;
|
|
12
|
+
case "initialized": return `[Planner] 模型连接已就绪(protocol: ${String(data.protocolVersion ?? "unknown")})`;
|
|
13
|
+
case "session_started": return `[Planner] 模型 Session 已创建(${event.sessionId})`;
|
|
14
|
+
case "model_selected": return `[Planner] 已选择模型 ${String(data.modelId ?? "unknown")}`;
|
|
15
|
+
case "prompt_started": return `[Planner] 开始第 ${Number(data.turn ?? 0) + 1} 轮生成`;
|
|
16
|
+
case "prompt_stopped": return `[Planner] 第 ${Number(data.turn ?? 0) + 1} 轮结束(${String(data.stopReason ?? "unknown")})`;
|
|
17
|
+
case "session_cancel_sent": return "[Planner] 正在取消模型 Session";
|
|
18
|
+
default: return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (progress.type === "planner.phase")
|
|
22
|
+
return `[Planner:${progress.phase}] 规划轮次 ${progress.planningTurnsConsumed}/${progress.maxPlanningTurns}${progress.validationErrorCount ? `,待修复 ${progress.validationErrorCount} 个问题` : ""}`;
|
|
23
|
+
if (progress.type === "workflow.finished") {
|
|
24
|
+
const marker = progress.status === "succeeded" ? "完成" : progress.status === "awaiting_signal" ? "等待用户输入" : progress.status === "awaiting_host" ? "等待 Host Model" : progress.status;
|
|
25
|
+
return `[Workflow] ${marker}(run: ${progress.runId})`;
|
|
26
|
+
}
|
|
27
|
+
const { event } = progress;
|
|
28
|
+
const data = event.data !== null && typeof event.data === "object" && !Array.isArray(event.data) ? event.data : {};
|
|
29
|
+
switch (event.type) {
|
|
30
|
+
case "run.created": return "[Workflow] 规划与静态校验完成,开始执行节点";
|
|
31
|
+
case "attempt.started": return `[Node] 开始 ${event.nodeId ?? "unknown"}(第 ${Number(data.attemptIndex ?? 0) + 1} 次尝试)`;
|
|
32
|
+
case "attempt.retry": return `[Node] 重试 ${event.nodeId ?? "unknown"}(第 ${Number(data.attemptIndex ?? 0) + 1} 次尝试)`;
|
|
33
|
+
case "node.cache_hit": return `[Node] ${event.nodeId ?? "unknown"} 命中缓存`;
|
|
34
|
+
case "node.succeeded":
|
|
35
|
+
case "node.resumed_succeeded": return `[Node] 完成 ${event.nodeId ?? "unknown"}`;
|
|
36
|
+
case "decision.selected": return `[Decision] ${event.nodeId ?? "unknown"} → ${String(data.selectedBranch)}${data.matched === false ? "(default)" : ""}`;
|
|
37
|
+
case "attempt.failed": return `[Node] ${event.nodeId ?? "unknown"} 执行失败(${String(data.code ?? "UNKNOWN")},${data.retryable === true ? "可重试" : "不可重试"})`;
|
|
38
|
+
case "attempt.awaiting_signal": return `[Node] ${event.nodeId ?? "unknown"} 等待用户输入`;
|
|
39
|
+
case "attempt.awaiting_host": return `[Node] ${event.nodeId ?? "unknown"} 等待 Host Model 完成任务`;
|
|
40
|
+
case "run.failed": return `[Workflow] 执行失败(${String(data.code ?? "UNKNOWN")})`;
|
|
41
|
+
case "run.cancelled": return "[Workflow] 已取消";
|
|
42
|
+
case "run.recovered": return "[Workflow] 已从持久化状态恢复";
|
|
43
|
+
default: return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function executionOptions(args, io) {
|
|
47
|
+
if (args.includes("--quiet"))
|
|
48
|
+
return {};
|
|
49
|
+
return { onProgress(progress) { const line = progressLine(progress); if (line)
|
|
50
|
+
io.stderr(line); } };
|
|
51
|
+
}
|
|
52
|
+
export function atomExecutionOptions(args, io) {
|
|
53
|
+
const maxLifecycleTicks = positiveIntegerOption(args, "--max-lifecycle-ticks");
|
|
54
|
+
return {
|
|
55
|
+
...(maxLifecycleTicks ? { maxLifecycleTicks } : {}),
|
|
56
|
+
...(!args.includes("--quiet") ? {
|
|
57
|
+
onEvent(event) {
|
|
58
|
+
if (!("phase" in event))
|
|
59
|
+
return;
|
|
60
|
+
const atomEvent = event;
|
|
61
|
+
const phase = atomEvent.phase === "resume" ? "恢复" : "执行";
|
|
62
|
+
if (atomEvent.type === "process.started")
|
|
63
|
+
io.stderr(`[Atom] 已启动隔离进程(${phase})`);
|
|
64
|
+
else if (atomEvent.type === "atom.loaded")
|
|
65
|
+
io.stderr("[Atom] 已加载精确版本实现");
|
|
66
|
+
else if (atomEvent.type === "execute.started" || atomEvent.type === "resume.started")
|
|
67
|
+
io.stderr(`[Atom] 开始${phase}生命周期`);
|
|
68
|
+
else if (atomEvent.type === "execute.completed" || atomEvent.type === "resume.completed")
|
|
69
|
+
io.stderr(`[Atom] ${phase}生命周期已返回`);
|
|
70
|
+
else if (atomEvent.type === "process.completed")
|
|
71
|
+
io.stderr("[Atom] 隔离进程已完成并清理");
|
|
72
|
+
else if (atomEvent.type === "atom.log" && atomEvent.data && typeof atomEvent.data === "object" && !Array.isArray(atomEvent.data)) {
|
|
73
|
+
const record = atomEvent.data;
|
|
74
|
+
if (record.level === "error")
|
|
75
|
+
io.stderr(`[Atom:error] ${String(record.message ?? "Atom execution error")}`);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
} : {}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=workflow-command-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-command-progress.js","sourceRoot":"","sources":["../../src/workflow/workflow-command-progress.ts"],"names":[],"mappings":"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"}
|