@executioncontrolprotocol/core 0.11.3 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +25 -1
  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-browser.d.ts +25 -2
  7. package/dist/compile/transpile-browser.d.ts.map +1 -1
  8. package/dist/compile/transpile-browser.js +32 -5
  9. package/dist/compile/transpile-browser.js.map +1 -1
  10. package/dist/compile/transpile.d.ts +6 -0
  11. package/dist/compile/transpile.d.ts.map +1 -1
  12. package/dist/compile/transpile.js +19 -8
  13. package/dist/compile/transpile.js.map +1 -1
  14. package/dist/definitions/capability.d.ts +4 -1
  15. package/dist/definitions/capability.d.ts.map +1 -1
  16. package/dist/definitions/capability.js +7 -0
  17. package/dist/definitions/capability.js.map +1 -1
  18. package/dist/definitions/types.d.ts +3 -1
  19. package/dist/definitions/types.d.ts.map +1 -1
  20. package/dist/encoding/normalize-workflow.d.ts.map +1 -1
  21. package/dist/encoding/normalize-workflow.js +2 -0
  22. package/dist/encoding/normalize-workflow.js.map +1 -1
  23. package/dist/encoding/schemas.d.ts +26 -26
  24. package/dist/environment/describe.d.ts +1 -2
  25. package/dist/environment/describe.d.ts.map +1 -1
  26. package/dist/environment/describe.js +2 -0
  27. package/dist/environment/describe.js.map +1 -1
  28. package/dist/environment/ecp.d.ts +8 -0
  29. package/dist/environment/ecp.d.ts.map +1 -1
  30. package/dist/environment/ecp.js +12 -0
  31. package/dist/environment/ecp.js.map +1 -1
  32. package/dist/environment/environment.d.ts +31 -0
  33. package/dist/environment/environment.d.ts.map +1 -1
  34. package/dist/environment/environment.js +73 -1
  35. package/dist/environment/environment.js.map +1 -1
  36. package/dist/file/file-ref.d.ts +28 -0
  37. package/dist/file/file-ref.d.ts.map +1 -0
  38. package/dist/{image/image-ref.js → file/file-ref.js} +20 -20
  39. package/dist/file/file-ref.js.map +1 -0
  40. package/dist/fluent/render-workflow.d.ts +1 -1
  41. package/dist/fluent/render-workflow.d.ts.map +1 -1
  42. package/dist/fluent/render-workflow.js +10 -2
  43. package/dist/fluent/render-workflow.js.map +1 -1
  44. package/dist/harness/authoring/context-policy.d.ts.map +1 -1
  45. package/dist/harness/authoring/context-policy.js +2 -2
  46. package/dist/harness/authoring/context-policy.js.map +1 -1
  47. package/dist/harness/authoring/index.d.ts +1 -1
  48. package/dist/harness/authoring/index.d.ts.map +1 -1
  49. package/dist/harness/authoring/index.js +1 -1
  50. package/dist/harness/authoring/index.js.map +1 -1
  51. package/dist/harness/authoring/summarize-capability-schema.d.ts.map +1 -1
  52. package/dist/harness/authoring/summarize-capability-schema.js +14 -10
  53. package/dist/harness/authoring/summarize-capability-schema.js.map +1 -1
  54. package/dist/harness/authoring/summarize-environment.d.ts +11 -0
  55. package/dist/harness/authoring/summarize-environment.d.ts.map +1 -1
  56. package/dist/harness/authoring/summarize-environment.js +55 -10
  57. package/dist/harness/authoring/summarize-environment.js.map +1 -1
  58. package/dist/harness/authoring/summarize-workflow.d.ts +2 -0
  59. package/dist/harness/authoring/summarize-workflow.d.ts.map +1 -1
  60. package/dist/harness/authoring/summarize-workflow.js +40 -1
  61. package/dist/harness/authoring/summarize-workflow.js.map +1 -1
  62. package/dist/harness/execute-harness.d.ts.map +1 -1
  63. package/dist/harness/execute-harness.js +14 -10
  64. package/dist/harness/execute-harness.js.map +1 -1
  65. package/dist/harness/prompts/eql-primer.d.ts +1 -0
  66. package/dist/harness/prompts/eql-primer.d.ts.map +1 -1
  67. package/dist/harness/prompts/eql-primer.js +22 -0
  68. package/dist/harness/prompts/eql-primer.js.map +1 -1
  69. package/dist/harness/prompts/typescript-primer.d.ts.map +1 -1
  70. package/dist/harness/prompts/typescript-primer.js +15 -3
  71. package/dist/harness/prompts/typescript-primer.js.map +1 -1
  72. package/dist/index.d.ts +13 -2
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +12 -1
  75. package/dist/index.js.map +1 -1
  76. package/dist/invoke/execute-invoke.d.ts.map +1 -1
  77. package/dist/invoke/execute-invoke.js +20 -6
  78. package/dist/invoke/execute-invoke.js.map +1 -1
  79. package/dist/loaders/files.d.ts.map +1 -1
  80. package/dist/loaders/files.js +4 -2
  81. package/dist/loaders/files.js.map +1 -1
  82. package/dist/loaders/read-media-file.d.ts +6 -0
  83. package/dist/loaders/read-media-file.d.ts.map +1 -0
  84. package/dist/loaders/read-media-file.js +10 -0
  85. package/dist/loaders/read-media-file.js.map +1 -0
  86. package/dist/media/artifact-filename.d.ts +41 -0
  87. package/dist/media/artifact-filename.d.ts.map +1 -0
  88. package/dist/media/artifact-filename.js +119 -0
  89. package/dist/media/artifact-filename.js.map +1 -0
  90. package/dist/media/assert-media-type.d.ts +11 -0
  91. package/dist/media/assert-media-type.d.ts.map +1 -0
  92. package/dist/media/assert-media-type.js +43 -0
  93. package/dist/media/assert-media-type.js.map +1 -0
  94. package/dist/media/index.d.ts +13 -0
  95. package/dist/media/index.d.ts.map +1 -0
  96. package/dist/media/index.js +13 -0
  97. package/dist/media/index.js.map +1 -0
  98. package/dist/media/resolve-file.d.ts +32 -0
  99. package/dist/media/resolve-file.d.ts.map +1 -0
  100. package/dist/media/resolve-file.js +110 -0
  101. package/dist/media/resolve-file.js.map +1 -0
  102. package/dist/media/write-media.d.ts +19 -0
  103. package/dist/media/write-media.d.ts.map +1 -0
  104. package/dist/media/write-media.js +46 -0
  105. package/dist/media/write-media.js.map +1 -0
  106. package/dist/patch/patch-document.d.ts +2 -2
  107. package/dist/runtime/artifacts.d.ts +31 -0
  108. package/dist/runtime/artifacts.d.ts.map +1 -0
  109. package/dist/runtime/artifacts.js +26 -0
  110. package/dist/runtime/artifacts.js.map +1 -0
  111. package/dist/runtime/blobs.d.ts +72 -0
  112. package/dist/runtime/blobs.d.ts.map +1 -0
  113. package/dist/runtime/blobs.js +129 -0
  114. package/dist/runtime/blobs.js.map +1 -0
  115. package/dist/runtime/capability-execution.d.ts +22 -0
  116. package/dist/runtime/capability-execution.d.ts.map +1 -0
  117. package/dist/runtime/capability-execution.js +25 -0
  118. package/dist/runtime/capability-execution.js.map +1 -0
  119. package/dist/runtime/context.d.ts +9 -1
  120. package/dist/runtime/context.d.ts.map +1 -1
  121. package/dist/runtime/context.js.map +1 -1
  122. package/dist/runtime/dispatch-capability.d.ts +42 -0
  123. package/dist/runtime/dispatch-capability.d.ts.map +1 -0
  124. package/dist/runtime/dispatch-capability.js +94 -0
  125. package/dist/runtime/dispatch-capability.js.map +1 -0
  126. package/dist/runtime/executor.d.ts +9 -0
  127. package/dist/runtime/executor.d.ts.map +1 -1
  128. package/dist/runtime/in-memory-executor.d.ts.map +1 -1
  129. package/dist/runtime/in-memory-executor.js +70 -10
  130. package/dist/runtime/in-memory-executor.js.map +1 -1
  131. package/dist/runtime/mixed-blob-upload.d.ts +37 -0
  132. package/dist/runtime/mixed-blob-upload.d.ts.map +1 -0
  133. package/dist/runtime/mixed-blob-upload.js +65 -0
  134. package/dist/runtime/mixed-blob-upload.js.map +1 -0
  135. package/dist/runtime/remote-invoke.d.ts +21 -0
  136. package/dist/runtime/remote-invoke.d.ts.map +1 -0
  137. package/dist/runtime/remote-invoke.js +83 -0
  138. package/dist/runtime/remote-invoke.js.map +1 -0
  139. package/dist/runtime/runtime-ids.d.ts +5 -0
  140. package/dist/runtime/runtime-ids.d.ts.map +1 -0
  141. package/dist/runtime/runtime-ids.js +5 -0
  142. package/dist/runtime/runtime-ids.js.map +1 -0
  143. package/dist/schema/json-schema.d.ts +47 -0
  144. package/dist/schema/json-schema.d.ts.map +1 -0
  145. package/dist/schema/json-schema.js +209 -0
  146. package/dist/schema/json-schema.js.map +1 -0
  147. package/dist/schema/workflow-io.d.ts +18 -0
  148. package/dist/schema/workflow-io.d.ts.map +1 -0
  149. package/dist/schema/workflow-io.js +33 -0
  150. package/dist/schema/workflow-io.js.map +1 -0
  151. package/dist/testing/test-extension.d.ts.map +1 -1
  152. package/dist/testing/test-extension.js +6 -0
  153. package/dist/testing/test-extension.js.map +1 -1
  154. package/dist/testing/test-lifecycle-extension.d.ts +3 -1
  155. package/dist/testing/test-lifecycle-extension.d.ts.map +1 -1
  156. package/dist/testing/test-lifecycle-extension.js +7 -1
  157. package/dist/testing/test-lifecycle-extension.js.map +1 -1
  158. package/dist/validate/environment.d.ts.map +1 -1
  159. package/dist/validate/environment.js +26 -4
  160. package/dist/validate/environment.js.map +1 -1
  161. package/dist/validate/workflow-schema.d.ts +16 -6
  162. package/dist/validate/workflow-schema.d.ts.map +1 -1
  163. package/dist/validate/workflow-schema.js +2 -0
  164. package/dist/validate/workflow-schema.js.map +1 -1
  165. package/dist/workflow/builder.d.ts +13 -0
  166. package/dist/workflow/builder.d.ts.map +1 -1
  167. package/dist/workflow/builder.js +40 -0
  168. package/dist/workflow/builder.js.map +1 -1
  169. package/fixtures/schema-examples/workflow.output.eql +6 -2
  170. package/fixtures/schema-examples/workflow.output.json +17 -3
  171. package/package.json +6 -6
  172. package/dist/image/image-ref.d.ts +0 -28
  173. package/dist/image/image-ref.d.ts.map +0 -1
  174. package/dist/image/image-ref.js.map +0 -1
@@ -0,0 +1,83 @@
1
+ import { ECP_INVOKE_ERROR_CODES, LATEST_ECP_VERSION, } from "@executioncontrolprotocol/types";
2
+ /** Whether a JSON value looks like an invoke result. @category Runtime */
3
+ export function isInvokeResult(value) {
4
+ if (value === null || typeof value !== "object")
5
+ return false;
6
+ const row = value;
7
+ return (row.schema === "@executioncontrolprotocol.invoke.result" &&
8
+ typeof row.success === "boolean" &&
9
+ typeof row.capabilityId === "string" &&
10
+ Array.isArray(row.diagnostics));
11
+ }
12
+ /**
13
+ * Build a failed invoke result.
14
+ * @category Runtime
15
+ */
16
+ export function invokeFailure(capabilityId, code, message, validation) {
17
+ return {
18
+ schema: "@executioncontrolprotocol.invoke.result",
19
+ version: LATEST_ECP_VERSION,
20
+ success: false,
21
+ capabilityId: capabilityId,
22
+ validation,
23
+ diagnostics: [{ severity: "error", code, message }],
24
+ };
25
+ }
26
+ const HOST_MISSING_CAP_MESSAGE = (id) => `Capability ${id} is not in the local host environment. Bind it in environment.ts and restart ecp up --env.`;
27
+ function trimSlash(url) {
28
+ return url.replace(/\/+$/, "");
29
+ }
30
+ /**
31
+ * POST `/v1/invoke` to a remote host and return the structured result.
32
+ * @category Runtime
33
+ */
34
+ export async function hopRemoteInvoke(binding, capabilityId, input, blobs) {
35
+ const url = `${trimSlash(binding.url)}/v1/invoke`;
36
+ let res;
37
+ try {
38
+ res = await fetch(url, {
39
+ method: "POST",
40
+ headers: {
41
+ "Content-Type": "application/json",
42
+ Authorization: `Bearer ${binding.token}`,
43
+ },
44
+ body: JSON.stringify({
45
+ capability: capabilityId,
46
+ input: input ?? {},
47
+ ...(blobs && Object.keys(blobs).length > 0 ? { blobs } : {}),
48
+ }),
49
+ });
50
+ }
51
+ catch (err) {
52
+ const message = err instanceof Error ? err.message : String(err);
53
+ return invokeFailure(capabilityId, ECP_INVOKE_ERROR_CODES.INVOKE_FAILED, `Local host unreachable (${message}). Is ecp up running?`);
54
+ }
55
+ if (res.status === 401) {
56
+ return invokeFailure(capabilityId, ECP_INVOKE_ERROR_CODES.INVOKE_DENIED, "Local host unauthorized — check the pairing token from `ecp up`.");
57
+ }
58
+ let body;
59
+ try {
60
+ body = await res.json();
61
+ }
62
+ catch {
63
+ return invokeFailure(capabilityId, ECP_INVOKE_ERROR_CODES.INVOKE_FAILED, `Local host returned HTTP ${res.status} without an invoke result.`);
64
+ }
65
+ if (isInvokeResult(body)) {
66
+ if (!body.success &&
67
+ body.diagnostics[0]?.code === ECP_INVOKE_ERROR_CODES.CAPABILITY_NOT_FOUND) {
68
+ return {
69
+ ...body,
70
+ diagnostics: [
71
+ {
72
+ ...body.diagnostics[0],
73
+ message: HOST_MISSING_CAP_MESSAGE(capabilityId),
74
+ },
75
+ ...body.diagnostics.slice(1),
76
+ ],
77
+ };
78
+ }
79
+ return body;
80
+ }
81
+ return invokeFailure(capabilityId, ECP_INVOKE_ERROR_CODES.INVOKE_FAILED, `Local host returned HTTP ${res.status} without an invoke result.`);
82
+ }
83
+ //# sourceMappingURL=remote-invoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-invoke.js","sourceRoot":"","sources":["../../src/runtime/remote-invoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Node runtime id. @category Runtime */
2
+ export declare const NODE_RUNTIME_ID: "@executioncontrolprotocol/node";
3
+ /** Browser runtime id. @category Runtime */
4
+ export declare const BROWSER_RUNTIME_ID: "@executioncontrolprotocol/browser";
5
+ //# sourceMappingURL=runtime-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-ids.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime-ids.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,eAAO,MAAM,eAAe,EAAG,gCAAyC,CAAA;AAExE,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,EAAG,mCAA4C,CAAA"}
@@ -0,0 +1,5 @@
1
+ /** Node runtime id. @category Runtime */
2
+ export const NODE_RUNTIME_ID = "@executioncontrolprotocol/node";
3
+ /** Browser runtime id. @category Runtime */
4
+ export const BROWSER_RUNTIME_ID = "@executioncontrolprotocol/browser";
5
+ //# sourceMappingURL=runtime-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-ids.js","sourceRoot":"","sources":["../../src/runtime/runtime-ids.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAG,gCAAyC,CAAA;AAExE,4CAA4C;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,mCAA4C,CAAA"}
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Project a Zod type to a JSON Schema fragment (primitives + object/array).
4
+ * @category Schema
5
+ */
6
+ export declare function jsonSchemaFromZod(type: z.ZodType): Record<string, unknown>;
7
+ /**
8
+ * List object-schema properties for workflow `accepts` / `returns`.
9
+ * @category Schema
10
+ */
11
+ export declare function jsonSchemaObjectProperties(schema: Record<string, unknown> | undefined): Array<{
12
+ name: string;
13
+ schema: Record<string, unknown>;
14
+ required: boolean;
15
+ }>;
16
+ /**
17
+ * Validate a value against a subset of JSON Schema (object properties, required, types).
18
+ * @category Schema
19
+ */
20
+ export declare function validateAgainstJsonSchema(schema: Record<string, unknown> | undefined, value: unknown): {
21
+ ok: true;
22
+ } | {
23
+ ok: false;
24
+ errors: string[];
25
+ };
26
+ /**
27
+ * Walk a dot-separated path against run state (e.g. `inspected.metadata`).
28
+ * @category Schema
29
+ */
30
+ export declare function resolveStatePath(state: Record<string, unknown>, dotPath: string): unknown;
31
+ /**
32
+ * Pick state values listed in a `returns` object schema.
33
+ * Property names may be dot paths (e.g. `inspected.metadata`).
34
+ * @category Schema
35
+ */
36
+ export declare function pickWorkflowReturns(schema: Record<string, unknown> | undefined, state: Record<string, unknown>): Record<string, unknown> | undefined;
37
+ /**
38
+ * Render a JSON Schema fragment as a Fluent `.accepts()` / `.returns()` argument.
39
+ * Pretty-prints object schemas across multiple lines; use `compact` for a single line.
40
+ * @category Schema
41
+ */
42
+ export declare function renderJsonSchemaAsFluentArg(schema: Record<string, unknown>, options?: {
43
+ compact?: boolean;
44
+ }): string;
45
+ /** True when a value looks like a Zod schema instance. @category Schema */
46
+ export declare function isZodType(value: unknown): value is z.ZodType;
47
+ //# sourceMappingURL=json-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema.d.ts","sourceRoot":"","sources":["../../src/schema/json-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAkBvB;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsC1E;AAMD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC1C,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAkB7E;AAoBD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,KAAK,EAAE,OAAO,GACb;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA+BhD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,MAAM,GACd,OAAO,CAYT;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CASrC;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,MAAM,CAQR;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,OAAO,CAE5D"}
@@ -0,0 +1,209 @@
1
+ import { z } from "zod";
2
+ import { fileRefSchemaOptions, fileRefValueSchemaHint, isFileRefSchema, } from "@executioncontrolprotocol/types";
3
+ function unwrapZodType(type) {
4
+ if (type instanceof z.ZodOptional)
5
+ return unwrapZodType(type.unwrap());
6
+ if (type instanceof z.ZodDefault)
7
+ return unwrapZodType(type.removeDefault());
8
+ if (type instanceof z.ZodNullable)
9
+ return unwrapZodType(type.unwrap());
10
+ return type;
11
+ }
12
+ function isOptionalField(type) {
13
+ return type instanceof z.ZodOptional || type instanceof z.ZodDefault;
14
+ }
15
+ /**
16
+ * Project a Zod type to a JSON Schema fragment (primitives + object/array).
17
+ * @category Schema
18
+ */
19
+ export function jsonSchemaFromZod(type) {
20
+ const inner = unwrapZodType(type);
21
+ if (inner instanceof z.ZodString)
22
+ return { type: "string" };
23
+ if (inner instanceof z.ZodNumber)
24
+ return { type: "number" };
25
+ if (inner instanceof z.ZodBoolean)
26
+ return { type: "boolean" };
27
+ if (inner instanceof z.ZodNull)
28
+ return { type: "null" };
29
+ if (inner instanceof z.ZodEnum) {
30
+ return { type: "string", enum: [...inner.options] };
31
+ }
32
+ if (inner instanceof z.ZodLiteral) {
33
+ const value = inner.value;
34
+ if (typeof value === "string")
35
+ return { type: "string", enum: [value] };
36
+ if (typeof value === "number")
37
+ return { type: "number", enum: [value] };
38
+ if (typeof value === "boolean")
39
+ return { type: "boolean", enum: [value] };
40
+ return {};
41
+ }
42
+ if (inner instanceof z.ZodArray) {
43
+ return { type: "array", items: jsonSchemaFromZod(inner.element) };
44
+ }
45
+ if (inner instanceof z.ZodObject) {
46
+ const properties = {};
47
+ const required = [];
48
+ for (const [name, field] of Object.entries(inner.shape)) {
49
+ const fieldType = field;
50
+ properties[name] = jsonSchemaFromZod(fieldType);
51
+ if (!isOptionalField(fieldType))
52
+ required.push(name);
53
+ }
54
+ const schema = { type: "object", properties };
55
+ if (required.length > 0)
56
+ schema.required = required;
57
+ return schema;
58
+ }
59
+ if (inner instanceof z.ZodRecord)
60
+ return { type: "object" };
61
+ if (inner instanceof z.ZodAny || inner instanceof z.ZodUnknown)
62
+ return {};
63
+ if (isFileRefSchema(inner)) {
64
+ return fileRefValueSchemaHint(fileRefSchemaOptions(inner));
65
+ }
66
+ return {};
67
+ }
68
+ function isJsonSchemaObject(schema) {
69
+ return schema !== null && typeof schema === "object" && !Array.isArray(schema);
70
+ }
71
+ /**
72
+ * List object-schema properties for workflow `accepts` / `returns`.
73
+ * @category Schema
74
+ */
75
+ export function jsonSchemaObjectProperties(schema) {
76
+ if (!schema)
77
+ return [];
78
+ const props = schema.properties;
79
+ if (!isJsonSchemaObject(props))
80
+ return [];
81
+ const required = new Set(Array.isArray(schema.required)
82
+ ? schema.required.filter((k) => typeof k === "string")
83
+ : []);
84
+ const out = [];
85
+ for (const [name, prop] of Object.entries(props)) {
86
+ out.push({
87
+ name,
88
+ schema: isJsonSchemaObject(prop) ? prop : {},
89
+ required: required.has(name),
90
+ });
91
+ }
92
+ return out;
93
+ }
94
+ function jsonSchemaTypeLabel(schema) {
95
+ const t = schema.type;
96
+ return typeof t === "string" ? t : "unknown";
97
+ }
98
+ function typeMatches(schema, value) {
99
+ const t = schema.type;
100
+ if (t === undefined)
101
+ return true;
102
+ if (t === "string")
103
+ return typeof value === "string";
104
+ if (t === "number")
105
+ return typeof value === "number" && Number.isFinite(value);
106
+ if (t === "integer")
107
+ return typeof value === "number" && Number.isInteger(value);
108
+ if (t === "boolean")
109
+ return typeof value === "boolean";
110
+ if (t === "null")
111
+ return value === null;
112
+ if (t === "array")
113
+ return Array.isArray(value);
114
+ if (t === "object")
115
+ return value !== null && typeof value === "object" && !Array.isArray(value);
116
+ return true;
117
+ }
118
+ /**
119
+ * Validate a value against a subset of JSON Schema (object properties, required, types).
120
+ * @category Schema
121
+ */
122
+ export function validateAgainstJsonSchema(schema, value) {
123
+ if (!schema || Object.keys(schema).length === 0)
124
+ return { ok: true };
125
+ const errors = [];
126
+ const fields = jsonSchemaObjectProperties(schema);
127
+ if (fields.length === 0 && schema.type !== "object") {
128
+ if (value !== undefined && !typeMatches(schema, value)) {
129
+ return { ok: false, errors: [`Expected type ${jsonSchemaTypeLabel(schema)}`] };
130
+ }
131
+ return { ok: true };
132
+ }
133
+ const obj = value === undefined || value === null
134
+ ? {}
135
+ : typeof value === "object" && !Array.isArray(value)
136
+ ? value
137
+ : null;
138
+ if (obj === null) {
139
+ return { ok: false, errors: ["Expected an object"] };
140
+ }
141
+ for (const field of fields) {
142
+ if (!(field.name in obj)) {
143
+ if (field.required)
144
+ errors.push(`Missing required property: ${field.name}`);
145
+ continue;
146
+ }
147
+ if (!typeMatches(field.schema, obj[field.name])) {
148
+ errors.push(`Property '${field.name}' expected type ${jsonSchemaTypeLabel(field.schema)}`);
149
+ }
150
+ }
151
+ return errors.length > 0 ? { ok: false, errors } : { ok: true };
152
+ }
153
+ /**
154
+ * Walk a dot-separated path against run state (e.g. `inspected.metadata`).
155
+ * @category Schema
156
+ */
157
+ export function resolveStatePath(state, dotPath) {
158
+ const segments = dotPath.split(".").filter((segment) => segment.length > 0);
159
+ if (segments.length === 0)
160
+ return undefined;
161
+ let current = state;
162
+ for (const segment of segments) {
163
+ if (current === null || typeof current !== "object" || Array.isArray(current)) {
164
+ return undefined;
165
+ }
166
+ if (!(segment in current))
167
+ return undefined;
168
+ current = current[segment];
169
+ }
170
+ return current;
171
+ }
172
+ /**
173
+ * Pick state values listed in a `returns` object schema.
174
+ * Property names may be dot paths (e.g. `inspected.metadata`).
175
+ * @category Schema
176
+ */
177
+ export function pickWorkflowReturns(schema, state) {
178
+ const fields = jsonSchemaObjectProperties(schema);
179
+ if (fields.length === 0)
180
+ return undefined;
181
+ const output = {};
182
+ for (const field of fields) {
183
+ const value = resolveStatePath(state, field.name);
184
+ if (value !== undefined)
185
+ output[field.name] = value;
186
+ }
187
+ return output;
188
+ }
189
+ /**
190
+ * Render a JSON Schema fragment as a Fluent `.accepts()` / `.returns()` argument.
191
+ * Pretty-prints object schemas across multiple lines; use `compact` for a single line.
192
+ * @category Schema
193
+ */
194
+ export function renderJsonSchemaAsFluentArg(schema, options) {
195
+ if (options?.compact)
196
+ return JSON.stringify(schema);
197
+ const pretty = JSON.stringify(schema, null, 2);
198
+ if (!pretty.includes("\n"))
199
+ return pretty;
200
+ return pretty
201
+ .split("\n")
202
+ .map((line, index) => (index === 0 ? line : ` ${line}`))
203
+ .join("\n");
204
+ }
205
+ /** True when a value looks like a Zod schema instance. @category Schema */
206
+ export function isZodType(value) {
207
+ return value instanceof z.ZodType;
208
+ }
209
+ //# sourceMappingURL=json-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../../src/schema/json-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { RunResult, WorkflowManifest } from "@executioncontrolprotocol/types";
2
+ /**
3
+ * Validate run `input` against `workflow.accepts`.
4
+ * @category Schema
5
+ */
6
+ export declare function validateWorkflowAcceptsInput(manifest: WorkflowManifest, input: Record<string, unknown> | undefined): {
7
+ ok: true;
8
+ } | {
9
+ ok: false;
10
+ message: string;
11
+ };
12
+ /**
13
+ * Attach `output` from `workflow.returns` and validate required properties.
14
+ * Invalid returns mark the run failed.
15
+ * @category Schema
16
+ */
17
+ export declare function applyWorkflowReturns(manifest: WorkflowManifest, result: RunResult, state: Record<string, unknown>): RunResult;
18
+ //# sourceMappingURL=workflow-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-io.d.ts","sourceRoot":"","sources":["../../src/schema/workflow-io.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAMlF;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACzC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAI/C;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,SAAS,CAeX"}
@@ -0,0 +1,33 @@
1
+ import { pickWorkflowReturns, validateAgainstJsonSchema, } from "../schema/json-schema.js";
2
+ /**
3
+ * Validate run `input` against `workflow.accepts`.
4
+ * @category Schema
5
+ */
6
+ export function validateWorkflowAcceptsInput(manifest, input) {
7
+ const result = validateAgainstJsonSchema(manifest.workflow.accepts, input ?? {});
8
+ if (result.ok)
9
+ return { ok: true };
10
+ return { ok: false, message: `Workflow accepts validation failed: ${result.errors.join("; ")}` };
11
+ }
12
+ /**
13
+ * Attach `output` from `workflow.returns` and validate required properties.
14
+ * Invalid returns mark the run failed.
15
+ * @category Schema
16
+ */
17
+ export function applyWorkflowReturns(manifest, result, state) {
18
+ const output = pickWorkflowReturns(manifest.workflow.returns, state);
19
+ if (output === undefined)
20
+ return result;
21
+ const next = { ...result, output };
22
+ if (result.run.status !== "completed")
23
+ return next;
24
+ const check = validateAgainstJsonSchema(manifest.workflow.returns, output);
25
+ if (!check.ok) {
26
+ return {
27
+ ...next,
28
+ run: { ...result.run, status: "failed" },
29
+ };
30
+ }
31
+ return next;
32
+ }
33
+ //# sourceMappingURL=workflow-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-io.js","sourceRoot":"","sources":["../../src/schema/workflow-io.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,0BAA0B,CAAA;AAEjC;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAA0B,EAC1B,KAA0C;IAE1C,MAAM,MAAM,GAAG,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAA;IAChF,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IAClC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,uCAAuC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAA;AAClG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAA0B,EAC1B,MAAiB,EACjB,KAA8B;IAE9B,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACpE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IAEvC,MAAM,IAAI,GAAc,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAA;IAC7C,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAA;IAElD,MAAM,KAAK,GAAG,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC1E,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,OAAO;YACL,GAAG,IAAI;YACP,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE;SACzC,CAAA;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"test-extension.d.ts","sourceRoot":"","sources":["../../src/testing/test-extension.ts"],"names":[],"mappings":"AAeA,uEAAuE;AACvE,eAAO,MAAM,aAAa,2DAgChB,CAAA;AAIV,mFAAmF;AACnF,wBAAsB,qBAAqB,CACzC,QAAQ,6CAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAIf"}
1
+ {"version":3,"file":"test-extension.d.ts","sourceRoot":"","sources":["../../src/testing/test-extension.ts"],"names":[],"mappings":"AAeA,uEAAuE;AACvE,eAAO,MAAM,aAAa,2DAsChB,CAAA;AAIV,mFAAmF;AACnF,wBAAsB,qBAAqB,CACzC,QAAQ,6CAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -17,28 +17,34 @@ export const testExtension = defineExtension("@executioncontrolprotocol", "test"
17
17
  capabilityFor("@executioncontrolprotocol/test", "echo")
18
18
  .withInput(z.object({ value: z.unknown().optional() }))
19
19
  .withOutput(z.object({ echo: z.unknown() }))
20
+ .withExecution("local")
20
21
  .withHandler(async (input) => ({
21
22
  echo: input.value ?? "hi",
22
23
  })),
23
24
  capabilityFor("@executioncontrolprotocol/test", "generate")
24
25
  .withInput(modelGenerateInputSchema)
25
26
  .withOutput(modelGenerateOutputSchema)
27
+ .withExecution("local")
26
28
  .withHandler(async (input) => testModelGenerateHandler(input)),
27
29
  capabilityFor("@executioncontrolprotocol/test", "summarize")
28
30
  .withInput(TestStubInput)
29
31
  .withOutput(TestStubOutput)
32
+ .withExecution("local")
30
33
  .withHandler(async (input) => testStubHandler(input)),
31
34
  capabilityFor("@executioncontrolprotocol/test", "translate")
32
35
  .withInput(TestStubInput)
33
36
  .withOutput(TestStubOutput)
37
+ .withExecution("local")
34
38
  .withHandler(async (input) => testStubHandler(input)),
35
39
  capabilityFor("@executioncontrolprotocol/test", "notify")
36
40
  .withInput(TestStubInput)
37
41
  .withOutput(TestStubOutput)
42
+ .withExecution("local")
38
43
  .withHandler(async (input) => testStubHandler(input)),
39
44
  capabilityFor("@executioncontrolprotocol/test", "validate")
40
45
  .withInput(TestStubInput)
41
46
  .withOutput(TestStubOutput)
47
+ .withExecution("local")
42
48
  .withHandler(async (input) => testStubHandler(input)),
43
49
  ])
44
50
  .build();
@@ -1 +1 @@
1
- {"version":3,"file":"test-extension.js","sourceRoot":"","sources":["../../src/testing/test-extension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-extension.js","sourceRoot":"","sources":["../../src/testing/test-extension.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
- import type { LifecycleEvent } from "@executioncontrolprotocol/types";
1
+ import type { LifecycleEvent, ValidationIssue } from "@executioncontrolprotocol/types";
2
2
  /** Recorded extension lifecycle hook events (reset via `resetLifecycleSpy()`). */
3
3
  export declare const lifecycleSpyEvents: LifecycleEvent[];
4
+ /** Diagnostics from the most recent `step:failed` hook invocation. */
5
+ export declare let lifecycleSpyLastStepFailedDiagnostics: ValidationIssue[] | undefined;
4
6
  /** Capability invocation count for spy capabilities. */
5
7
  export declare let capabilityInvokeCount: number;
6
8
  /** Reset spy state between tests. */
@@ -1 +1 @@
1
- {"version":3,"file":"test-lifecycle-extension.d.ts","sourceRoot":"","sources":["../../src/testing/test-lifecycle-extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAQrE,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,EAAE,cAAc,EAAO,CAAA;AAEtD,wDAAwD;AACxD,eAAO,IAAI,qBAAqB,QAAI,CAAA;AAEpC,qCAAqC;AACrC,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAQD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,2DAmCxB,CAAA;AAIV,2DAA2D;AAC3D,wBAAsB,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC,CAInE"}
1
+ {"version":3,"file":"test-lifecycle-extension.d.ts","sourceRoot":"","sources":["../../src/testing/test-lifecycle-extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAQtF,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,EAAE,cAAc,EAAO,CAAA;AAEtD,sEAAsE;AACtE,eAAO,IAAI,qCAAqC,EAAE,eAAe,EAAE,GAAG,SAAS,CAAA;AAE/E,wDAAwD;AACxD,eAAO,IAAI,qBAAqB,QAAI,CAAA;AAEpC,qCAAqC;AACrC,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAWD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,2DAmCxB,CAAA;AAIV,2DAA2D;AAC3D,wBAAsB,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC,CAInE"}
@@ -6,16 +6,22 @@ import { globalRegistry } from "../registry/registry.js";
6
6
  import { z } from "zod";
7
7
  /** Recorded extension lifecycle hook events (reset via `resetLifecycleSpy()`). */
8
8
  export const lifecycleSpyEvents = [];
9
+ /** Diagnostics from the most recent `step:failed` hook invocation. */
10
+ export let lifecycleSpyLastStepFailedDiagnostics;
9
11
  /** Capability invocation count for spy capabilities. */
10
12
  export let capabilityInvokeCount = 0;
11
13
  /** Reset spy state between tests. */
12
14
  export function resetLifecycleSpy() {
13
15
  lifecycleSpyEvents.length = 0;
16
+ lifecycleSpyLastStepFailedDiagnostics = undefined;
14
17
  capabilityInvokeCount = 0;
15
18
  }
16
19
  function spyHook(event) {
17
- return hook(event, async () => {
20
+ return hook(event, async (ctx) => {
18
21
  lifecycleSpyEvents.push(event);
22
+ if (event === "step:failed" && "diagnostics" in ctx) {
23
+ lifecycleSpyLastStepFailedDiagnostics = ctx.diagnostics;
24
+ }
19
25
  });
20
26
  }
21
27
  /** Lifecycle spy extension for conformance tests. @category Testing */
@@ -1 +1 @@
1
- {"version":3,"file":"test-lifecycle-extension.js","sourceRoot":"","sources":["../../src/testing/test-lifecycle-extension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-lifecycle-extension.js","sourceRoot":"","sources":["../../src/testing/test-lifecycle-extension.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/validate/environment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAGhH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAElE,oDAAoD;AACpD,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,qBAAqB,EACjC,QAAQ,EAAE,gBAAgB,GACzB,gBAAgB,CA0BlB"}
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/validate/environment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAGhH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AA8BlE,oDAAoD;AACpD,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,qBAAqB,EACjC,QAAQ,EAAE,gBAAgB,GACzB,gBAAgB,CA2BlB"}
@@ -1,18 +1,40 @@
1
1
  import { LATEST_ECP_VERSION } from "@executioncontrolprotocol/types";
2
2
  import { globalRegistry } from "../registry/registry.js";
3
3
  import { validateWorkflow } from "./workflow.js";
4
+ import { isBrowserRuntimeId, resolveCapabilityExecution, } from "../runtime/capability-execution.js";
5
+ /**
6
+ * Whether a bound extension may live in this environment runtime.
7
+ * Node-only packages are allowed on the browser when every capability is
8
+ * `host` or `mixed` (catalog + hop / mixed tab work).
9
+ */
10
+ function extensionCompatibleWithRuntime(extId, runtimeId) {
11
+ const def = globalRegistry.getExtension(extId);
12
+ const supported = def?.supportedRuntimes;
13
+ if (!supported?.length || supported.includes(runtimeId)) {
14
+ return true;
15
+ }
16
+ if (!isBrowserRuntimeId(runtimeId) || !def) {
17
+ return false;
18
+ }
19
+ // Browser may bind host/mixed catalogs that execute on `ecp up`.
20
+ return def.capabilities.every((cap) => {
21
+ const execution = resolveCapabilityExecution(cap, def);
22
+ return execution === "host" || execution === "mixed";
23
+ });
24
+ }
4
25
  /** Validate workflow against a live environment. */
5
26
  export function validateEnvironmentWithWorkflow(workflow, descriptor, bindings) {
6
27
  const result = validateWorkflow(workflow, descriptor);
7
28
  const rtId = String(bindings.runtime.id);
8
29
  for (const ext of bindings.extensions) {
9
- const def = globalRegistry.getExtension(String(ext.id));
10
- const supported = def?.supportedRuntimes;
11
- if (supported?.length && !supported.includes(rtId)) {
30
+ const id = String(ext.id);
31
+ if (!extensionCompatibleWithRuntime(id, rtId)) {
32
+ const def = globalRegistry.getExtension(id);
33
+ const supported = def?.supportedRuntimes ?? [];
12
34
  result.valid = false;
13
35
  result.errors.push({
14
36
  code: "UNSUPPORTED_RUNTIME_EXTENSION",
15
- message: `Extension ${ext.id} does not support runtime ${rtId}. Supported: ${supported.join(", ")}`,
37
+ message: `Extension ${id} does not support runtime ${rtId}. Supported: ${supported.join(", ")}`,
16
38
  });
17
39
  }
18
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/validate/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAGhD,oDAAoD;AACpD,MAAM,UAAU,+BAA+B,CAC7C,QAA0B,EAC1B,UAAiC,EACjC,QAA0B;IAE1B,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAExC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QACvD,MAAM,SAAS,GAAG,GAAG,EAAE,iBAAiB,CAAA;QACxC,IAAI,SAAS,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAkC,CAAC,EAAE,CAAC;YACjF,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;YACpB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,+BAA+B;gBACrC,OAAO,EAAE,aAAa,GAAG,CAAC,EAAE,6BAA6B,IAAI,gBAAgB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACpG,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAK,iCAAiC,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;QACpB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,yFAAyF;SACnG,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,CAAC,MAAM,GAAG,6CAA6C,CAAA;IAC7D,MAAM,CAAC,OAAO,GAAG,kBAAkB,CAAA;IACnC,OAAO,MAAM,CAAA;AACf,CAAC"}
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/validate/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,oCAAoC,CAAA;AAE3C;;;;GAIG;AACH,SAAS,8BAA8B,CACrC,KAAa,EACb,SAAiB;IAEjB,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,GAAG,EAAE,iBAAiB,CAAA;IACxC,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAuC,CAAC,EAAE,CAAC;QACtF,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAA;IACd,CAAC;IACD,iEAAiE;IACjE,OAAO,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACpC,MAAM,SAAS,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACtD,OAAO,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO,CAAA;IACtD,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,+BAA+B,CAC7C,QAA0B,EAC1B,UAAiC,EACjC,QAA0B;IAE1B,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAExC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzB,IAAI,CAAC,8BAA8B,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;YAC3C,MAAM,SAAS,GAAG,GAAG,EAAE,iBAAiB,IAAI,EAAE,CAAA;YAC9C,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;YACpB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,+BAA+B;gBACrC,OAAO,EAAE,aAAa,EAAE,6BAA6B,IAAI,gBAAgB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAChG,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAK,iCAAiC,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;QACpB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,yFAAyF;SACnG,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,CAAC,MAAM,GAAG,6CAA6C,CAAA;IAC7D,MAAM,CAAC,OAAO,GAAG,kBAAkB,CAAA;IACnC,OAAO,MAAM,CAAA;AACf,CAAC"}