@executioncontrolprotocol/cli 0.3.0 → 0.4.0

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.
Files changed (55) hide show
  1. package/README.md +22 -0
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +8 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +8 -0
  6. package/dist/commands/graph.d.ts +13 -0
  7. package/dist/commands/graph.d.ts.map +1 -0
  8. package/dist/commands/graph.js +36 -0
  9. package/dist/commands/graph.js.map +1 -0
  10. package/dist/commands/run.d.ts +24 -0
  11. package/dist/commands/run.d.ts.map +1 -0
  12. package/dist/commands/run.js +349 -0
  13. package/dist/commands/run.js.map +1 -0
  14. package/dist/commands/trace/list.d.ts +9 -0
  15. package/dist/commands/trace/list.d.ts.map +1 -0
  16. package/dist/commands/trace/list.js +32 -0
  17. package/dist/commands/trace/list.js.map +1 -0
  18. package/dist/commands/trace.d.ts +13 -0
  19. package/dist/commands/trace.d.ts.map +1 -0
  20. package/dist/commands/trace.js +40 -0
  21. package/dist/commands/trace.js.map +1 -0
  22. package/dist/commands/validate.d.ts +13 -0
  23. package/dist/commands/validate.d.ts.map +1 -0
  24. package/dist/commands/validate.js +89 -0
  25. package/dist/commands/validate.js.map +1 -0
  26. package/dist/lib/ecp-home.d.ts +3 -0
  27. package/dist/lib/ecp-home.d.ts.map +1 -0
  28. package/dist/lib/ecp-home.js +9 -0
  29. package/dist/lib/ecp-home.js.map +1 -0
  30. package/dist/lib/inputs.d.ts +3 -0
  31. package/dist/lib/inputs.d.ts.map +1 -0
  32. package/dist/lib/inputs.js +7 -0
  33. package/dist/lib/inputs.js.map +1 -0
  34. package/dist/lib/parsing.d.ts +12 -0
  35. package/dist/lib/parsing.d.ts.map +1 -0
  36. package/dist/lib/parsing.js +57 -0
  37. package/dist/lib/parsing.js.map +1 -0
  38. package/dist/lib/progress.d.ts +4 -0
  39. package/dist/lib/progress.d.ts.map +1 -0
  40. package/dist/lib/progress.js +111 -0
  41. package/dist/lib/progress.js.map +1 -0
  42. package/dist/lib/trace-files.d.ts +2 -0
  43. package/dist/lib/trace-files.d.ts.map +1 -0
  44. package/dist/lib/trace-files.js +14 -0
  45. package/dist/lib/trace-files.js.map +1 -0
  46. package/dist/lib/trace-view.d.ts +4 -0
  47. package/dist/lib/trace-view.d.ts.map +1 -0
  48. package/dist/lib/trace-view.js +8 -0
  49. package/dist/lib/trace-view.js.map +1 -0
  50. package/package.json +37 -7
  51. package/bin/ecp.cjs +0 -21
  52. package/dist/index.d.ts +0 -13
  53. package/dist/index.d.ts.map +0 -1
  54. package/dist/index.js +0 -471
  55. package/dist/index.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # `@executioncontrolprotocol/cli`
2
+
3
+ Command-line interface for **Execution Control Protocol (ECP)**.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @executioncontrolprotocol/cli
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```bash
14
+ ecp --help
15
+ ecp validate path/to/context.yaml
16
+ ecp run path/to/context.yaml --enable openai -i topic="Hello"
17
+ ```
18
+
19
+ ## Links
20
+
21
+ - **Repo**: `https://github.com/executioncontrolprotocol/executioncontrolprotocol`
22
+ - **Issues**: `https://github.com/executioncontrolprotocol/executioncontrolprotocol/issues`
package/bin/dev.cmd ADDED
@@ -0,0 +1,3 @@
1
+ @echo off
2
+
3
+ node --loader ts-node/esm --no-warnings=ExperimentalWarning "%~dp0\dev" %*
package/bin/dev.js ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env -S node --loader ts-node/esm --disable-warning=ExperimentalWarning
2
+
3
+ import {execute} from '@oclif/core'
4
+
5
+ // Suppress Node deprecation warnings (e.g. punycode -> DEP0040) so CLI output stays clean.
6
+ process.noDeprecation = true;
7
+
8
+ await execute({development: true, dir: import.meta.url})
package/bin/run.cmd ADDED
@@ -0,0 +1,3 @@
1
+ @echo off
2
+
3
+ node "%~dp0\run" %*
package/bin/run.js ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {execute} from '@oclif/core'
4
+
5
+ // Suppress Node deprecation warnings (e.g. punycode -> DEP0040) so CLI output stays clean.
6
+ process.noDeprecation = true;
7
+
8
+ await execute({dir: import.meta.url})
@@ -0,0 +1,13 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Graph extends Command {
3
+ static summary: string;
4
+ static hidden: boolean;
5
+ static flags: {
6
+ "trace-dir": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
+ };
8
+ static args: {
9
+ runId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AASnD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAC,OAAO,SAA6B;IAE3C,MAAM,CAAC,MAAM,UAAQ;IAErB,MAAM,CAAC,KAAK;;MAKV;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmB3B"}
@@ -0,0 +1,36 @@
1
+ import { Command, Flags, Args } from "@oclif/core";
2
+ import { readFileSync, existsSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import { renderTraceView } from "../lib/trace-view.js";
5
+ import { getDefaultTraceDir } from "../lib/ecp-home.js";
6
+ export default class Graph extends Command {
7
+ static summary = "Display execution graph";
8
+ // Backwards-compatible alias for `ecp trace --output graph`.
9
+ static hidden = true;
10
+ static flags = {
11
+ "trace-dir": Flags.string({
12
+ description: "Directory for trace files",
13
+ default: getDefaultTraceDir(),
14
+ }),
15
+ };
16
+ static args = {
17
+ runId: Args.string({
18
+ required: true,
19
+ description: "run id (e.g. run-123...)",
20
+ }),
21
+ };
22
+ async run() {
23
+ const { args, flags } = await this.parse(Graph);
24
+ const runId = args.runId;
25
+ const traceDir = flags["trace-dir"];
26
+ const filePath = resolve(traceDir, `${runId}.json`);
27
+ if (!existsSync(filePath)) {
28
+ this.error(`\n Trace not found: ${filePath}\n Run ` +
29
+ `ecp run <context.yaml> (tracing is enabled by default; use --no-trace to disable)\n`, { exit: 1 });
30
+ }
31
+ const trace = JSON.parse(readFileSync(filePath, "utf-8"));
32
+ const rendered = await renderTraceView(trace, "graph");
33
+ console.log(rendered);
34
+ }
35
+ }
36
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,eAAe,EAA0B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAC,OAAO,GAAG,yBAAyB,CAAC;IAC3C,6DAA6D;IAC7D,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;IAErB,MAAM,CAAC,KAAK,GAAG;QACb,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,WAAW,EAAE,2BAA2B;YACxC,OAAO,EAAE,kBAAkB,EAAE;SAC9B,CAAC;KACH,CAAC;IAEF,MAAM,CAAC,IAAI,GAAG;QACZ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;YACjB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,0BAA0B;SACxC,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;QAEpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CACR,wBAAwB,QAAQ,UAAU;gBACxC,qFAAqF,EACvF,EAAE,IAAI,EAAE,CAAC,EAAE,CACZ,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAmB,CAAC;QAC5E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,OAA4B,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Run extends Command {
3
+ static summary: string;
4
+ static flags: {
5
+ input: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
+ model: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ provider: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ enable: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ config: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
+ "ollama-base-url": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
+ trace: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ "trace-dir": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
+ "progress-logger": import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ "extension-security": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
+ "agent-endpoints": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
16
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ };
18
+ static args: {
19
+ contextPath: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
20
+ };
21
+ run(): Promise<void>;
22
+ private createModelProviderOrFail;
23
+ }
24
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAwEnD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,OAAO;IACtC,MAAM,CAAC,OAAO,SAAgC;IAE9C,MAAM,CAAC,KAAK;;;;;;;;;;;;;MA6DV;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAgQ1B,OAAO,CAAC,yBAAyB;CAkBlC"}
@@ -0,0 +1,349 @@
1
+ import { Command, Flags, Args } from "@oclif/core";
2
+ import { resolve } from "node:path";
3
+ import ora from "ora";
4
+ import { ECPEngine, loadContext, resolveInputs, resolveSystemConfig, MCPToolInvoker, A2AAgentTransport, ExtensionRegistry, registerBuiltinModelProviders, registerBuiltinProgressLoggers, registerBuiltinPlugins, TraceCollector, ConsoleTraceExporter, JsonFileTraceExporter, } from "@executioncontrolprotocol/runtime";
5
+ import { parseKeyValueInputs, splitCommaSeparated, parseJsonObject } from "../lib/parsing.js";
6
+ import { createProgressHandler } from "../lib/progress.js";
7
+ import { getDefaultTraceDir } from "../lib/ecp-home.js";
8
+ function contextHasMemory(context) {
9
+ const visit = (orchestrator) => {
10
+ if (orchestrator.memory)
11
+ return true;
12
+ for (const executor of orchestrator.executors ?? []) {
13
+ if (executor.memory)
14
+ return true;
15
+ }
16
+ for (const child of orchestrator.orchestrators ?? []) {
17
+ if (visit(child))
18
+ return true;
19
+ }
20
+ return false;
21
+ };
22
+ if (context.orchestrator && visit(context.orchestrator))
23
+ return true;
24
+ return (context.executors ?? []).some((e) => e.memory != null);
25
+ }
26
+ function inferModelProviderFromContext(context) {
27
+ const providers = new Set();
28
+ const visitExecutor = (executor) => {
29
+ const providerName = executor.model?.provider?.name;
30
+ if (providerName)
31
+ providers.add(providerName);
32
+ };
33
+ const visitOrchestrator = (orchestrator) => {
34
+ for (const executor of orchestrator.executors ?? []) {
35
+ visitExecutor(executor);
36
+ }
37
+ for (const child of orchestrator.orchestrators ?? []) {
38
+ visitOrchestrator(child);
39
+ }
40
+ };
41
+ if (context.orchestrator)
42
+ visitOrchestrator(context.orchestrator);
43
+ for (const executor of context.executors ?? []) {
44
+ visitExecutor(executor);
45
+ }
46
+ if (providers.size === 1)
47
+ return [...providers][0];
48
+ if (providers.size === 0)
49
+ return undefined;
50
+ throw new Error(`Context declares multiple model providers (${[...providers].join(", ")}). Please pass --provider.`);
51
+ }
52
+ export default class Run extends Command {
53
+ static summary = "Execute a Context manifest";
54
+ static flags = {
55
+ input: Flags.string({
56
+ char: "i",
57
+ multiple: true,
58
+ description: "Set an input value (repeatable, key=value)",
59
+ summary: "Input value (key=value)",
60
+ }),
61
+ model: Flags.string({
62
+ char: "m",
63
+ description: "Override the default model (e.g. gpt-4o-mini)",
64
+ }),
65
+ provider: Flags.string({
66
+ char: "p",
67
+ description: "Model provider: openai or ollama",
68
+ options: ["openai", "ollama"],
69
+ }),
70
+ enable: Flags.string({
71
+ char: "e",
72
+ multiple: true,
73
+ multipleNonGreedy: true,
74
+ description: "Extension(s) to enable for this run (repeatable or comma-separated). Overrides system config defaultEnable.",
75
+ }),
76
+ config: Flags.string({
77
+ char: "c",
78
+ description: "Path to system config (ecp.config.yaml). Default: ./ecp.config.yaml then ~/.ecp/config.yaml",
79
+ default: "",
80
+ }),
81
+ "ollama-base-url": Flags.string({
82
+ description: "Ollama server URL",
83
+ default: "http://localhost:11434",
84
+ }),
85
+ trace: Flags.boolean({
86
+ char: "t",
87
+ description: "Enable tracing (saves to the user traces directory by default)",
88
+ default: true,
89
+ allowNo: true,
90
+ }),
91
+ "trace-dir": Flags.string({
92
+ description: "Directory for trace files",
93
+ default: getDefaultTraceDir(),
94
+ }),
95
+ "progress-logger": Flags.string({
96
+ char: "l",
97
+ multiple: true,
98
+ multipleNonGreedy: true,
99
+ description: "Enable a progress logger (e.g. file). Repeatable or comma-separated.",
100
+ }),
101
+ "extension-security": Flags.string({
102
+ description: "JSON security policy for extension loading",
103
+ default: "",
104
+ }),
105
+ "agent-endpoints": Flags.string({
106
+ description: "JSON map of agent endpoints",
107
+ default: "",
108
+ }),
109
+ debug: Flags.boolean({
110
+ char: "d",
111
+ description: "Enable debug logging",
112
+ default: false,
113
+ }),
114
+ };
115
+ static args = {
116
+ contextPath: Args.string({
117
+ required: true,
118
+ description: "Path to context.yaml (or context.json)",
119
+ }),
120
+ };
121
+ async run() {
122
+ const { args, flags } = await this.parse(Run);
123
+ const contextPath = resolve(args.contextPath);
124
+ const inputs = (() => {
125
+ try {
126
+ return parseKeyValueInputs(flags.input, "--input");
127
+ }
128
+ catch (err) {
129
+ const msg = err instanceof Error ? err.message : String(err);
130
+ this.error(msg, { exit: 1 });
131
+ }
132
+ })();
133
+ const cwd = process.cwd();
134
+ const systemConfig = (() => {
135
+ try {
136
+ return resolveSystemConfig(flags.config ? flags.config : undefined, cwd);
137
+ }
138
+ catch (err) {
139
+ const msg = err instanceof Error ? err.message : String(err);
140
+ this.error(msg, { exit: 1 });
141
+ }
142
+ })();
143
+ const enableRaw = splitCommaSeparated(flags.enable);
144
+ const progressLoggerRaw = splitCommaSeparated(flags["progress-logger"]);
145
+ const context = loadContext(contextPath);
146
+ let providerToUse;
147
+ try {
148
+ providerToUse = flags.provider ?? inferModelProviderFromContext(context);
149
+ }
150
+ catch (err) {
151
+ const msg = err instanceof Error ? err.message : String(err);
152
+ this.error(msg, { exit: 1 });
153
+ }
154
+ if (!providerToUse) {
155
+ this.error('Model provider could not be inferred from the Context. Pass --provider openai|ollama.', { exit: 1 });
156
+ }
157
+ const enableFromCli = enableRaw.length > 0 ? enableRaw : systemConfig?.extensions?.defaultEnable ?? [providerToUse];
158
+ const allowEnable = systemConfig?.extensions?.allowEnable;
159
+ if (allowEnable && allowEnable.length > 0) {
160
+ for (const id of enableFromCli) {
161
+ if (!allowEnable.includes(id)) {
162
+ this.error(`Extension "${id}" is not in system config allowEnable. Allowed: ${allowEnable.join(", ")}`, { exit: 1 });
163
+ }
164
+ }
165
+ }
166
+ const registry = new ExtensionRegistry();
167
+ registerBuiltinModelProviders(registry, {
168
+ version: "0.3.0",
169
+ openai: { defaultModel: flags.model },
170
+ ollama: { baseURL: flags["ollama-base-url"], defaultModel: flags.model },
171
+ });
172
+ registerBuiltinProgressLoggers(registry, { version: "0.3.0", file: {} });
173
+ registerBuiltinPlugins(registry, { version: "0.3.0" });
174
+ registry.lock();
175
+ const modelProvider = this.createModelProviderOrFail(registry, providerToUse);
176
+ const toolInvoker = new MCPToolInvoker();
177
+ const agentTransport = new A2AAgentTransport();
178
+ const toolServers = systemConfig?.toolServers;
179
+ try {
180
+ new URL(flags["ollama-base-url"]);
181
+ }
182
+ catch {
183
+ this.error(`Invalid --ollama-base-url: "${flags["ollama-base-url"]}" is not a valid URL.`, { exit: 1 });
184
+ }
185
+ const agentEndpoints = (() => {
186
+ if (!flags["agent-endpoints"])
187
+ return undefined;
188
+ try {
189
+ return parseJsonObject(flags["agent-endpoints"], "--agent-endpoints");
190
+ }
191
+ catch (err) {
192
+ const msg = err instanceof Error ? err.message : String(err);
193
+ this.error(msg, { exit: 1 });
194
+ }
195
+ })();
196
+ const extensionSecurity = (() => {
197
+ if (!flags["extension-security"])
198
+ return systemConfig?.extensions?.security ?? context.extensions?.security;
199
+ try {
200
+ return parseJsonObject(flags["extension-security"], "--extension-security");
201
+ }
202
+ catch (err) {
203
+ const msg = err instanceof Error ? err.message : String(err);
204
+ this.error(msg, { exit: 1 });
205
+ }
206
+ })();
207
+ const progressLoggerCallbacks = [];
208
+ const plConfig = systemConfig?.progressLoggers;
209
+ const plEnable = progressLoggerRaw.length > 0 ? progressLoggerRaw : plConfig?.defaultEnable ?? [];
210
+ const plAllow = plConfig?.allowEnable;
211
+ if (plAllow && plAllow.length > 0) {
212
+ for (const id of plEnable) {
213
+ if (!plAllow.includes(id)) {
214
+ this.error(`Progress logger "${id}" is not in system config progressLoggers.allowEnable. Allowed: ${plAllow.join(", ")}`, { exit: 1 });
215
+ }
216
+ }
217
+ }
218
+ for (const id of plEnable) {
219
+ try {
220
+ const cb = registry.createProgressLogger(id, plConfig?.config?.[id]);
221
+ progressLoggerCallbacks.push(cb);
222
+ }
223
+ catch (err) {
224
+ const msg = err instanceof Error ? err.message : String(err);
225
+ this.error(`Failed to create progress logger "${id}": ${msg}`, { exit: 1 });
226
+ }
227
+ }
228
+ const spinner = flags.debug ? undefined : ora({ stream: process.stderr }).start("Loading context...");
229
+ const builtInProgress = spinner
230
+ ? createProgressHandler(spinner, contextPath, context.metadata.name)
231
+ : undefined;
232
+ const onProgress = builtInProgress && progressLoggerCallbacks.length > 0
233
+ ? [builtInProgress, ...progressLoggerCallbacks]
234
+ : builtInProgress ?? (progressLoggerCallbacks.length > 0 ? progressLoggerCallbacks : undefined);
235
+ if (flags.debug) {
236
+ console.log(`\n Running: ${contextPath}\n`);
237
+ }
238
+ // Keep memory-store lifecycle in the CLI so we can close it after a run.
239
+ let memoryStore;
240
+ if (contextHasMemory(context)) {
241
+ const pluginReg = registry.listPlugins().find((p) => p.id === "memory");
242
+ if (pluginReg) {
243
+ try {
244
+ const instance = pluginReg.create(context.extensions?.config?.memory);
245
+ memoryStore = await instance.open();
246
+ }
247
+ catch (err) {
248
+ if (flags.debug) {
249
+ const msg = err instanceof Error ? err.message : String(err);
250
+ console.error(` Memory plugin open failed: ${msg}\n`);
251
+ }
252
+ }
253
+ }
254
+ }
255
+ const engine = new ECPEngine(modelProvider, toolInvoker, agentTransport, {
256
+ toolServers,
257
+ agentEndpoints,
258
+ defaultModel: flags.model,
259
+ modelOverride: flags.model,
260
+ debug: flags.debug,
261
+ trace: flags.trace,
262
+ memoryStore,
263
+ onProgress,
264
+ extensions: {
265
+ registry,
266
+ enable: enableFromCli,
267
+ allowEnable: systemConfig?.extensions?.allowEnable,
268
+ security: extensionSecurity,
269
+ },
270
+ });
271
+ if (flags.trace) {
272
+ const collector = new TraceCollector();
273
+ collector.addExporters(new ConsoleTraceExporter(), new JsonFileTraceExporter({ outputDir: flags["trace-dir"] }));
274
+ engine.setTraceCollector(collector);
275
+ }
276
+ let resolvedInputs;
277
+ try {
278
+ resolvedInputs = resolveInputs(context, inputs);
279
+ }
280
+ catch (err) {
281
+ const msg = err instanceof Error ? err.message : String(err);
282
+ const missing = msg.match(/^Missing required input: "([^"]+)"$/);
283
+ if (missing) {
284
+ const inputName = missing[1];
285
+ this.error(`\n Error: Missing required input "${inputName}" defined in the Context manifest.\n` +
286
+ ` Provide it via --input ${inputName}=<value> (e.g. -i ${inputName}="...").\n`, { exit: 1 });
287
+ }
288
+ throw err;
289
+ }
290
+ const result = await engine.run({ context, inputs: resolvedInputs });
291
+ if (memoryStore && typeof memoryStore.close === "function") {
292
+ await memoryStore.close();
293
+ }
294
+ if (spinner) {
295
+ if (result.success)
296
+ spinner.succeed("Execution completed.");
297
+ else
298
+ spinner.fail("Execution failed.");
299
+ }
300
+ console.log("\n--- Execution Result ---");
301
+ console.log(` Run ID: ${result.runId}`);
302
+ console.log(` Context: ${result.contextName} v${result.contextVersion}`);
303
+ console.log(` Success: ${result.success}`);
304
+ console.log(` Duration: ${result.durationMs}ms`);
305
+ console.log(` Tool calls: ${result.totalBudgetUsage.toolCalls}`);
306
+ if (result.error) {
307
+ console.log(` Error: ${result.error}`);
308
+ }
309
+ if (result.output) {
310
+ console.log("\n--- Output ---");
311
+ console.log(JSON.stringify(result.output, null, 2));
312
+ }
313
+ if (!spinner) {
314
+ console.log("\n--- Executor Outputs ---");
315
+ for (const [name, output] of Object.entries(result.executorOutputs)) {
316
+ console.log(`\n [${name}]`);
317
+ console.log(JSON.stringify(output, null, 2));
318
+ }
319
+ }
320
+ if (flags.debug) {
321
+ console.log("\n--- Execution Log ---");
322
+ for (const entry of result.log) {
323
+ console.log(` [${entry.level.toUpperCase().padEnd(5)}] ${entry.message}`);
324
+ }
325
+ }
326
+ if (flags.trace) {
327
+ console.log(`\n Trace saved to: ${flags["trace-dir"]}/${result.runId}.json`);
328
+ console.log(` View with: ecp trace ${result.runId}`);
329
+ console.log(` Graph with: ecp trace --output graph ${result.runId}`);
330
+ }
331
+ this.exit(result.success ? 0 : 1);
332
+ }
333
+ createModelProviderOrFail(registry, providerId) {
334
+ const registration = registry.getModelProviderRegistration(providerId);
335
+ if (!registration) {
336
+ const known = registry.listModelProviders().map((p) => p.id).join(", ");
337
+ this.error(`Unknown provider "${providerId}". Registered providers: ${known}`, { exit: 1 });
338
+ }
339
+ try {
340
+ return registry.createModelProvider(providerId);
341
+ }
342
+ catch (err) {
343
+ const rawMsg = err instanceof Error ? err.message : String(err);
344
+ const hint = err && typeof err === "object" && "hint" in err ? err.hint : undefined;
345
+ this.error(`${rawMsg}${hint ? `\n${hint}` : ""}`, { exit: 1 });
346
+ }
347
+ }
348
+ }
349
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class TraceList extends Command {
3
+ static summary: string;
4
+ static flags: {
5
+ "trace-dir": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
+ };
7
+ run(): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/trace/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAK7C,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,OAAO,SAAmC;IAEjD,MAAM,CAAC,KAAK;;MAKV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoB3B"}
@@ -0,0 +1,32 @@
1
+ import { Command, Flags } from "@oclif/core";
2
+ import { listTraceIds } from "../../lib/trace-files.js";
3
+ import { getDefaultTraceDir } from "../../lib/ecp-home.js";
4
+ export default class TraceList extends Command {
5
+ static summary = "List locally available traces";
6
+ static flags = {
7
+ "trace-dir": Flags.string({
8
+ description: "Directory for trace files",
9
+ default: getDefaultTraceDir(),
10
+ }),
11
+ };
12
+ async run() {
13
+ const { flags } = await this.parse(TraceList);
14
+ const traceDir = flags["trace-dir"];
15
+ try {
16
+ const ids = await listTraceIds(traceDir);
17
+ if (ids.length === 0) {
18
+ console.log(`No trace files found in ${traceDir}.`);
19
+ return;
20
+ }
21
+ console.log(`Available traces in ${traceDir}:`);
22
+ for (const id of ids) {
23
+ console.log(`- ${id}`);
24
+ }
25
+ }
26
+ catch (err) {
27
+ const msg = err instanceof Error ? err.message : String(err);
28
+ this.error(msg, { exit: 1 });
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/trace/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,OAAO,GAAG,+BAA+B,CAAC;IAEjD,MAAM,CAAC,KAAK,GAAG;QACb,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,WAAW,EAAE,2BAA2B;YACxC,OAAO,EAAE,kBAAkB,EAAE;SAC9B,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,GAAG,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,GAAG,CAAC,CAAC;YAChD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Trace extends Command {
3
+ static summary: string;
4
+ static flags: {
5
+ output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
+ "trace-dir": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
+ };
8
+ static args: {
9
+ runId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AASnD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAC,OAAO,SAA6B;IAE3C,MAAM,CAAC,KAAK;;;MAUV;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoB3B"}
@@ -0,0 +1,40 @@
1
+ import { Command, Flags, Args } from "@oclif/core";
2
+ import { readFileSync, existsSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import { renderTraceView } from "../lib/trace-view.js";
5
+ import { getDefaultTraceDir } from "../lib/ecp-home.js";
6
+ export default class Trace extends Command {
7
+ static summary = "Display execution trace";
8
+ static flags = {
9
+ output: Flags.string({
10
+ description: "Render mode: 'text' (human log) or 'graph' (ASCII visualization)",
11
+ options: ["text", "graph"],
12
+ default: "text",
13
+ }),
14
+ "trace-dir": Flags.string({
15
+ description: "Directory for trace files",
16
+ default: getDefaultTraceDir(),
17
+ }),
18
+ };
19
+ static args = {
20
+ runId: Args.string({
21
+ required: true,
22
+ description: "run id (e.g. run-123...)",
23
+ }),
24
+ };
25
+ async run() {
26
+ const { args, flags } = await this.parse(Trace);
27
+ const runId = args.runId;
28
+ const output = flags.output;
29
+ const traceDir = flags["trace-dir"];
30
+ const filePath = resolve(traceDir, `${runId}.json`);
31
+ if (!existsSync(filePath)) {
32
+ this.error(`\n Trace not found: ${filePath}\n Run ` +
33
+ `ecp run <context.yaml> (tracing is enabled by default; use --no-trace to disable)\n`, { exit: 1 });
34
+ }
35
+ const trace = JSON.parse(readFileSync(filePath, "utf-8"));
36
+ const rendered = await renderTraceView(trace, output);
37
+ console.log(rendered);
38
+ }
39
+ }
40
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,eAAe,EAA0B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAC,OAAO,GAAG,yBAAyB,CAAC;IAE3C,MAAM,CAAC,KAAK,GAAG;QACb,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,kEAAkE;YAC/E,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAU;YACnC,OAAO,EAAE,MAAM;SAChB,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,WAAW,EAAE,2BAA2B;YACxC,OAAO,EAAE,kBAAkB,EAAE;SAC9B,CAAC;KACH,CAAC;IAEF,MAAM,CAAC,IAAI,GAAG;QACZ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;YACjB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,0BAA0B;SACxC,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,MAAM,GAAG,KAAK,CAAC,MAA2B,CAAC;QAEjD,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;QAEpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CACR,wBAAwB,QAAQ,UAAU;gBACxC,qFAAqF,EACvF,EAAE,IAAI,EAAE,CAAC,EAAE,CACZ,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAmB,CAAC;QAC5E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Validate extends Command {
3
+ static summary: string;
4
+ static flags: {
5
+ input: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
+ "skip-inputs": import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ };
8
+ static args: {
9
+ contextPath: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=validate.d.ts.map