@executioncontrolprotocol/cli 0.10.0 → 0.11.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 (82) hide show
  1. package/README.md +61 -0
  2. package/dist/commands/invoke.d.ts +17 -0
  3. package/dist/commands/invoke.d.ts.map +1 -0
  4. package/dist/commands/invoke.js +47 -0
  5. package/dist/commands/invoke.js.map +1 -0
  6. package/dist/commands/serve.d.ts +15 -0
  7. package/dist/commands/serve.d.ts.map +1 -0
  8. package/dist/commands/serve.js +53 -0
  9. package/dist/commands/serve.js.map +1 -0
  10. package/dist/commands/test/rerun.d.ts +16 -0
  11. package/dist/commands/test/rerun.d.ts.map +1 -0
  12. package/dist/commands/test/rerun.js +38 -0
  13. package/dist/commands/test/rerun.js.map +1 -0
  14. package/dist/commands/test/run.d.ts +14 -0
  15. package/dist/commands/test/run.d.ts.map +1 -0
  16. package/dist/commands/test/run.js +36 -0
  17. package/dist/commands/test/run.js.map +1 -0
  18. package/dist/commands/test/start.d.ts +17 -0
  19. package/dist/commands/test/start.d.ts.map +1 -0
  20. package/dist/commands/test/start.js +43 -0
  21. package/dist/commands/test/start.js.map +1 -0
  22. package/dist/commands/test/status.d.ts +12 -0
  23. package/dist/commands/test/status.d.ts.map +1 -0
  24. package/dist/commands/test/status.js +24 -0
  25. package/dist/commands/test/status.js.map +1 -0
  26. package/dist/commands/test.d.ts +9 -0
  27. package/dist/commands/test.d.ts.map +1 -0
  28. package/dist/commands/test.js +32 -0
  29. package/dist/commands/test.js.map +1 -0
  30. package/dist/commands/up.d.ts +18 -0
  31. package/dist/commands/up.d.ts.map +1 -0
  32. package/dist/commands/up.js +95 -0
  33. package/dist/commands/up.js.map +1 -0
  34. package/dist/lib/http/create-serve-handler.d.ts +15 -0
  35. package/dist/lib/http/create-serve-handler.d.ts.map +1 -0
  36. package/dist/lib/http/create-serve-handler.js +34 -0
  37. package/dist/lib/http/create-serve-handler.js.map +1 -0
  38. package/dist/lib/http/create-serve.d.ts +30 -0
  39. package/dist/lib/http/create-serve.d.ts.map +1 -0
  40. package/dist/lib/http/create-serve.js +43 -0
  41. package/dist/lib/http/create-serve.js.map +1 -0
  42. package/dist/lib/http/handle-invoke.d.ts +42 -0
  43. package/dist/lib/http/handle-invoke.d.ts.map +1 -0
  44. package/dist/lib/http/handle-invoke.js +66 -0
  45. package/dist/lib/http/handle-invoke.js.map +1 -0
  46. package/dist/lib/http/read-body.d.ts +7 -0
  47. package/dist/lib/http/read-body.d.ts.map +1 -0
  48. package/dist/lib/http/read-body.js +12 -0
  49. package/dist/lib/http/read-body.js.map +1 -0
  50. package/dist/lib/http/write-json.d.ts +7 -0
  51. package/dist/lib/http/write-json.d.ts.map +1 -0
  52. package/dist/lib/http/write-json.js +11 -0
  53. package/dist/lib/http/write-json.js.map +1 -0
  54. package/dist/lib/test-session-io.d.ts +12 -0
  55. package/dist/lib/test-session-io.d.ts.map +1 -0
  56. package/dist/lib/test-session-io.js +36 -0
  57. package/dist/lib/test-session-io.js.map +1 -0
  58. package/dist/lib/up/constants.d.ts +15 -0
  59. package/dist/lib/up/constants.d.ts.map +1 -0
  60. package/dist/lib/up/constants.js +21 -0
  61. package/dist/lib/up/constants.js.map +1 -0
  62. package/dist/lib/up/cors.d.ts +12 -0
  63. package/dist/lib/up/cors.d.ts.map +1 -0
  64. package/dist/lib/up/cors.js +28 -0
  65. package/dist/lib/up/cors.js.map +1 -0
  66. package/dist/lib/up/create-daemon.d.ts +37 -0
  67. package/dist/lib/up/create-daemon.d.ts.map +1 -0
  68. package/dist/lib/up/create-daemon.js +63 -0
  69. package/dist/lib/up/create-daemon.js.map +1 -0
  70. package/dist/lib/up/handle-request.d.ts +19 -0
  71. package/dist/lib/up/handle-request.d.ts.map +1 -0
  72. package/dist/lib/up/handle-request.js +49 -0
  73. package/dist/lib/up/handle-request.js.map +1 -0
  74. package/dist/lib/up/open-browser.d.ts +19 -0
  75. package/dist/lib/up/open-browser.d.ts.map +1 -0
  76. package/dist/lib/up/open-browser.js +43 -0
  77. package/dist/lib/up/open-browser.js.map +1 -0
  78. package/dist/lib/up/read-body.d.ts +3 -0
  79. package/dist/lib/up/read-body.d.ts.map +1 -0
  80. package/dist/lib/up/read-body.js +3 -0
  81. package/dist/lib/up/read-body.js.map +1 -0
  82. package/package.json +8 -7
package/README.md CHANGED
@@ -9,6 +9,9 @@ This CLI is how you run ECP deterministically in a Node.js / TypeScript ecosyste
9
9
  - Validate workflows against an environment’s registered capabilities
10
10
  - Describe/search environment capabilities for agent/UI discovery
11
11
  - Run workflows and print structured run results
12
+ - Invoke a single capability outside a workflow (`ecp invoke`)
13
+ - Serve an environment over loopback HTTP for `POST /v1/invoke` (`ecp serve`)
14
+ - Test workflows with a persistent session (`ecp test start|run|rerun|status`)
12
15
  - Encode/decode workflows using format extensions (TOON, Fluent, JSON)
13
16
 
14
17
  For the architecture and monorepo package boundaries, start with
@@ -74,6 +77,64 @@ ecp describe --env examples/01-echo/environment.ts
74
77
  ecp search "echo" --env examples/01-echo/environment.ts
75
78
  ```
76
79
 
80
+ ### Test session (`ecp test`)
81
+
82
+ Drive a workflow incrementally with frozen state (distinct from `@executioncontrolprotocol/core/testing` stubs):
83
+
84
+ ```sh
85
+ ecp test start workflow.ts --env environment.ts -o session.json
86
+ ecp test run --to step-b --env environment.ts --session session.json
87
+ ecp test rerun step-a --env environment.ts --session session.json
88
+ ecp test status --session session.json
89
+ ```
90
+
91
+ - `run --to <step-id>` is **inclusive** (runs through that step, then pauses).
92
+ - `rerun <step-id>` re-executes one step and **clears** downstream history and `.as` state keys.
93
+ - Session file schema: `@executioncontrolprotocol.test.session`.
94
+
95
+ Fluent API: `ecp.test(workflow).with({ input }).start()` then `session.runTo(id)` / `session.rerun(id)`.
96
+
97
+ ### Invoke a capability
98
+
99
+ Call a single bound capability without a workflow:
100
+
101
+ ```sh
102
+ ecp invoke @executioncontrolprotocol/test.echo --env examples/01-echo/environment.ts --input input.json
103
+ ```
104
+
105
+ Optional `--uses <provider-capability-id>` overrides the harness default provider. Prints an `InvokeResult` JSON document; exits non-zero when `success` is false.
106
+
107
+ ### Serve (`ecp serve`)
108
+
109
+ Expose any `--env` over loopback HTTP (no auth; loopback-only trust):
110
+
111
+ ```sh
112
+ ecp serve --env examples/01-echo/environment.ts
113
+ ecp serve --env environment.ts --port 3090 --cors-origin http://localhost:5173
114
+ ```
115
+
116
+ - `GET /health` — `{ ok, version }`
117
+ - `POST /v1/invoke` — body `{ capability, input?, provider? }` → `ecp.invoke(...).with(...).process()`
118
+
119
+ Default port **3090** (ECP leet), host `127.0.0.1`.
120
+
121
+ ### Local daemon (`ecp up`)
122
+
123
+ Ollama/PNA **demo bridge** (fixed local env, not arbitrary `--env`). Prefer `ecp serve` for general HTTP invoke. Start the daemon, then open the demo with a pairing token:
124
+
125
+ ```sh
126
+ ecp up
127
+ # Opens https://executioncontrolprotocol.github.io/browser-demo/?token=<uuid>&bridge=http://127.0.0.1:3090
128
+
129
+ ecp up --open-url http://localhost:5173/
130
+ ecp up --no-open
131
+ ```
132
+
133
+ - `GET /health` — `{ ok, version, ollamaReachable }` (no auth; used by the demo to enable Ollama)
134
+ - `POST /v1/invoke` — Bearer token required; same body shape as `ecp serve`
135
+
136
+ Default port **3090**. The demo reads `?token=` (and optional `?bridge=`) automatically. Hosted HTTPS demos need **Chromium** (Chrome/Edge) for Private Network Access. Add extra page origins with `--cors-origin`.
137
+
77
138
  ### Encode / decode formats
78
139
 
79
140
  Encoding and decoding uses **format extensions** bound in your environment.
@@ -0,0 +1,17 @@
1
+ import { EnvModuleCommand } from "../lib/env-module-command.js";
2
+ /** Invoke a single capability outside a workflow run. */
3
+ export default class Invoke extends EnvModuleCommand {
4
+ static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static args: {
8
+ "capability-id": import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
9
+ };
10
+ static flags: {
11
+ input: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ uses: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ env: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
14
+ };
15
+ run(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=invoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/commands/invoke.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAE/D,yDAAyD;AACzD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,gBAAgB;IAClD,MAAM,CAAC,OAAO,SAAwB;IAEtC,MAAM,CAAC,WAAW,SAEmD;IAErE,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,IAAI;;MAKV;IAED,MAAM,CAAC,KAAK;;;;MAQX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB3B"}
@@ -0,0 +1,47 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { readJsonFile, runWithCommandError } from "../lib/command-helpers.js";
3
+ import { EnvModuleCommand } from "../lib/env-module-command.js";
4
+ /** Invoke a single capability outside a workflow run. */
5
+ export default class Invoke extends EnvModuleCommand {
6
+ static summary = "Invoke a capability";
7
+ static description = "Call a registered capability by id using the runtime and extensions from --env, " +
8
+ "without running a workflow. Prints an InvokeResult JSON document.";
9
+ static examples = [
10
+ "<%= config.bin %> <%= command.id %> @executioncontrolprotocol/test.echo --env examples/01-echo/environment.ts --input input.json",
11
+ "<%= config.bin %> <%= command.id %> @executioncontrolprotocol/harness-browser-nano.evaluate --env environment.ts --input in.json --uses @executioncontrolprotocol/ollama.generate",
12
+ ];
13
+ static args = {
14
+ "capability-id": Args.string({
15
+ required: true,
16
+ description: "Capability id to invoke (e.g. @executioncontrolprotocol/test.echo)",
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...EnvModuleCommand.flags,
21
+ input: Flags.string({
22
+ description: "Path to JSON file with capability input object",
23
+ }),
24
+ uses: Flags.string({
25
+ description: "Optional provider capability override (harness .uses)",
26
+ }),
27
+ };
28
+ async run() {
29
+ const { args, flags } = await this.parse(Invoke);
30
+ let result;
31
+ await runWithCommandError(this, async () => {
32
+ const input = flags.input
33
+ ? await readJsonFile(flags.input, "--input")
34
+ : {};
35
+ const ecp = await this.loadEcp(flags);
36
+ let builder = ecp.invoke(args["capability-id"]).with(input);
37
+ if (flags.uses)
38
+ builder = builder.uses(flags.uses);
39
+ result = await builder.process();
40
+ this.log(JSON.stringify(result, null, 2));
41
+ });
42
+ if (result !== undefined && !result.success) {
43
+ this.error("Capability invoke did not succeed", { exit: 1 });
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=invoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/commands/invoke.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAE/D,yDAAyD;AACzD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,gBAAgB;IAClD,MAAM,CAAC,OAAO,GAAG,qBAAqB,CAAA;IAEtC,MAAM,CAAC,WAAW,GAChB,kFAAkF;QAClF,mEAAmE,CAAA;IAErE,MAAM,CAAC,QAAQ,GAAG;QAChB,kIAAkI;QAClI,mLAAmL;KACpL,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC;YAC3B,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,oEAAoE;SAClF,CAAC;KACH,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,gBAAgB,CAAC,KAAK;QACzB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,gDAAgD;SAC9D,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,uDAAuD;SACrE,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAChD,IAAI,MAAgC,CAAA;QACpC,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK;gBACvB,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC;gBAC5C,CAAC,CAAC,EAAE,CAAA;YACN,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACrC,IAAI,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC3D,IAAI,KAAK,CAAC,IAAI;gBAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAClD,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;YAChC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QACF,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { EnvModuleCommand } from "../lib/env-module-command.js";
2
+ /** Serve an environment over loopback HTTP for capability invoke. */
3
+ export default class Serve extends EnvModuleCommand {
4
+ static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: {
8
+ port: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
9
+ host: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
+ "cors-origin": import("@oclif/core/interfaces").OptionFlag<string[], import("@oclif/core/interfaces").CustomOptions>;
11
+ env: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAE/D,qEAAqE;AACrE,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,gBAAgB;IACjD,MAAM,CAAC,OAAO,SAAmC;IAEjD,MAAM,CAAC,WAAW,SAGyB;IAE3C,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,KAAK;;;;;MAeX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB3B"}
@@ -0,0 +1,53 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { DEFAULT_ECP_UP_HOST, DEFAULT_ECP_UP_PORT } from "../lib/up/constants.js";
3
+ import { startEcpServe } from "../lib/http/create-serve.js";
4
+ import { EnvModuleCommand } from "../lib/env-module-command.js";
5
+ /** Serve an environment over loopback HTTP for capability invoke. */
6
+ export default class Serve extends EnvModuleCommand {
7
+ static summary = "Serve an environment over HTTP";
8
+ static description = "Run a loopback HTTP server that exposes POST /v1/invoke for any capability " +
9
+ "bound in --env. No auth (loopback-only trust model). For the Ollama browser " +
10
+ "demo bridge with pairing, use `ecp up`.";
11
+ static examples = [
12
+ "<%= config.bin %> <%= command.id %> --env examples/01-echo/environment.ts",
13
+ "<%= config.bin %> <%= command.id %> --env environment.ts --port 3090 --cors-origin http://localhost:5173",
14
+ ];
15
+ static flags = {
16
+ ...EnvModuleCommand.flags,
17
+ port: Flags.integer({
18
+ description: "Listen port (ECP leet default 3090)",
19
+ default: DEFAULT_ECP_UP_PORT,
20
+ }),
21
+ host: Flags.string({
22
+ description: "Bind host (loopback only by default)",
23
+ default: DEFAULT_ECP_UP_HOST,
24
+ }),
25
+ "cors-origin": Flags.string({
26
+ description: "Extra allowed CORS origin (repeatable)",
27
+ multiple: true,
28
+ default: [],
29
+ }),
30
+ };
31
+ async run() {
32
+ const { flags } = await this.parse(Serve);
33
+ const ecp = await this.loadEcp(flags);
34
+ const daemon = await startEcpServe({
35
+ ecp,
36
+ port: flags.port,
37
+ host: flags.host,
38
+ corsOrigins: flags["cors-origin"],
39
+ });
40
+ const baseURL = `http://${daemon.host}:${daemon.port}`;
41
+ this.log(`ECP serve on ${baseURL}`);
42
+ this.log("GET /health · POST /v1/invoke (no auth; loopback)");
43
+ this.log("Press Ctrl+C to stop.");
44
+ await new Promise((resolve) => {
45
+ const shutdown = () => {
46
+ void daemon.close().finally(() => resolve());
47
+ };
48
+ process.once("SIGINT", shutdown);
49
+ process.once("SIGTERM", shutdown);
50
+ });
51
+ }
52
+ }
53
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAE/D,qEAAqE;AACrE,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,gBAAgB;IACjD,MAAM,CAAC,OAAO,GAAG,gCAAgC,CAAA;IAEjD,MAAM,CAAC,WAAW,GAChB,6EAA6E;QAC7E,8EAA8E;QAC9E,yCAAyC,CAAA;IAE3C,MAAM,CAAC,QAAQ,GAAG;QAChB,2EAA2E;QAC3E,0GAA0G;KAC3G,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,gBAAgB,CAAC,KAAK;QACzB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;YAClB,WAAW,EAAE,qCAAqC;YAClD,OAAO,EAAE,mBAAmB;SAC7B,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,sCAAsC;YACnD,OAAO,EAAE,mBAAmB;SAC7B,CAAC;QACF,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;YAC1B,WAAW,EAAE,wCAAwC;YACrD,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,EAAE;SACZ,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;YACjC,GAAG;YACH,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC;SAClC,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,UAAU,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAA;QACtD,IAAI,CAAC,GAAG,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAA;QACnC,IAAI,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAA;QAC7D,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;QAEjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,QAAQ,GAAG,GAAG,EAAE;gBACpB,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;YAC9C,CAAC,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAChC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { EnvModuleCommand } from "../../lib/env-module-command.js";
2
+ /** Rerun a single step in a test session. */
3
+ export default class TestRerun extends EnvModuleCommand {
4
+ static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static args: {
8
+ "step-id": import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
9
+ };
10
+ static flags: {
11
+ session: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
+ env: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
+ };
14
+ run(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=rerun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rerun.d.ts","sourceRoot":"","sources":["../../../src/commands/test/rerun.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAGlE,6CAA6C;AAC7C,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,gBAAgB;IACrD,MAAM,CAAC,OAAO,SAAqC;IAEnD,MAAM,CAAC,WAAW,SAEwD;IAE1E,MAAM,CAAC,QAAQ,WAEd;IAED,MAAM,CAAC,IAAI;;MAKV;IAED,MAAM,CAAC,KAAK;;;MAMX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAW3B"}
@@ -0,0 +1,38 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { runWithCommandError } from "../../lib/command-helpers.js";
3
+ import { EnvModuleCommand } from "../../lib/env-module-command.js";
4
+ import { readTestSessionFile, writeTestSessionFile } from "../../lib/test-session-io.js";
5
+ /** Rerun a single step in a test session. */
6
+ export default class TestRerun extends EnvModuleCommand {
7
+ static summary = "Rerun one step in a test session";
8
+ static description = "Execute a single step against frozen prior state, replace its committed output, " +
9
+ "and clear downstream history and `.as` state keys. Rewrites --session.";
10
+ static examples = [
11
+ "<%= config.bin %> <%= command.id %> echo --env examples/01-echo/environment.ts --session session.json",
12
+ ];
13
+ static args = {
14
+ "step-id": Args.string({
15
+ required: true,
16
+ description: "Step id to rerun",
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...EnvModuleCommand.flags,
21
+ session: Flags.string({
22
+ required: true,
23
+ description: "Path to test session JSON file",
24
+ }),
25
+ };
26
+ async run() {
27
+ const { args, flags } = await this.parse(TestRerun);
28
+ await runWithCommandError(this, async () => {
29
+ const snap = await readTestSessionFile(flags.session);
30
+ const ecp = await this.loadEcp(flags);
31
+ const session = await ecp.restoreTestSession(snap);
32
+ const next = await session.rerun(args["step-id"]);
33
+ await writeTestSessionFile(flags.session, next);
34
+ this.log(JSON.stringify(next, null, 2));
35
+ });
36
+ }
37
+ }
38
+ //# sourceMappingURL=rerun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rerun.js","sourceRoot":"","sources":["../../../src/commands/test/rerun.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAExF,6CAA6C;AAC7C,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,gBAAgB;IACrD,MAAM,CAAC,OAAO,GAAG,kCAAkC,CAAA;IAEnD,MAAM,CAAC,WAAW,GAChB,kFAAkF;QAClF,wEAAwE,CAAA;IAE1E,MAAM,CAAC,QAAQ,GAAG;QAChB,uGAAuG;KACxG,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;YACrB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,kBAAkB;SAChC,CAAC;KACH,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,gBAAgB,CAAC,KAAK;QACzB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,gCAAgC;SAC9C,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACnD,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACrD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACrC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;YAClD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;YACjD,MAAM,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAC/C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { EnvModuleCommand } from "../../lib/env-module-command.js";
2
+ /** Inclusive run-to within a test session. */
3
+ export default class TestRun extends EnvModuleCommand {
4
+ static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: {
8
+ to: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
+ session: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
+ env: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/test/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAGlE,8CAA8C;AAC9C,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,gBAAgB;IACnD,MAAM,CAAC,OAAO,SAAsC;IAEpD,MAAM,CAAC,WAAW,SAE0C;IAE5D,MAAM,CAAC,QAAQ,WAEd;IAED,MAAM,CAAC,KAAK;;;;MAUX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAW3B"}
@@ -0,0 +1,36 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { runWithCommandError } from "../../lib/command-helpers.js";
3
+ import { EnvModuleCommand } from "../../lib/env-module-command.js";
4
+ import { readTestSessionFile, writeTestSessionFile } from "../../lib/test-session-io.js";
5
+ /** Inclusive run-to within a test session. */
6
+ export default class TestRun extends EnvModuleCommand {
7
+ static summary = "Run a test session through a step";
8
+ static description = "Inclusively execute through --to <step-id>, skipping already-completed prior steps " +
9
+ "and freezing state for later reruns. Rewrites --session.";
10
+ static examples = [
11
+ "<%= config.bin %> <%= command.id %> --to echo --env examples/01-echo/environment.ts --session session.json",
12
+ ];
13
+ static flags = {
14
+ ...EnvModuleCommand.flags,
15
+ to: Flags.string({
16
+ required: true,
17
+ description: "Inclusive step id to run through",
18
+ }),
19
+ session: Flags.string({
20
+ required: true,
21
+ description: "Path to test session JSON file",
22
+ }),
23
+ };
24
+ async run() {
25
+ const { flags } = await this.parse(TestRun);
26
+ await runWithCommandError(this, async () => {
27
+ const snap = await readTestSessionFile(flags.session);
28
+ const ecp = await this.loadEcp(flags);
29
+ const session = await ecp.restoreTestSession(snap);
30
+ const next = await session.runTo(flags.to);
31
+ await writeTestSessionFile(flags.session, next);
32
+ this.log(JSON.stringify(next, null, 2));
33
+ });
34
+ }
35
+ }
36
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/test/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAExF,8CAA8C;AAC9C,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,gBAAgB;IACnD,MAAM,CAAC,OAAO,GAAG,mCAAmC,CAAA;IAEpD,MAAM,CAAC,WAAW,GAChB,qFAAqF;QACrF,0DAA0D,CAAA;IAE5D,MAAM,CAAC,QAAQ,GAAG;QAChB,4GAA4G;KAC7G,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,gBAAgB,CAAC,KAAK;QACzB,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC;YACf,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,kCAAkC;SAChD,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,gCAAgC;SAC9C,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACrD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACrC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;YAClD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC1C,MAAM,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAC/C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { WorkflowEnvCommand } from "../../lib/env-module-command.js";
2
+ /** Create a workflow test session file. */
3
+ export default class TestStart extends WorkflowEnvCommand {
4
+ static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static args: {
8
+ "workflow-path": import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
9
+ };
10
+ static flags: {
11
+ input: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
+ env: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
14
+ };
15
+ run(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/test/start.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAEpE,2CAA2C;AAC3C,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,kBAAkB;IACvD,MAAM,CAAC,OAAO,SAAkC;IAEhD,MAAM,CAAC,WAAW,SAE4C;IAE9D,MAAM,CAAC,QAAQ,WAEd;IAED,MAAM,CAAC,IAAI;;MAEV;IAED,MAAM,CAAC,KAAK;;;;MAUX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAc3B"}
@@ -0,0 +1,43 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { loadWorkflowFile } from "@executioncontrolprotocol/core/loaders";
3
+ import { readJsonFile, runWithCommandError } from "../../lib/command-helpers.js";
4
+ import { writeTestSessionFile } from "../../lib/test-session-io.js";
5
+ import { WorkflowEnvCommand } from "../../lib/env-module-command.js";
6
+ /** Create a workflow test session file. */
7
+ export default class TestStart extends WorkflowEnvCommand {
8
+ static summary = "Start a workflow test session";
9
+ static description = "Create an idle test session snapshot for a workflow. Use `ecp test run --to` " +
10
+ "and `ecp test rerun` to drive execution with frozen state.";
11
+ static examples = [
12
+ "<%= config.bin %> <%= command.id %> examples/01-echo/workflow.ts --env examples/01-echo/environment.ts -o session.json",
13
+ ];
14
+ static args = {
15
+ ...WorkflowEnvCommand.args,
16
+ };
17
+ static flags = {
18
+ ...WorkflowEnvCommand.flags,
19
+ input: Flags.string({
20
+ description: "Path to JSON file with workflow input object",
21
+ }),
22
+ output: Flags.string({
23
+ char: "o",
24
+ required: true,
25
+ description: "Path to write the test session JSON file",
26
+ }),
27
+ };
28
+ async run() {
29
+ const { args, flags } = await this.parse(TestStart);
30
+ await runWithCommandError(this, async () => {
31
+ const input = flags.input
32
+ ? await readJsonFile(flags.input, "--input")
33
+ : {};
34
+ const ecp = await this.loadEcp(flags);
35
+ const workflow = await loadWorkflowFile(args["workflow-path"]);
36
+ const session = await ecp.test(workflow).with({ input }).start();
37
+ const snap = session.snapshot();
38
+ await writeTestSessionFile(flags.output, snap);
39
+ this.log(JSON.stringify(snap, null, 2));
40
+ });
41
+ }
42
+ }
43
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/test/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAEpE,2CAA2C;AAC3C,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,kBAAkB;IACvD,MAAM,CAAC,OAAO,GAAG,+BAA+B,CAAA;IAEhD,MAAM,CAAC,WAAW,GAChB,+EAA+E;QAC/E,4DAA4D,CAAA;IAE9D,MAAM,CAAC,QAAQ,GAAG;QAChB,wHAAwH;KACzH,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,GAAG,kBAAkB,CAAC,IAAI;KAC3B,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,kBAAkB,CAAC,KAAK;QAC3B,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,8CAA8C;SAC5D,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,0CAA0C;SACxD,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACnD,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK;gBACvB,CAAC,CAAC,MAAM,YAAY,CAA0B,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC;gBACrE,CAAC,CAAC,EAAE,CAAA;YACN,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACrC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;YAC9D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAA;YAChE,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;YAC/B,MAAM,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC9C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Command } from "@oclif/core";
2
+ /** Print test session status. */
3
+ export default class TestStatus extends Command {
4
+ static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: {
8
+ session: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
+ };
10
+ run(): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/test/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,OAAO,EAAE,MAAM,aAAa,CAAA;AAI5C,iCAAiC;AACjC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,OAAO,SAA6B;IAE3C,MAAM,CAAC,WAAW,SACwD;IAE1E,MAAM,CAAC,QAAQ,WAAiE;IAEhF,MAAM,CAAC,KAAK;;MAMX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAO3B"}
@@ -0,0 +1,24 @@
1
+ import { Flags, Command } from "@oclif/core";
2
+ import { runWithCommandError } from "../../lib/command-helpers.js";
3
+ import { readTestSessionFile } from "../../lib/test-session-io.js";
4
+ /** Print test session status. */
5
+ export default class TestStatus extends Command {
6
+ static summary = "Show test session status";
7
+ static description = "Print the test session snapshot (status, cursor, state keys, history).";
8
+ static examples = ["<%= config.bin %> <%= command.id %> --session session.json"];
9
+ static flags = {
10
+ ...Command.baseFlags,
11
+ session: Flags.string({
12
+ required: true,
13
+ description: "Path to test session JSON file",
14
+ }),
15
+ };
16
+ async run() {
17
+ const { flags } = await this.parse(TestStatus);
18
+ await runWithCommandError(this, async () => {
19
+ const snap = await readTestSessionFile(flags.session);
20
+ this.log(JSON.stringify(snap, null, 2));
21
+ });
22
+ }
23
+ }
24
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/test/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAElE,iCAAiC;AACjC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,OAAO,GAAG,0BAA0B,CAAA;IAE3C,MAAM,CAAC,WAAW,GAChB,wEAAwE,CAAA;IAE1E,MAAM,CAAC,QAAQ,GAAG,CAAC,4DAA4D,CAAC,CAAA;IAEhF,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,OAAO,CAAC,SAAS;QACpB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,gCAAgC;SAC9C,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAC9C,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACrD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "@oclif/core";
2
+ /** Workflow test sessions (run-to / rerun with frozen state). */
3
+ export default class TestTopic extends Command {
4
+ static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ run(): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,iEAAiE;AACjE,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,OAAO,SAA8C;IAE5D,MAAM,CAAC,WAAW,SAM8B;IAEhD,MAAM,CAAC,QAAQ,WAKd;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAe3B"}
@@ -0,0 +1,32 @@
1
+ import { Command } from "@oclif/core";
2
+ /** Workflow test sessions (run-to / rerun with frozen state). */
3
+ export default class TestTopic extends Command {
4
+ static summary = "Test a workflow with a persistent session";
5
+ static description = `Create and drive a test session that freezes workflow state between operations.
6
+
7
+ Subcommands:
8
+ start Create a session file from a workflow
9
+ run Inclusive run-to via --to <step-id>
10
+ rerun Rerun one step and clear downstream state
11
+ status Print session status / cursor / history`;
12
+ static examples = [
13
+ "<%= config.bin %> test start workflow.ts --env environment.ts -o session.json",
14
+ "<%= config.bin %> test run --to step-b --env environment.ts --session session.json",
15
+ "<%= config.bin %> test rerun step-a --env environment.ts --session session.json",
16
+ "<%= config.bin %> test status --session session.json",
17
+ ];
18
+ async run() {
19
+ await this.parse(TestTopic);
20
+ this.log([
21
+ "Usage: ecp test <subcommand>",
22
+ "",
23
+ " start WORKFLOW-PATH Create a session (-o session.json)",
24
+ " run --to STEP-ID Inclusive run through a step",
25
+ " rerun STEP-ID Rerun one step; clear downstream",
26
+ " status Show session snapshot summary",
27
+ "",
28
+ "Run ecp test <cmd> --help for flags.",
29
+ ].join("\n"));
30
+ }
31
+ }
32
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,iEAAiE;AACjE,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,OAAO,GAAG,2CAA2C,CAAA;IAE5D,MAAM,CAAC,WAAW,GAAG;;;;;;kDAM2B,CAAA;IAEhD,MAAM,CAAC,QAAQ,GAAG;QAChB,+EAA+E;QAC/E,oFAAoF;QACpF,iFAAiF;QACjF,sDAAsD;KACvD,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAC3B,IAAI,CAAC,GAAG,CACN;YACE,8BAA8B;YAC9B,EAAE;YACF,2DAA2D;YAC3D,qDAAqD;YACrD,yDAAyD;YACzD,sDAAsD;YACtD,EAAE;YACF,sCAAsC;SACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;IACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Command } from "@oclif/core";
2
+ /** Start the local ECP daemon (bridges Ollama for the browser demo). */
3
+ export default class Up extends Command {
4
+ static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: {
8
+ port: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
9
+ host: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
+ "ollama-url": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
+ "cors-origin": import("@oclif/core/interfaces").OptionFlag<string[], import("@oclif/core/interfaces").CustomOptions>;
12
+ token: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ "open-url": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
14
+ open: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ };
16
+ run(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=up.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"up.d.ts","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAU5C,wEAAwE;AACxE,MAAM,CAAC,OAAO,OAAO,EAAG,SAAQ,OAAO;IACrC,MAAM,CAAC,OAAO,SAA+B;IAE7C,MAAM,CAAC,WAAW,SAEmE;IAErF,MAAM,CAAC,QAAQ,WAId;IAED,MAAM,CAAC,KAAK;;;;;;;;MA8BX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmD3B"}