@executioncontrolprotocol/cli 0.11.3 → 0.13.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 (40) hide show
  1. package/README.md +1 -1
  2. package/dist/commands/init.d.ts +14 -0
  3. package/dist/commands/init.d.ts.map +1 -0
  4. package/dist/commands/init.js +91 -0
  5. package/dist/commands/init.js.map +1 -0
  6. package/dist/commands/up.d.ts +1 -0
  7. package/dist/commands/up.d.ts.map +1 -1
  8. package/dist/commands/up.js +10 -3
  9. package/dist/commands/up.js.map +1 -1
  10. package/dist/lib/http/create-serve-handler.d.ts.map +1 -1
  11. package/dist/lib/http/create-serve-handler.js +6 -0
  12. package/dist/lib/http/create-serve-handler.js.map +1 -1
  13. package/dist/lib/http/handle-artifact.d.ts +14 -0
  14. package/dist/lib/http/handle-artifact.d.ts.map +1 -0
  15. package/dist/lib/http/handle-artifact.js +40 -0
  16. package/dist/lib/http/handle-artifact.js.map +1 -0
  17. package/dist/lib/http/handle-invoke.d.ts +28 -11
  18. package/dist/lib/http/handle-invoke.d.ts.map +1 -1
  19. package/dist/lib/http/handle-invoke.js +43 -1
  20. package/dist/lib/http/handle-invoke.js.map +1 -1
  21. package/dist/lib/init/collect-env-packages.d.ts +14 -0
  22. package/dist/lib/init/collect-env-packages.d.ts.map +1 -0
  23. package/dist/lib/init/collect-env-packages.js +36 -0
  24. package/dist/lib/init/collect-env-packages.js.map +1 -0
  25. package/dist/lib/init/merge-package-json.d.ts +29 -0
  26. package/dist/lib/init/merge-package-json.d.ts.map +1 -0
  27. package/dist/lib/init/merge-package-json.js +56 -0
  28. package/dist/lib/init/merge-package-json.js.map +1 -0
  29. package/dist/lib/up/constants.d.ts +1 -1
  30. package/dist/lib/up/constants.d.ts.map +1 -1
  31. package/dist/lib/up/constants.js +2 -2
  32. package/dist/lib/up/constants.js.map +1 -1
  33. package/dist/lib/up/create-daemon.d.ts +16 -0
  34. package/dist/lib/up/create-daemon.d.ts.map +1 -1
  35. package/dist/lib/up/create-daemon.js +29 -7
  36. package/dist/lib/up/create-daemon.js.map +1 -1
  37. package/dist/lib/up/handle-request.d.ts.map +1 -1
  38. package/dist/lib/up/handle-request.js +15 -2
  39. package/dist/lib/up/handle-request.js.map +1 -1
  40. package/package.json +8 -8
package/README.md CHANGED
@@ -124,7 +124,7 @@ Ollama/PNA **demo bridge** (fixed local env, not arbitrary `--env`). Prefer `ecp
124
124
 
125
125
  ```sh
126
126
  ecp up
127
- # Opens https://executioncontrolprotocol.github.io/browser-demo/?token=<uuid>&bridge=http://127.0.0.1:3090
127
+ # Opens https://demo.executioncontrolprotocol.io/?token=<uuid>&bridge=http://127.0.0.1:3090
128
128
 
129
129
  ecp up --open-url http://localhost:5173/
130
130
  ecp up --no-open
@@ -0,0 +1,14 @@
1
+ import { Command } from "@oclif/core";
2
+ /** Create or merge package.json from an environment module's imports. */
3
+ export default class Init extends Command {
4
+ static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: {
8
+ from: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
+ install: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ "dry-run": import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAgC5C,yEAAyE;AACzE,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,OAAO,SAA4D;IAE1E,MAAM,CAAC,WAAW,SAE4D;IAE9E,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,KAAK;;;;MAcX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmC3B"}
@@ -0,0 +1,91 @@
1
+ import { readFile, writeFile, access } from "node:fs/promises";
2
+ import { basename, dirname, join, resolve } from "node:path";
3
+ import { spawn } from "node:child_process";
4
+ import { Command, Flags } from "@oclif/core";
5
+ import { collectPackagesFromEnvironmentSource } from "../lib/init/collect-env-packages.js";
6
+ import { createPackageJson, mergeMissingDependencies, } from "../lib/init/merge-package-json.js";
7
+ async function pathExists(path) {
8
+ try {
9
+ await access(path);
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ function runNpmInstall(cwd, extra) {
17
+ return new Promise((resolveInstall, reject) => {
18
+ const child = spawn("npm", ["install", ...extra], {
19
+ cwd,
20
+ stdio: "inherit",
21
+ shell: true,
22
+ });
23
+ child.on("error", reject);
24
+ child.on("exit", (code) => {
25
+ if (code === 0)
26
+ resolveInstall();
27
+ else
28
+ reject(new Error(`npm install exited with code ${code ?? "null"}`));
29
+ });
30
+ });
31
+ }
32
+ /** Create or merge package.json from an environment module's imports. */
33
+ export default class Init extends Command {
34
+ static summary = "Create or merge package.json from an environment module";
35
+ static description = "Collect npm packages from environment.ts side-effect imports, write or merge " +
36
+ "package.json (never bump existing ranges), and optionally run npm install.";
37
+ static examples = [
38
+ "<%= config.bin %> <%= command.id %> --from environment.ts --install",
39
+ "<%= config.bin %> <%= command.id %> --from examples/01-echo/environment.ts --no-install",
40
+ ];
41
+ static flags = {
42
+ from: Flags.string({
43
+ required: true,
44
+ description: "Path to environment module (.ts or .js)",
45
+ }),
46
+ install: Flags.boolean({
47
+ description: "Run npm install after writing package.json",
48
+ allowNo: true,
49
+ default: true,
50
+ }),
51
+ "dry-run": Flags.boolean({
52
+ description: "Print planned packages without writing files",
53
+ default: false,
54
+ }),
55
+ };
56
+ async run() {
57
+ const { flags } = await this.parse(Init);
58
+ const envPath = resolve(flags.from);
59
+ const source = await readFile(envPath, "utf8");
60
+ const packages = collectPackagesFromEnvironmentSource(source);
61
+ const dir = dirname(envPath);
62
+ const pkgPath = join(dir, "package.json");
63
+ const exists = await pathExists(pkgPath);
64
+ if (flags["dry-run"]) {
65
+ this.log(JSON.stringify({ packages, packageJson: pkgPath, exists }, null, 2));
66
+ return;
67
+ }
68
+ let added = packages;
69
+ if (!exists) {
70
+ const created = createPackageJson(basename(dir) || "ecp-env", packages);
71
+ await writeFile(pkgPath, `${JSON.stringify(created, null, 2)}\n`, "utf8");
72
+ this.log(`Created ${pkgPath}`);
73
+ }
74
+ else {
75
+ const existing = JSON.parse(await readFile(pkgPath, "utf8"));
76
+ const merged = mergeMissingDependencies(existing, packages);
77
+ added = merged.added;
78
+ await writeFile(pkgPath, `${JSON.stringify(merged.next, null, 2)}\n`, "utf8");
79
+ if (added.length === 0) {
80
+ this.log(`No missing packages in ${pkgPath}`);
81
+ }
82
+ else {
83
+ this.log(`Added ${added.join(", ")} to ${pkgPath}`);
84
+ }
85
+ }
86
+ if (flags.install) {
87
+ await runNpmInstall(dir, []);
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ export default class Up extends Command {
9
9
  host: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
10
  "ollama-url": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
11
  "cors-origin": import("@oclif/core/interfaces").OptionFlag<string[], import("@oclif/core/interfaces").CustomOptions>;
12
+ env: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
13
  token: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
14
  "open-url": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
14
15
  open: import("@oclif/core/interfaces").BooleanFlag<boolean>;
@@ -1 +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"}
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,SAIkC;IAEpD,MAAM,CAAC,QAAQ,WAKd;IAED,MAAM,CAAC,KAAK;;;;;;;;;MAkCX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoD3B"}
@@ -6,10 +6,13 @@ import { buildDemoOpenUrl, openBrowserUrl, originFromUrl } from "../lib/up/open-
6
6
  /** Start the local ECP daemon (bridges Ollama for the browser demo). */
7
7
  export default class Up extends Command {
8
8
  static summary = "Start the local ECP daemon";
9
- static description = "Run a loopback HTTP daemon that exposes ECP invoke for local Ollama " +
10
- "(CORS + Private Network Access). Opens the browser demo with ?token= for pairing.";
9
+ static description = "Run a loopback HTTP daemon that exposes ECP invoke for a local environment " +
10
+ "(CORS + Private Network Access). Always hosts Ollama for the browser demo; " +
11
+ "optional --env adds that project's host extensions alongside Ollama. " +
12
+ "Opens the browser demo with ?token= for pairing.";
11
13
  static examples = [
12
14
  "<%= config.bin %> <%= command.id %>",
15
+ "<%= config.bin %> <%= command.id %> --env environment.ts",
13
16
  "<%= config.bin %> <%= command.id %> --open-url http://localhost:5173/",
14
17
  "<%= config.bin %> <%= command.id %> --no-open",
15
18
  ];
@@ -31,6 +34,9 @@ export default class Up extends Command {
31
34
  multiple: true,
32
35
  default: [],
33
36
  }),
37
+ env: Flags.string({
38
+ description: "Path to environment module (.ts or .js). Merged with Ollama (always hosted for the demo bridge).",
39
+ }),
34
40
  token: Flags.string({
35
41
  description: "Pairing token for /v1/invoke (auto-generated if omitted)",
36
42
  }),
@@ -59,6 +65,7 @@ export default class Up extends Command {
59
65
  ollamaUrl: flags["ollama-url"],
60
66
  corsOrigins,
61
67
  token,
68
+ envPath: flags.env,
62
69
  });
63
70
  const bridgeBaseURL = `http://${daemon.host}:${daemon.port}`;
64
71
  const demoUrl = buildDemoOpenUrl(openUrl, {
@@ -67,7 +74,7 @@ export default class Up extends Command {
67
74
  });
68
75
  this.log(`ECP daemon on ${bridgeBaseURL}`);
69
76
  this.log(`Pairing token: ${daemon.token}`);
70
- this.log("GET /health (no auth) · POST /v1/invoke (Bearer token)");
77
+ this.log("GET /health (no auth) · POST /v1/invoke · GET /v1/artifacts (Bearer or ?token=)");
71
78
  if (flags.open) {
72
79
  this.log(`Opening ${demoUrl}`);
73
80
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-serve-handler.d.ts","sourceRoot":"","sources":["../../../src/lib/http/create-serve-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAA;AAMzD,wEAAwE;AACxE,MAAM,WAAW,0BAA0B;IACzC,gCAAgC;IAChC,GAAG,EAAE,GAAG,CAAA;IACR,6DAA6D;IAC7D,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAClC;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,IAIzE,KAAK,eAAe,EACpB,KAAK,cAAc,KAClB,OAAO,CAAC,IAAI,CAAC,CA2BjB"}
1
+ {"version":3,"file":"create-serve-handler.d.ts","sourceRoot":"","sources":["../../../src/lib/http/create-serve-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAA;AAQzD,wEAAwE;AACxE,MAAM,WAAW,0BAA0B;IACzC,gCAAgC;IAChC,GAAG,EAAE,GAAG,CAAA;IACR,6DAA6D;IAC7D,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAClC;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,IAIzE,KAAK,eAAe,EACpB,KAAK,cAAc,KAClB,OAAO,CAAC,IAAI,CAAC,CAgCjB"}
@@ -1,3 +1,5 @@
1
+ import { isArtifactFetchPathname } from "@executioncontrolprotocol/core";
2
+ import { handleArtifactGet } from "./handle-artifact.js";
1
3
  import { handleInvokePost } from "./handle-invoke.js";
2
4
  import { writeJson } from "./write-json.js";
3
5
  import { ECP_UP_VERSION } from "../up/constants.js";
@@ -24,6 +26,10 @@ export function createServeRequestHandler(options) {
24
26
  });
25
27
  return;
26
28
  }
29
+ if (req.method === "GET" && isArtifactFetchPathname(pathname)) {
30
+ await handleArtifactGet(ecp, req, res);
31
+ return;
32
+ }
27
33
  if (req.method === "POST" && pathname === "/v1/invoke") {
28
34
  await handleInvokePost(ecp, req, res);
29
35
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"create-serve-handler.js","sourceRoot":"","sources":["../../../src/lib/http/create-serve-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAU7C;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAmC;IAC3E,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,OAAO,CAAA;IAErC,OAAO,KAAK,UAAU,kBAAkB,CACtC,GAAoB,EACpB,GAAmB;QAEnB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,CAAA;QAErC,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YAClB,GAAG,CAAC,GAAG,EAAE,CAAA;YACT,OAAM;QACR,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAA;QAChF,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;QAE7B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE;gBAClB,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,cAAc;aACxB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YACvD,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YACrC,OAAM;QACR,CAAC;QAED,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;IAC7C,CAAC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"create-serve-handler.js","sourceRoot":"","sources":["../../../src/lib/http/create-serve-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAU7C;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAmC;IAC3E,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,OAAO,CAAA;IAErC,OAAO,KAAK,UAAU,kBAAkB,CACtC,GAAoB,EACpB,GAAmB;QAEnB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,CAAA;QAErC,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YAClB,GAAG,CAAC,GAAG,EAAE,CAAA;YACT,OAAM;QACR,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAA;QAChF,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;QAE7B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE;gBAClB,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,cAAc;aACxB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9D,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YACvD,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YACrC,OAAM;QACR,CAAC;QAED,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;IAC7C,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import { type Ecp } from "@executioncontrolprotocol/core";
3
+ /**
4
+ * Sanitize a filename for Content-Disposition (strip quotes / path separators).
5
+ * @category CLI
6
+ */
7
+ export declare function sanitizeArtifactFilename(name: string | undefined, uri: string, mediaType?: string): string;
8
+ /**
9
+ * Handle `GET /v1/artifacts` or `GET /v1/artifacts/<filename>?uri=…` — serve host artifact bytes.
10
+ * Caller is responsible for authentication.
11
+ * @category CLI
12
+ */
13
+ export declare function handleArtifactGet(ecp: Ecp, req: IncomingMessage, res: ServerResponse): Promise<void>;
14
+ //# sourceMappingURL=handle-artifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-artifact.d.ts","sourceRoot":"","sources":["../../../src/lib/http/handle-artifact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,EAAuD,KAAK,GAAG,EAAE,MAAM,gCAAgC,CAAA;AAG9G;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -0,0 +1,40 @@
1
+ import { resolveArtifactFilename, parseArtifactFetchPathname } from "@executioncontrolprotocol/core";
2
+ import { writeJson } from "./write-json.js";
3
+ /**
4
+ * Sanitize a filename for Content-Disposition (strip quotes / path separators).
5
+ * @category CLI
6
+ */
7
+ export function sanitizeArtifactFilename(name, uri, mediaType) {
8
+ return resolveArtifactFilename(name, uri, mediaType);
9
+ }
10
+ /**
11
+ * Handle `GET /v1/artifacts` or `GET /v1/artifacts/<filename>?uri=…` — serve host artifact bytes.
12
+ * Caller is responsible for authentication.
13
+ * @category CLI
14
+ */
15
+ export async function handleArtifactGet(ecp, req, res) {
16
+ const host = req.headers.host ?? "127.0.0.1";
17
+ const url = new URL(req.url ?? "/", `http://${host}`);
18
+ const uri = url.searchParams.get("uri")?.trim() ?? "";
19
+ if (!uri || !uri.startsWith("ecp://")) {
20
+ writeJson(res, 400, { error: "uri query parameter is required (ecp://…)" });
21
+ return;
22
+ }
23
+ const store = typeof ecp.getArtifactStore === "function" ? ecp.getArtifactStore() : undefined;
24
+ const artifact = store?.get(uri);
25
+ if (!artifact) {
26
+ writeJson(res, 404, { error: `Artifact not found: ${uri}` });
27
+ return;
28
+ }
29
+ const pathHint = parseArtifactFetchPathname(url.pathname);
30
+ const filename = sanitizeArtifactFilename(artifact.name ?? pathHint, uri, artifact.mediaType);
31
+ const body = Buffer.from(artifact.bytes);
32
+ res.writeHead(200, {
33
+ "Content-Type": artifact.mediaType || "application/octet-stream",
34
+ "Content-Length": body.length,
35
+ "Content-Disposition": `inline; filename="${filename}"`,
36
+ "Cache-Control": "no-store",
37
+ });
38
+ res.end(body);
39
+ }
40
+ //# sourceMappingURL=handle-artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-artifact.js","sourceRoot":"","sources":["../../../src/lib/http/handle-artifact.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAY,MAAM,gCAAgC,CAAA;AAC9G,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAwB,EACxB,GAAW,EACX,SAAkB;IAElB,OAAO,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAQ,EACR,GAAoB,EACpB,GAAmB;IAEnB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAA;IAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC,CAAA;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACrD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC,CAAA;QAC3E,OAAM;IACR,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7F,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,uBAAuB,GAAG,EAAE,EAAE,CAAC,CAAA;QAC5D,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,0BAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACzD,MAAM,QAAQ,GAAG,wBAAwB,CACvC,QAAQ,CAAC,IAAI,IAAI,QAAQ,EACzB,GAAG,EACH,QAAQ,CAAC,SAAS,CACnB,CAAA;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACxC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,QAAQ,CAAC,SAAS,IAAI,0BAA0B;QAChE,gBAAgB,EAAE,IAAI,CAAC,MAAM;QAC7B,qBAAqB,EAAE,qBAAqB,QAAQ,GAAG;QACvD,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAA;IACF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACf,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { IncomingMessage, ServerResponse } from "node:http";
2
- import type { Ecp } from "@executioncontrolprotocol/core";
2
+ import { type CapabilityBlobStore, type Ecp, type SerializedCapabilityBlob } from "@executioncontrolprotocol/core";
3
+ import { type InvokeResult } from "@executioncontrolprotocol/types";
3
4
  /** JSON body for `POST /v1/invoke`. @category CLI */
4
5
  export interface InvokeHttpBody {
5
6
  /** Capability id to invoke. */
@@ -8,6 +9,19 @@ export interface InvokeHttpBody {
8
9
  input?: unknown;
9
10
  /** Optional provider capability override (harness `.uses`). */
10
11
  provider?: string;
12
+ /** Browser file blobs hopped with locator refs (transport only). */
13
+ blobs?: Record<string, SerializedCapabilityBlob>;
14
+ }
15
+ /** Parsed invoke body. @category CLI */
16
+ export interface ParsedInvokeBody {
17
+ /** Capability id. */
18
+ capability: string;
19
+ /** Input payload. */
20
+ input: unknown;
21
+ /** Optional provider override. */
22
+ provider?: string;
23
+ /** Optional hopped blobs. */
24
+ blobs?: Record<string, SerializedCapabilityBlob>;
11
25
  }
12
26
  /**
13
27
  * Parse and validate a `/v1/invoke` request body.
@@ -15,24 +29,27 @@ export interface InvokeHttpBody {
15
29
  */
16
30
  export declare function parseInvokeBody(raw: string): {
17
31
  ok: true;
18
- body: {
19
- capability: string;
20
- input: unknown;
21
- provider?: string;
22
- };
32
+ body: ParsedInvokeBody;
23
33
  } | {
24
34
  ok: false;
25
35
  error: string;
26
36
  };
37
+ /**
38
+ * Resolve the host blob store when the operational ECP supports hop hydration.
39
+ * Older `@executioncontrolprotocol/core` builds (no {@link Ecp.getBlobStore}) return undefined.
40
+ * @category CLI
41
+ */
42
+ export declare function resolveInvokeBlobStore(ecp: Ecp): CapabilityBlobStore | undefined;
43
+ /**
44
+ * Failed invoke result when the host cannot accept hopped browser blobs.
45
+ * @category CLI
46
+ */
47
+ export declare function blobHopUnsupportedResult(capabilityId: string): InvokeResult;
27
48
  /**
28
49
  * Run `ecp.invoke` for a parsed invoke body and return the result.
29
50
  * @category CLI
30
51
  */
31
- export declare function runHttpInvoke(ecp: Ecp, body: {
32
- capability: string;
33
- input: unknown;
34
- provider?: string;
35
- }): Promise<import("@executioncontrolprotocol/core").InvokeResult<unknown>>;
52
+ export declare function runHttpInvoke(ecp: Ecp, body: ParsedInvokeBody): Promise<InvokeResult<unknown>>;
36
53
  /**
37
54
  * Handle `POST /v1/invoke`: read body, invoke, write JSON result.
38
55
  * Does not perform authentication.
@@ -1 +1 @@
1
- {"version":3,"file":"handle-invoke.d.ts","sourceRoot":"","sources":["../../../src/lib/http/handle-invoke.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAA;AAIzD,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gCAAgC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GACV;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAoB9G;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,GAAG,EACR,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,2EAIhE;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
1
+ {"version":3,"file":"handle-invoke.d.ts","sourceRoot":"","sources":["../../../src/lib/http/handle-invoke.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,GAAG,EACR,KAAK,wBAAwB,EAC9B,MAAM,gCAAgC,CAAA;AAGvC,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,iCAAiC,CAAA;AAExC,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gCAAgC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;CACjD;AAED,wCAAwC;AACxC,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,qBAAqB;IACrB,KAAK,EAAE,OAAO,CAAA;IACd,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;CACjD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GACV;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAyBrE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,mBAAmB,GAAG,SAAS,CAGhF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,YAAY,CAe3E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,gBAAgB,kCAUnE;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
@@ -1,5 +1,7 @@
1
+ import { hydrateCapabilityBlobs, } from "@executioncontrolprotocol/core";
1
2
  import { readRequestBody } from "./read-body.js";
2
3
  import { writeJson } from "./write-json.js";
4
+ import { ECP_INVOKE_ERROR_CODES, LATEST_ECP_VERSION, httpStatusForInvokeResult, } from "@executioncontrolprotocol/types";
3
5
  /**
4
6
  * Parse and validate a `/v1/invoke` request body.
5
7
  * @category CLI
@@ -15,6 +17,9 @@ export function parseInvokeBody(raw) {
15
17
  if (typeof parsed.capability !== "string" || !parsed.capability.trim()) {
16
18
  return { ok: false, error: "capability is required" };
17
19
  }
20
+ const blobs = parsed.blobs && typeof parsed.blobs === "object" && !Array.isArray(parsed.blobs)
21
+ ? parsed.blobs
22
+ : undefined;
18
23
  return {
19
24
  ok: true,
20
25
  body: {
@@ -23,14 +28,51 @@ export function parseInvokeBody(raw) {
23
28
  ...(typeof parsed.provider === "string" && parsed.provider.trim()
24
29
  ? { provider: parsed.provider }
25
30
  : {}),
31
+ ...(blobs ? { blobs } : {}),
26
32
  },
27
33
  };
28
34
  }
35
+ /**
36
+ * Resolve the host blob store when the operational ECP supports hop hydration.
37
+ * Older `@executioncontrolprotocol/core` builds (no {@link Ecp.getBlobStore}) return undefined.
38
+ * @category CLI
39
+ */
40
+ export function resolveInvokeBlobStore(ecp) {
41
+ if (typeof ecp.getBlobStore !== "function")
42
+ return undefined;
43
+ return ecp.getBlobStore();
44
+ }
45
+ /**
46
+ * Failed invoke result when the host cannot accept hopped browser blobs.
47
+ * @category CLI
48
+ */
49
+ export function blobHopUnsupportedResult(capabilityId) {
50
+ return {
51
+ schema: "@executioncontrolprotocol.invoke.result",
52
+ version: LATEST_ECP_VERSION,
53
+ success: false,
54
+ capabilityId: capabilityId,
55
+ diagnostics: [
56
+ {
57
+ severity: "error",
58
+ code: ECP_INVOKE_ERROR_CODES.INVOKE_FAILED,
59
+ message: "Host environment does not support browser blob hop (upgrade @executioncontrolprotocol/core / node used by --env).",
60
+ },
61
+ ],
62
+ };
63
+ }
29
64
  /**
30
65
  * Run `ecp.invoke` for a parsed invoke body and return the result.
31
66
  * @category CLI
32
67
  */
33
68
  export async function runHttpInvoke(ecp, body) {
69
+ if (body.blobs) {
70
+ const store = resolveInvokeBlobStore(ecp);
71
+ if (!store) {
72
+ return blobHopUnsupportedResult(body.capability);
73
+ }
74
+ hydrateCapabilityBlobs(store, body.blobs);
75
+ }
34
76
  const builder = ecp.invoke(body.capability).with(body.input);
35
77
  return (body.provider ? builder.uses(body.provider) : builder).process();
36
78
  }
@@ -56,7 +98,7 @@ export async function handleInvokePost(ecp, req, res) {
56
98
  }
57
99
  try {
58
100
  const result = await runHttpInvoke(ecp, parsed.body);
59
- writeJson(res, 200, result);
101
+ writeJson(res, httpStatusForInvokeResult(result), result);
60
102
  }
61
103
  catch (err) {
62
104
  const message = err instanceof Error ? err.message : String(err);
@@ -1 +1 @@
1
- {"version":3,"file":"handle-invoke.js","sourceRoot":"","sources":["../../../src/lib/http/handle-invoke.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handle-invoke.js","sourceRoot":"","sources":["../../../src/lib/http/handle-invoke.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,GAIvB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,yBAAyB,GAG1B,MAAM,iCAAiC,CAAA;AA0BxC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAW;IAEX,IAAI,MAAsB,CAAA;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC,CAAC,CAAC,EAAE,CAAA;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAA;IAClD,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QACvE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAA;IACvD,CAAC;IACD,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9E,CAAC,CAAC,MAAM,CAAC,KAAK;QACd,CAAC,CAAC,SAAS,CAAA;IACf,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE;YACJ,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;YACzB,GAAG,CAAC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAC/D,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;gBAC/B,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5B;KACF,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAQ;IAC7C,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,UAAU;QAAE,OAAO,SAAS,CAAA;IAC5D,OAAO,GAAG,CAAC,YAAY,EAAE,CAAA;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,YAAoB;IAC3D,OAAO;QACL,MAAM,EAAE,yCAAyC;QACjD,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE,KAAK;QACd,YAAY,EAAE,YAA4B;QAC1C,WAAW,EAAE;YACX;gBACE,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,sBAAsB,CAAC,aAAa;gBAC1C,OAAO,EACL,mHAAmH;aACtH;SACF;KACF,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAQ,EAAE,IAAsB;IAClE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClD,CAAC;QACD,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAC3C,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5D,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAA;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAQ,EACR,GAAoB,EACpB,GAAmB;IAEnB,IAAI,GAAW,CAAA;IACf,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAA;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QACvC,OAAM;IACR,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;IACnC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAC5C,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QACpD,SAAS,CAAC,GAAG,EAAE,yBAAyB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IACzC,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Map an import specifier to its npm package name.
3
+ * Subpaths resolve to the owning package (`@scope/name/sub` → `@scope/name`).
4
+ * @category CLI
5
+ */
6
+ export declare function npmPackageFromSpecifier(specifier: string): string | undefined;
7
+ /**
8
+ * Collect npm package names from environment module source (side-effect and named imports).
9
+ * @category CLI
10
+ */
11
+ export declare function collectPackagesFromEnvironmentSource(source: string): string[];
12
+ /** Dev-only packages added by `ecp init`. @category CLI */
13
+ export declare const INIT_DEV_DEPENDENCIES: readonly ["@executioncontrolprotocol/cli"];
14
+ //# sourceMappingURL=collect-env-packages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-env-packages.d.ts","sourceRoot":"","sources":["../../../src/lib/init/collect-env-packages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW7E;AAID;;;GAGG;AACH,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ7E;AAED,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,4CAA6C,CAAA"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Map an import specifier to its npm package name.
3
+ * Subpaths resolve to the owning package (`@scope/name/sub` → `@scope/name`).
4
+ * @category CLI
5
+ */
6
+ export function npmPackageFromSpecifier(specifier) {
7
+ const trimmed = specifier.trim();
8
+ if (!trimmed || trimmed.startsWith(".") || trimmed.startsWith("/") || trimmed.startsWith("node:")) {
9
+ return undefined;
10
+ }
11
+ if (trimmed.startsWith("@")) {
12
+ const parts = trimmed.split("/");
13
+ if (parts.length < 2 || !parts[0] || !parts[1])
14
+ return undefined;
15
+ return `${parts[0]}/${parts[1]}`;
16
+ }
17
+ return trimmed.split("/")[0];
18
+ }
19
+ const IMPORT_FROM_RE = /(?:from|import)\s+["']([^"']+)["']/g;
20
+ /**
21
+ * Collect npm package names from environment module source (side-effect and named imports).
22
+ * @category CLI
23
+ */
24
+ export function collectPackagesFromEnvironmentSource(source) {
25
+ const names = new Set();
26
+ for (const match of source.matchAll(IMPORT_FROM_RE)) {
27
+ const pkg = npmPackageFromSpecifier(match[1] ?? "");
28
+ if (pkg)
29
+ names.add(pkg);
30
+ }
31
+ names.add("@executioncontrolprotocol/node");
32
+ return [...names].sort();
33
+ }
34
+ /** Dev-only packages added by `ecp init`. @category CLI */
35
+ export const INIT_DEV_DEPENDENCIES = ["@executioncontrolprotocol/cli"];
36
+ //# sourceMappingURL=collect-env-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-env-packages.js","sourceRoot":"","sources":["../../../src/lib/init/collect-env-packages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;IAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAClG,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,CAAA;QAChE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IAClC,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,cAAc,GAAG,qCAAqC,CAAA;AAE5D;;;GAGG;AACH,MAAM,UAAU,oCAAoC,CAAC,MAAc;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACnD,IAAI,GAAG;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;IAC3C,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1B,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,+BAA+B,CAAU,CAAA"}
@@ -0,0 +1,29 @@
1
+ /** package.json shape used by `ecp init`. @category CLI */
2
+ export interface InitPackageJson {
3
+ /** Package name. */
4
+ name?: string;
5
+ /** Private package flag. */
6
+ private?: boolean;
7
+ /** Module type. */
8
+ type?: string;
9
+ /** Production dependencies. */
10
+ dependencies?: Record<string, string>;
11
+ /** Development dependencies. */
12
+ devDependencies?: Record<string, string>;
13
+ /** Additional package.json fields. */
14
+ [key: string]: unknown;
15
+ }
16
+ /**
17
+ * Create a greenfield package.json (latest-compatible ranges via `*`).
18
+ * @category CLI
19
+ */
20
+ export declare function createPackageJson(name: string, packages: string[], devPackages?: readonly string[]): InitPackageJson;
21
+ /**
22
+ * Add missing packages without rewriting existing version ranges.
23
+ * @category CLI
24
+ */
25
+ export declare function mergeMissingDependencies(existing: InitPackageJson, packages: string[], devPackages?: readonly string[]): {
26
+ next: InitPackageJson;
27
+ added: string[];
28
+ };
29
+ //# sourceMappingURL=merge-package-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-package-json.d.ts","sourceRoot":"","sources":["../../../src/lib/init/merge-package-json.ts"],"names":[],"mappings":"AAEA,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,gCAAgC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,sCAAsC;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,GAAE,SAAS,MAAM,EAA0B,GACrD,eAAe,CAiBjB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,GAAE,SAAS,MAAM,EAA0B,GACrD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAwB5C"}
@@ -0,0 +1,56 @@
1
+ import { INIT_DEV_DEPENDENCIES } from "./collect-env-packages.js";
2
+ /**
3
+ * Create a greenfield package.json (latest-compatible ranges via `*`).
4
+ * @category CLI
5
+ */
6
+ export function createPackageJson(name, packages, devPackages = INIT_DEV_DEPENDENCIES) {
7
+ const dependencies = {};
8
+ for (const pkg of packages) {
9
+ if (devPackages.includes(pkg))
10
+ continue;
11
+ dependencies[pkg] = "*";
12
+ }
13
+ const devDependencies = {};
14
+ for (const pkg of devPackages) {
15
+ devDependencies[pkg] = "*";
16
+ }
17
+ return {
18
+ name,
19
+ private: true,
20
+ type: "module",
21
+ dependencies,
22
+ devDependencies,
23
+ };
24
+ }
25
+ /**
26
+ * Add missing packages without rewriting existing version ranges.
27
+ * @category CLI
28
+ */
29
+ export function mergeMissingDependencies(existing, packages, devPackages = INIT_DEV_DEPENDENCIES) {
30
+ const next = {
31
+ ...existing,
32
+ dependencies: { ...existing.dependencies },
33
+ devDependencies: { ...existing.devDependencies },
34
+ };
35
+ const added = [];
36
+ const deps = next.dependencies ?? {};
37
+ const dev = next.devDependencies ?? {};
38
+ next.dependencies = deps;
39
+ next.devDependencies = dev;
40
+ for (const pkg of packages) {
41
+ if (devPackages.includes(pkg))
42
+ continue;
43
+ if (deps[pkg] || dev[pkg])
44
+ continue;
45
+ deps[pkg] = "*";
46
+ added.push(pkg);
47
+ }
48
+ for (const pkg of devPackages) {
49
+ if (deps[pkg] || dev[pkg])
50
+ continue;
51
+ dev[pkg] = "*";
52
+ added.push(pkg);
53
+ }
54
+ return { next, added };
55
+ }
56
+ //# sourceMappingURL=merge-package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-package-json.js","sourceRoot":"","sources":["../../../src/lib/init/merge-package-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAkBjE;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,QAAkB,EAClB,cAAiC,qBAAqB;IAEtD,MAAM,YAAY,GAA2B,EAAE,CAAA;IAC/C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAmC,CAAC;YAAE,SAAQ;QACvE,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;IACzB,CAAC;IACD,MAAM,eAAe,GAA2B,EAAE,CAAA;IAClD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,eAAe,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;IAC5B,CAAC;IACD,OAAO;QACL,IAAI;QACJ,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;QACd,YAAY;QACZ,eAAe;KAChB,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAAyB,EACzB,QAAkB,EAClB,cAAiC,qBAAqB;IAEtD,MAAM,IAAI,GAAoB;QAC5B,GAAG,QAAQ;QACX,YAAY,EAAE,EAAE,GAAG,QAAQ,CAAC,YAAY,EAAE;QAC1C,eAAe,EAAE,EAAE,GAAG,QAAQ,CAAC,eAAe,EAAE;KACjD,CAAA;IACD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,IAAI,EAAE,CAAA;IACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;IACxB,IAAI,CAAC,eAAe,GAAG,GAAG,CAAA;IAE1B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAmC,CAAC;YAAE,SAAQ;QACvE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC;YAAE,SAAQ;QACnC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjB,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC;YAAE,SAAQ;QACnC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACxB,CAAC"}
@@ -5,7 +5,7 @@ export declare const DEFAULT_ECP_UP_HOST = "127.0.0.1";
5
5
  /** Default Ollama HTTP API base URL. @category CLI */
6
6
  export declare const DEFAULT_OLLAMA_URL = "http://127.0.0.1:11434";
7
7
  /** Default browser demo URL opened by `ecp up`. @category CLI */
8
- export declare const DEFAULT_DEMO_OPEN_URL = "https://executioncontrolprotocol.github.io/browser-demo/";
8
+ export declare const DEFAULT_DEMO_OPEN_URL = "https://demo.executioncontrolprotocol.io/";
9
9
  /** Built-in CORS origins for local Vite + hosted demo. @category CLI */
10
10
  export declare const DEFAULT_CORS_ORIGINS: readonly string[];
11
11
  /** JSON MIME type for daemon responses. @category CLI */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/up/constants.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,eAAO,MAAM,mBAAmB,OAAO,CAAA;AAEvC,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,cAAc,CAAA;AAE9C,sDAAsD;AACtD,eAAO,MAAM,kBAAkB,2BAA2B,CAAA;AAE1D,iEAAiE;AACjE,eAAO,MAAM,qBAAqB,6DAA6D,CAAA;AAE/F,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAIjD,CAAA;AAED,yDAAyD;AACzD,eAAO,MAAM,SAAS,qBAAqB,CAAA;AAI3C,mHAAmH;AACnH,eAAO,MAAM,cAAc,QAAoE,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/up/constants.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,eAAO,MAAM,mBAAmB,OAAO,CAAA;AAEvC,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,cAAc,CAAA;AAE9C,sDAAsD;AACtD,eAAO,MAAM,kBAAkB,2BAA2B,CAAA;AAE1D,iEAAiE;AACjE,eAAO,MAAM,qBAAqB,8CAA8C,CAAA;AAEhF,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAIjD,CAAA;AAED,yDAAyD;AACzD,eAAO,MAAM,SAAS,qBAAqB,CAAA;AAI3C,mHAAmH;AACnH,eAAO,MAAM,cAAc,QAAoE,CAAA"}
@@ -6,12 +6,12 @@ export const DEFAULT_ECP_UP_HOST = "127.0.0.1";
6
6
  /** Default Ollama HTTP API base URL. @category CLI */
7
7
  export const DEFAULT_OLLAMA_URL = "http://127.0.0.1:11434";
8
8
  /** Default browser demo URL opened by `ecp up`. @category CLI */
9
- export const DEFAULT_DEMO_OPEN_URL = "https://executioncontrolprotocol.github.io/browser-demo/";
9
+ export const DEFAULT_DEMO_OPEN_URL = "https://demo.executioncontrolprotocol.io/";
10
10
  /** Built-in CORS origins for local Vite + hosted demo. @category CLI */
11
11
  export const DEFAULT_CORS_ORIGINS = [
12
12
  "http://localhost:5173",
13
13
  "http://127.0.0.1:5173",
14
- "https://executioncontrolprotocol.github.io",
14
+ "https://demo.executioncontrolprotocol.io",
15
15
  ];
16
16
  /** JSON MIME type for daemon responses. @category CLI */
17
17
  export const JSON_MIME = "application/json";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/up/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAA;AAEvC,uDAAuD;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAA;AAE9C,sDAAsD;AACtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,wBAAwB,CAAA;AAE1D,iEAAiE;AACjE,MAAM,CAAC,MAAM,qBAAqB,GAAG,0DAA0D,CAAA;AAE/F,wEAAwE;AACxE,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,uBAAuB;IACvB,uBAAuB;IACvB,4CAA4C;CAC7C,CAAA;AAED,yDAAyD;AACzD,MAAM,CAAC,MAAM,SAAS,GAAG,kBAAkB,CAAA;AAE3C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9C,mHAAmH;AACnH,MAAM,CAAC,MAAM,cAAc,GAAI,OAAO,CAAC,uBAAuB,CAAyB,CAAC,OAAO,CAAA"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/up/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAA;AAEvC,uDAAuD;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAA;AAE9C,sDAAsD;AACtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,wBAAwB,CAAA;AAE1D,iEAAiE;AACjE,MAAM,CAAC,MAAM,qBAAqB,GAAG,2CAA2C,CAAA;AAEhF,wEAAwE;AACxE,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,uBAAuB;IACvB,uBAAuB;IACvB,0CAA0C;CAC3C,CAAA;AAED,yDAAyD;AACzD,MAAM,CAAC,MAAM,SAAS,GAAG,kBAAkB,CAAA;AAE3C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9C,mHAAmH;AACnH,MAAM,CAAC,MAAM,cAAc,GAAI,OAAO,CAAC,uBAAuB,CAAyB,CAAC,OAAO,CAAA"}
@@ -13,6 +13,8 @@ export interface StartEcpUpDaemonOptions {
13
13
  corsOrigins?: string[];
14
14
  /** Pairing token for `/v1/invoke`. */
15
15
  token: string;
16
+ /** Optional environment module path (`ecp up --env`). */
17
+ envPath?: string;
16
18
  }
17
19
  /** Result of starting the daemon. @category CLI */
18
20
  export interface EcpUpDaemon {
@@ -29,6 +31,20 @@ export interface EcpUpDaemon {
29
31
  /** Close the server and terminate ECP. */
30
32
  close: () => Promise<void>;
31
33
  }
34
+ /**
35
+ * Load the operational ECP instance for `ecp up`.
36
+ * Always hosts Ollama (browser demo model picker / coding harness).
37
+ * With `--env`, that project's Node environment is loaded and Ollama is added
38
+ * so host packages (e.g. image-sharp) and Ollama coexist.
39
+ * Without `--env`, the daemon hosts Ollama only.
40
+ * @category CLI
41
+ */
42
+ export declare function loadUpDaemonEcp(options: {
43
+ /** Optional environment module path. */
44
+ envPath?: string;
45
+ /** Ollama API base URL for the default daemon env. */
46
+ ollamaUrl: string;
47
+ }): Promise<Ecp>;
32
48
  /**
33
49
  * Start the local ECP daemon (`ecp up`).
34
50
  * @category CLI
@@ -1 +1 @@
1
- {"version":3,"file":"create-daemon.d.ts","sourceRoot":"","sources":["../../../src/lib/up/create-daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAA;AAErD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAA;AACzD,OAAO,4CAA4C,CAAA;AAUnD,0DAA0D;AAC1D,MAAM,WAAW,uBAAuB;IACtC,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAA;CACd;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,gCAAgC;IAChC,GAAG,EAAE,GAAG,CAAA;IACR,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,0CAA0C;IAC1C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,WAAW,CAAC,CA0DtB"}
1
+ {"version":3,"file":"create-daemon.d.ts","sourceRoot":"","sources":["../../../src/lib/up/create-daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAA;AAErD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAA;AAEzD,OAAO,4CAA4C,CAAA;AAUnD,0DAA0D;AAC1D,MAAM,WAAW,uBAAuB;IACtC,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,gCAAgC;IAChC,GAAG,EAAE,GAAG,CAAA;IACR,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,0CAA0C;IAC1C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC,GAAG,CAAC,CAef;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,WAAW,CAAC,CAsDtB"}
@@ -1,9 +1,34 @@
1
1
  import { createServer } from "node:http";
2
2
  import { environment, extension } from "@executioncontrolprotocol/node";
3
+ import { loadEnvironmentModule } from "@executioncontrolprotocol/core/loaders";
3
4
  import "@executioncontrolprotocol/extension-ollama";
4
5
  import { registerOllamaExtension } from "@executioncontrolprotocol/extension-ollama";
5
6
  import { DEFAULT_CORS_ORIGINS, DEFAULT_ECP_UP_HOST, DEFAULT_ECP_UP_PORT, DEFAULT_OLLAMA_URL, } from "./constants.js";
6
7
  import { createUpRequestHandler } from "./handle-request.js";
8
+ /**
9
+ * Load the operational ECP instance for `ecp up`.
10
+ * Always hosts Ollama (browser demo model picker / coding harness).
11
+ * With `--env`, that project's Node environment is loaded and Ollama is added
12
+ * so host packages (e.g. image-sharp) and Ollama coexist.
13
+ * Without `--env`, the daemon hosts Ollama only.
14
+ * @category CLI
15
+ */
16
+ export async function loadUpDaemonEcp(options) {
17
+ await registerOllamaExtension();
18
+ const ollamaConfig = { baseURL: options.ollamaUrl };
19
+ if (options.envPath) {
20
+ const loaded = await loadEnvironmentModule(options.envPath);
21
+ // Project envs use their own registry instance after module load — register Ollama there.
22
+ await registerOllamaExtension(loaded.getRegistry());
23
+ // Project envs (e.g. image-prep) omit Ollama; the demo bridge still needs listModels/generate.
24
+ loaded.addExtensionBinding("@executioncontrolprotocol/ollama", ollamaConfig);
25
+ return loaded.init();
26
+ }
27
+ const env = (await environment("ecp-up")).withExtensions([
28
+ extension("@executioncontrolprotocol/ollama").with(ollamaConfig),
29
+ ]);
30
+ return env.init();
31
+ }
7
32
  /**
8
33
  * Start the local ECP daemon (`ecp up`).
9
34
  * @category CLI
@@ -13,13 +38,10 @@ export async function startEcpUpDaemon(options) {
13
38
  const host = options.host ?? DEFAULT_ECP_UP_HOST;
14
39
  const ollamaUrl = options.ollamaUrl ?? DEFAULT_OLLAMA_URL;
15
40
  const token = options.token;
16
- await registerOllamaExtension();
17
- const env = (await environment("ecp-up")).withExtensions([
18
- extension("@executioncontrolprotocol/ollama").with({
19
- baseURL: ollamaUrl,
20
- }),
21
- ]);
22
- const ecp = await env.init();
41
+ const ecp = await loadUpDaemonEcp({
42
+ envPath: options.envPath,
43
+ ollamaUrl,
44
+ });
23
45
  const allowOrigins = new Set([
24
46
  ...DEFAULT_CORS_ORIGINS,
25
47
  ...(options.corsOrigins ?? []),
@@ -1 +1 @@
1
- {"version":3,"file":"create-daemon.js","sourceRoot":"","sources":["../../../src/lib/up/create-daemon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-daemon.js","sourceRoot":"","sources":["../../../src/lib/up/create-daemon.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"handle-request.d.ts","sourceRoot":"","sources":["../../../src/lib/up/handle-request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAA;AAOzD,qEAAqE;AACrE,MAAM,WAAW,uBAAuB;IACtC,gCAAgC;IAChC,GAAG,EAAE,GAAG,CAAA;IACR,gCAAgC;IAChC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACjC,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,IAInE,KAAK,eAAe,EACpB,KAAK,cAAc,KAClB,OAAO,CAAC,IAAI,CAAC,CAwCjB"}
1
+ {"version":3,"file":"handle-request.d.ts","sourceRoot":"","sources":["../../../src/lib/up/handle-request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAA;AASzD,qEAAqE;AACrE,MAAM,WAAW,uBAAuB;IACtC,gCAAgC;IAChC,GAAG,EAAE,GAAG,CAAA;IACR,gCAAgC;IAChC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACjC,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAA;CAClB;AAWD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,IAInE,KAAK,eAAe,EACpB,KAAK,cAAc,KAClB,OAAO,CAAC,IAAI,CAAC,CAgDjB"}
@@ -1,8 +1,14 @@
1
+ import { isArtifactFetchPathname } from "@executioncontrolprotocol/core";
1
2
  import { listOllamaModels } from "@executioncontrolprotocol/extension-ollama";
3
+ import { handleArtifactGet } from "../http/handle-artifact.js";
2
4
  import { handleInvokePost } from "../http/handle-invoke.js";
3
5
  import { writeJson } from "../http/write-json.js";
4
6
  import { ECP_UP_VERSION } from "./constants.js";
5
7
  import { readBearerToken, setCorsAndPna } from "./cors.js";
8
+ function authorizeUpRequest(req, url, token) {
9
+ const presented = readBearerToken(req) ?? url.searchParams.get("token")?.trim() ?? "";
10
+ return Boolean(presented) && presented === token;
11
+ }
6
12
  /**
7
13
  * Create the HTTP request handler for `ecp up`.
8
14
  * @category CLI
@@ -34,9 +40,16 @@ export function createUpRequestHandler(options) {
34
40
  });
35
41
  return;
36
42
  }
43
+ if (req.method === "GET" && isArtifactFetchPathname(pathname)) {
44
+ if (!authorizeUpRequest(req, url, token)) {
45
+ writeJson(res, 401, { error: "Unauthorized" });
46
+ return;
47
+ }
48
+ await handleArtifactGet(ecp, req, res);
49
+ return;
50
+ }
37
51
  if (req.method === "POST" && pathname === "/v1/invoke") {
38
- const presented = readBearerToken(req);
39
- if (!presented || presented !== token) {
52
+ if (!authorizeUpRequest(req, url, token)) {
40
53
  writeJson(res, 401, { error: "Unauthorized" });
41
54
  return;
42
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handle-request.js","sourceRoot":"","sources":["../../../src/lib/up/handle-request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAc1D;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACrE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;IAEvD,OAAO,KAAK,UAAU,eAAe,CACnC,GAAoB,EACpB,GAAmB;QAEnB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,CAAA;QAErC,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YAClB,GAAG,CAAC,GAAG,EAAE,CAAA;YACT,OAAM;QACR,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAA;QAChF,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;QAE7B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnD,IAAI,eAAe,GAAG,KAAK,CAAA;YAC3B,IAAI,CAAC;gBACH,MAAM,gBAAgB,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACxE,eAAe,GAAG,IAAI,CAAA;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe,GAAG,KAAK,CAAA;YACzB,CAAC;YACD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE;gBAClB,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,cAAc;gBACvB,eAAe;aAChB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YACvD,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;YACtC,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBACtC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;gBAC9C,OAAM;YACR,CAAC;YACD,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YACrC,OAAM;QACR,CAAC;QAED,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;IAC7C,CAAC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"handle-request.js","sourceRoot":"","sources":["../../../src/lib/up/handle-request.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@executioncontrolprotocol/cli",
3
- "version": "0.11.3",
3
+ "version": "0.13.0",
4
4
  "description": "ECP command-line interface",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -19,19 +19,19 @@
19
19
  "start": "node ./bin/dev.js"
20
20
  },
21
21
  "peerDependencies": {
22
- "@executioncontrolprotocol/core": "^0.11.3",
23
- "@executioncontrolprotocol/types": "^0.11.3",
22
+ "@executioncontrolprotocol/core": "^0.13.0",
23
+ "@executioncontrolprotocol/types": "^0.13.0",
24
24
  "zod": "^3.24.0"
25
25
  },
26
26
  "dependencies": {
27
- "@executioncontrolprotocol/node": "0.11.3",
28
- "@executioncontrolprotocol/secrets": "0.11.3",
29
- "@executioncontrolprotocol/extension-ollama": "0.11.3",
27
+ "@executioncontrolprotocol/node": "0.13.0",
28
+ "@executioncontrolprotocol/secrets": "0.13.0",
29
+ "@executioncontrolprotocol/extension-ollama": "0.13.0",
30
30
  "@oclif/core": "^4.10.0"
31
31
  },
32
32
  "devDependencies": {
33
- "@executioncontrolprotocol/core": "0.11.3",
34
- "@executioncontrolprotocol/types": "0.11.3",
33
+ "@executioncontrolprotocol/core": "0.13.0",
34
+ "@executioncontrolprotocol/types": "0.13.0",
35
35
  "typescript": "^5.7.0",
36
36
  "zod": "^3.24.0"
37
37
  },