@executioncontrolprotocol/format-eql 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +67 -0
  2. package/dist/decode/ast.d.ts +138 -0
  3. package/dist/decode/ast.d.ts.map +1 -0
  4. package/dist/decode/ast.js +2 -0
  5. package/dist/decode/ast.js.map +1 -0
  6. package/dist/decode/decode-eql.d.ts +9 -0
  7. package/dist/decode/decode-eql.d.ts.map +1 -0
  8. package/dist/decode/decode-eql.js +260 -0
  9. package/dist/decode/decode-eql.js.map +1 -0
  10. package/dist/decode/diagnostics.d.ts +10 -0
  11. package/dist/decode/diagnostics.d.ts.map +1 -0
  12. package/dist/decode/diagnostics.js +18 -0
  13. package/dist/decode/diagnostics.js.map +1 -0
  14. package/dist/decode/lexer.d.ts +5 -0
  15. package/dist/decode/lexer.d.ts.map +1 -0
  16. package/dist/decode/lexer.js +76 -0
  17. package/dist/decode/lexer.js.map +1 -0
  18. package/dist/decode/normalize-describe.d.ts +4 -0
  19. package/dist/decode/normalize-describe.d.ts.map +1 -0
  20. package/dist/decode/normalize-describe.js +42 -0
  21. package/dist/decode/normalize-describe.js.map +1 -0
  22. package/dist/decode/normalize-environment.d.ts +4 -0
  23. package/dist/decode/normalize-environment.d.ts.map +1 -0
  24. package/dist/decode/normalize-environment.js +43 -0
  25. package/dist/decode/normalize-environment.js.map +1 -0
  26. package/dist/decode/normalize-intent.d.ts +4 -0
  27. package/dist/decode/normalize-intent.d.ts.map +1 -0
  28. package/dist/decode/normalize-intent.js +10 -0
  29. package/dist/decode/normalize-intent.js.map +1 -0
  30. package/dist/decode/normalize-patch.d.ts +4 -0
  31. package/dist/decode/normalize-patch.d.ts.map +1 -0
  32. package/dist/decode/normalize-patch.js +119 -0
  33. package/dist/decode/normalize-patch.js.map +1 -0
  34. package/dist/decode/normalize-reply.d.ts +4 -0
  35. package/dist/decode/normalize-reply.d.ts.map +1 -0
  36. package/dist/decode/normalize-reply.js +18 -0
  37. package/dist/decode/normalize-reply.js.map +1 -0
  38. package/dist/decode/normalize-workflow.d.ts +4 -0
  39. package/dist/decode/normalize-workflow.d.ts.map +1 -0
  40. package/dist/decode/normalize-workflow.js +31 -0
  41. package/dist/decode/normalize-workflow.js.map +1 -0
  42. package/dist/decode/parser-environment.d.ts +9 -0
  43. package/dist/decode/parser-environment.d.ts.map +1 -0
  44. package/dist/decode/parser-environment.js +355 -0
  45. package/dist/decode/parser-environment.js.map +1 -0
  46. package/dist/decode/parser-harness.d.ts +5 -0
  47. package/dist/decode/parser-harness.d.ts.map +1 -0
  48. package/dist/decode/parser-harness.js +140 -0
  49. package/dist/decode/parser-harness.js.map +1 -0
  50. package/dist/decode/parser.d.ts +11 -0
  51. package/dist/decode/parser.d.ts.map +1 -0
  52. package/dist/decode/parser.js +372 -0
  53. package/dist/decode/parser.js.map +1 -0
  54. package/dist/decode/values.d.ts +24 -0
  55. package/dist/decode/values.d.ts.map +1 -0
  56. package/dist/decode/values.js +64 -0
  57. package/dist/decode/values.js.map +1 -0
  58. package/dist/encode/encode-describe.d.ts +5 -0
  59. package/dist/encode/encode-describe.d.ts.map +1 -0
  60. package/dist/encode/encode-describe.js +61 -0
  61. package/dist/encode/encode-describe.js.map +1 -0
  62. package/dist/encode/encode-environment.d.ts +5 -0
  63. package/dist/encode/encode-environment.d.ts.map +1 -0
  64. package/dist/encode/encode-environment.js +41 -0
  65. package/dist/encode/encode-environment.js.map +1 -0
  66. package/dist/encode/encode-eql.d.ts +9 -0
  67. package/dist/encode/encode-eql.d.ts.map +1 -0
  68. package/dist/encode/encode-eql.js +199 -0
  69. package/dist/encode/encode-eql.js.map +1 -0
  70. package/dist/encode/encode-intent.d.ts +5 -0
  71. package/dist/encode/encode-intent.d.ts.map +1 -0
  72. package/dist/encode/encode-intent.js +16 -0
  73. package/dist/encode/encode-intent.js.map +1 -0
  74. package/dist/encode/encode-patch.d.ts +5 -0
  75. package/dist/encode/encode-patch.d.ts.map +1 -0
  76. package/dist/encode/encode-patch.js +146 -0
  77. package/dist/encode/encode-patch.js.map +1 -0
  78. package/dist/encode/encode-reply.d.ts +5 -0
  79. package/dist/encode/encode-reply.d.ts.map +1 -0
  80. package/dist/encode/encode-reply.js +16 -0
  81. package/dist/encode/encode-reply.js.map +1 -0
  82. package/dist/encode/encode-workflow.d.ts +5 -0
  83. package/dist/encode/encode-workflow.d.ts.map +1 -0
  84. package/dist/encode/encode-workflow.js +39 -0
  85. package/dist/encode/encode-workflow.js.map +1 -0
  86. package/dist/encode/writer.d.ts +14 -0
  87. package/dist/encode/writer.d.ts.map +1 -0
  88. package/dist/encode/writer.js +56 -0
  89. package/dist/encode/writer.js.map +1 -0
  90. package/dist/extension.d.ts +3 -0
  91. package/dist/extension.d.ts.map +1 -0
  92. package/dist/extension.js +17 -0
  93. package/dist/extension.js.map +1 -0
  94. package/dist/index.d.ts +12 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +17 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/schemas.d.ts +34 -0
  99. package/dist/schemas.d.ts.map +1 -0
  100. package/dist/schemas.js +22 -0
  101. package/dist/schemas.js.map +1 -0
  102. package/dist/validate-environment.d.ts +323 -0
  103. package/dist/validate-environment.d.ts.map +1 -0
  104. package/dist/validate-environment.js +78 -0
  105. package/dist/validate-environment.js.map +1 -0
  106. package/dist/validate-harness.d.ts +2 -0
  107. package/dist/validate-harness.d.ts.map +1 -0
  108. package/dist/validate-harness.js +2 -0
  109. package/dist/validate-harness.js.map +1 -0
  110. package/package.json +33 -0
package/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # @executioncontrolprotocol/format-eql
2
+
3
+ ECP format extension for **EQL** (ECP Query Language): keyword-driven text for `@executioncontrolprotocol.workflow` and `@executioncontrolprotocol.patch` documents.
4
+
5
+ ## Capabilities
6
+
7
+ | Capability | Description |
8
+ | --------------------------------------------- | ------------------------------------------------------------- |
9
+ | `@executioncontrolprotocol/format-eql.encode` | Workflow, patch, environment, or describe document → EQL text |
10
+ | `@executioncontrolprotocol/format-eql.decode` | EQL text → workflow, patch, environment, or describe document |
11
+
12
+ Input/output types use generic `EncodeCapabilityInput` / `DecodeCapabilityInput` from `@executioncontrolprotocol/types`, with options `EcpFormatOptions & EqlFormatOptions`.
13
+
14
+ ## Options
15
+
16
+ | Option | Default | Description |
17
+ | ------------- | ------------------------ | ----------------------------------- |
18
+ | `headers` | `true` / `"auto"` | ECP header line emit or detection |
19
+ | `preserveIds` | `true` | Reserved for future use |
20
+ | `quote` | `"auto"` | String literal quoting mode |
21
+ | `indent` | `2` | Spaces per indentation level |
22
+
23
+ ## v1 scope
24
+
25
+ - Linear workflows (`STEP` lists only)
26
+ - Patch verbs: `UPDATE`, `ADD`, `DELETE`, `MOVE` with `WITH`, `LABEL`, `AS`, `MODE`
27
+ - Environment manifests (`ENVIRONMENT`, `RUNTIME`, `EXTENSION`, `POLICY`)
28
+ - Environment describe (`CAPABILITY`, `POLICY`, `WITH name:type`, `OUT name:type`)
29
+ - `REF` / `STATE` in workflow `WITH` clauses; basic `WHEN field == value`
30
+ - Line/column diagnostics on parse errors
31
+
32
+ **Not in v1:** `PARALLEL` / `BRANCH` / `LOOP`, `@executioncontrolprotocol.environment.search`, harness wiring.
33
+
34
+ ## Usage
35
+
36
+ Register the extension (tests or apps only— not part of core formats):
37
+
38
+ ```ts
39
+ import { registerFormatEqlExtension } from "@executioncontrolprotocol/format-eql"
40
+
41
+ await registerFormatEqlExtension()
42
+ ```
43
+
44
+ ```ts
45
+ const encoded = await ecp
46
+ .encode(manifest)
47
+ .uses("@executioncontrolprotocol/format-eql")
48
+ .with({ options: { headers: false } })
49
+ .process()
50
+
51
+ const decoded = await ecp
52
+ .decode(encoded.result)
53
+ .uses("@executioncontrolprotocol/format-eql")
54
+ .to("@executioncontrolprotocol.workflow")
55
+ .with({ options: { headers: false } })
56
+ .process()
57
+ ```
58
+
59
+ ## Tests
60
+
61
+ ```bash
62
+ npm run test:unit -- packages/extensions/format-eql/test
63
+ ```
64
+
65
+ Coverage threshold (≥90% lines/statements) applies to `packages/extensions/format-eql/src/**`.
66
+
67
+ See [docs/format-eql.md](../../docs/format-eql.md) for the full language spec.
@@ -0,0 +1,138 @@
1
+ import type { ExprValue, InputValue } from "@executioncontrolprotocol/types";
2
+ export interface EqlHeader {
3
+ schema: string;
4
+ version: string;
5
+ }
6
+ export interface EqlWorkflowDoc {
7
+ kind: "workflow";
8
+ header?: EqlHeader;
9
+ workflowId: string;
10
+ workflowLabel?: string;
11
+ steps: EqlStep[];
12
+ }
13
+ export interface EqlStep {
14
+ id: string;
15
+ uses: string;
16
+ label?: string;
17
+ with: Record<string, InputValue>;
18
+ as?: string;
19
+ mode?: string;
20
+ when?: ExprValue;
21
+ }
22
+ export interface EqlWorkflowUpdate {
23
+ label?: string;
24
+ }
25
+ export interface EqlPatchDoc {
26
+ kind: "patch";
27
+ header?: EqlHeader;
28
+ workflowId: string;
29
+ workflowUpdate?: EqlWorkflowUpdate;
30
+ updates: EqlStepUpdate[];
31
+ adds: EqlStepAdd[];
32
+ deletes: string[];
33
+ moves: EqlStepMove[];
34
+ }
35
+ export interface EqlStepUpdate {
36
+ stepId: string;
37
+ label?: string;
38
+ uses?: string;
39
+ with: Record<string, InputValue>;
40
+ as?: string;
41
+ mode?: string;
42
+ when?: ExprValue;
43
+ }
44
+ export interface EqlStepAdd {
45
+ stepId: string;
46
+ uses: string;
47
+ after?: string;
48
+ before?: string;
49
+ label?: string;
50
+ with: Record<string, InputValue>;
51
+ as?: string;
52
+ mode?: string;
53
+ when?: ExprValue;
54
+ }
55
+ export interface EqlStepMove {
56
+ stepId: string;
57
+ after?: string;
58
+ before?: string;
59
+ }
60
+ export interface EqlEnvironmentDoc {
61
+ kind: "environment";
62
+ header?: EqlHeader;
63
+ environmentId: string;
64
+ environmentLabel?: string;
65
+ runtime?: {
66
+ id: string;
67
+ label?: string;
68
+ config: Record<string, unknown>;
69
+ };
70
+ extensions: EqlBinding[];
71
+ policies: EqlBinding[];
72
+ }
73
+ export interface EqlBinding {
74
+ id: string;
75
+ order: number;
76
+ label?: string;
77
+ config: Record<string, unknown>;
78
+ }
79
+ export interface EqlDescribeDoc {
80
+ kind: "describe";
81
+ header?: EqlHeader;
82
+ environmentId: string;
83
+ environmentLabel?: string;
84
+ runtime?: {
85
+ id: string;
86
+ label?: string;
87
+ features: Record<string, boolean>;
88
+ };
89
+ extensions: EqlDescribeExtension[];
90
+ capabilities: EqlDescribeCapability[];
91
+ policies: EqlDescribePolicy[];
92
+ }
93
+ export interface EqlDescribeExtension {
94
+ id: string;
95
+ order: number;
96
+ label?: string;
97
+ capabilities: string[];
98
+ }
99
+ export interface EqlDescribeCapability {
100
+ id: string;
101
+ extension?: string;
102
+ label?: string;
103
+ inputs: Record<string, string>;
104
+ outputs: Record<string, string>;
105
+ }
106
+ export interface EqlDescribePolicy {
107
+ id: string;
108
+ label?: string;
109
+ summary?: string;
110
+ }
111
+ export interface EqlIntentDoc {
112
+ kind: "intent";
113
+ header?: EqlHeader;
114
+ intent: string;
115
+ /** Optional topic bucket. */
116
+ topic?: string;
117
+ /** Optional request summary. */
118
+ summary?: string;
119
+ }
120
+ export interface EqlReplyCitation {
121
+ kind: string;
122
+ id?: string;
123
+ detail?: string;
124
+ }
125
+ export interface EqlReplyDoc {
126
+ kind: "reply";
127
+ header?: EqlHeader;
128
+ answer: string;
129
+ citations: EqlReplyCitation[];
130
+ }
131
+ export type EqlDocument = EqlWorkflowDoc | EqlPatchDoc | EqlEnvironmentDoc | EqlDescribeDoc | EqlIntentDoc | EqlReplyDoc;
132
+ export interface ParsedLine {
133
+ line: number;
134
+ indent: number;
135
+ text: string;
136
+ tokens: string[];
137
+ }
138
+ //# sourceMappingURL=ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/decode/ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/decode/ast.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { type DecodeResult } from "@executioncontrolprotocol/types";
2
+ import { type UtilityCapabilityContext } from "@executioncontrolprotocol/core";
3
+ import type { EqlDecodeInput } from "../schemas.js";
4
+ /**
5
+ * Decode EQL text to an ECP document.
6
+ * @category Encoding
7
+ */
8
+ export declare function decodeFromEql(input: EqlDecodeInput, _ctx: UtilityCapabilityContext): DecodeResult;
9
+ //# sourceMappingURL=decode-eql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-eql.d.ts","sourceRoot":"","sources":["../../src/decode/decode-eql.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAA2D,KAAK,wBAAwB,EAAE,MAAM,gCAAgC,CAAA;AACvI,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAenD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,wBAAwB,GAC7B,YAAY,CA2Rd"}
@@ -0,0 +1,260 @@
1
+ import { ECP_ENCODING_ERROR_CODES, LATEST_ECP_VERSION, } from "@executioncontrolprotocol/types";
2
+ import { decodeFailure, ecpPatchDocumentSchema, validateWorkflow } from "@executioncontrolprotocol/core";
3
+ import { EQL_ERROR_CODES, eqlIssue } from "./diagnostics.js";
4
+ import { detectHeader, parseEql } from "./parser.js";
5
+ import { describeFromEql } from "./normalize-describe.js";
6
+ import { environmentFromEql } from "./normalize-environment.js";
7
+ import { intentFromEql } from "./normalize-intent.js";
8
+ import { patchFromEql } from "./normalize-patch.js";
9
+ import { replyFromEql } from "./normalize-reply.js";
10
+ import { workflowFromEql } from "./normalize-workflow.js";
11
+ import { environmentDescribeSchema, environmentManifestSchema, } from "../validate-environment.js";
12
+ import { ecpIntentSchema, harnessReplySchema } from "../validate-harness.js";
13
+ /**
14
+ * Decode EQL text to an ECP document.
15
+ * @category Encoding
16
+ */
17
+ export function decodeFromEql(input, _ctx) {
18
+ const content = String(input.input ?? "");
19
+ const headersOpt = input.options?.headers ?? "auto";
20
+ const detected = detectHeader(content);
21
+ const hasHeader = headersOpt === true ||
22
+ (headersOpt === "auto" && detected !== undefined);
23
+ let targetSchema = input.targetSchema;
24
+ if (hasHeader && detected) {
25
+ if (targetSchema && targetSchema !== detected.schema) {
26
+ return decodeFailure({
27
+ targetSchema,
28
+ diagnostics: [
29
+ eqlIssue(EQL_ERROR_CODES.UNSUPPORTED_SCHEMA, `EQL header schema ${detected.schema} does not match targetSchema ${targetSchema}`),
30
+ ],
31
+ });
32
+ }
33
+ targetSchema = detected.schema;
34
+ }
35
+ if (!targetSchema) {
36
+ return decodeFailure({
37
+ targetSchema: input.targetSchema,
38
+ diagnostics: [
39
+ eqlIssue(EQL_ERROR_CODES.MISSING_TARGET_SCHEMA, "Decode requires an ECP header or explicit targetSchema", "line:1"),
40
+ ],
41
+ });
42
+ }
43
+ const supportedDecodeSchemas = [
44
+ "@executioncontrolprotocol.workflow",
45
+ "@executioncontrolprotocol.patch",
46
+ "@executioncontrolprotocol.environment",
47
+ "@executioncontrolprotocol.environment.describe",
48
+ "@executioncontrolprotocol.intent",
49
+ "@executioncontrolprotocol.harness.reply",
50
+ ];
51
+ if (!supportedDecodeSchemas.includes(targetSchema)) {
52
+ return decodeFailure({
53
+ targetSchema,
54
+ diagnostics: [
55
+ eqlIssue(EQL_ERROR_CODES.UNSUPPORTED_SCHEMA, `EQL decode does not support schema: ${targetSchema}`),
56
+ ],
57
+ });
58
+ }
59
+ const parsed = parseEql(content);
60
+ if (parsed.issues.length > 0) {
61
+ return decodeFailure({
62
+ targetSchema,
63
+ diagnostics: parsed.issues,
64
+ });
65
+ }
66
+ if (!parsed.document) {
67
+ return decodeFailure({
68
+ targetSchema,
69
+ diagnostics: [eqlIssue(EQL_ERROR_CODES.SYNTAX, "Failed to parse EQL document")],
70
+ });
71
+ }
72
+ try {
73
+ if (parsed.document.kind === "environment") {
74
+ if (targetSchema !== "@executioncontrolprotocol.environment") {
75
+ return decodeFailure({
76
+ targetSchema,
77
+ diagnostics: [
78
+ eqlIssue(EQL_ERROR_CODES.UNSUPPORTED_SCHEMA, "EQL environment document does not match targetSchema"),
79
+ ],
80
+ });
81
+ }
82
+ const manifest = environmentFromEql(parsed.document);
83
+ const zod = environmentManifestSchema.safeParse(manifest);
84
+ if (!zod.success) {
85
+ return decodeFailure({
86
+ targetSchema,
87
+ diagnostics: zod.error.issues.map((i) => ({
88
+ severity: "error",
89
+ message: i.message,
90
+ path: i.path.join("."),
91
+ code: ECP_ENCODING_ERROR_CODES.FORMAT_DECODE_FAILED,
92
+ })),
93
+ });
94
+ }
95
+ return {
96
+ schema: "@executioncontrolprotocol.decode.result",
97
+ version: LATEST_ECP_VERSION,
98
+ success: true,
99
+ targetSchema,
100
+ result: manifest,
101
+ diagnostics: [],
102
+ };
103
+ }
104
+ if (parsed.document.kind === "describe") {
105
+ if (targetSchema !== "@executioncontrolprotocol.environment.describe") {
106
+ return decodeFailure({
107
+ targetSchema,
108
+ diagnostics: [
109
+ eqlIssue(EQL_ERROR_CODES.UNSUPPORTED_SCHEMA, "EQL describe document does not match targetSchema"),
110
+ ],
111
+ });
112
+ }
113
+ const descriptor = describeFromEql(parsed.document);
114
+ const zod = environmentDescribeSchema.safeParse(descriptor);
115
+ if (!zod.success) {
116
+ return decodeFailure({
117
+ targetSchema,
118
+ diagnostics: zod.error.issues.map((i) => ({
119
+ severity: "error",
120
+ message: i.message,
121
+ path: i.path.join("."),
122
+ code: ECP_ENCODING_ERROR_CODES.FORMAT_DECODE_FAILED,
123
+ })),
124
+ });
125
+ }
126
+ return {
127
+ schema: "@executioncontrolprotocol.decode.result",
128
+ version: LATEST_ECP_VERSION,
129
+ success: true,
130
+ targetSchema,
131
+ result: descriptor,
132
+ diagnostics: [],
133
+ };
134
+ }
135
+ if (parsed.document.kind === "intent") {
136
+ if (targetSchema !== "@executioncontrolprotocol.intent") {
137
+ return decodeFailure({
138
+ targetSchema,
139
+ diagnostics: [
140
+ eqlIssue(EQL_ERROR_CODES.UNSUPPORTED_SCHEMA, "EQL intent document does not match targetSchema"),
141
+ ],
142
+ });
143
+ }
144
+ const intent = intentFromEql(parsed.document);
145
+ const zod = ecpIntentSchema.safeParse(intent);
146
+ if (!zod.success) {
147
+ return decodeFailure({
148
+ targetSchema,
149
+ diagnostics: zod.error.issues.map((i) => ({
150
+ severity: "error",
151
+ message: i.message,
152
+ path: i.path.join("."),
153
+ code: ECP_ENCODING_ERROR_CODES.FORMAT_DECODE_FAILED,
154
+ })),
155
+ });
156
+ }
157
+ return {
158
+ schema: "@executioncontrolprotocol.decode.result",
159
+ version: LATEST_ECP_VERSION,
160
+ success: true,
161
+ targetSchema,
162
+ result: intent,
163
+ diagnostics: [],
164
+ };
165
+ }
166
+ if (parsed.document.kind === "reply") {
167
+ if (targetSchema !== "@executioncontrolprotocol.harness.reply") {
168
+ return decodeFailure({
169
+ targetSchema,
170
+ diagnostics: [
171
+ eqlIssue(EQL_ERROR_CODES.UNSUPPORTED_SCHEMA, "EQL reply document does not match targetSchema"),
172
+ ],
173
+ });
174
+ }
175
+ const reply = replyFromEql(parsed.document);
176
+ const zod = harnessReplySchema.safeParse(reply);
177
+ if (!zod.success) {
178
+ return decodeFailure({
179
+ targetSchema,
180
+ diagnostics: zod.error.issues.map((i) => ({
181
+ severity: "error",
182
+ message: i.message,
183
+ path: i.path.join("."),
184
+ code: ECP_ENCODING_ERROR_CODES.FORMAT_DECODE_FAILED,
185
+ })),
186
+ });
187
+ }
188
+ return {
189
+ schema: "@executioncontrolprotocol.decode.result",
190
+ version: LATEST_ECP_VERSION,
191
+ success: true,
192
+ targetSchema,
193
+ result: reply,
194
+ diagnostics: [],
195
+ };
196
+ }
197
+ if (parsed.document.kind === "workflow") {
198
+ if (targetSchema !== "@executioncontrolprotocol.workflow") {
199
+ return decodeFailure({
200
+ targetSchema,
201
+ diagnostics: [
202
+ eqlIssue(EQL_ERROR_CODES.UNSUPPORTED_SCHEMA, "EQL workflow document does not match targetSchema"),
203
+ ],
204
+ });
205
+ }
206
+ const manifest = workflowFromEql(parsed.document);
207
+ const validation = validateWorkflow(manifest);
208
+ return {
209
+ schema: "@executioncontrolprotocol.decode.result",
210
+ version: LATEST_ECP_VERSION,
211
+ success: validation.valid,
212
+ targetSchema,
213
+ result: manifest,
214
+ validation,
215
+ diagnostics: validation.valid
216
+ ? []
217
+ : [...validation.errors, ...validation.warnings],
218
+ };
219
+ }
220
+ if (targetSchema !== "@executioncontrolprotocol.patch") {
221
+ return decodeFailure({
222
+ targetSchema,
223
+ diagnostics: [
224
+ eqlIssue(EQL_ERROR_CODES.UNSUPPORTED_SCHEMA, "EQL patch document does not match targetSchema"),
225
+ ],
226
+ });
227
+ }
228
+ const patchDoc = patchFromEql(parsed.document);
229
+ const zod = ecpPatchDocumentSchema.safeParse(patchDoc);
230
+ if (!zod.success) {
231
+ return decodeFailure({
232
+ targetSchema,
233
+ diagnostics: zod.error.issues.map((i) => ({
234
+ severity: "error",
235
+ message: i.message,
236
+ path: i.path.join("."),
237
+ code: ECP_ENCODING_ERROR_CODES.FORMAT_DECODE_FAILED,
238
+ })),
239
+ });
240
+ }
241
+ return {
242
+ schema: "@executioncontrolprotocol.decode.result",
243
+ version: LATEST_ECP_VERSION,
244
+ success: true,
245
+ targetSchema,
246
+ result: patchDoc,
247
+ diagnostics: [],
248
+ };
249
+ }
250
+ catch (err) {
251
+ const message = err instanceof Error ? err.message : String(err);
252
+ return decodeFailure({
253
+ targetSchema,
254
+ diagnostics: [
255
+ eqlIssue(ECP_ENCODING_ERROR_CODES.FORMAT_DECODE_FAILED, message),
256
+ ],
257
+ });
258
+ }
259
+ }
260
+ //# sourceMappingURL=decode-eql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-eql.js","sourceRoot":"","sources":["../../src/decode/decode-eql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ValidationIssue } from "@executioncontrolprotocol/types";
2
+ export declare const EQL_ERROR_CODES: {
3
+ readonly SYNTAX: "EQL_SYNTAX";
4
+ readonly UNSUPPORTED_SCHEMA: "EQL_UNSUPPORTED_SCHEMA";
5
+ readonly MISSING_TARGET_SCHEMA: "EQL_MISSING_TARGET_SCHEMA";
6
+ readonly UNSUPPORTED_NODE: "EQL_UNSUPPORTED_NODE";
7
+ };
8
+ export declare function eqlSyntaxIssue(line: number, message: string): ValidationIssue;
9
+ export declare function eqlIssue(code: string, message: string, path?: string): ValidationIssue;
10
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/decode/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEtE,eAAO,MAAM,eAAe;;;;;CAKlB,CAAA;AAEV,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAO7E;AAED,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,GACZ,eAAe,CAEjB"}
@@ -0,0 +1,18 @@
1
+ export const EQL_ERROR_CODES = {
2
+ SYNTAX: "EQL_SYNTAX",
3
+ UNSUPPORTED_SCHEMA: "EQL_UNSUPPORTED_SCHEMA",
4
+ MISSING_TARGET_SCHEMA: "EQL_MISSING_TARGET_SCHEMA",
5
+ UNSUPPORTED_NODE: "EQL_UNSUPPORTED_NODE",
6
+ };
7
+ export function eqlSyntaxIssue(line, message) {
8
+ return {
9
+ severity: "error",
10
+ code: EQL_ERROR_CODES.SYNTAX,
11
+ message,
12
+ path: `line:${line}`,
13
+ };
14
+ }
15
+ export function eqlIssue(code, message, path) {
16
+ return { severity: "error", code, message, path };
17
+ }
18
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/decode/diagnostics.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAE,YAAY;IACpB,kBAAkB,EAAE,wBAAwB;IAC5C,qBAAqB,EAAE,2BAA2B;IAClD,gBAAgB,EAAE,sBAAsB;CAChC,CAAA;AAEV,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe;IAC1D,OAAO;QACL,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,eAAe,CAAC,MAAM;QAC5B,OAAO;QACP,IAAI,EAAE,QAAQ,IAAI,EAAE;KACrB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,IAAY,EACZ,OAAe,EACf,IAAa;IAEb,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACnD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ParsedLine } from "./ast.js";
2
+ /** Split a line into tokens respecting quoted strings. */
3
+ export declare function tokenizeLine(text: string): string[];
4
+ export declare function parseLines(text: string): ParsedLine[];
5
+ //# sourceMappingURL=lexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../../src/decode/lexer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqDnD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAgBrD"}
@@ -0,0 +1,76 @@
1
+ /** Split a line into tokens respecting quoted strings. */
2
+ export function tokenizeLine(text) {
3
+ const tokens = [];
4
+ let i = 0;
5
+ while (i < text.length) {
6
+ while (i < text.length && /\s/.test(text[i]))
7
+ i++;
8
+ if (i >= text.length)
9
+ break;
10
+ const ch = text[i];
11
+ if (ch === '"' || ch === "'") {
12
+ const quote = ch;
13
+ let j = i + 1;
14
+ let value = quote;
15
+ while (j < text.length) {
16
+ if (text[j] === "\\" && j + 1 < text.length) {
17
+ value += text[j] + text[j + 1];
18
+ j += 2;
19
+ continue;
20
+ }
21
+ value += text[j];
22
+ if (text[j] === quote) {
23
+ j++;
24
+ break;
25
+ }
26
+ j++;
27
+ }
28
+ tokens.push(value);
29
+ i = j;
30
+ continue;
31
+ }
32
+ if (ch === "{" || ch === "[") {
33
+ let depth = 0;
34
+ let j = i;
35
+ for (; j < text.length; j++) {
36
+ const c = text[j];
37
+ if (c === "{" || c === "[")
38
+ depth++;
39
+ if (c === "}" || c === "]")
40
+ depth--;
41
+ if (depth === 0) {
42
+ j++;
43
+ break;
44
+ }
45
+ }
46
+ tokens.push(text.slice(i, j));
47
+ i = j;
48
+ continue;
49
+ }
50
+ let j = i;
51
+ while (j < text.length && !/\s/.test(text[j]))
52
+ j++;
53
+ tokens.push(text.slice(i, j));
54
+ i = j;
55
+ }
56
+ return tokens;
57
+ }
58
+ export function parseLines(text) {
59
+ const lines = [];
60
+ const rawLines = text.replace(/\r\n/g, "\n").split("\n");
61
+ for (let i = 0; i < rawLines.length; i++) {
62
+ const raw = rawLines[i];
63
+ const trimmed = raw.trim();
64
+ if (trimmed.length === 0 || trimmed.startsWith("#"))
65
+ continue;
66
+ const indent = raw.match(/^\s*/)?.[0].length ?? 0;
67
+ lines.push({
68
+ line: i + 1,
69
+ indent,
70
+ text: trimmed,
71
+ tokens: tokenizeLine(trimmed),
72
+ });
73
+ }
74
+ return lines;
75
+ }
76
+ //# sourceMappingURL=lexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../src/decode/lexer.ts"],"names":[],"mappings":"AAEA,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;YAAE,CAAC,EAAE,CAAA;QAClD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,MAAK;QAE3B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QACnB,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,EAAE,CAAA;YAChB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACb,IAAI,KAAK,GAAG,KAAK,CAAA;YACjB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC5C,KAAK,IAAI,IAAI,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA;oBAChC,CAAC,IAAI,CAAC,CAAA;oBACN,SAAQ;gBACV,CAAC;gBACD,KAAK,IAAI,IAAI,CAAC,CAAC,CAAE,CAAA;gBACjB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;oBACtB,CAAC,EAAE,CAAA;oBACH,MAAK;gBACP,CAAC;gBACD,CAAC,EAAE,CAAA;YACL,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,CAAC,GAAG,CAAC,CAAA;YACL,SAAQ;QACV,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,IAAI,KAAK,GAAG,CAAC,CAAA;YACb,IAAI,CAAC,GAAG,CAAC,CAAA;YACT,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;gBAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;oBAAE,KAAK,EAAE,CAAA;gBACnC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;oBAAE,KAAK,EAAE,CAAA;gBACnC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAChB,CAAC,EAAE,CAAA;oBACH,MAAK;gBACP,CAAC;YACH,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC7B,CAAC,GAAG,CAAC,CAAA;YACL,SAAQ;QACV,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;YAAE,CAAC,EAAE,CAAA;QACnD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC7B,CAAC,GAAG,CAAC,CAAA;IACP,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAiB,EAAE,CAAA;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;QACxB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;QAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAC7D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAA;QACjD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,CAAC,GAAG,CAAC;YACX,MAAM;YACN,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type EnvironmentDescriptor } from "@executioncontrolprotocol/types";
2
+ import type { EqlDescribeDoc } from "./ast.js";
3
+ export declare function describeFromEql(doc: EqlDescribeDoc): EnvironmentDescriptor;
4
+ //# sourceMappingURL=normalize-describe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-describe.d.ts","sourceRoot":"","sources":["../../src/decode/normalize-describe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAU9C,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,qBAAqB,CAgC1E"}