@executioncontrolprotocol/browser 0.10.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 (54) hide show
  1. package/README.md +61 -0
  2. package/dist/authoring/browser-authoring-panels.d.ts +11 -0
  3. package/dist/authoring/browser-authoring-panels.d.ts.map +1 -0
  4. package/dist/authoring/browser-authoring-panels.js +25 -0
  5. package/dist/authoring/browser-authoring-panels.js.map +1 -0
  6. package/dist/authoring/browser-authoring-service.d.ts +42 -0
  7. package/dist/authoring/browser-authoring-service.d.ts.map +1 -0
  8. package/dist/authoring/browser-authoring-service.js +16 -0
  9. package/dist/authoring/browser-authoring-service.js.map +1 -0
  10. package/dist/authoring/harness-ids.d.ts +2 -0
  11. package/dist/authoring/harness-ids.d.ts.map +1 -0
  12. package/dist/authoring/harness-ids.js +2 -0
  13. package/dist/authoring/harness-ids.js.map +1 -0
  14. package/dist/create-ecp.d.ts +18 -0
  15. package/dist/create-ecp.d.ts.map +1 -0
  16. package/dist/create-ecp.js +24 -0
  17. package/dist/create-ecp.js.map +1 -0
  18. package/dist/environment.d.ts +24 -0
  19. package/dist/environment.d.ts.map +1 -0
  20. package/dist/environment.js +111 -0
  21. package/dist/environment.js.map +1 -0
  22. package/dist/extensions/browser-guide.d.ts +6 -0
  23. package/dist/extensions/browser-guide.d.ts.map +1 -0
  24. package/dist/extensions/browser-guide.js +99 -0
  25. package/dist/extensions/browser-guide.js.map +1 -0
  26. package/dist/extensions/browser-local-config.d.ts +5 -0
  27. package/dist/extensions/browser-local-config.d.ts.map +1 -0
  28. package/dist/extensions/browser-local-config.js +63 -0
  29. package/dist/extensions/browser-local-config.js.map +1 -0
  30. package/dist/extensions/browser-registry.d.ts +21 -0
  31. package/dist/extensions/browser-registry.d.ts.map +1 -0
  32. package/dist/extensions/browser-registry.js +109 -0
  33. package/dist/extensions/browser-registry.js.map +1 -0
  34. package/dist/extensions/browser-session-config.d.ts +19 -0
  35. package/dist/extensions/browser-session-config.d.ts.map +1 -0
  36. package/dist/extensions/browser-session-config.js +71 -0
  37. package/dist/extensions/browser-session-config.js.map +1 -0
  38. package/dist/index.d.ts +16 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +14 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/runtime/browser-executor.d.ts +8 -0
  43. package/dist/runtime/browser-executor.d.ts.map +1 -0
  44. package/dist/runtime/browser-executor.js +12 -0
  45. package/dist/runtime/browser-executor.js.map +1 -0
  46. package/dist/runtime/builtin-browser.d.ts +8 -0
  47. package/dist/runtime/builtin-browser.d.ts.map +1 -0
  48. package/dist/runtime/builtin-browser.js +21 -0
  49. package/dist/runtime/builtin-browser.js.map +1 -0
  50. package/dist/workflow-shim.d.ts +19 -0
  51. package/dist/workflow-shim.d.ts.map +1 -0
  52. package/dist/workflow-shim.js +18 -0
  53. package/dist/workflow-shim.js.map +1 -0
  54. package/package.json +44 -0
package/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # @executioncontrolprotocol/browser
2
+
3
+ **Browser runtime host** for ECP: in-browser executor, registry extensions, session/local config, and helpers to initialize `Ecp` in a web page.
4
+
5
+ This is **not** the browser demo application. UI, provider picker, layout, and demo-only persistence belong in the standalone [browser demo repo](https://github.com/GuillaumeCleme/executioncontrolprotocol-browser-demo).
6
+
7
+ ## What belongs here
8
+
9
+ | In `@executioncontrolprotocol/browser` | In the browser demo app (or your app) |
10
+ | ----------------- | ------------------------------------- |
11
+ | `@executioncontrolprotocol/browser` runtime executor | React/Vite shell, chat layout, panels |
12
+ | `@executioncontrolprotocol/browser-registry` (`globalThis.ecp`, freeze) | First-run modal, provider mode UI |
13
+ | `@executioncontrolprotocol/browser-session-config` (in-memory API keys) | `localStorage` for **provider choice** (not secrets) |
14
+ | `createEcp()`, `installBrowserWorkflowShim()` | Monaco, Mermaid viewer, CSS |
15
+ | `registerBrowserDefaults()` — registers extensions on the catalog | Which capability id to pass to authoring (e.g. `@executioncontrolprotocol/openai.generate`) |
16
+
17
+ **Do not add demo-app UI types here** (e.g. hardcoded `ProviderMode` unions, demo localStorage keys). Those stay in the demo app.
18
+
19
+ ## Reference bindings (optional)
20
+
21
+ These are **convenience** exports for the demo doc and tests, not requirements for every browser app:
22
+
23
+ - **`createBrowserDemoEnvironment()`** — pre-bound environment (browser runtime, format extensions, registry-control, session config). Your app can call `environment(id).withRuntime(...).withExtensions([...])` instead.
24
+ - **`BrowserAuthoringService`** — chat-driven create/patch orchestration on `Ecp`. The **caller** supplies `providerCapabilityId`; the service does not pick a provider mode.
25
+
26
+ ## Typical usage
27
+
28
+ ```ts
29
+ import { registerBrowserDefaults, environment, createEcp } from "@executioncontrolprotocol/browser"
30
+ import { workflow, step } from "@executioncontrolprotocol/core"
31
+
32
+ await registerBrowserDefaults()
33
+ const env = (await environment("my-app"))
34
+ .withExtensions([/* your bindings */])
35
+ const ecp = await createEcp(env, { exposeGlobal: true })
36
+
37
+ await ecp.run(workflow("Hello").run([step("@executioncontrolprotocol/chrome-ai.generate", "Summarize").with({ prompt: "hi" }).as("out")]).toManifest())
38
+ ```
39
+
40
+ ## Compile-on-edit in the browser
41
+
42
+ Use **`@executioncontrolprotocol/core/browser`** for `compileWorkflowSource` with `resolveImports: "browser-global"`, and call **`installBrowserWorkflowShim()`** before compile so Fluent source can use `@executioncontrolprotocol/browser` imports or the injected shim.
43
+
44
+ Fluent emission for browser panels uses `ecp.encode(manifest).as("fluent").with({ target: "browser", importFrom: "@executioncontrolprotocol/browser" })`.
45
+
46
+ **Compile-on-edit:** `compileWorkflowSource({ resolveImports: "browser-global" })` strips `@executioncontrolprotocol/browser` imports and injects `globalThis.__ecpWorkflowShim` (call `installBrowserWorkflowShim()` first). The import is for authoring ergonomics, not a real browser bundle dependency.
47
+
48
+ **Monaco:** the demo app registers ambient types for `@executioncontrolprotocol/browser` so the editor does not show TS2792; that is separate from the esbuild-wasm compile path.
49
+
50
+ ## Dependencies
51
+
52
+ `@executioncontrolprotocol/browser` depends on `@executioncontrolprotocol/core` only for runtime mechanics. Extension packages (`@executioncontrolprotocol/format-toon`, `@executioncontrolprotocol/chrome-ai`, `@executioncontrolprotocol/extension-fal`, `@executioncontrolprotocol/extension-image-sharp`, providers, etc.) are registered by `registerBrowserDefaults()` for the **reference** browser demo environment; production browser apps should register only what they need.
53
+
54
+ ## Tests
55
+
56
+ ```sh
57
+ npm run test:browser:install # once
58
+ npm run test:browser
59
+ ```
60
+
61
+ See [AGENTS.md](../../AGENTS.md) and the [browser demo repo](https://github.com/GuillaumeCleme/executioncontrolprotocol-browser-demo) for the full demo story (app + runtime).
@@ -0,0 +1,11 @@
1
+ import type { Ecp } from "@executioncontrolprotocol/core";
2
+ import type { WorkflowManifest } from "@executioncontrolprotocol/types";
3
+ import type { AuthoringPanels } from "./browser-authoring-service.js";
4
+ /** Minimal ECP surface for panel encoding. @category Authoring */
5
+ export type BrowserPanelsEcp = Pick<Ecp, "encode">;
6
+ /**
7
+ * Encode canonical workflow manifest into independent panel views.
8
+ * @category Authoring
9
+ */
10
+ export declare function encodeAuthoringPanels(ecp: BrowserPanelsEcp, manifest: WorkflowManifest, patchToon?: string): Promise<AuthoringPanels>;
11
+ //# sourceMappingURL=browser-authoring-panels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-authoring-panels.d.ts","sourceRoot":"","sources":["../../src/authoring/browser-authoring-panels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAA;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAErE,kEAAkE;AAClE,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;AAElD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,gBAAgB,EACrB,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,SAAK,GACb,OAAO,CAAC,eAAe,CAAC,CAoB1B"}
@@ -0,0 +1,25 @@
1
+ import { normalizeWorkflowManifest } from "@executioncontrolprotocol/core";
2
+ /**
3
+ * Encode canonical workflow manifest into independent panel views.
4
+ * @category Authoring
5
+ */
6
+ export async function encodeAuthoringPanels(ecp, manifest, patchToon = "") {
7
+ const canonical = normalizeWorkflowManifest(manifest);
8
+ const [fluent, toon, mermaid] = await Promise.all([
9
+ ecp
10
+ .encode(canonical)
11
+ .uses("@executioncontrolprotocol/format-fluent")
12
+ .with({ target: "browser", importFrom: "@executioncontrolprotocol/browser" })
13
+ .process(),
14
+ ecp.encode(canonical).uses("@executioncontrolprotocol/format-toon").with({ headers: false, compact: true }).process(),
15
+ ecp.encode(canonical).uses("@executioncontrolprotocol/format-mermaid").with({ direction: "LR" }).process(),
16
+ ]);
17
+ return {
18
+ fluent: String(fluent.result ?? ""),
19
+ json: JSON.stringify(canonical, null, 2),
20
+ toon: String(toon.result ?? ""),
21
+ mermaid: String(mermaid.result ?? ""),
22
+ patch: patchToon,
23
+ };
24
+ }
25
+ //# sourceMappingURL=browser-authoring-panels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-authoring-panels.js","sourceRoot":"","sources":["../../src/authoring/browser-authoring-panels.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAO1E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAqB,EACrB,QAA0B,EAC1B,SAAS,GAAG,EAAE;IAEd,MAAM,SAAS,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAA;IAErD,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChD,GAAG;aACA,MAAM,CAAC,SAAS,CAAC;aACjB,IAAI,CAAC,yCAAyC,CAAC;aAC/C,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,mCAAmC,EAAE,CAAC;aAC5E,OAAO,EAAE;QACZ,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;QACrH,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;KAC3G,CAAC,CAAA;IAEF,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QACnC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QACrC,KAAK,EAAE,SAAS;KACjB,CAAA;AACH,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { Ecp } from "@executioncontrolprotocol/core";
2
+ import type { ValidationResult, WorkflowManifest } from "@executioncontrolprotocol/types";
3
+ import { type BrowserPanelsEcp } from "./browser-authoring-panels.js";
4
+ /** UI-ready encoded panel outputs. @category Authoring */
5
+ export interface AuthoringPanels {
6
+ /** Fluent API source. */
7
+ fluent: string;
8
+ /** JSON manifest string. */
9
+ json: string;
10
+ /** Compact TOON workflow. */
11
+ toon: string;
12
+ /** Mermaid flowchart source. */
13
+ mermaid: string;
14
+ /** Latest patch TOON (empty when none). */
15
+ patch: string;
16
+ }
17
+ /** @deprecated Use harness invoke + {@link encodeAuthoringPanels}. @category Authoring */
18
+ export interface CreateWorkflowResult {
19
+ manifest: WorkflowManifest;
20
+ validation: ValidationResult;
21
+ panels: AuthoringPanels;
22
+ }
23
+ /** @deprecated Use harness invoke + {@link encodeAuthoringPanels}. @category Authoring */
24
+ export interface PatchWorkflowResult {
25
+ manifest: WorkflowManifest;
26
+ validation: ValidationResult;
27
+ panels: AuthoringPanels;
28
+ patchToon: string;
29
+ }
30
+ /**
31
+ * Panel encoding helper for the browser demo (workflow authoring uses harnesses).
32
+ * @category Authoring
33
+ */
34
+ export declare class BrowserAuthoringService {
35
+ private readonly ecp;
36
+ constructor(ecp: BrowserPanelsEcp);
37
+ /** Encode canonical workflow manifest into panel views. @category Authoring */
38
+ encodePanels(manifest: WorkflowManifest, patchToon?: string): Promise<AuthoringPanels>;
39
+ }
40
+ /** @category Authoring */
41
+ export type BrowserOperationalEcp = Ecp;
42
+ //# sourceMappingURL=browser-authoring-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-authoring-service.d.ts","sourceRoot":"","sources":["../../src/authoring/browser-authoring-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AACzF,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAE5F,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAA;CACd;AAED,0FAA0F;AAC1F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,0FAA0F;AAC1F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,eAAe,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,gBAAgB;IAElD,+EAA+E;IAC/E,YAAY,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,SAAK,GAAG,OAAO,CAAC,eAAe,CAAC;CAGnF;AAED,0BAA0B;AAC1B,MAAM,MAAM,qBAAqB,GAAG,GAAG,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { encodeAuthoringPanels } from "./browser-authoring-panels.js";
2
+ /**
3
+ * Panel encoding helper for the browser demo (workflow authoring uses harnesses).
4
+ * @category Authoring
5
+ */
6
+ export class BrowserAuthoringService {
7
+ ecp;
8
+ constructor(ecp) {
9
+ this.ecp = ecp;
10
+ }
11
+ /** Encode canonical workflow manifest into panel views. @category Authoring */
12
+ encodePanels(manifest, patchToon = "") {
13
+ return encodeAuthoringPanels(this.ecp, manifest, patchToon);
14
+ }
15
+ }
16
+ //# sourceMappingURL=browser-authoring-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-authoring-service.js","sourceRoot":"","sources":["../../src/authoring/browser-authoring-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAyB,MAAM,+BAA+B,CAAA;AA+B5F;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IACL;IAA7B,YAA6B,GAAqB;QAArB,QAAG,GAAH,GAAG,CAAkB;IAAG,CAAC;IAEtD,+EAA+E;IAC/E,YAAY,CAAC,QAA0B,EAAE,SAAS,GAAG,EAAE;QACrD,OAAO,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC7D,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export { BROWSER_NANO_HARNESS_CAPABILITY, BROWSER_NANO_HARNESS_ID, HARNESS_TASKS, BROWSER_NANO_HARNESS_CAPABILITY as WORKFLOW_AUTHORING_CAPABILITY, BROWSER_NANO_HARNESS_CAPABILITY as INTENT_CLASSIFICATION_CAPABILITY, } from "@executioncontrolprotocol/harnesses-browser-nano";
2
+ //# sourceMappingURL=harness-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-ids.d.ts","sourceRoot":"","sources":["../../src/authoring/harness-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,uBAAuB,EACvB,aAAa,EACb,+BAA+B,IAAI,6BAA6B,EAChE,+BAA+B,IAAI,gCAAgC,GACpE,MAAM,kDAAkD,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { BROWSER_NANO_HARNESS_CAPABILITY, BROWSER_NANO_HARNESS_ID, HARNESS_TASKS, BROWSER_NANO_HARNESS_CAPABILITY as WORKFLOW_AUTHORING_CAPABILITY, BROWSER_NANO_HARNESS_CAPABILITY as INTENT_CLASSIFICATION_CAPABILITY, } from "@executioncontrolprotocol/harnesses-browser-nano";
2
+ //# sourceMappingURL=harness-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-ids.js","sourceRoot":"","sources":["../../src/authoring/harness-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,uBAAuB,EACvB,aAAa,EACb,+BAA+B,IAAI,6BAA6B,EAChE,+BAA+B,IAAI,gCAAgC,GACpE,MAAM,kDAAkD,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { Ecp, Environment } from "@executioncontrolprotocol/core";
2
+ import { type BrowserEcpGlobal } from "./extensions/browser-registry.js";
3
+ /** Operational ECP with optional browser registry helpers on the global object. @category Environment */
4
+ export type BrowserOperationalEcp = Ecp & Partial<BrowserEcpGlobal>;
5
+ /** Options for {@link createEcp}. @category Environment */
6
+ export interface CreateEcpOptions {
7
+ /** Attach merged API to `globalThis` (default from browser-registry config). */
8
+ exposeGlobal?: boolean;
9
+ /** Global property name (default `ecp`). */
10
+ globalName?: string;
11
+ }
12
+ /**
13
+ * Initialize an operational {@link Ecp} instance and optionally expose it on `globalThis`.
14
+ * Registry helpers (`registerExtension`, `freezeRegistry`) are merged when browser-registry is bound.
15
+ * @category Environment
16
+ */
17
+ export declare function createEcp(env: Environment, options?: CreateEcpOptions): Promise<BrowserOperationalEcp>;
18
+ //# sourceMappingURL=create-ecp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-ecp.d.ts","sourceRoot":"","sources":["../src/create-ecp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAE/F,yGAAyG;AACzG,MAAM,MAAM,qBAAqB,GAAG,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;AAEnE,2DAA2D;AAC3D,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,WAAW,EAChB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,qBAAqB,CAAC,CAkBhC"}
@@ -0,0 +1,24 @@
1
+ import { exposeBrowserRegistry } from "./extensions/browser-registry.js";
2
+ /**
3
+ * Initialize an operational {@link Ecp} instance and optionally expose it on `globalThis`.
4
+ * Registry helpers (`registerExtension`, `freezeRegistry`) are merged when browser-registry is bound.
5
+ * @category Environment
6
+ */
7
+ export async function createEcp(env, options = {}) {
8
+ const ecp = await env.init();
9
+ const registryApi = exposeBrowserRegistry();
10
+ const merged = registryApi
11
+ ? Object.assign(ecp, {
12
+ registerExtension: registryApi.registerExtension.bind(registryApi),
13
+ freezeRegistry: registryApi.freezeRegistry.bind(registryApi),
14
+ isRegistryFrozen: registryApi.isRegistryFrozen.bind(registryApi),
15
+ getEnvironment: registryApi.getEnvironment.bind(registryApi),
16
+ })
17
+ : ecp;
18
+ if (options.exposeGlobal !== false && typeof globalThis !== "undefined") {
19
+ const globalName = options.globalName ?? "ecp";
20
+ globalThis[globalName] = merged;
21
+ }
22
+ return merged;
23
+ }
24
+ //# sourceMappingURL=create-ecp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-ecp.js","sourceRoot":"","sources":["../src/create-ecp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAyB,MAAM,kCAAkC,CAAA;AAa/F;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAgB,EAChB,UAA4B,EAAE;IAE9B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IAC5B,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAA;IAC3C,MAAM,MAAM,GAA0B,WAAW;QAC/C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YACjB,iBAAiB,EAAE,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;YAClE,cAAc,EAAE,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;YAC5D,gBAAgB,EAAE,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC;YAChE,cAAc,EAAE,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;SAC7D,CAAC;QACJ,CAAC,CAAC,GAAG,CAAA;IAEP,IAAI,OAAO,CAAC,YAAY,KAAK,KAAK,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACxE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAC7C;QAAC,UAAsC,CAAC,UAAU,CAAC,GAAG,MAAM,CAAA;IAC/D,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { Registry } from "@executioncontrolprotocol/core";
2
+ import type { Environment } from "@executioncontrolprotocol/core";
3
+ import "@executioncontrolprotocol/format-eql";
4
+ import "@executioncontrolprotocol/format-toon";
5
+ import "@executioncontrolprotocol/format-mermaid";
6
+ import "@executioncontrolprotocol/chrome-ai";
7
+ import "@executioncontrolprotocol/extension-openai";
8
+ import "@executioncontrolprotocol/claude";
9
+ import "@executioncontrolprotocol/browser-secrets";
10
+ import "@executioncontrolprotocol/extension-fal";
11
+ import "@executioncontrolprotocol/extension-image-sharp";
12
+ /** Register browser runtime and standard browser extensions. */
13
+ export declare function registerBrowserDefaults(registry?: Registry): Promise<void>;
14
+ /**
15
+ * Browser demo environment with registry-control and browser-registry defaults.
16
+ * @category Environment
17
+ */
18
+ export declare function createBrowserDemoEnvironment(id: string, label?: string, registry?: Registry): Environment;
19
+ /**
20
+ * Create a browser environment with `@executioncontrolprotocol/browser` runtime pre-bound.
21
+ * @category Environment
22
+ */
23
+ export declare function environment(id: string, label?: string): Promise<Environment>;
24
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,QAAQ,EAET,MAAM,gCAAgC,CAAA;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAqBjE,OAAO,sCAAsC,CAAA;AAC7C,OAAO,uCAAuC,CAAA;AAC9C,OAAO,0CAA0C,CAAA;AACjD,OAAO,qCAAqC,CAAA;AAC5C,OAAO,4CAA4C,CAAA;AACnD,OAAO,kCAAkC,CAAA;AACzC,OAAO,2CAA2C,CAAA;AAClD,OAAO,yCAAyC,CAAA;AAChD,OAAO,iDAAiD,CAAA;AAExD,gEAAgE;AAChE,wBAAsB,uBAAuB,CAAC,QAAQ,GAAE,QAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhG;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,GAAE,QAAyB,GAClC,WAAW,CAoDb;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAGlF"}
@@ -0,0 +1,111 @@
1
+ import { environment as coreEnvironment, extension, harness, runtime, policy, browser, globalRegistry, } from "@executioncontrolprotocol/core";
2
+ import { registerStandardPolicies } from "@executioncontrolprotocol/policies";
3
+ import { BROWSER_RUNTIME_ID, registerBrowserRuntime } from "./runtime/builtin-browser.js";
4
+ import { registerBrowserRegistryExtension } from "./extensions/browser-registry.js";
5
+ import { registerBrowserSessionConfigExtension } from "./extensions/browser-session-config.js";
6
+ import { registerBrowserLocalConfigExtension } from "./extensions/browser-local-config.js";
7
+ import { registerBrowserGuideExtension } from "./extensions/browser-guide.js";
8
+ import { registerFormatEqlExtension } from "@executioncontrolprotocol/format-eql";
9
+ import { registerFormatToonExtension } from "@executioncontrolprotocol/format-toon";
10
+ import { registerFormatMermaidExtension } from "@executioncontrolprotocol/format-mermaid";
11
+ import { registerChromeAiExtension } from "@executioncontrolprotocol/chrome-ai";
12
+ import { registerOpenaiExtension } from "@executioncontrolprotocol/extension-openai";
13
+ import { registerClaudeExtension } from "@executioncontrolprotocol/claude";
14
+ import { registerBrowserSecretsExtension } from "@executioncontrolprotocol/browser-secrets";
15
+ import { registerFalExtension } from "@executioncontrolprotocol/extension-fal";
16
+ import { registerImageSharpExtension } from "@executioncontrolprotocol/extension-image-sharp";
17
+ import { BROWSER_NANO_HARNESS_ID, HARNESS_NANO_BINDING, registerBrowserNanoHarnesses, } from "@executioncontrolprotocol/harnesses-browser-nano";
18
+ import "@executioncontrolprotocol/format-eql";
19
+ import "@executioncontrolprotocol/format-toon";
20
+ import "@executioncontrolprotocol/format-mermaid";
21
+ import "@executioncontrolprotocol/chrome-ai";
22
+ import "@executioncontrolprotocol/extension-openai";
23
+ import "@executioncontrolprotocol/claude";
24
+ import "@executioncontrolprotocol/browser-secrets";
25
+ import "@executioncontrolprotocol/extension-fal";
26
+ import "@executioncontrolprotocol/extension-image-sharp";
27
+ /** Register browser runtime and standard browser extensions. */
28
+ export async function registerBrowserDefaults(registry = globalRegistry) {
29
+ await registerBrowserRuntime(registry);
30
+ await registerBrowserRegistryExtension(registry);
31
+ await registerBrowserSessionConfigExtension(registry);
32
+ await registerBrowserLocalConfigExtension(registry);
33
+ await registerBrowserGuideExtension(registry);
34
+ await registerFormatEqlExtension(registry);
35
+ await registerFormatToonExtension(registry);
36
+ await registerFormatMermaidExtension(registry);
37
+ await registerChromeAiExtension(registry);
38
+ await registerOpenaiExtension(registry);
39
+ await registerClaudeExtension(registry);
40
+ await registerBrowserSecretsExtension(registry);
41
+ await registerFalExtension(registry);
42
+ await registerImageSharpExtension(registry);
43
+ await registerStandardPolicies(registry);
44
+ registerBrowserNanoHarnesses();
45
+ }
46
+ /**
47
+ * Browser demo environment with registry-control and browser-registry defaults.
48
+ * @category Environment
49
+ */
50
+ export function createBrowserDemoEnvironment(id, label, registry = globalRegistry) {
51
+ return coreEnvironment(id, label, registry)
52
+ .withRuntime(runtime(BROWSER_RUNTIME_ID, "Browser Runtime"))
53
+ .withExtensions([
54
+ extension("@executioncontrolprotocol/format-eql").with({}),
55
+ extension("@executioncontrolprotocol/format-toon").with({}),
56
+ extension("@executioncontrolprotocol/format-mermaid").with({}),
57
+ extension("@executioncontrolprotocol/format-json").with({}),
58
+ extension("@executioncontrolprotocol/chrome-ai").with({}),
59
+ extension("@executioncontrolprotocol/browser-secrets").with({}),
60
+ extension("@executioncontrolprotocol/openai").with({
61
+ apiKey: browser("OPENAI_API_KEY", { optional: true }),
62
+ }),
63
+ extension("@executioncontrolprotocol/claude").with({
64
+ apiKey: browser("ANTHROPIC_API_KEY", { optional: true }),
65
+ }),
66
+ extension("@executioncontrolprotocol/fal").with({
67
+ apiKey: browser("FAL_KEY", { optional: true }),
68
+ defaultMode: "subscribe",
69
+ }),
70
+ extension("@executioncontrolprotocol/image-sharp").with({}),
71
+ extension("@executioncontrolprotocol/browser-registry").with({
72
+ freezeOn: "environment:beforeRun",
73
+ autoBindRegisteredExtensions: true,
74
+ exposeGlobal: true,
75
+ globalName: "ecp",
76
+ }),
77
+ extension("@executioncontrolprotocol/browser-session-config").with({ persist: false }),
78
+ extension("@executioncontrolprotocol/browser-local-config").with({}),
79
+ extension("@executioncontrolprotocol/browser").with({}),
80
+ ])
81
+ .withHarnesses([
82
+ harness(BROWSER_NANO_HARNESS_ID, "Harness")
83
+ .uses("@executioncontrolprotocol/chrome-ai.generate")
84
+ .with({ ...HARNESS_NANO_BINDING }),
85
+ ])
86
+ .withPolicies([
87
+ policy("@executioncontrolprotocol/registry-control").with({
88
+ allowedExtensionNamespaces: [
89
+ "@executioncontrolprotocol/chrome-ai",
90
+ "@executioncontrolprotocol/openai",
91
+ "@executioncontrolprotocol/claude",
92
+ "@executioncontrolprotocol/fal",
93
+ "@executioncontrolprotocol/image-sharp",
94
+ "@executioncontrolprotocol/browser",
95
+ "@customer/*",
96
+ ],
97
+ deniedExtensionNamespaces: [],
98
+ allowDynamicExtensionRegistration: true,
99
+ allowAutoBind: true,
100
+ }),
101
+ ]);
102
+ }
103
+ /**
104
+ * Create a browser environment with `@executioncontrolprotocol/browser` runtime pre-bound.
105
+ * @category Environment
106
+ */
107
+ export async function environment(id, label) {
108
+ await registerBrowserDefaults();
109
+ return createBrowserDemoEnvironment(id, label);
110
+ }
111
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type Registry } from "@executioncontrolprotocol/core";
2
+ /** Browser guided onboarding chat (no external model). @category Extensions */
3
+ export declare const browserGuideExtension: import("@executioncontrolprotocol/core").ExtensionDefinition;
4
+ /** Register browser guide extension. @category Extensions */
5
+ export declare function registerBrowserGuideExtension(registry?: Registry): Promise<void>;
6
+ //# sourceMappingURL=browser-guide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-guide.d.ts","sourceRoot":"","sources":["../../src/extensions/browser-guide.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,gCAAgC,CAAA;AA+FvC,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,8DAUxB,CAAA;AAIV,6DAA6D;AAC7D,wBAAsB,6BAA6B,CAAC,QAAQ,GAAE,QAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAItG"}
@@ -0,0 +1,99 @@
1
+ import { catalogExtension, capabilityFor, defineExtension, globalRegistry, } from "@executioncontrolprotocol/core";
2
+ import { z } from "zod";
3
+ const GuideChatInput = z.object({
4
+ message: z.string(),
5
+ });
6
+ const GuideChatOutput = z.object({
7
+ text: z.string(),
8
+ });
9
+ function guideReply(message) {
10
+ const lower = message.toLowerCase();
11
+ if (lower.includes("create") &&
12
+ (lower.includes("workflow") || lower.includes("echo") || lower.includes("build"))) {
13
+ return [
14
+ "To generate a workflow in the editor, switch to authoring mode or ask explicitly, for example:",
15
+ '"Create a demo echo workflow."',
16
+ "That will produce Fluent source, a Mermaid graph, and validation results in the panels.",
17
+ ].join(" ");
18
+ }
19
+ if (/what is ecp|execution control protocol/.test(lower)) {
20
+ return [
21
+ "ECP is the Execution Control Protocol: portable workflows run in governed environments",
22
+ "that bind tools, models, policies, and runtimes alongside MCP tool calling.",
23
+ ].join(" ");
24
+ }
25
+ if (/what can you do|what are you|who are you|help me|introduce/.test(lower)) {
26
+ return [
27
+ "I help you build and patch ECP workflows in this editor, explain ECP concepts,",
28
+ "and describe capabilities registered in this environment (for example @executioncontrolprotocol/chrome-ai.generate, @executioncontrolprotocol/fal.generate, and @executioncontrolprotocol/image-sharp.transform).",
29
+ "Ask about workflows, the environment panel, validation, or Chrome AI.",
30
+ 'To generate a workflow, try: "Create a demo echo workflow."',
31
+ ].join(" ");
32
+ }
33
+ if (lower.includes("workflow") || lower.includes("fluent") || lower.includes("step")) {
34
+ return [
35
+ "Workflows in ECP are built from steps bound to capabilities.",
36
+ "The left **Workflow** tab shows Fluent API source; edits compile into a manifest.",
37
+ "The right canvas shows a Mermaid graph of the same workflow.",
38
+ "Try: create a demo echo workflow, then open the Code sidebar to explore Fluent, JSON, and TOON.",
39
+ ].join(" ");
40
+ }
41
+ if (lower.includes("environment") || lower.includes("extension") || lower.includes("capabilit")) {
42
+ return [
43
+ "The **Environment** tab lists extensions bound to this session (for example @executioncontrolprotocol/chrome-ai).",
44
+ "Capabilities come from those bindings and appear in describe() output.",
45
+ "The demo binds @executioncontrolprotocol/chrome-ai, @executioncontrolprotocol/fal, and @executioncontrolprotocol/image-sharp for workflow steps (FAL generates images; image-sharp inspects and transforms when running on Node).",
46
+ ].join(" ");
47
+ }
48
+ if (lower.includes("mermaid") || lower.includes("graph") || lower.includes("diagram")) {
49
+ return [
50
+ "The graph panel renders Mermaid from your workflow manifest via @executioncontrolprotocol/format-mermaid.",
51
+ "It updates when you chat-generate a workflow or edit Fluent source.",
52
+ ].join(" ");
53
+ }
54
+ if (lower.includes("valid")) {
55
+ return [
56
+ "Use the **Validation** item in the top bar to see schema and binding diagnostics.",
57
+ "Invalid workflows still appear in the editor so you can fix them.",
58
+ ].join(" ");
59
+ }
60
+ if (lower.includes("run") || lower.includes("execut")) {
61
+ return [
62
+ "Click **Execute** in the top bar to run the current workflow against bound capabilities.",
63
+ "Run output appears in the Run output overlay.",
64
+ ].join(" ");
65
+ }
66
+ if (lower.includes("chrome") || lower.includes("model") || lower.includes("ai")) {
67
+ return [
68
+ "Chrome built-in AI (Gemini Nano) runs on-device after a one-time download.",
69
+ "Choose it in provider settings; a toast shows install progress while you explore.",
70
+ "Until it is ready, I can answer questions in this guided mode using offline help text.",
71
+ ].join(" ");
72
+ }
73
+ return [
74
+ "Welcome to the ECP Graph Editor.",
75
+ "I can explain workflows, the environment, validation, Mermaid graphs, and Chrome AI.",
76
+ "Ask what I can do, what ECP is, or how to run a workflow.",
77
+ 'To generate a workflow, say: "Create a demo echo workflow."',
78
+ ].join(" ");
79
+ }
80
+ /** Browser guided onboarding chat (no external model). @category Extensions */
81
+ export const browserGuideExtension = defineExtension("@executioncontrolprotocol", "browser")
82
+ .withCapabilities([
83
+ capabilityFor("@executioncontrolprotocol/browser", "guideChat")
84
+ .withInput(GuideChatInput)
85
+ .withOutput(GuideChatOutput)
86
+ .withHandler(async (raw) => {
87
+ const input = raw;
88
+ return { text: guideReply(input.message) };
89
+ }),
90
+ ])
91
+ .build();
92
+ catalogExtension(browserGuideExtension);
93
+ /** Register browser guide extension. @category Extensions */
94
+ export async function registerBrowserGuideExtension(registry = globalRegistry) {
95
+ if (!registry.getExtension("@executioncontrolprotocol/browser")) {
96
+ await registry.registerExtension(browserGuideExtension);
97
+ }
98
+ }
99
+ //# sourceMappingURL=browser-guide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-guide.js","sourceRoot":"","sources":["../../src/extensions/browser-guide.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Browser localStorage config extension (non-secret keys only). @category Extensions */
2
+ export declare const browserLocalConfigExtension: import("@executioncontrolprotocol/core").ExtensionDefinition;
3
+ /** Register `@executioncontrolprotocol/browser-local-config`. */
4
+ export declare function registerBrowserLocalConfigExtension(registry?: import("@executioncontrolprotocol/core").Registry): Promise<void>;
5
+ //# sourceMappingURL=browser-local-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-local-config.d.ts","sourceRoot":"","sources":["../../src/extensions/browser-local-config.ts"],"names":[],"mappings":"AAsDA,yFAAyF;AACzF,eAAO,MAAM,2BAA2B,8DAO9B,CAAA;AAEV,iEAAiE;AACjE,wBAAsB,mCAAmC,CACvD,QAAQ,oDAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -0,0 +1,63 @@
1
+ import { defineExtension, hook, globalRegistry, } from "@executioncontrolprotocol/core";
2
+ import { z } from "zod";
3
+ const EXT_ID = "@executioncontrolprotocol/browser-local-config";
4
+ const DEFAULT_DENIED = [
5
+ "OPENAI_API_KEY",
6
+ "ANTHROPIC_API_KEY",
7
+ "SLACK_BOT_TOKEN",
8
+ "TOKEN",
9
+ "SECRET",
10
+ "PASSWORD",
11
+ ];
12
+ function isDeniedKey(name, denied) {
13
+ const u = name.toUpperCase();
14
+ return denied.some((d) => u.includes(d.toUpperCase()));
15
+ }
16
+ function attachLocalConfigResolver(ctx) {
17
+ const host = ctx.environment;
18
+ if (!host)
19
+ return;
20
+ const cfg = ctx
21
+ .extensionConfig ?? {};
22
+ const prefix = cfg.prefix ?? "ecp:";
23
+ const allowed = cfg.allowedKeys ?? [];
24
+ const denied = cfg.deniedKeys ?? DEFAULT_DENIED;
25
+ const resolver = {
26
+ id: EXT_ID,
27
+ resolve(name) {
28
+ if (isDeniedKey(name, denied)) {
29
+ return undefined;
30
+ }
31
+ if (!allowed.includes(name))
32
+ return undefined;
33
+ if (typeof localStorage === "undefined")
34
+ return undefined;
35
+ const raw = localStorage.getItem(`${prefix}${name}`);
36
+ if (raw === null)
37
+ return undefined;
38
+ try {
39
+ return JSON.parse(raw);
40
+ }
41
+ catch {
42
+ return raw;
43
+ }
44
+ },
45
+ };
46
+ host.registerConfigResolver(resolver);
47
+ }
48
+ /** Browser localStorage config extension (non-secret keys only). @category Extensions */
49
+ export const browserLocalConfigExtension = defineExtension("@executioncontrolprotocol", "browser-local-config")
50
+ .withConfig({
51
+ prefix: z.string().default("ecp:"),
52
+ allowedKeys: z.array(z.string()).default([]),
53
+ deniedKeys: z.array(z.string()).default(DEFAULT_DENIED),
54
+ })
55
+ .withHooks([hook("environment:configuring", attachLocalConfigResolver)])
56
+ .build();
57
+ /** Register `@executioncontrolprotocol/browser-local-config`. */
58
+ export async function registerBrowserLocalConfigExtension(registry = globalRegistry) {
59
+ if (!registry.getExtension(EXT_ID)) {
60
+ await registry.registerExtension(browserLocalConfigExtension);
61
+ }
62
+ }
63
+ //# sourceMappingURL=browser-local-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-local-config.js","sourceRoot":"","sources":["../../src/extensions/browser-local-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,IAAI,EACJ,cAAc,GAGf,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,MAAM,GAAG,gDAAgD,CAAA;AAE/D,MAAM,cAAc,GAAG;IACrB,gBAAgB;IAChB,mBAAmB;IACnB,iBAAiB;IACjB,OAAO;IACP,QAAQ;IACR,UAAU;CACX,CAAA;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,MAAgB;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;AACxD,CAAC;AAED,SAAS,yBAAyB,CAAC,GAAqB;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAA;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAM;IACjB,MAAM,GAAG,GAAI,GAAwE;SAClF,eAAe,IAAI,EAAE,CAAA;IACxB,MAAM,MAAM,GAAI,GAAG,CAAC,MAA6B,IAAI,MAAM,CAAA;IAC3D,MAAM,OAAO,GAAI,GAAG,CAAC,WAAoC,IAAI,EAAE,CAAA;IAC/D,MAAM,MAAM,GAAI,GAAG,CAAC,UAAmC,IAAI,cAAc,CAAA;IAEzE,MAAM,QAAQ,GAA8B;QAC1C,EAAE,EAAE,MAAM;QACV,OAAO,CAAC,IAAY;YAClB,IAAI,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC9B,OAAO,SAAS,CAAA;YAClB,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAA;YAC7C,IAAI,OAAO,YAAY,KAAK,WAAW;gBAAE,OAAO,SAAS,CAAA;YACzD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAA;YACpD,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,SAAS,CAAA;YAClC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAA;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,CAAA;YACZ,CAAC;QACH,CAAC;KACF,CAAA;IACD,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAA;AACvC,CAAC;AAED,yFAAyF;AACzF,MAAM,CAAC,MAAM,2BAA2B,GAAG,eAAe,CAAC,2BAA2B,EAAE,sBAAsB,CAAC;KAC5G,UAAU,CAAC;IACV,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAClC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;CACxD,CAAC;KACD,SAAS,CAAC,CAAC,IAAI,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,CAAC,CAAC;KACvE,KAAK,EAAE,CAAA;AAEV,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,QAAQ,GAAG,cAAc;IAEzB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,CAAC,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type Environment, type EnvironmentLifecycleHost, type ExtensionDefinition } from "@executioncontrolprotocol/core";
2
+ /** Browser global registration surface. @category Extensions */
3
+ export interface BrowserEcpGlobal {
4
+ /** Active environment when browser-registry is configured. */
5
+ getEnvironment(): Environment | undefined;
6
+ /** Register an extension definition (policy-governed). */
7
+ registerExtension(def: ExtensionDefinition): Promise<void>;
8
+ /** Freeze the environment registry. */
9
+ freezeRegistry(reason?: string): void;
10
+ /** Whether the registry rejects new registrations. */
11
+ isRegistryFrozen(): boolean;
12
+ }
13
+ /** Expose browser global registry API when configured. */
14
+ export declare function exposeBrowserRegistry(): BrowserEcpGlobal | undefined;
15
+ /** Hook-only dynamic registry extension for browser. @category Extensions */
16
+ export declare const browserRegistryExtension: ExtensionDefinition;
17
+ /** Register `@executioncontrolprotocol/browser-registry`. */
18
+ export declare function registerBrowserRegistryExtension(registry?: import("@executioncontrolprotocol/core").Registry): Promise<void>;
19
+ /** Active environment host when registry extension is attached. */
20
+ export declare function getActiveBrowserEnvironmentHost(): EnvironmentLifecycleHost | undefined;
21
+ //# sourceMappingURL=browser-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-registry.d.ts","sourceRoot":"","sources":["../../src/extensions/browser-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAEzB,MAAM,gCAAgC,CAAA;AAMvC,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,cAAc,IAAI,WAAW,GAAG,SAAS,CAAA;IACzC,0DAA0D;IAC1D,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1D,uCAAuC;IACvC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,sDAAsD;IACtD,gBAAgB,IAAI,OAAO,CAAA;CAC5B;AAsFD,0DAA0D;AAC1D,wBAAgB,qBAAqB,IAAI,gBAAgB,GAAG,SAAS,CAEpE;AAED,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,qBAc3B,CAAA;AAEV,6DAA6D;AAC7D,wBAAsB,gCAAgC,CAAC,QAAQ,oDAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/F;AAED,mEAAmE;AACnE,wBAAgB,+BAA+B,IAAI,wBAAwB,GAAG,SAAS,CAEtF"}
@@ -0,0 +1,109 @@
1
+ import { defineExtension, hook, globalRegistry, RegistryRegistrationDeniedError, } from "@executioncontrolprotocol/core";
2
+ import { z } from "zod";
3
+ const EXT_ID = "@executioncontrolprotocol/browser-registry";
4
+ let activeHost;
5
+ let globalApi;
6
+ let attachedGlobalName;
7
+ function getExtensionConfig(ctx) {
8
+ return ctx
9
+ .extensionConfig ?? {};
10
+ }
11
+ function attachBrowserRegistry(ctx) {
12
+ const host = ctx.environment;
13
+ if (!host?.evaluateRegistryRegistration)
14
+ return;
15
+ activeHost = host;
16
+ const cfg = getExtensionConfig(ctx);
17
+ const registry = host.getRegistry();
18
+ const allowReg = cfg.allowRuntimeRegistration !== false;
19
+ registry.setRegistrationGuard(async (request) => {
20
+ if (request.kind !== "extension") {
21
+ throw new RegistryRegistrationDeniedError(request.id, "Dynamic policy/runtime registration is not allowed");
22
+ }
23
+ if (!allowReg) {
24
+ throw new Error("Runtime registration disabled");
25
+ }
26
+ await host.evaluateRegistryRegistration({
27
+ ...request,
28
+ autoBindRequested: cfg.autoBindRegisteredExtensions === true,
29
+ });
30
+ });
31
+ if (cfg.exposeGlobal === true && typeof globalThis !== "undefined") {
32
+ const globalName = cfg.globalName ?? "ecp";
33
+ const env = host;
34
+ const api = {
35
+ getEnvironment: () => env,
36
+ async registerExtension(def) {
37
+ if (!allowReg)
38
+ throw new Error("Runtime registration disabled");
39
+ await registry.registerExtension(def, {
40
+ source: { type: "browser-global" },
41
+ autoBindRequested: cfg.autoBindRegisteredExtensions === true,
42
+ });
43
+ if (cfg.autoBindRegisteredExtensions === true) {
44
+ env.addExtensionBinding(def.id, {});
45
+ }
46
+ },
47
+ freezeRegistry: (r) => registry.freeze(r),
48
+ isRegistryFrozen: () => registry.isFrozen(),
49
+ };
50
+ globalApi = api;
51
+ attachedGlobalName = globalName;
52
+ globalThis[globalName] = api;
53
+ }
54
+ }
55
+ function maybeFreezeOn(ctx, hook) {
56
+ const cfg = getExtensionConfig(ctx);
57
+ const registry = ctx.environment?.getRegistry();
58
+ if (!registry || registry.isFrozen())
59
+ return;
60
+ if (cfg.freezeOn === hook) {
61
+ registry.freeze(hook);
62
+ }
63
+ }
64
+ function detachBrowserRegistry(ctx) {
65
+ const cfg = getExtensionConfig(ctx);
66
+ if (cfg.exposeGlobal === true &&
67
+ attachedGlobalName &&
68
+ typeof globalThis !== "undefined") {
69
+ const g = globalThis;
70
+ if (g[attachedGlobalName] === globalApi) {
71
+ delete g[attachedGlobalName];
72
+ }
73
+ }
74
+ ctx.environment?.getRegistry().setRegistrationGuard(undefined);
75
+ activeHost = undefined;
76
+ globalApi = undefined;
77
+ attachedGlobalName = undefined;
78
+ }
79
+ /** Expose browser global registry API when configured. */
80
+ export function exposeBrowserRegistry() {
81
+ return globalApi;
82
+ }
83
+ /** Hook-only dynamic registry extension for browser. @category Extensions */
84
+ export const browserRegistryExtension = defineExtension("@executioncontrolprotocol", "browser-registry")
85
+ .withConfig({
86
+ freezeOn: z.string().default("environment:beforeRun"),
87
+ allowRuntimeRegistration: z.boolean().default(true),
88
+ autoBindRegisteredExtensions: z.boolean().default(false),
89
+ exposeGlobal: z.boolean().default(false),
90
+ globalName: z.string().default("ecp"),
91
+ })
92
+ .withHooks([
93
+ hook("environment:configuring", attachBrowserRegistry),
94
+ hook("environment:ready", (ctx) => maybeFreezeOn(ctx, "environment:ready")),
95
+ hook("environment:beforeRun", (ctx) => maybeFreezeOn(ctx, "environment:beforeRun")),
96
+ hook("environment:terminate", detachBrowserRegistry),
97
+ ])
98
+ .build();
99
+ /** Register `@executioncontrolprotocol/browser-registry`. */
100
+ export async function registerBrowserRegistryExtension(registry = globalRegistry) {
101
+ if (!registry.getExtension(EXT_ID)) {
102
+ await registry.registerExtension(browserRegistryExtension);
103
+ }
104
+ }
105
+ /** Active environment host when registry extension is attached. */
106
+ export function getActiveBrowserEnvironmentHost() {
107
+ return activeHost;
108
+ }
109
+ //# sourceMappingURL=browser-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-registry.js","sourceRoot":"","sources":["../../src/extensions/browser-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** In-memory session config controller. @category Extensions */
2
+ export interface BrowserSessionConfigController {
3
+ set(name: string, value: unknown): void;
4
+ get(name: string): unknown;
5
+ has(name: string): boolean;
6
+ delete(name: string): void;
7
+ clear(): void;
8
+ }
9
+ /** Create a session config controller (tests / host apps). */
10
+ export declare function createBrowserSessionConfig(): BrowserSessionConfigController;
11
+ /** Set session value for active environments using default store. */
12
+ export declare function setBrowserSessionValue(name: string, value: unknown): void;
13
+ /** Read session value from default store (tests / host apps). */
14
+ export declare function getBrowserSessionValue(name: string): unknown;
15
+ /** Browser session-only config extension. @category Extensions */
16
+ export declare const browserSessionConfigExtension: import("@executioncontrolprotocol/core").ExtensionDefinition;
17
+ /** Register `@executioncontrolprotocol/browser-session-config`. */
18
+ export declare function registerBrowserSessionConfigExtension(registry?: import("@executioncontrolprotocol/core").Registry): Promise<void>;
19
+ //# sourceMappingURL=browser-session-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session-config.d.ts","sourceRoot":"","sources":["../../src/extensions/browser-session-config.ts"],"names":[],"mappings":"AAaA,gEAAgE;AAChE,MAAM,WAAW,8BAA8B;IAC7C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IACvC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,KAAK,IAAI,IAAI,CAAA;CACd;AAED,8DAA8D;AAC9D,wBAAgB,0BAA0B,IAAI,8BAA8B,CAS3E;AAoCD,qEAAqE;AACrE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAEzE;AAED,iEAAiE;AACjE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,kEAAkE;AAClE,eAAO,MAAM,6BAA6B,8DAShC,CAAA;AAEV,mEAAmE;AACnE,wBAAsB,qCAAqC,CACzD,QAAQ,oDAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -0,0 +1,71 @@
1
+ import { defineExtension, hook, globalRegistry, } from "@executioncontrolprotocol/core";
2
+ import { z } from "zod";
3
+ const EXT_ID = "@executioncontrolprotocol/browser-session-config";
4
+ const sessionValues = new Map();
5
+ /** Create a session config controller (tests / host apps). */
6
+ export function createBrowserSessionConfig() {
7
+ const local = new Map();
8
+ return {
9
+ set: (n, v) => local.set(n, v),
10
+ get: (n) => local.get(n),
11
+ has: (n) => local.has(n),
12
+ delete: (n) => local.delete(n),
13
+ clear: () => local.clear(),
14
+ };
15
+ }
16
+ function attachSessionResolver(ctx) {
17
+ const host = ctx.environment;
18
+ if (!host)
19
+ return;
20
+ const cfg = ctx
21
+ .extensionConfig ?? {};
22
+ if (cfg.persist === true) {
23
+ throw new Error("browser-session-config persist:true is not supported");
24
+ }
25
+ const allowSecrets = cfg.allowSecrets !== false;
26
+ const resolver = {
27
+ id: EXT_ID,
28
+ resolve(name) {
29
+ if (!allowSecrets && looksSecret(name))
30
+ return undefined;
31
+ return sessionValues.get(name);
32
+ },
33
+ };
34
+ host.registerConfigResolver(resolver);
35
+ }
36
+ function clearSession(_ctx) {
37
+ sessionValues.clear();
38
+ }
39
+ function looksSecret(name) {
40
+ const u = name.toUpperCase();
41
+ return (u.includes("SECRET") ||
42
+ u.includes("TOKEN") ||
43
+ u.includes("PASSWORD") ||
44
+ u.includes("API_KEY"));
45
+ }
46
+ /** Set session value for active environments using default store. */
47
+ export function setBrowserSessionValue(name, value) {
48
+ sessionValues.set(name, value);
49
+ }
50
+ /** Read session value from default store (tests / host apps). */
51
+ export function getBrowserSessionValue(name) {
52
+ return sessionValues.get(name);
53
+ }
54
+ /** Browser session-only config extension. @category Extensions */
55
+ export const browserSessionConfigExtension = defineExtension("@executioncontrolprotocol", "browser-session-config")
56
+ .withConfig({
57
+ allowSecrets: z.boolean().default(true),
58
+ persist: z.boolean().default(false),
59
+ })
60
+ .withHooks([
61
+ hook("environment:configuring", attachSessionResolver),
62
+ hook("environment:terminate", clearSession),
63
+ ])
64
+ .build();
65
+ /** Register `@executioncontrolprotocol/browser-session-config`. */
66
+ export async function registerBrowserSessionConfigExtension(registry = globalRegistry) {
67
+ if (!registry.getExtension(EXT_ID)) {
68
+ await registry.registerExtension(browserSessionConfigExtension);
69
+ }
70
+ }
71
+ //# sourceMappingURL=browser-session-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session-config.js","sourceRoot":"","sources":["../../src/extensions/browser-session-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,IAAI,EACJ,cAAc,GAGf,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,MAAM,GAAG,kDAAkD,CAAA;AAEjE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAmB,CAAA;AAWhD,8DAA8D;AAC9D,MAAM,UAAU,0BAA0B;IACxC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAA;IACxC,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9B,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9B,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE;KAC3B,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAqB;IAClD,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAA;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAM;IACjB,MAAM,GAAG,GAAI,GAAwE;SAClF,eAAe,IAAI,EAAE,CAAA;IACxB,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IACzE,CAAC;IACD,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,KAAK,KAAK,CAAA;IAE/C,MAAM,QAAQ,GAA8B;QAC1C,EAAE,EAAE,MAAM;QACV,OAAO,CAAC,IAAY;YAClB,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAA;YACxD,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;KACF,CAAA;IACD,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAA;AACvC,CAAC;AAED,SAAS,YAAY,CAAC,IAAsB;IAC1C,aAAa,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IAC5B,OAAO,CACL,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACpB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QACtB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CACtB,CAAA;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,KAAc;IACjE,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AAChC,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,MAAM,6BAA6B,GAAG,eAAe,CAAC,2BAA2B,EAAE,wBAAwB,CAAC;KAChH,UAAU,CAAC;IACV,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACpC,CAAC;KACD,SAAS,CAAC;IACT,IAAI,CAAC,yBAAyB,EAAE,qBAAqB,CAAC;IACtD,IAAI,CAAC,uBAAuB,EAAE,YAAY,CAAC;CAC5C,CAAC;KACD,KAAK,EAAE,CAAA;AAEV,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,qCAAqC,CACzD,QAAQ,GAAG,cAAc;IAEzB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,CAAC,iBAAiB,CAAC,6BAA6B,CAAC,CAAA;IACjE,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ export { BROWSER_RUNTIME_ID, browserRuntimeDefinition, BrowserRuntimeExecutor, registerBrowserRuntime, } from "./runtime/builtin-browser.js";
2
+ export { browserRegistryExtension, registerBrowserRegistryExtension, exposeBrowserRegistry, getActiveBrowserEnvironmentHost, } from "./extensions/browser-registry.js";
3
+ export { browserSessionConfigExtension, registerBrowserSessionConfigExtension, createBrowserSessionConfig, setBrowserSessionValue, type BrowserSessionConfigController, } from "./extensions/browser-session-config.js";
4
+ export { getBrowserSessionValue } from "./extensions/browser-session-config.js";
5
+ export { browserLocalConfigExtension, registerBrowserLocalConfigExtension, } from "./extensions/browser-local-config.js";
6
+ export { registerBrowserDefaults, environment, createBrowserDemoEnvironment, } from "./environment.js";
7
+ export { createEcp, type BrowserOperationalEcp, type CreateEcpOptions } from "./create-ecp.js";
8
+ export { installBrowserWorkflowShim, type BrowserWorkflowShim } from "./workflow-shim.js";
9
+ export { BrowserAuthoringService, type AuthoringPanels, type CreateWorkflowResult, type PatchWorkflowResult, } from "./authoring/browser-authoring-service.js";
10
+ export { encodeAuthoringPanels } from "./authoring/browser-authoring-panels.js";
11
+ export { BROWSER_NANO_HARNESS_CAPABILITY, BROWSER_NANO_HARNESS_ID, HARNESS_TASKS, chatResultAnswer, chatResultWorkflow, BROWSER_NANO_HARNESS_CAPABILITY as WORKFLOW_AUTHORING_CAPABILITY, BROWSER_NANO_HARNESS_CAPABILITY as INTENT_CLASSIFICATION_CAPABILITY, } from "@executioncontrolprotocol/harnesses-browser-nano";
12
+ export type { BrowserEcpGlobal } from "./extensions/browser-registry.js";
13
+ export type { Ecp } from "@executioncontrolprotocol/core";
14
+ export { hasBrowserVault, isBrowserVaultUnlocked, setupBrowserVault, unlockBrowserVault, lockBrowserVault, setBrowserSecret, getBrowserSecret, deleteBrowserSecret, listBrowserSecretKeys, } from "@executioncontrolprotocol/browser-secrets";
15
+ export { workflow, step, ref, state, env, secrets, browser, expr, parallel, branch, loop, extension, runtime, policy, defineExtension, defineRuntime, definePolicy, capability, capabilityFor, hook, Environment, Registry, globalRegistry, } from "@executioncontrolprotocol/core";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,qBAAqB,EACrB,+BAA+B,GAChC,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,6BAA6B,EAC7B,qCAAqC,EACrC,0BAA0B,EAC1B,sBAAsB,EACtB,KAAK,8BAA8B,GACpC,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAA;AAE/E,OAAO,EACL,2BAA2B,EAC3B,mCAAmC,GACpC,MAAM,sCAAsC,CAAA;AAE7C,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,4BAA4B,GAC7B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,SAAS,EAAE,KAAK,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAC9F,OAAO,EAAE,0BAA0B,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACzF,OAAO,EACL,uBAAuB,EACvB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,0CAA0C,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AAC/E,OAAO,EACL,+BAA+B,EAC/B,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,+BAA+B,IAAI,6BAA6B,EAChE,+BAA+B,IAAI,gCAAgC,GACpE,MAAM,kDAAkD,CAAA;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACxE,YAAY,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAA;AAEzD,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,2CAA2C,CAAA;AAElD,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,KAAK,EACL,GAAG,EACH,OAAO,EACP,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,SAAS,EACT,OAAO,EACP,MAAM,EACN,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,cAAc,GACf,MAAM,gCAAgC,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export { BROWSER_RUNTIME_ID, browserRuntimeDefinition, BrowserRuntimeExecutor, registerBrowserRuntime, } from "./runtime/builtin-browser.js";
2
+ export { browserRegistryExtension, registerBrowserRegistryExtension, exposeBrowserRegistry, getActiveBrowserEnvironmentHost, } from "./extensions/browser-registry.js";
3
+ export { browserSessionConfigExtension, registerBrowserSessionConfigExtension, createBrowserSessionConfig, setBrowserSessionValue, } from "./extensions/browser-session-config.js";
4
+ export { getBrowserSessionValue } from "./extensions/browser-session-config.js";
5
+ export { browserLocalConfigExtension, registerBrowserLocalConfigExtension, } from "./extensions/browser-local-config.js";
6
+ export { registerBrowserDefaults, environment, createBrowserDemoEnvironment, } from "./environment.js";
7
+ export { createEcp } from "./create-ecp.js";
8
+ export { installBrowserWorkflowShim } from "./workflow-shim.js";
9
+ export { BrowserAuthoringService, } from "./authoring/browser-authoring-service.js";
10
+ export { encodeAuthoringPanels } from "./authoring/browser-authoring-panels.js";
11
+ export { BROWSER_NANO_HARNESS_CAPABILITY, BROWSER_NANO_HARNESS_ID, HARNESS_TASKS, chatResultAnswer, chatResultWorkflow, BROWSER_NANO_HARNESS_CAPABILITY as WORKFLOW_AUTHORING_CAPABILITY, BROWSER_NANO_HARNESS_CAPABILITY as INTENT_CLASSIFICATION_CAPABILITY, } from "@executioncontrolprotocol/harnesses-browser-nano";
12
+ export { hasBrowserVault, isBrowserVaultUnlocked, setupBrowserVault, unlockBrowserVault, lockBrowserVault, setBrowserSecret, getBrowserSecret, deleteBrowserSecret, listBrowserSecretKeys, } from "@executioncontrolprotocol/browser-secrets";
13
+ export { workflow, step, ref, state, env, secrets, browser, expr, parallel, branch, loop, extension, runtime, policy, defineExtension, defineRuntime, definePolicy, capability, capabilityFor, hook, Environment, Registry, globalRegistry, } from "@executioncontrolprotocol/core";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,qBAAqB,EACrB,+BAA+B,GAChC,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,6BAA6B,EAC7B,qCAAqC,EACrC,0BAA0B,EAC1B,sBAAsB,GAEvB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAA;AAE/E,OAAO,EACL,2BAA2B,EAC3B,mCAAmC,GACpC,MAAM,sCAAsC,CAAA;AAE7C,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,4BAA4B,GAC7B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,SAAS,EAAqD,MAAM,iBAAiB,CAAA;AAC9F,OAAO,EAAE,0BAA0B,EAA4B,MAAM,oBAAoB,CAAA;AACzF,OAAO,EACL,uBAAuB,GAIxB,MAAM,0CAA0C,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AAC/E,OAAO,EACL,+BAA+B,EAC/B,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,+BAA+B,IAAI,6BAA6B,EAChE,+BAA+B,IAAI,gCAAgC,GACpE,MAAM,kDAAkD,CAAA;AAIzD,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,2CAA2C,CAAA;AAElD,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,KAAK,EACL,GAAG,EACH,OAAO,EACP,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,SAAS,EACT,OAAO,EACP,MAAM,EACN,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,cAAc,GACf,MAAM,gCAAgC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { RunResult, WorkflowManifest } from "@executioncontrolprotocol/types";
2
+ import type { RuntimeExecutionContext, RuntimeExecutor } from "@executioncontrolprotocol/core";
3
+ /** Browser runtime executor (delegates to in-memory engine). @category Runtime */
4
+ export declare class BrowserRuntimeExecutor implements RuntimeExecutor {
5
+ private readonly inner;
6
+ execute(manifest: WorkflowManifest, context: RuntimeExecutionContext): Promise<RunResult>;
7
+ }
8
+ //# sourceMappingURL=browser-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-executor.d.ts","sourceRoot":"","sources":["../../src/runtime/browser-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAE9F,kFAAkF;AAClF,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IAEtD,OAAO,CACL,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,SAAS,CAAC;CAOtB"}
@@ -0,0 +1,12 @@
1
+ import { InMemoryRuntimeExecutor } from "@executioncontrolprotocol/core";
2
+ /** Browser runtime executor (delegates to in-memory engine). @category Runtime */
3
+ export class BrowserRuntimeExecutor {
4
+ inner = new InMemoryRuntimeExecutor();
5
+ execute(manifest, context) {
6
+ const maxConcurrency = context.maxConcurrency ??
7
+ context.bindings.runtime.config.maxConcurrency ??
8
+ 4;
9
+ return this.inner.execute(manifest, { ...context, maxConcurrency });
10
+ }
11
+ }
12
+ //# sourceMappingURL=browser-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-executor.js","sourceRoot":"","sources":["../../src/runtime/browser-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AAIxE,kFAAkF;AAClF,MAAM,OAAO,sBAAsB;IAChB,KAAK,GAAG,IAAI,uBAAuB,EAAE,CAAA;IAEtD,OAAO,CACL,QAA0B,EAC1B,OAAgC;QAEhC,MAAM,cAAc,GAClB,OAAO,CAAC,cAAc;YACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,cAAqC;YACtE,CAAC,CAAA;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,CAAC,CAAA;IACrE,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ export { BrowserRuntimeExecutor } from "./browser-executor.js";
2
+ /** Browser runtime id. @category Runtime */
3
+ export declare const BROWSER_RUNTIME_ID: "@executioncontrolprotocol/browser";
4
+ /** Built-in browser runtime definition. @category Runtime */
5
+ export declare const browserRuntimeDefinition: import("@executioncontrolprotocol/core").RuntimeDefinition;
6
+ /** Register `@executioncontrolprotocol/browser` on the global registry. */
7
+ export declare function registerBrowserRuntime(registry?: import("@executioncontrolprotocol/core").Registry): Promise<void>;
8
+ //# sourceMappingURL=builtin-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-browser.d.ts","sourceRoot":"","sources":["../../src/runtime/builtin-browser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,EAAG,mCAA4C,CAAA;AAE9E,6DAA6D;AAC7D,eAAO,MAAM,wBAAwB,4DAMQ,CAAA;AAE7C,2EAA2E;AAC3E,wBAAsB,sBAAsB,CAAC,QAAQ,oDAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrF"}
@@ -0,0 +1,21 @@
1
+ import { defineRuntime, globalRegistry } from "@executioncontrolprotocol/core";
2
+ import { z } from "zod";
3
+ import { BrowserRuntimeExecutor } from "./browser-executor.js";
4
+ export { BrowserRuntimeExecutor } from "./browser-executor.js";
5
+ /** Browser runtime id. @category Runtime */
6
+ export const BROWSER_RUNTIME_ID = "@executioncontrolprotocol/browser";
7
+ /** Built-in browser runtime definition. @category Runtime */
8
+ export const browserRuntimeDefinition = defineRuntime("@executioncontrolprotocol", "browser")
9
+ .withConfig({
10
+ maxConcurrency: z.number().optional(),
11
+ allowParallel: z.boolean().default(true),
12
+ allowLongRunningTasks: z.boolean().default(false),
13
+ })
14
+ .withExecutor(new BrowserRuntimeExecutor());
15
+ /** Register `@executioncontrolprotocol/browser` on the global registry. */
16
+ export async function registerBrowserRuntime(registry = globalRegistry) {
17
+ if (!registry.getRuntime(BROWSER_RUNTIME_ID)) {
18
+ await registry.registerRuntime(browserRuntimeDefinition);
19
+ }
20
+ }
21
+ //# sourceMappingURL=builtin-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-browser.js","sourceRoot":"","sources":["../../src/runtime/builtin-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,4CAA4C;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,mCAA4C,CAAA;AAE9E,6DAA6D;AAC7D,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAa,CAAC,2BAA2B,EAAE,SAAS,CAAC;KAC1F,UAAU,CAAC;IACV,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACxC,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CAClD,CAAC;KACD,YAAY,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAA;AAE7C,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAQ,GAAG,cAAc;IACpE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { workflow, step, ref, state, env, expr, parallel, branch, loop } from "@executioncontrolprotocol/core";
2
+ /** Workflow builder symbols exposed to browser Fluent compile via globalThis. */
3
+ export interface BrowserWorkflowShim {
4
+ workflow: typeof workflow;
5
+ step: typeof step;
6
+ ref: typeof ref;
7
+ state: typeof state;
8
+ env: typeof env;
9
+ expr: typeof expr;
10
+ parallel: typeof parallel;
11
+ branch: typeof branch;
12
+ loop: typeof loop;
13
+ }
14
+ declare global {
15
+ var __ecpWorkflowShim: BrowserWorkflowShim | undefined;
16
+ }
17
+ /** Install workflow builders on globalThis for browser Fluent compile-on-edit. @category Environment */
18
+ export declare function installBrowserWorkflowShim(): BrowserWorkflowShim;
19
+ //# sourceMappingURL=workflow-shim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-shim.d.ts","sourceRoot":"","sources":["../src/workflow-shim.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,KAAK,EACL,GAAG,EACH,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,IAAI,EACL,MAAM,gCAAgC,CAAA;AAEvC,iFAAiF;AACjF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,QAAQ,CAAA;IACzB,IAAI,EAAE,OAAO,IAAI,CAAA;IACjB,GAAG,EAAE,OAAO,GAAG,CAAA;IACf,KAAK,EAAE,OAAO,KAAK,CAAA;IACnB,GAAG,EAAE,OAAO,GAAG,CAAA;IACf,IAAI,EAAE,OAAO,IAAI,CAAA;IACjB,QAAQ,EAAE,OAAO,QAAQ,CAAA;IACzB,MAAM,EAAE,OAAO,MAAM,CAAA;IACrB,IAAI,EAAE,OAAO,IAAI,CAAA;CAClB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,iBAAiB,EAAE,mBAAmB,GAAG,SAAS,CAAA;CACvD;AAED,wGAAwG;AACxG,wBAAgB,0BAA0B,IAAI,mBAAmB,CAchE"}
@@ -0,0 +1,18 @@
1
+ import { workflow, step, ref, state, env, expr, parallel, branch, loop, } from "@executioncontrolprotocol/core";
2
+ /** Install workflow builders on globalThis for browser Fluent compile-on-edit. @category Environment */
3
+ export function installBrowserWorkflowShim() {
4
+ const shim = {
5
+ workflow,
6
+ step,
7
+ ref,
8
+ state,
9
+ env,
10
+ expr,
11
+ parallel,
12
+ branch,
13
+ loop,
14
+ };
15
+ globalThis.__ecpWorkflowShim = shim;
16
+ return shim;
17
+ }
18
+ //# sourceMappingURL=workflow-shim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-shim.js","sourceRoot":"","sources":["../src/workflow-shim.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,KAAK,EACL,GAAG,EACH,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,IAAI,GACL,MAAM,gCAAgC,CAAA;AAmBvC,wGAAwG;AACxG,MAAM,UAAU,0BAA0B;IACxC,MAAM,IAAI,GAAwB;QAChC,QAAQ;QACR,IAAI;QACJ,GAAG;QACH,KAAK;QACL,GAAG;QACH,IAAI;QACJ,QAAQ;QACR,MAAM;QACN,IAAI;KACL,CAAA;IACD,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAA;IACnC,OAAO,IAAI,CAAA;AACb,CAAC"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@executioncontrolprotocol/browser",
3
+ "version": "0.10.0",
4
+ "description": "ECP browser runtime and environment extensions",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc -b"
21
+ },
22
+ "peerDependencies": {
23
+ "zod": "^3.24.0"
24
+ },
25
+ "dependencies": {
26
+ "@executioncontrolprotocol/chrome-ai": "0.10.0",
27
+ "@executioncontrolprotocol/claude": "0.10.0",
28
+ "@executioncontrolprotocol/core": "0.10.0",
29
+ "@executioncontrolprotocol/harnesses-browser-nano": "0.10.0",
30
+ "@executioncontrolprotocol/format-eql": "0.10.0",
31
+ "@executioncontrolprotocol/format-mermaid": "0.10.0",
32
+ "@executioncontrolprotocol/format-toon": "0.10.0",
33
+ "@executioncontrolprotocol/extension-openai": "0.10.0",
34
+ "@executioncontrolprotocol/extension-fal": "0.10.0",
35
+ "@executioncontrolprotocol/extension-image-sharp": "0.10.0",
36
+ "@executioncontrolprotocol/browser-secrets": "0.10.0",
37
+ "@executioncontrolprotocol/policies": "0.10.0",
38
+ "@executioncontrolprotocol/types": "0.10.0"
39
+ },
40
+ "devDependencies": {
41
+ "typescript": "^5.7.0",
42
+ "zod": "^3.24.0"
43
+ }
44
+ }