@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.
- package/README.md +25 -1
- package/dist/browser-runtime-entry.d.ts +11 -2
- package/dist/browser-runtime-entry.d.ts.map +1 -1
- package/dist/browser-runtime-entry.js +10 -1
- package/dist/browser-runtime-entry.js.map +1 -1
- package/dist/compile/transpile-browser.d.ts +25 -2
- package/dist/compile/transpile-browser.d.ts.map +1 -1
- package/dist/compile/transpile-browser.js +32 -5
- package/dist/compile/transpile-browser.js.map +1 -1
- package/dist/compile/transpile.d.ts +6 -0
- package/dist/compile/transpile.d.ts.map +1 -1
- package/dist/compile/transpile.js +19 -8
- package/dist/compile/transpile.js.map +1 -1
- package/dist/definitions/capability.d.ts +4 -1
- package/dist/definitions/capability.d.ts.map +1 -1
- package/dist/definitions/capability.js +7 -0
- package/dist/definitions/capability.js.map +1 -1
- package/dist/definitions/types.d.ts +3 -1
- package/dist/definitions/types.d.ts.map +1 -1
- package/dist/encoding/normalize-workflow.d.ts.map +1 -1
- package/dist/encoding/normalize-workflow.js +2 -0
- package/dist/encoding/normalize-workflow.js.map +1 -1
- package/dist/encoding/schemas.d.ts +26 -26
- package/dist/environment/describe.d.ts +1 -2
- package/dist/environment/describe.d.ts.map +1 -1
- package/dist/environment/describe.js +2 -0
- package/dist/environment/describe.js.map +1 -1
- package/dist/environment/ecp.d.ts +8 -0
- package/dist/environment/ecp.d.ts.map +1 -1
- package/dist/environment/ecp.js +12 -0
- package/dist/environment/ecp.js.map +1 -1
- package/dist/environment/environment.d.ts +31 -0
- package/dist/environment/environment.d.ts.map +1 -1
- package/dist/environment/environment.js +73 -1
- package/dist/environment/environment.js.map +1 -1
- package/dist/file/file-ref.d.ts +28 -0
- package/dist/file/file-ref.d.ts.map +1 -0
- package/dist/{image/image-ref.js → file/file-ref.js} +20 -20
- package/dist/file/file-ref.js.map +1 -0
- package/dist/fluent/render-workflow.d.ts +1 -1
- package/dist/fluent/render-workflow.d.ts.map +1 -1
- package/dist/fluent/render-workflow.js +10 -2
- package/dist/fluent/render-workflow.js.map +1 -1
- package/dist/harness/authoring/context-policy.d.ts.map +1 -1
- package/dist/harness/authoring/context-policy.js +2 -2
- package/dist/harness/authoring/context-policy.js.map +1 -1
- package/dist/harness/authoring/index.d.ts +1 -1
- package/dist/harness/authoring/index.d.ts.map +1 -1
- package/dist/harness/authoring/index.js +1 -1
- package/dist/harness/authoring/index.js.map +1 -1
- package/dist/harness/authoring/summarize-capability-schema.d.ts.map +1 -1
- package/dist/harness/authoring/summarize-capability-schema.js +14 -10
- package/dist/harness/authoring/summarize-capability-schema.js.map +1 -1
- package/dist/harness/authoring/summarize-environment.d.ts +11 -0
- package/dist/harness/authoring/summarize-environment.d.ts.map +1 -1
- package/dist/harness/authoring/summarize-environment.js +55 -10
- package/dist/harness/authoring/summarize-environment.js.map +1 -1
- package/dist/harness/authoring/summarize-workflow.d.ts +2 -0
- package/dist/harness/authoring/summarize-workflow.d.ts.map +1 -1
- package/dist/harness/authoring/summarize-workflow.js +40 -1
- package/dist/harness/authoring/summarize-workflow.js.map +1 -1
- package/dist/harness/execute-harness.d.ts.map +1 -1
- package/dist/harness/execute-harness.js +14 -10
- package/dist/harness/execute-harness.js.map +1 -1
- package/dist/harness/prompts/eql-primer.d.ts +1 -0
- package/dist/harness/prompts/eql-primer.d.ts.map +1 -1
- package/dist/harness/prompts/eql-primer.js +22 -0
- package/dist/harness/prompts/eql-primer.js.map +1 -1
- package/dist/harness/prompts/typescript-primer.d.ts.map +1 -1
- package/dist/harness/prompts/typescript-primer.js +15 -3
- package/dist/harness/prompts/typescript-primer.js.map +1 -1
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/invoke/execute-invoke.d.ts.map +1 -1
- package/dist/invoke/execute-invoke.js +20 -6
- package/dist/invoke/execute-invoke.js.map +1 -1
- package/dist/loaders/files.d.ts.map +1 -1
- package/dist/loaders/files.js +4 -2
- package/dist/loaders/files.js.map +1 -1
- package/dist/loaders/read-media-file.d.ts +6 -0
- package/dist/loaders/read-media-file.d.ts.map +1 -0
- package/dist/loaders/read-media-file.js +10 -0
- package/dist/loaders/read-media-file.js.map +1 -0
- package/dist/media/artifact-filename.d.ts +41 -0
- package/dist/media/artifact-filename.d.ts.map +1 -0
- package/dist/media/artifact-filename.js +119 -0
- package/dist/media/artifact-filename.js.map +1 -0
- package/dist/media/assert-media-type.d.ts +11 -0
- package/dist/media/assert-media-type.d.ts.map +1 -0
- package/dist/media/assert-media-type.js +43 -0
- package/dist/media/assert-media-type.js.map +1 -0
- package/dist/media/index.d.ts +13 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +13 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/resolve-file.d.ts +32 -0
- package/dist/media/resolve-file.d.ts.map +1 -0
- package/dist/media/resolve-file.js +110 -0
- package/dist/media/resolve-file.js.map +1 -0
- package/dist/media/write-media.d.ts +19 -0
- package/dist/media/write-media.d.ts.map +1 -0
- package/dist/media/write-media.js +46 -0
- package/dist/media/write-media.js.map +1 -0
- package/dist/patch/patch-document.d.ts +2 -2
- package/dist/runtime/artifacts.d.ts +31 -0
- package/dist/runtime/artifacts.d.ts.map +1 -0
- package/dist/runtime/artifacts.js +26 -0
- package/dist/runtime/artifacts.js.map +1 -0
- package/dist/runtime/blobs.d.ts +72 -0
- package/dist/runtime/blobs.d.ts.map +1 -0
- package/dist/runtime/blobs.js +129 -0
- package/dist/runtime/blobs.js.map +1 -0
- package/dist/runtime/capability-execution.d.ts +22 -0
- package/dist/runtime/capability-execution.d.ts.map +1 -0
- package/dist/runtime/capability-execution.js +25 -0
- package/dist/runtime/capability-execution.js.map +1 -0
- package/dist/runtime/context.d.ts +9 -1
- package/dist/runtime/context.d.ts.map +1 -1
- package/dist/runtime/context.js.map +1 -1
- package/dist/runtime/dispatch-capability.d.ts +42 -0
- package/dist/runtime/dispatch-capability.d.ts.map +1 -0
- package/dist/runtime/dispatch-capability.js +94 -0
- package/dist/runtime/dispatch-capability.js.map +1 -0
- package/dist/runtime/executor.d.ts +9 -0
- package/dist/runtime/executor.d.ts.map +1 -1
- package/dist/runtime/in-memory-executor.d.ts.map +1 -1
- package/dist/runtime/in-memory-executor.js +70 -10
- package/dist/runtime/in-memory-executor.js.map +1 -1
- package/dist/runtime/mixed-blob-upload.d.ts +37 -0
- package/dist/runtime/mixed-blob-upload.d.ts.map +1 -0
- package/dist/runtime/mixed-blob-upload.js +65 -0
- package/dist/runtime/mixed-blob-upload.js.map +1 -0
- package/dist/runtime/remote-invoke.d.ts +21 -0
- package/dist/runtime/remote-invoke.d.ts.map +1 -0
- package/dist/runtime/remote-invoke.js +83 -0
- package/dist/runtime/remote-invoke.js.map +1 -0
- package/dist/runtime/runtime-ids.d.ts +5 -0
- package/dist/runtime/runtime-ids.d.ts.map +1 -0
- package/dist/runtime/runtime-ids.js +5 -0
- package/dist/runtime/runtime-ids.js.map +1 -0
- package/dist/schema/json-schema.d.ts +47 -0
- package/dist/schema/json-schema.d.ts.map +1 -0
- package/dist/schema/json-schema.js +209 -0
- package/dist/schema/json-schema.js.map +1 -0
- package/dist/schema/workflow-io.d.ts +18 -0
- package/dist/schema/workflow-io.d.ts.map +1 -0
- package/dist/schema/workflow-io.js +33 -0
- package/dist/schema/workflow-io.js.map +1 -0
- package/dist/testing/test-extension.d.ts.map +1 -1
- package/dist/testing/test-extension.js +6 -0
- package/dist/testing/test-extension.js.map +1 -1
- package/dist/testing/test-lifecycle-extension.d.ts +3 -1
- package/dist/testing/test-lifecycle-extension.d.ts.map +1 -1
- package/dist/testing/test-lifecycle-extension.js +7 -1
- package/dist/testing/test-lifecycle-extension.js.map +1 -1
- package/dist/validate/environment.d.ts.map +1 -1
- package/dist/validate/environment.js +26 -4
- package/dist/validate/environment.js.map +1 -1
- package/dist/validate/workflow-schema.d.ts +16 -6
- package/dist/validate/workflow-schema.d.ts.map +1 -1
- package/dist/validate/workflow-schema.js +2 -0
- package/dist/validate/workflow-schema.js.map +1 -1
- package/dist/workflow/builder.d.ts +13 -0
- package/dist/workflow/builder.d.ts.map +1 -1
- package/dist/workflow/builder.js +40 -0
- package/dist/workflow/builder.js.map +1 -1
- package/fixtures/schema-examples/workflow.output.eql +6 -2
- package/fixtures/schema-examples/workflow.output.json +17 -3
- package/package.json +6 -6
- package/dist/image/image-ref.d.ts +0 -28
- package/dist/image/image-ref.d.ts.map +0 -1
- 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 @@
|
|
|
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,
|
|
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;
|
|
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":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,kFAAkF;AAClF,MAAM,CAAC,MAAM,kBAAkB,GAAqB,EAAE,CAAA;AAEtD,wDAAwD;AACxD,MAAM,CAAC,IAAI,qBAAqB,GAAG,CAAC,CAAA;AAEpC,qCAAqC;AACrC,MAAM,UAAU,iBAAiB;IAC/B,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAA;IAC7B,qBAAqB,GAAG,CAAC,CAAA;AAC3B,CAAC;AAED,SAAS,OAAO,CAAC,KAAqB;IACpC,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"test-lifecycle-extension.js","sourceRoot":"","sources":["../../src/testing/test-lifecycle-extension.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,kFAAkF;AAClF,MAAM,CAAC,MAAM,kBAAkB,GAAqB,EAAE,CAAA;AAEtD,sEAAsE;AACtE,MAAM,CAAC,IAAI,qCAAoE,CAAA;AAE/E,wDAAwD;AACxD,MAAM,CAAC,IAAI,qBAAqB,GAAG,CAAC,CAAA;AAEpC,qCAAqC;AACrC,MAAM,UAAU,iBAAiB;IAC/B,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAA;IAC7B,qCAAqC,GAAG,SAAS,CAAA;IACjD,qBAAqB,GAAG,CAAC,CAAA;AAC3B,CAAC;AAED,SAAS,OAAO,CAAC,KAAqB;IACpC,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC/B,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,KAAK,KAAK,aAAa,IAAI,aAAa,IAAI,GAAG,EAAE,CAAC;YACpD,qCAAqC,GAAG,GAAG,CAAC,WAAW,CAAA;QACzD,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC,2BAA2B,EAAE,eAAe,CAAC;KAC/F,UAAU,CAAC,EAAE,CAAC;KACd,gBAAgB,CAAC;IAChB,aAAa,CAAC,yCAAyC,EAAE,MAAM,CAAC;SAC7D,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;SACtD,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SAC3C,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC3B,qBAAqB,EAAE,CAAA;QACvB,OAAO,EAAE,IAAI,EAAG,KAA6B,CAAC,KAAK,IAAI,IAAI,EAAE,CAAA;IAC/D,CAAC,CAAC;IACJ,aAAa,CAAC,yCAAyC,EAAE,OAAO,CAAC;SAC9D,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACvB,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACxB,WAAW,CAAC,KAAK,IAAI,EAAE;QACtB,qBAAqB,EAAE,CAAA;QACvB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACtC,CAAC,CAAC;IACJ,aAAa,CAAC,yCAAyC,EAAE,aAAa,CAAC;SACpE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SAC5C,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SACzC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAChC,qBAAqB,EAAE,CAAA;QACvB,MAAM,MAAM,GAAI,KAAyG;aACtH,MAAM,CAAA;QACT,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IACrB,CAAC,CAAC;CACL,CAAC;KACD,SAAS,CAAC;IACT,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,gBAAgB,CAAC;IACzB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,cAAc,CAAC;CACxB,CAAC;KACD,KAAK,EAAE,CAAA;AAEV,gBAAgB,CAAC,qBAAqB,CAAC,CAAA;AAEvC,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,6BAA6B;IACjD,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,yCAAyC,CAAC,EAAE,CAAC;QAC5E,MAAM,cAAc,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -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;
|
|
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
|
|
10
|
-
|
|
11
|
-
|
|
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 ${
|
|
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;
|
|
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"}
|