@executioncontrolprotocol/core 0.12.0 → 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 (156) hide show
  1. package/README.md +14 -0
  2. package/dist/browser-runtime-entry.d.ts +11 -2
  3. package/dist/browser-runtime-entry.d.ts.map +1 -1
  4. package/dist/browser-runtime-entry.js +10 -1
  5. package/dist/browser-runtime-entry.js.map +1 -1
  6. package/dist/compile/transpile.d.ts +6 -0
  7. package/dist/compile/transpile.d.ts.map +1 -1
  8. package/dist/compile/transpile.js +19 -8
  9. package/dist/compile/transpile.js.map +1 -1
  10. package/dist/definitions/capability.d.ts +4 -1
  11. package/dist/definitions/capability.d.ts.map +1 -1
  12. package/dist/definitions/capability.js +7 -0
  13. package/dist/definitions/capability.js.map +1 -1
  14. package/dist/definitions/types.d.ts +3 -1
  15. package/dist/definitions/types.d.ts.map +1 -1
  16. package/dist/encoding/schemas.d.ts +26 -26
  17. package/dist/environment/describe.d.ts +1 -2
  18. package/dist/environment/describe.d.ts.map +1 -1
  19. package/dist/environment/describe.js +2 -0
  20. package/dist/environment/describe.js.map +1 -1
  21. package/dist/environment/ecp.d.ts +8 -0
  22. package/dist/environment/ecp.d.ts.map +1 -1
  23. package/dist/environment/ecp.js +12 -0
  24. package/dist/environment/ecp.js.map +1 -1
  25. package/dist/environment/environment.d.ts +31 -0
  26. package/dist/environment/environment.d.ts.map +1 -1
  27. package/dist/environment/environment.js +64 -1
  28. package/dist/environment/environment.js.map +1 -1
  29. package/dist/file/file-ref.d.ts +28 -0
  30. package/dist/file/file-ref.d.ts.map +1 -0
  31. package/dist/{image/image-ref.js → file/file-ref.js} +20 -20
  32. package/dist/file/file-ref.js.map +1 -0
  33. package/dist/fluent/render-workflow.d.ts +1 -1
  34. package/dist/fluent/render-workflow.d.ts.map +1 -1
  35. package/dist/fluent/render-workflow.js +5 -4
  36. package/dist/fluent/render-workflow.js.map +1 -1
  37. package/dist/harness/authoring/context-policy.d.ts.map +1 -1
  38. package/dist/harness/authoring/context-policy.js +2 -2
  39. package/dist/harness/authoring/context-policy.js.map +1 -1
  40. package/dist/harness/authoring/index.d.ts +1 -1
  41. package/dist/harness/authoring/index.d.ts.map +1 -1
  42. package/dist/harness/authoring/index.js +1 -1
  43. package/dist/harness/authoring/index.js.map +1 -1
  44. package/dist/harness/authoring/summarize-capability-schema.d.ts.map +1 -1
  45. package/dist/harness/authoring/summarize-capability-schema.js +14 -10
  46. package/dist/harness/authoring/summarize-capability-schema.js.map +1 -1
  47. package/dist/harness/authoring/summarize-environment.d.ts +11 -0
  48. package/dist/harness/authoring/summarize-environment.d.ts.map +1 -1
  49. package/dist/harness/authoring/summarize-environment.js +55 -10
  50. package/dist/harness/authoring/summarize-environment.js.map +1 -1
  51. package/dist/harness/authoring/summarize-workflow.d.ts +2 -0
  52. package/dist/harness/authoring/summarize-workflow.d.ts.map +1 -1
  53. package/dist/harness/authoring/summarize-workflow.js +40 -1
  54. package/dist/harness/authoring/summarize-workflow.js.map +1 -1
  55. package/dist/harness/execute-harness.d.ts.map +1 -1
  56. package/dist/harness/execute-harness.js +14 -10
  57. package/dist/harness/execute-harness.js.map +1 -1
  58. package/dist/harness/prompts/eql-primer.d.ts +1 -0
  59. package/dist/harness/prompts/eql-primer.d.ts.map +1 -1
  60. package/dist/harness/prompts/eql-primer.js +22 -0
  61. package/dist/harness/prompts/eql-primer.js.map +1 -1
  62. package/dist/harness/prompts/typescript-primer.d.ts.map +1 -1
  63. package/dist/harness/prompts/typescript-primer.js +15 -3
  64. package/dist/harness/prompts/typescript-primer.js.map +1 -1
  65. package/dist/index.d.ts +12 -3
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +11 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/invoke/execute-invoke.d.ts.map +1 -1
  70. package/dist/invoke/execute-invoke.js +20 -6
  71. package/dist/invoke/execute-invoke.js.map +1 -1
  72. package/dist/loaders/files.d.ts.map +1 -1
  73. package/dist/loaders/files.js +4 -2
  74. package/dist/loaders/files.js.map +1 -1
  75. package/dist/loaders/read-media-file.d.ts +6 -0
  76. package/dist/loaders/read-media-file.d.ts.map +1 -0
  77. package/dist/loaders/read-media-file.js +10 -0
  78. package/dist/loaders/read-media-file.js.map +1 -0
  79. package/dist/media/artifact-filename.d.ts +41 -0
  80. package/dist/media/artifact-filename.d.ts.map +1 -0
  81. package/dist/media/artifact-filename.js +119 -0
  82. package/dist/media/artifact-filename.js.map +1 -0
  83. package/dist/media/assert-media-type.d.ts +11 -0
  84. package/dist/media/assert-media-type.d.ts.map +1 -0
  85. package/dist/media/assert-media-type.js +43 -0
  86. package/dist/media/assert-media-type.js.map +1 -0
  87. package/dist/media/index.d.ts +13 -0
  88. package/dist/media/index.d.ts.map +1 -0
  89. package/dist/media/index.js +13 -0
  90. package/dist/media/index.js.map +1 -0
  91. package/dist/media/resolve-file.d.ts +32 -0
  92. package/dist/media/resolve-file.d.ts.map +1 -0
  93. package/dist/media/resolve-file.js +110 -0
  94. package/dist/media/resolve-file.js.map +1 -0
  95. package/dist/media/write-media.d.ts +19 -0
  96. package/dist/media/write-media.d.ts.map +1 -0
  97. package/dist/media/write-media.js +46 -0
  98. package/dist/media/write-media.js.map +1 -0
  99. package/dist/patch/patch-document.d.ts +2 -2
  100. package/dist/runtime/artifacts.d.ts +31 -0
  101. package/dist/runtime/artifacts.d.ts.map +1 -0
  102. package/dist/runtime/artifacts.js +26 -0
  103. package/dist/runtime/artifacts.js.map +1 -0
  104. package/dist/runtime/blobs.d.ts +72 -0
  105. package/dist/runtime/blobs.d.ts.map +1 -0
  106. package/dist/runtime/blobs.js +129 -0
  107. package/dist/runtime/blobs.js.map +1 -0
  108. package/dist/runtime/capability-execution.d.ts +22 -0
  109. package/dist/runtime/capability-execution.d.ts.map +1 -0
  110. package/dist/runtime/capability-execution.js +25 -0
  111. package/dist/runtime/capability-execution.js.map +1 -0
  112. package/dist/runtime/context.d.ts +9 -1
  113. package/dist/runtime/context.d.ts.map +1 -1
  114. package/dist/runtime/context.js.map +1 -1
  115. package/dist/runtime/dispatch-capability.d.ts +42 -0
  116. package/dist/runtime/dispatch-capability.d.ts.map +1 -0
  117. package/dist/runtime/dispatch-capability.js +94 -0
  118. package/dist/runtime/dispatch-capability.js.map +1 -0
  119. package/dist/runtime/executor.d.ts +9 -0
  120. package/dist/runtime/executor.d.ts.map +1 -1
  121. package/dist/runtime/in-memory-executor.d.ts.map +1 -1
  122. package/dist/runtime/in-memory-executor.js +67 -8
  123. package/dist/runtime/in-memory-executor.js.map +1 -1
  124. package/dist/runtime/mixed-blob-upload.d.ts +37 -0
  125. package/dist/runtime/mixed-blob-upload.d.ts.map +1 -0
  126. package/dist/runtime/mixed-blob-upload.js +65 -0
  127. package/dist/runtime/mixed-blob-upload.js.map +1 -0
  128. package/dist/runtime/remote-invoke.d.ts +21 -0
  129. package/dist/runtime/remote-invoke.d.ts.map +1 -0
  130. package/dist/runtime/remote-invoke.js +83 -0
  131. package/dist/runtime/remote-invoke.js.map +1 -0
  132. package/dist/runtime/runtime-ids.d.ts +5 -0
  133. package/dist/runtime/runtime-ids.d.ts.map +1 -0
  134. package/dist/runtime/runtime-ids.js +5 -0
  135. package/dist/runtime/runtime-ids.js.map +1 -0
  136. package/dist/schema/json-schema.d.ts +12 -4
  137. package/dist/schema/json-schema.d.ts.map +1 -1
  138. package/dist/schema/json-schema.js +40 -7
  139. package/dist/schema/json-schema.js.map +1 -1
  140. package/dist/testing/test-extension.d.ts.map +1 -1
  141. package/dist/testing/test-extension.js +6 -0
  142. package/dist/testing/test-extension.js.map +1 -1
  143. package/dist/testing/test-lifecycle-extension.d.ts +3 -1
  144. package/dist/testing/test-lifecycle-extension.d.ts.map +1 -1
  145. package/dist/testing/test-lifecycle-extension.js +7 -1
  146. package/dist/testing/test-lifecycle-extension.js.map +1 -1
  147. package/dist/validate/environment.d.ts.map +1 -1
  148. package/dist/validate/environment.js +26 -4
  149. package/dist/validate/environment.js.map +1 -1
  150. package/dist/validate/workflow-schema.d.ts +6 -6
  151. package/fixtures/schema-examples/workflow.output.eql +6 -2
  152. package/fixtures/schema-examples/workflow.output.json +17 -3
  153. package/package.json +6 -6
  154. package/dist/image/image-ref.d.ts +0 -28
  155. package/dist/image/image-ref.d.ts.map +0 -1
  156. package/dist/image/image-ref.js.map +0 -1
@@ -0,0 +1,46 @@
1
+ import { FILE_REF_KINDS } from "@executioncontrolprotocol/types";
2
+ import { defaultArtifactFilename } from "./artifact-filename.js";
3
+ import { STORAGE_ARTIFACT_URI_PREFIX, } from "./resolve-file.js";
4
+ /**
5
+ * Write bytes into the host artifact store (or durable storage) and return an artifact {@link FileRef}.
6
+ * @category Media
7
+ */
8
+ export async function writeMediaArtifact(data, options, ctx) {
9
+ const cfg = ctx.extensionConfig ?? {};
10
+ const storage = cfg.storage ?? {};
11
+ const prefix = options.prefix ?? storage.outputPrefix ?? "artifacts/media";
12
+ const name = options.name ?? defaultArtifactFilename(options.mediaType);
13
+ const uri = `ecp://${prefix}/${name}`;
14
+ if (options.store === "storage" || storage.defaultStore === "storage") {
15
+ const key = `${prefix}/${name}`;
16
+ await ctx.capabilities.call("@executioncontrolprotocol/storage.write", {
17
+ key,
18
+ value: data,
19
+ });
20
+ return {
21
+ kind: FILE_REF_KINDS.ARTIFACT,
22
+ uri: `${STORAGE_ARTIFACT_URI_PREFIX}${key}`,
23
+ mediaType: options.mediaType,
24
+ name,
25
+ sizeBytes: data.byteLength,
26
+ };
27
+ }
28
+ if (!ctx.artifacts) {
29
+ throw new Error("No artifact store on capability context. Ensure the runtime wires ctx.artifacts (env.ensureArtifactStore).");
30
+ }
31
+ const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
32
+ ctx.artifacts.set(uri, {
33
+ mediaType: options.mediaType,
34
+ name,
35
+ size: bytes.byteLength,
36
+ bytes,
37
+ });
38
+ return {
39
+ kind: FILE_REF_KINDS.ARTIFACT,
40
+ uri,
41
+ mediaType: options.mediaType,
42
+ name,
43
+ sizeBytes: bytes.byteLength,
44
+ };
45
+ }
46
+ //# sourceMappingURL=write-media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-media.js","sourceRoot":"","sources":["../../src/media/write-media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgB,MAAM,iCAAiC,CAAA;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EACL,2BAA2B,GAE5B,MAAM,mBAAmB,CAAA;AAc1B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAgB,EAChB,OAAkC,EAClC,GAA0B;IAE1B,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE,CAAA;IACrC,MAAM,OAAO,GAAI,GAAG,CAAC,OAAwE,IAAI,EAAE,CAAA;IACnG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,YAAY,IAAI,iBAAiB,CAAA;IAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACvE,MAAM,GAAG,GAAG,SAAS,MAAM,IAAI,IAAI,EAAE,CAAA;IAErC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtE,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,IAAI,EAAE,CAAA;QAC/B,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,yCAAyC,EAAE;YACrE,GAAG;YACH,KAAK,EAAE,IAAI;SACZ,CAAC,CAAA;QACF,OAAO;YACL,IAAI,EAAE,cAAc,CAAC,QAAQ;YAC7B,GAAG,EAAE,GAAG,2BAA2B,GAAG,GAAG,EAAE;YAC3C,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,UAAU;SAC3B,CAAA;IACH,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAA;IACH,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;IACtE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE;QACrB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI;QACJ,IAAI,EAAE,KAAK,CAAC,UAAU;QACtB,KAAK;KACN,CAAC,CAAA;IAEF,OAAO;QACL,IAAI,EAAE,cAAc,CAAC,QAAQ;QAC7B,GAAG;QACH,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI;QACJ,SAAS,EAAE,KAAK,CAAC,UAAU;KAC5B,CAAA;AACH,CAAC"}
@@ -38,8 +38,8 @@ export declare const ecpPatchDocumentSchema: z.ZodObject<{
38
38
  mode?: "replace" | "merge" | undefined;
39
39
  }>, "many">;
40
40
  }, "strip", z.ZodTypeAny, {
41
- version: string;
42
41
  schema: "@executioncontrolprotocol.patch";
42
+ version: string;
43
43
  targetSchema: string;
44
44
  patches: {
45
45
  path: string;
@@ -48,8 +48,8 @@ export declare const ecpPatchDocumentSchema: z.ZodObject<{
48
48
  mode?: "replace" | "merge" | undefined;
49
49
  }[];
50
50
  }, {
51
- version: string;
52
51
  schema: "@executioncontrolprotocol.patch";
52
+ version: string;
53
53
  targetSchema: string;
54
54
  patches: {
55
55
  path: string;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Host-side artifact bytes keyed by `ecp://…` URIs (invoke/run preview and hop outputs).
3
+ * @category Runtime
4
+ */
5
+ /** Stored host artifact (bytes + metadata). @category Runtime */
6
+ export interface CapabilityArtifact {
7
+ /** MIME type for HTTP / browser preview. */
8
+ readonly mediaType: string;
9
+ /** Optional display / download name. */
10
+ readonly name?: string;
11
+ /** Size in bytes. */
12
+ readonly size: number;
13
+ /** Artifact bytes. */
14
+ readonly bytes: Uint8Array;
15
+ }
16
+ /** Environment-scoped map of artifact URIs to bytes. @category Runtime */
17
+ export interface CapabilityArtifactStore {
18
+ /** Look up a stored artifact. */
19
+ get(uri: string): CapabilityArtifact | undefined;
20
+ /** Store an artifact under its URI. */
21
+ set(uri: string, artifact: CapabilityArtifact): void;
22
+ /** Remove a URI. */
23
+ delete(uri: string): void;
24
+ /** Drop all artifacts. */
25
+ clear(): void;
26
+ /** Number of stored artifacts. */
27
+ size(): number;
28
+ }
29
+ /** In-memory {@link CapabilityArtifactStore}. @category Runtime */
30
+ export declare function createCapabilityArtifactStore(): CapabilityArtifactStore;
31
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/runtime/artifacts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,wCAAwC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,sBAAsB;IACtB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAC3B;AAED,0EAA0E;AAC1E,MAAM,WAAW,uBAAuB;IACtC,iCAAiC;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAA;IAChD,uCAAuC;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAA;IACpD,oBAAoB;IACpB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,0BAA0B;IAC1B,KAAK,IAAI,IAAI,CAAA;IACb,kCAAkC;IAClC,IAAI,IAAI,MAAM,CAAA;CACf;AAED,mEAAmE;AACnE,wBAAgB,6BAA6B,IAAI,uBAAuB,CAmBvE"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Host-side artifact bytes keyed by `ecp://…` URIs (invoke/run preview and hop outputs).
3
+ * @category Runtime
4
+ */
5
+ /** In-memory {@link CapabilityArtifactStore}. @category Runtime */
6
+ export function createCapabilityArtifactStore() {
7
+ const items = new Map();
8
+ return {
9
+ get(uri) {
10
+ return items.get(uri);
11
+ },
12
+ set(uri, artifact) {
13
+ items.set(uri, artifact);
14
+ },
15
+ delete(uri) {
16
+ items.delete(uri);
17
+ },
18
+ clear() {
19
+ items.clear();
20
+ },
21
+ size() {
22
+ return items.size;
23
+ },
24
+ };
25
+ }
26
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/runtime/artifacts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4BH,mEAAmE;AACnE,MAAM,UAAU,6BAA6B;IAC3C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAA;IACnD,OAAO;QACL,GAAG,CAAC,GAAG;YACL,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC;QACD,GAAG,CAAC,GAAG,EAAE,QAAQ;YACf,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QAC1B,CAAC;QACD,MAAM,CAAC,GAAG;YACR,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACnB,CAAC;QACD,KAAK;YACH,KAAK,CAAC,KAAK,EAAE,CAAA;QACf,CAAC;QACD,IAAI;YACF,OAAO,KAAK,CAAC,IAAI,CAAA;QACnB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Locator prefix for files stashed in the browser run map.
3
+ * @category Runtime
4
+ */
5
+ export declare const BROWSER_FILE_LOCATOR_PREFIX = "ecp://browser/";
6
+ /** Browser-stashed file handle used by mixed upload handlers. @category Runtime */
7
+ export interface CapabilityBlob {
8
+ /** Original file name when available. */
9
+ readonly name: string;
10
+ /** MIME type. */
11
+ readonly type: string;
12
+ /** Size in bytes. */
13
+ readonly size: number;
14
+ /** Read file bytes. */
15
+ arrayBuffer(): Promise<ArrayBuffer>;
16
+ }
17
+ /** Run-scoped map of browser file locators to blobs. @category Runtime */
18
+ export interface CapabilityBlobStore {
19
+ /** Look up a stashed file. */
20
+ get(locator: string): CapabilityBlob | undefined;
21
+ /** Stash a file under a locator. */
22
+ set(locator: string, blob: CapabilityBlob): void;
23
+ /** Remove a locator. */
24
+ delete(locator: string): void;
25
+ /** Drop all locators. */
26
+ clear(): void;
27
+ /** Number of stashed files. */
28
+ size(): number;
29
+ }
30
+ /**
31
+ * Wire format for hopping browser blobs to a host invoke (transport only; not workflow state).
32
+ * @category Runtime
33
+ */
34
+ export interface SerializedCapabilityBlob {
35
+ /** Original file name when available. */
36
+ name: string;
37
+ /** MIME type. */
38
+ type: string;
39
+ /** Size in bytes. */
40
+ size: number;
41
+ /** File bytes as base64 (invoke hop transport). */
42
+ dataBase64: string;
43
+ }
44
+ /** Whether a string is a browser file locator. @category Runtime */
45
+ export declare function isBrowserFileLocator(value: string): boolean;
46
+ /** Create a unique browser file locator. @category Runtime */
47
+ export declare function createBrowserFileLocator(): string;
48
+ /** In-memory {@link CapabilityBlobStore}. @category Runtime */
49
+ export declare function createCapabilityBlobStore(): CapabilityBlobStore;
50
+ /**
51
+ * Stash a blob and return its locator.
52
+ * @category Runtime
53
+ */
54
+ export declare function stashCapabilityBlob(store: CapabilityBlobStore, blob: CapabilityBlob): string;
55
+ /**
56
+ * Collect `ecp://browser/<id>` locators from an invoke/run payload.
57
+ * Walks nested objects/arrays, including {@link FileRef} `file.path` and
58
+ * `artifact.uri` when they hold browser locators.
59
+ * @category Runtime
60
+ */
61
+ export declare function collectBrowserLocators(value: unknown, out?: string[]): string[];
62
+ /**
63
+ * Serialize selected locators for a host invoke hop (bytes travel on the wire only).
64
+ * @category Runtime
65
+ */
66
+ export declare function serializeCapabilityBlobs(store: CapabilityBlobStore, locators: string[]): Promise<Record<string, SerializedCapabilityBlob>>;
67
+ /**
68
+ * Hydrate a blob store from hop transport payloads.
69
+ * @category Runtime
70
+ */
71
+ export declare function hydrateCapabilityBlobs(store: CapabilityBlobStore, serialized: Record<string, SerializedCapabilityBlob>): void;
72
+ //# sourceMappingURL=blobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blobs.d.ts","sourceRoot":"","sources":["../../src/runtime/blobs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,2BAA2B,mBAAmB,CAAA;AAE3D,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,iBAAiB;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uBAAuB;IACvB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;CACpC;AAED,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAA;IAChD,oCAAoC;IACpC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAAA;IAChD,wBAAwB;IACxB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,yBAAyB;IACzB,KAAK,IAAI,IAAI,CAAA;IACb,+BAA+B;IAC/B,IAAI,IAAI,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,8DAA8D;AAC9D,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,+DAA+D;AAC/D,wBAAgB,yBAAyB,IAAI,mBAAmB,CAmB/D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAI5F;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAcnF;AAwBD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAcnD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,mBAAmB,EAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,GACnD,IAAI,CAaN"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Locator prefix for files stashed in the browser run map.
3
+ * @category Runtime
4
+ */
5
+ export const BROWSER_FILE_LOCATOR_PREFIX = "ecp://browser/";
6
+ /** Whether a string is a browser file locator. @category Runtime */
7
+ export function isBrowserFileLocator(value) {
8
+ return value.startsWith(BROWSER_FILE_LOCATOR_PREFIX) && value.length > BROWSER_FILE_LOCATOR_PREFIX.length;
9
+ }
10
+ /** Create a unique browser file locator. @category Runtime */
11
+ export function createBrowserFileLocator() {
12
+ return `${BROWSER_FILE_LOCATOR_PREFIX}${globalThis.crypto.randomUUID()}`;
13
+ }
14
+ /** In-memory {@link CapabilityBlobStore}. @category Runtime */
15
+ export function createCapabilityBlobStore() {
16
+ const files = new Map();
17
+ return {
18
+ get(locator) {
19
+ return files.get(locator);
20
+ },
21
+ set(locator, blob) {
22
+ files.set(locator, blob);
23
+ },
24
+ delete(locator) {
25
+ files.delete(locator);
26
+ },
27
+ clear() {
28
+ files.clear();
29
+ },
30
+ size() {
31
+ return files.size;
32
+ },
33
+ };
34
+ }
35
+ /**
36
+ * Stash a blob and return its locator.
37
+ * @category Runtime
38
+ */
39
+ export function stashCapabilityBlob(store, blob) {
40
+ const locator = createBrowserFileLocator();
41
+ store.set(locator, blob);
42
+ return locator;
43
+ }
44
+ /**
45
+ * Collect `ecp://browser/<id>` locators from an invoke/run payload.
46
+ * Walks nested objects/arrays, including {@link FileRef} `file.path` and
47
+ * `artifact.uri` when they hold browser locators.
48
+ * @category Runtime
49
+ */
50
+ export function collectBrowserLocators(value, out = []) {
51
+ if (typeof value === "string") {
52
+ if (isBrowserFileLocator(value) && !out.includes(value))
53
+ out.push(value);
54
+ return out;
55
+ }
56
+ if (Array.isArray(value)) {
57
+ for (const item of value)
58
+ collectBrowserLocators(item, out);
59
+ return out;
60
+ }
61
+ if (value !== null && typeof value === "object") {
62
+ const row = value;
63
+ for (const child of Object.values(row))
64
+ collectBrowserLocators(child, out);
65
+ }
66
+ return out;
67
+ }
68
+ function bytesToBase64(bytes) {
69
+ if (typeof Buffer !== "undefined") {
70
+ return Buffer.from(bytes).toString("base64");
71
+ }
72
+ const chunk = 0x8000;
73
+ let binary = "";
74
+ for (let i = 0; i < bytes.length; i += chunk) {
75
+ binary += String.fromCharCode(...bytes.subarray(i, i + chunk));
76
+ }
77
+ return btoa(binary);
78
+ }
79
+ function base64ToBytes(dataBase64) {
80
+ if (typeof Buffer !== "undefined") {
81
+ return new Uint8Array(Buffer.from(dataBase64, "base64"));
82
+ }
83
+ const binary = atob(dataBase64);
84
+ const bytes = new Uint8Array(binary.length);
85
+ for (let i = 0; i < binary.length; i++)
86
+ bytes[i] = binary.charCodeAt(i);
87
+ return bytes;
88
+ }
89
+ /**
90
+ * Serialize selected locators for a host invoke hop (bytes travel on the wire only).
91
+ * @category Runtime
92
+ */
93
+ export async function serializeCapabilityBlobs(store, locators) {
94
+ const out = {};
95
+ for (const locator of locators) {
96
+ const blob = store.get(locator);
97
+ if (!blob)
98
+ continue;
99
+ const bytes = new Uint8Array(await blob.arrayBuffer());
100
+ out[locator] = {
101
+ name: blob.name,
102
+ type: blob.type,
103
+ size: blob.size,
104
+ dataBase64: bytesToBase64(bytes),
105
+ };
106
+ }
107
+ return out;
108
+ }
109
+ /**
110
+ * Hydrate a blob store from hop transport payloads.
111
+ * @category Runtime
112
+ */
113
+ export function hydrateCapabilityBlobs(store, serialized) {
114
+ for (const [locator, row] of Object.entries(serialized)) {
115
+ if (!isBrowserFileLocator(locator))
116
+ continue;
117
+ if (typeof row?.dataBase64 !== "string")
118
+ continue;
119
+ const bytes = base64ToBytes(row.dataBase64);
120
+ const copy = bytes.slice().buffer;
121
+ store.set(locator, {
122
+ name: typeof row.name === "string" ? row.name : "blob",
123
+ type: typeof row.type === "string" ? row.type : "application/octet-stream",
124
+ size: typeof row.size === "number" ? row.size : bytes.byteLength,
125
+ arrayBuffer: async () => copy,
126
+ });
127
+ }
128
+ }
129
+ //# sourceMappingURL=blobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blobs.js","sourceRoot":"","sources":["../../src/runtime/blobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { CapabilityExecution } from "@executioncontrolprotocol/types";
2
+ /** Extension shape needed to infer capability execution. @category Runtime */
3
+ export interface ExecutionExtensionHint {
4
+ /** Runtimes this extension supports when restricted. */
5
+ supportedRuntimes?: readonly string[];
6
+ }
7
+ /** Capability shape needed to resolve execution. @category Runtime */
8
+ export interface ExecutionCapabilityHint {
9
+ /** Explicit execution declaration. */
10
+ execution?: CapabilityExecution;
11
+ }
12
+ /**
13
+ * Resolve capability execution, defaulting from extension `supportedRuntimes`.
14
+ * Unrestricted capabilities default to **host**; browser-only extensions default to **local**.
15
+ * @category Runtime
16
+ */
17
+ export declare function resolveCapabilityExecution(cap: ExecutionCapabilityHint, ext?: ExecutionExtensionHint): CapabilityExecution;
18
+ /** Whether this runtime id is the browser host. @category Runtime */
19
+ export declare function isBrowserRuntimeId(runtimeId: string): boolean;
20
+ /** Whether this runtime id is the Node host. @category Runtime */
21
+ export declare function isNodeRuntimeId(runtimeId: string): boolean;
22
+ //# sourceMappingURL=capability-execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-execution.d.ts","sourceRoot":"","sources":["../../src/runtime/capability-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAG1E,8EAA8E;AAC9E,MAAM,WAAW,sBAAsB;IACrC,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACtC;AAED,sEAAsE;AACtE,MAAM,WAAW,uBAAuB;IACtC,sCAAsC;IACtC,SAAS,CAAC,EAAE,mBAAmB,CAAA;CAChC;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,uBAAuB,EAC5B,GAAG,CAAC,EAAE,sBAAsB,GAC3B,mBAAmB,CAMrB;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE1D"}
@@ -0,0 +1,25 @@
1
+ import { BROWSER_RUNTIME_ID, NODE_RUNTIME_ID } from "./runtime-ids.js";
2
+ /**
3
+ * Resolve capability execution, defaulting from extension `supportedRuntimes`.
4
+ * Unrestricted capabilities default to **host**; browser-only extensions default to **local**.
5
+ * @category Runtime
6
+ */
7
+ export function resolveCapabilityExecution(cap, ext) {
8
+ if (cap.execution)
9
+ return cap.execution;
10
+ const supported = ext?.supportedRuntimes;
11
+ if (supported?.length === 1 && supported[0] === NODE_RUNTIME_ID)
12
+ return "host";
13
+ if (supported?.length === 1 && supported[0] === BROWSER_RUNTIME_ID)
14
+ return "local";
15
+ return "host";
16
+ }
17
+ /** Whether this runtime id is the browser host. @category Runtime */
18
+ export function isBrowserRuntimeId(runtimeId) {
19
+ return runtimeId === BROWSER_RUNTIME_ID;
20
+ }
21
+ /** Whether this runtime id is the Node host. @category Runtime */
22
+ export function isNodeRuntimeId(runtimeId) {
23
+ return runtimeId === NODE_RUNTIME_ID;
24
+ }
25
+ //# sourceMappingURL=capability-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-execution.js","sourceRoot":"","sources":["../../src/runtime/capability-execution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AActE;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,GAA4B,EAC5B,GAA4B;IAE5B,IAAI,GAAG,CAAC,SAAS;QAAE,OAAO,GAAG,CAAC,SAAS,CAAA;IACvC,MAAM,SAAS,GAAG,GAAG,EAAE,iBAAiB,CAAA;IACxC,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,eAAe;QAAE,OAAO,MAAM,CAAA;IAC9E,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,kBAAkB;QAAE,OAAO,OAAO,CAAA;IAClF,OAAO,MAAM,CAAA;AACf,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,OAAO,SAAS,KAAK,kBAAkB,CAAA;AACzC,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,SAAS,KAAK,eAAe,CAAA;AACtC,CAAC"}
@@ -1,6 +1,8 @@
1
- import type { LifecycleEvent, PolicyEvaluationScope, RegistryRegistrationRequest, WorkflowManifest } from "@executioncontrolprotocol/types";
1
+ import type { LifecycleEvent, PolicyEvaluationScope, RegistryRegistrationRequest, ValidationIssue, WorkflowManifest } from "@executioncontrolprotocol/types";
2
2
  import type { PendingMutation, StoreStateHandle } from "@executioncontrolprotocol/types";
3
3
  import type { StoreContext } from "./store.js";
4
+ import type { CapabilityArtifactStore } from "./artifacts.js";
5
+ import type { CapabilityBlobStore } from "./blobs.js";
4
6
  /** Run-level context. @category Runtime */
5
7
  export interface RunContext {
6
8
  id: string;
@@ -23,6 +25,10 @@ export interface CapabilityContext {
23
25
  capabilities: {
24
26
  call(id: string, input: unknown): Promise<unknown>;
25
27
  };
28
+ /** Run-scoped browser files keyed by `ecp://browser/<id>` locators. */
29
+ blobs?: CapabilityBlobStore;
30
+ /** Environment-scoped host artifacts keyed by `ecp://…` URIs. */
31
+ artifacts?: CapabilityArtifactStore;
26
32
  }
27
33
  /** Host surface exposed on environment lifecycle hooks. @category Environment */
28
34
  export interface EnvironmentLifecycleHost {
@@ -41,6 +47,8 @@ export interface LifecycleContext {
41
47
  state: Record<string, unknown>;
42
48
  /** Step capability output when available (e.g. `step:completed`). */
43
49
  output?: unknown;
50
+ /** Failure diagnostics when the step did not complete (e.g. `step:failed`). */
51
+ diagnostics?: ValidationIssue[];
44
52
  /** Present on `environment:*` events. */
45
53
  environment?: EnvironmentLifecycleHost;
46
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/runtime/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/runtime/context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/runtime/context.ts"],"names":[],"mappings":"AAsGA,6BAA6B;AAC7B,MAAM,UAAU,iBAAiB;IAC/B,qEAAqE;IACrE,yEAAyE;IACzE,yEAAyE;IACzE,MAAM,MAAM,GAAgB;QAC1B,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,SAAS,CAAC,OAAO;YACf,IAAI,OAAO,CAAC,UAAU;gBAAE,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAA;YAC/D,IAAI,OAAO,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAA;YACtD,IAAI,OAAO,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAA;YACnD,IAAI,OAAO,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAA;QACxD,CAAC;KACF,CAAA;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAC7C,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAC9C,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;KACjD,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/runtime/context.ts"],"names":[],"mappings":"AA+GA,6BAA6B;AAC7B,MAAM,UAAU,iBAAiB;IAC/B,qEAAqE;IACrE,yEAAyE;IACzE,yEAAyE;IACzE,MAAM,MAAM,GAAgB;QAC1B,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,SAAS,CAAC,OAAO;YACf,IAAI,OAAO,CAAC,UAAU;gBAAE,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAA;YAC/D,IAAI,OAAO,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAA;YACtD,IAAI,OAAO,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAA;YACnD,IAAI,OAAO,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAA;QACxD,CAAC;KACF,CAAA;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAC7C,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAC9C,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;KACjD,CAAA;AACH,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { type InvokeResult } from "@executioncontrolprotocol/types";
2
+ import type { Registry } from "../registry/registry.js";
3
+ import type { CapabilityContext } from "./context.js";
4
+ import { type RemoteInvokeBinding } from "./remote-invoke.js";
5
+ /** Error thrown when dispatch cannot produce handler output. @category Runtime */
6
+ export declare class CapabilityDispatchError extends Error {
7
+ /** Structured invoke failure. */
8
+ readonly result: InvokeResult;
9
+ constructor(result: InvokeResult);
10
+ }
11
+ /** Inputs for {@link dispatchCapability}. @category Runtime */
12
+ export interface DispatchCapabilityOptions {
13
+ /** Capability id to run or hop. */
14
+ capabilityId: string;
15
+ /** Capability input. */
16
+ input: unknown;
17
+ /** Handler context (nested `call` should use this dispatcher). */
18
+ ctx: CapabilityContext;
19
+ /** Live registry. */
20
+ registry: Registry;
21
+ /** Current environment runtime id. */
22
+ runtimeId: string;
23
+ /** Remote invoke host when this environment hops. */
24
+ remoteInvoke?: RemoteInvokeBinding;
25
+ }
26
+ /**
27
+ * Run a capability locally or hop to `POST /v1/invoke` on the same id.
28
+ * Returns handler output. Throws {@link CapabilityDispatchError} on failure.
29
+ * @category Runtime
30
+ */
31
+ export declare function dispatchCapability(options: DispatchCapabilityOptions): Promise<unknown>;
32
+ /**
33
+ * Nested `ctx.capabilities.call` that uses the same local/hop dispatcher.
34
+ * @category Runtime
35
+ */
36
+ export declare function createDispatchingCall(options: Omit<DispatchCapabilityOptions, "capabilityId" | "input">): (id: string, input: unknown) => Promise<unknown>;
37
+ /**
38
+ * Like {@link dispatchCapability} but always returns an {@link InvokeResult}.
39
+ * @category Runtime
40
+ */
41
+ export declare function dispatchCapabilityResult(options: DispatchCapabilityOptions): Promise<InvokeResult>;
42
+ //# sourceMappingURL=dispatch-capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-capability.d.ts","sourceRoot":"","sources":["../../src/runtime/dispatch-capability.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,iCAAiC,CAAA;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAErD,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,oBAAoB,CAAA;AAO3B,kFAAkF;AAClF,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;gBAEjB,MAAM,EAAE,YAAY;CAKjC;AAED,+DAA+D;AAC/D,MAAM,WAAW,yBAAyB;IACxC,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAA;IACpB,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAA;IACd,kEAAkE;IAClE,GAAG,EAAE,iBAAiB,CAAA;IACtB,qBAAqB;IACrB,QAAQ,EAAE,QAAQ,CAAA;IAClB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB,qDAAqD;IACrD,YAAY,CAAC,EAAE,mBAAmB,CAAA;CACnC;AAcD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqD7F;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,cAAc,GAAG,OAAO,CAAC,GACjE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAElD;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
@@ -0,0 +1,94 @@
1
+ import { ECP_INVOKE_ERROR_CODES, LATEST_ECP_VERSION, } from "@executioncontrolprotocol/types";
2
+ import { resolveCapabilityExecution, isBrowserRuntimeId } from "./capability-execution.js";
3
+ import { hopRemoteInvoke, invokeFailure, } from "./remote-invoke.js";
4
+ import { collectBrowserLocators, serializeCapabilityBlobs, } from "./blobs.js";
5
+ /** Error thrown when dispatch cannot produce handler output. @category Runtime */
6
+ export class CapabilityDispatchError extends Error {
7
+ /** Structured invoke failure. */
8
+ result;
9
+ constructor(result) {
10
+ super(result.diagnostics[0]?.message ?? "Capability dispatch failed");
11
+ this.name = "CapabilityDispatchError";
12
+ this.result = result;
13
+ }
14
+ }
15
+ function extensionForCapability(registry, cap) {
16
+ const extId = cap.id.replace(/\.[^.]+$/, "");
17
+ return registry.getExtension(extId);
18
+ }
19
+ function remoteRequiredMessage(capabilityId) {
20
+ return `Capability ${capabilityId} requires a local host. Start \`ecp up --env …\`.`;
21
+ }
22
+ /**
23
+ * Run a capability locally or hop to `POST /v1/invoke` on the same id.
24
+ * Returns handler output. Throws {@link CapabilityDispatchError} on failure.
25
+ * @category Runtime
26
+ */
27
+ export async function dispatchCapability(options) {
28
+ const { capabilityId, input, ctx, registry, runtimeId, remoteInvoke } = options;
29
+ const cap = registry.getCapability(capabilityId);
30
+ if (!cap) {
31
+ throw new CapabilityDispatchError(invokeFailure(capabilityId, ECP_INVOKE_ERROR_CODES.CAPABILITY_NOT_FOUND, `Capability not registered: ${capabilityId}`));
32
+ }
33
+ const ext = extensionForCapability(registry, cap);
34
+ const execution = resolveCapabilityExecution(cap, ext);
35
+ const onBrowser = isBrowserRuntimeId(runtimeId);
36
+ const hopHost = execution === "host" && onBrowser;
37
+ const mixedNeedsHost = execution === "mixed" && onBrowser;
38
+ if (hopHost || mixedNeedsHost) {
39
+ if (!remoteInvoke?.url || !remoteInvoke.token) {
40
+ throw new CapabilityDispatchError(invokeFailure(capabilityId, ECP_INVOKE_ERROR_CODES.REMOTE_INVOKE_REQUIRED, remoteRequiredMessage(capabilityId)));
41
+ }
42
+ }
43
+ if (hopHost) {
44
+ const locators = collectBrowserLocators(input);
45
+ const blobs = ctx.blobs && locators.length > 0
46
+ ? await serializeCapabilityBlobs(ctx.blobs, locators)
47
+ : undefined;
48
+ const hopped = await hopRemoteInvoke(remoteInvoke, capabilityId, input, blobs);
49
+ if (!hopped.success) {
50
+ throw new CapabilityDispatchError(hopped);
51
+ }
52
+ return hopped.result;
53
+ }
54
+ try {
55
+ return await cap.handler(input, ctx);
56
+ }
57
+ catch (err) {
58
+ if (err instanceof CapabilityDispatchError)
59
+ throw err;
60
+ const message = err instanceof Error ? err.message : String(err);
61
+ throw new CapabilityDispatchError(invokeFailure(capabilityId, ECP_INVOKE_ERROR_CODES.INVOKE_FAILED, message));
62
+ }
63
+ }
64
+ /**
65
+ * Nested `ctx.capabilities.call` that uses the same local/hop dispatcher.
66
+ * @category Runtime
67
+ */
68
+ export function createDispatchingCall(options) {
69
+ return (id, input) => dispatchCapability({ ...options, capabilityId: id, input });
70
+ }
71
+ /**
72
+ * Like {@link dispatchCapability} but always returns an {@link InvokeResult}.
73
+ * @category Runtime
74
+ */
75
+ export async function dispatchCapabilityResult(options) {
76
+ try {
77
+ const output = await dispatchCapability(options);
78
+ return {
79
+ schema: "@executioncontrolprotocol.invoke.result",
80
+ version: LATEST_ECP_VERSION,
81
+ success: true,
82
+ capabilityId: options.capabilityId,
83
+ result: output,
84
+ diagnostics: [],
85
+ };
86
+ }
87
+ catch (err) {
88
+ if (err instanceof CapabilityDispatchError)
89
+ return err.result;
90
+ const message = err instanceof Error ? err.message : String(err);
91
+ return invokeFailure(options.capabilityId, ECP_INVOKE_ERROR_CODES.INVOKE_FAILED, message);
92
+ }
93
+ }
94
+ //# sourceMappingURL=dispatch-capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-capability.js","sourceRoot":"","sources":["../../src/runtime/dispatch-capability.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,7 @@
1
1
  import type { RunResult, StepRunRecord, WorkflowManifest } from "@executioncontrolprotocol/types";
2
+ import type { RemoteInvokeBinding } from "./remote-invoke.js";
3
+ import type { CapabilityArtifactStore } from "./artifacts.js";
4
+ import type { CapabilityBlobStore } from "./blobs.js";
2
5
  /** Runtime execution mode. @category Runtime */
3
6
  export type RuntimeExecutionMode = "run" | "test";
4
7
  /** Runtime execution options passed to the executor. @category Runtime */
@@ -21,6 +24,12 @@ export interface RuntimeExecutionContext {
21
24
  stopAfterStepId?: string;
22
25
  /** Execute only this leaf step id (test `rerun`). */
23
26
  onlyStepId?: string;
27
+ /** Local invoke host for host/mixed hops. */
28
+ remoteInvoke?: RemoteInvokeBinding;
29
+ /** Run-scoped browser file map. */
30
+ blobs?: CapabilityBlobStore;
31
+ /** Environment-scoped host artifact map. */
32
+ artifacts?: CapabilityArtifactStore;
24
33
  }
25
34
  /** Runtime executor interface. @category Runtime */
26
35
  export interface RuntimeExecutor {