@tagma/sdk 0.6.5 → 0.6.7
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 +66 -1
- package/package.json +2 -2
- package/src/engine-ports.test.ts +1 -1
- package/dist/dag.test.d.ts +0 -2
- package/dist/dag.test.d.ts.map +0 -1
- package/dist/dag.test.js +0 -42
- package/dist/dag.test.js.map +0 -1
- package/dist/engine-ports.test.d.ts +0 -2
- package/dist/engine-ports.test.d.ts.map +0 -1
- package/dist/engine-ports.test.js +0 -378
- package/dist/engine-ports.test.js.map +0 -1
- package/dist/plugin-registry.test.d.ts +0 -2
- package/dist/plugin-registry.test.d.ts.map +0 -1
- package/dist/plugin-registry.test.js +0 -188
- package/dist/plugin-registry.test.js.map +0 -1
- package/dist/ports.test.d.ts +0 -2
- package/dist/ports.test.d.ts.map +0 -1
- package/dist/ports.test.js +0 -262
- package/dist/ports.test.js.map +0 -1
- package/dist/prompt-doc.test.d.ts +0 -2
- package/dist/prompt-doc.test.d.ts.map +0 -1
- package/dist/prompt-doc.test.js +0 -145
- package/dist/prompt-doc.test.js.map +0 -1
- package/dist/runner.test.d.ts +0 -2
- package/dist/runner.test.d.ts.map +0 -1
- package/dist/runner.test.js +0 -119
- package/dist/runner.test.js.map +0 -1
- package/dist/schema-ports.test.d.ts +0 -2
- package/dist/schema-ports.test.d.ts.map +0 -1
- package/dist/schema-ports.test.js +0 -219
- package/dist/schema-ports.test.js.map +0 -1
- package/dist/schema.test.d.ts +0 -2
- package/dist/schema.test.d.ts.map +0 -1
- package/dist/schema.test.js +0 -94
- package/dist/schema.test.js.map +0 -1
- package/dist/task-ref.test.d.ts +0 -2
- package/dist/task-ref.test.d.ts.map +0 -1
- package/dist/task-ref.test.js +0 -364
- package/dist/task-ref.test.js.map +0 -1
- package/dist/validate-raw-ports.test.d.ts +0 -2
- package/dist/validate-raw-ports.test.d.ts.map +0 -1
- package/dist/validate-raw-ports.test.js +0 -157
- package/dist/validate-raw-ports.test.js.map +0 -1
package/dist/task-ref.test.js
DELETED
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'bun:test';
|
|
2
|
-
import { TASK_ID_RE, isValidTaskId, qualifyTaskId, isQualifiedRef, buildTaskIndex, resolveTaskRef, AMBIGUOUS, } from './task-ref';
|
|
3
|
-
import { buildDag, buildRawDag } from './dag';
|
|
4
|
-
import { validateRaw } from './validate-raw';
|
|
5
|
-
// ═══ Low-level helpers ═══
|
|
6
|
-
describe('isValidTaskId', () => {
|
|
7
|
-
test('accepts letter-led ids with letters, digits, underscores, hyphens', () => {
|
|
8
|
-
for (const id of ['a', 'A', '_', 'task_1', 'Task-2', '_private', 'a_b-c_1']) {
|
|
9
|
-
expect(isValidTaskId(id)).toBe(true);
|
|
10
|
-
expect(TASK_ID_RE.test(id)).toBe(true);
|
|
11
|
-
}
|
|
12
|
-
});
|
|
13
|
-
test('rejects empty, digit-led, dot-bearing, and whitespace forms', () => {
|
|
14
|
-
for (const id of ['', '1task', 'a.b', 'foo bar', '-leading', 'has/slash', 'dot.']) {
|
|
15
|
-
expect(isValidTaskId(id)).toBe(false);
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
test('rejects non-string values', () => {
|
|
19
|
-
expect(isValidTaskId(null)).toBe(false);
|
|
20
|
-
expect(isValidTaskId(undefined)).toBe(false);
|
|
21
|
-
expect(isValidTaskId(42)).toBe(false);
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
describe('qualifyTaskId + isQualifiedRef', () => {
|
|
25
|
-
test('qualifyTaskId joins with dot; isQualifiedRef detects dotted form', () => {
|
|
26
|
-
expect(qualifyTaskId('alpha', 'review')).toBe('alpha.review');
|
|
27
|
-
expect(isQualifiedRef('alpha.review')).toBe(true);
|
|
28
|
-
expect(isQualifiedRef('review')).toBe(false);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
// ═══ Index build ═══
|
|
32
|
-
describe('buildTaskIndex', () => {
|
|
33
|
-
test('collects all qualified ids and unique bare ids', () => {
|
|
34
|
-
const cfg = {
|
|
35
|
-
name: 'T',
|
|
36
|
-
tracks: [
|
|
37
|
-
{ id: 'alpha', name: 'A', tasks: [{ id: 'plan', prompt: 'p' }] },
|
|
38
|
-
{ id: 'beta', name: 'B', tasks: [{ id: 'ship', prompt: 'p' }] },
|
|
39
|
-
],
|
|
40
|
-
};
|
|
41
|
-
const idx = buildTaskIndex(cfg);
|
|
42
|
-
expect(idx.allQualified.has('alpha.plan')).toBe(true);
|
|
43
|
-
expect(idx.allQualified.has('beta.ship')).toBe(true);
|
|
44
|
-
expect(idx.bareToQualified.get('plan')).toBe('alpha.plan');
|
|
45
|
-
expect(idx.bareToQualified.get('ship')).toBe('beta.ship');
|
|
46
|
-
});
|
|
47
|
-
test('marks bare ids shared across tracks as ambiguous', () => {
|
|
48
|
-
const cfg = {
|
|
49
|
-
name: 'T',
|
|
50
|
-
tracks: [
|
|
51
|
-
{ id: 'alpha', name: 'A', tasks: [{ id: 'review', prompt: 'p' }] },
|
|
52
|
-
{ id: 'beta', name: 'B', tasks: [{ id: 'review', prompt: 'p' }] },
|
|
53
|
-
],
|
|
54
|
-
};
|
|
55
|
-
const idx = buildTaskIndex(cfg);
|
|
56
|
-
expect(idx.bareToQualified.get('review')).toBe(AMBIGUOUS);
|
|
57
|
-
expect(idx.allQualified.has('alpha.review')).toBe(true);
|
|
58
|
-
expect(idx.allQualified.has('beta.review')).toBe(true);
|
|
59
|
-
});
|
|
60
|
-
test('tolerates tracks/tasks missing ids (editor in-progress state)', () => {
|
|
61
|
-
const cfg = {
|
|
62
|
-
name: 'T',
|
|
63
|
-
tracks: [
|
|
64
|
-
{ id: '', name: 'half-typed', tasks: [{ id: 'x', prompt: 'p' }] },
|
|
65
|
-
{ id: 'ok', name: 'OK', tasks: [{ id: '', prompt: 'p' }, { id: 'y', prompt: 'p' }] },
|
|
66
|
-
],
|
|
67
|
-
};
|
|
68
|
-
const idx = buildTaskIndex(cfg);
|
|
69
|
-
expect(idx.allQualified.size).toBe(1);
|
|
70
|
-
expect(idx.allQualified.has('ok.y')).toBe(true);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
// ═══ Ref resolution ═══
|
|
74
|
-
describe('resolveTaskRef', () => {
|
|
75
|
-
const cfg = {
|
|
76
|
-
name: 'T',
|
|
77
|
-
tracks: [
|
|
78
|
-
{
|
|
79
|
-
id: 'alpha',
|
|
80
|
-
name: 'A',
|
|
81
|
-
tasks: [
|
|
82
|
-
{ id: 'plan', prompt: 'p' },
|
|
83
|
-
{ id: 'review', prompt: 'p' },
|
|
84
|
-
],
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
id: 'beta',
|
|
88
|
-
name: 'B',
|
|
89
|
-
tasks: [
|
|
90
|
-
{ id: 'review', prompt: 'p' },
|
|
91
|
-
{ id: 'ship', prompt: 'p' },
|
|
92
|
-
],
|
|
93
|
-
},
|
|
94
|
-
],
|
|
95
|
-
};
|
|
96
|
-
const idx = buildTaskIndex(cfg);
|
|
97
|
-
test('fully qualified ref resolves when it exists', () => {
|
|
98
|
-
expect(resolveTaskRef('alpha.plan', 'beta', idx)).toEqual({
|
|
99
|
-
kind: 'resolved',
|
|
100
|
-
qid: 'alpha.plan',
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
test('fully qualified ref that does not exist is not_found', () => {
|
|
104
|
-
expect(resolveTaskRef('alpha.ghost', 'beta', idx)).toEqual({
|
|
105
|
-
kind: 'not_found',
|
|
106
|
-
ref: 'alpha.ghost',
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
test('bare ref prefers same-track shorthand', () => {
|
|
110
|
-
// "review" exists in both tracks — from beta's perspective, the same-
|
|
111
|
-
// track shadow must win over the cross-track ambiguous pool.
|
|
112
|
-
expect(resolveTaskRef('review', 'beta', idx)).toEqual({
|
|
113
|
-
kind: 'resolved',
|
|
114
|
-
qid: 'beta.review',
|
|
115
|
-
});
|
|
116
|
-
expect(resolveTaskRef('review', 'alpha', idx)).toEqual({
|
|
117
|
-
kind: 'resolved',
|
|
118
|
-
qid: 'alpha.review',
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
test('bare ref not in current track is ambiguous when multiple tracks have it', () => {
|
|
122
|
-
const twoForeign = {
|
|
123
|
-
name: 'T',
|
|
124
|
-
tracks: [
|
|
125
|
-
{ id: 'a', name: 'A', tasks: [{ id: 'review', prompt: 'p' }] },
|
|
126
|
-
{ id: 'b', name: 'B', tasks: [{ id: 'review', prompt: 'p' }] },
|
|
127
|
-
{ id: 'c', name: 'C', tasks: [{ id: 'other', prompt: 'p' }] },
|
|
128
|
-
],
|
|
129
|
-
};
|
|
130
|
-
const idx2 = buildTaskIndex(twoForeign);
|
|
131
|
-
expect(resolveTaskRef('review', 'c', idx2)).toEqual({ kind: 'ambiguous', ref: 'review' });
|
|
132
|
-
});
|
|
133
|
-
test('bare ref unique in the pool resolves cross-track', () => {
|
|
134
|
-
expect(resolveTaskRef('ship', 'alpha', idx)).toEqual({
|
|
135
|
-
kind: 'resolved',
|
|
136
|
-
qid: 'beta.ship',
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
test('bare ref nobody has is not_found', () => {
|
|
140
|
-
expect(resolveTaskRef('nowhere', 'alpha', idx)).toEqual({
|
|
141
|
-
kind: 'not_found',
|
|
142
|
-
ref: 'nowhere',
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
// ═══ Regression: bug #2 — same bare task id in multiple tracks ═══
|
|
147
|
-
describe('regression: continue_from across same-named tasks (bug #2)', () => {
|
|
148
|
-
test('bare continue_from resolves via same-track shadow — qualified id handed downstream', () => {
|
|
149
|
-
// Two tracks, each with a "review" task and a follower that continues
|
|
150
|
-
// from it. The follower MUST bind to its own track's review via the
|
|
151
|
-
// same-track shorthand, not to the other track's review.
|
|
152
|
-
const resolved = {
|
|
153
|
-
name: 'Same-Bare',
|
|
154
|
-
tracks: [
|
|
155
|
-
{
|
|
156
|
-
id: 'alpha',
|
|
157
|
-
name: 'Alpha',
|
|
158
|
-
tasks: [
|
|
159
|
-
{ id: 'review', name: 'Review', prompt: 'do A' },
|
|
160
|
-
{
|
|
161
|
-
id: 'ship',
|
|
162
|
-
name: 'Ship',
|
|
163
|
-
prompt: 'ship A',
|
|
164
|
-
depends_on: ['review'],
|
|
165
|
-
continue_from: 'review',
|
|
166
|
-
},
|
|
167
|
-
],
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
id: 'beta',
|
|
171
|
-
name: 'Beta',
|
|
172
|
-
tasks: [
|
|
173
|
-
{ id: 'review', name: 'Review', prompt: 'do B' },
|
|
174
|
-
{
|
|
175
|
-
id: 'ship',
|
|
176
|
-
name: 'Ship',
|
|
177
|
-
prompt: 'ship B',
|
|
178
|
-
depends_on: ['review'],
|
|
179
|
-
continue_from: 'review',
|
|
180
|
-
},
|
|
181
|
-
],
|
|
182
|
-
},
|
|
183
|
-
],
|
|
184
|
-
};
|
|
185
|
-
const dag = buildDag(resolved);
|
|
186
|
-
const alphaShip = dag.nodes.get('alpha.ship');
|
|
187
|
-
const betaShip = dag.nodes.get('beta.ship');
|
|
188
|
-
expect(alphaShip.resolvedContinueFrom).toBe('alpha.review');
|
|
189
|
-
expect(betaShip.resolvedContinueFrom).toBe('beta.review');
|
|
190
|
-
// And the dep edges get qualified too, preventing engine map-key misses.
|
|
191
|
-
expect(alphaShip.dependsOn).toContain('alpha.review');
|
|
192
|
-
expect(betaShip.dependsOn).toContain('beta.review');
|
|
193
|
-
});
|
|
194
|
-
test('bare continue_from pointing at a foreign ambiguous task throws', () => {
|
|
195
|
-
const resolved = {
|
|
196
|
-
name: 'Ambiguous',
|
|
197
|
-
tracks: [
|
|
198
|
-
{
|
|
199
|
-
id: 'alpha',
|
|
200
|
-
name: 'Alpha',
|
|
201
|
-
tasks: [
|
|
202
|
-
{ id: 'review', name: 'Review', prompt: 'p' },
|
|
203
|
-
// ship has no local "review" so bare "review" is ambiguous.
|
|
204
|
-
{ id: 'filler', name: 'Filler', prompt: 'p' },
|
|
205
|
-
],
|
|
206
|
-
},
|
|
207
|
-
{
|
|
208
|
-
id: 'beta',
|
|
209
|
-
name: 'Beta',
|
|
210
|
-
tasks: [{ id: 'review', name: 'Review', prompt: 'p' }],
|
|
211
|
-
},
|
|
212
|
-
{
|
|
213
|
-
id: 'gamma',
|
|
214
|
-
name: 'Gamma',
|
|
215
|
-
tasks: [
|
|
216
|
-
{
|
|
217
|
-
id: 'ship',
|
|
218
|
-
name: 'Ship',
|
|
219
|
-
prompt: 'ship',
|
|
220
|
-
continue_from: 'review',
|
|
221
|
-
},
|
|
222
|
-
],
|
|
223
|
-
},
|
|
224
|
-
],
|
|
225
|
-
};
|
|
226
|
-
expect(() => buildDag(resolved)).toThrow(/ambiguous/i);
|
|
227
|
-
});
|
|
228
|
-
test('qualified continue_from always wins — no same-track-shadow risk', () => {
|
|
229
|
-
const resolved = {
|
|
230
|
-
name: 'Qualified',
|
|
231
|
-
tracks: [
|
|
232
|
-
{
|
|
233
|
-
id: 'alpha',
|
|
234
|
-
name: 'Alpha',
|
|
235
|
-
tasks: [
|
|
236
|
-
{ id: 'plan', name: 'Plan', prompt: 'p' },
|
|
237
|
-
{
|
|
238
|
-
id: 'plan_v2',
|
|
239
|
-
name: 'Plan v2',
|
|
240
|
-
prompt: 'p2',
|
|
241
|
-
continue_from: 'plan',
|
|
242
|
-
},
|
|
243
|
-
],
|
|
244
|
-
},
|
|
245
|
-
{
|
|
246
|
-
id: 'beta',
|
|
247
|
-
name: 'Beta',
|
|
248
|
-
tasks: [
|
|
249
|
-
{ id: 'plan', name: 'Plan B', prompt: 'p' },
|
|
250
|
-
{
|
|
251
|
-
id: 'cross',
|
|
252
|
-
name: 'Cross',
|
|
253
|
-
prompt: 'x',
|
|
254
|
-
continue_from: 'alpha.plan',
|
|
255
|
-
},
|
|
256
|
-
],
|
|
257
|
-
},
|
|
258
|
-
],
|
|
259
|
-
};
|
|
260
|
-
const dag = buildDag(resolved);
|
|
261
|
-
expect(dag.nodes.get('alpha.plan_v2').resolvedContinueFrom).toBe('alpha.plan');
|
|
262
|
-
expect(dag.nodes.get('beta.cross').resolvedContinueFrom).toBe('alpha.plan');
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
// ═══ Regression: bug #10 — editor-generated ids always pass validate-raw ═══
|
|
266
|
-
describe('regression: TASK_ID_RE is the single source of truth (bug #10)', () => {
|
|
267
|
-
test('validateRaw rejects exactly what isValidTaskId rejects', () => {
|
|
268
|
-
// Any string the helper says is invalid must be flagged by validateRaw
|
|
269
|
-
// as an "invalid characters" error — proving they read from the same
|
|
270
|
-
// regex rather than two drifted copies.
|
|
271
|
-
const invalids = ['1bad', 'has.dot', 'with space', '-leading', 'q?mark', ''];
|
|
272
|
-
for (const badId of invalids) {
|
|
273
|
-
const cfg = {
|
|
274
|
-
name: 'T',
|
|
275
|
-
tracks: [
|
|
276
|
-
{
|
|
277
|
-
id: 'ok',
|
|
278
|
-
name: 'OK',
|
|
279
|
-
tasks: [{ id: badId, prompt: 'p' }],
|
|
280
|
-
},
|
|
281
|
-
],
|
|
282
|
-
};
|
|
283
|
-
const errs = validateRaw(cfg);
|
|
284
|
-
expect(errs.length).toBeGreaterThan(0);
|
|
285
|
-
expect(isValidTaskId(badId)).toBe(false);
|
|
286
|
-
}
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
|
-
// ═══ Regression: buildDag topo sort is deterministic (bug #13) ═══
|
|
290
|
-
describe('regression: buildDag topo sort is deterministic', () => {
|
|
291
|
-
const base = (trackOrder) => ({
|
|
292
|
-
name: 'Determinism',
|
|
293
|
-
tracks: trackOrder.map((id) => ({
|
|
294
|
-
id,
|
|
295
|
-
name: id,
|
|
296
|
-
tasks: [
|
|
297
|
-
{ id: 'a', name: 'A', prompt: 'p' },
|
|
298
|
-
{ id: 'b', name: 'B', prompt: 'p', depends_on: ['a'] },
|
|
299
|
-
],
|
|
300
|
-
})),
|
|
301
|
-
});
|
|
302
|
-
test('parallel tasks with equal depth sort by qid, independent of YAML order', () => {
|
|
303
|
-
const forward = buildDag(base(['alpha', 'beta', 'gamma']));
|
|
304
|
-
const reversed = buildDag(base(['gamma', 'beta', 'alpha']));
|
|
305
|
-
expect(forward.sorted).toEqual(reversed.sorted);
|
|
306
|
-
// And the actual order is alphabetical by qid — every "a" before every "b".
|
|
307
|
-
expect(forward.sorted).toEqual([
|
|
308
|
-
'alpha.a',
|
|
309
|
-
'beta.a',
|
|
310
|
-
'gamma.a',
|
|
311
|
-
'alpha.b',
|
|
312
|
-
'beta.b',
|
|
313
|
-
'gamma.b',
|
|
314
|
-
]);
|
|
315
|
-
});
|
|
316
|
-
test('diamond dependency still produces a unique sorted order', () => {
|
|
317
|
-
// root -> left, right -> join
|
|
318
|
-
const cfg = {
|
|
319
|
-
name: 'Diamond',
|
|
320
|
-
tracks: [
|
|
321
|
-
{
|
|
322
|
-
id: 't',
|
|
323
|
-
name: 't',
|
|
324
|
-
tasks: [
|
|
325
|
-
{ id: 'root', name: 'r', prompt: 'p' },
|
|
326
|
-
{ id: 'left', name: 'l', prompt: 'p', depends_on: ['root'] },
|
|
327
|
-
{ id: 'right', name: 'r', prompt: 'p', depends_on: ['root'] },
|
|
328
|
-
{ id: 'join', name: 'j', prompt: 'p', depends_on: ['left', 'right'] },
|
|
329
|
-
],
|
|
330
|
-
},
|
|
331
|
-
],
|
|
332
|
-
};
|
|
333
|
-
const first = buildDag(cfg).sorted;
|
|
334
|
-
const second = buildDag(cfg).sorted;
|
|
335
|
-
expect(first).toEqual(second);
|
|
336
|
-
// root first, join last; left/right in alphabetical order between.
|
|
337
|
-
expect(first[0]).toBe('t.root');
|
|
338
|
-
expect(first[first.length - 1]).toBe('t.join');
|
|
339
|
-
expect(first.indexOf('t.left')).toBeLessThan(first.indexOf('t.right'));
|
|
340
|
-
});
|
|
341
|
-
});
|
|
342
|
-
// ═══ Regression: buildRawDag stays lenient (editor real-time view) ═══
|
|
343
|
-
describe('buildRawDag tolerates unresolved refs', () => {
|
|
344
|
-
test('ambiguous bare continue_from is silently skipped (no edge, no throw)', () => {
|
|
345
|
-
const cfg = {
|
|
346
|
-
name: 'T',
|
|
347
|
-
tracks: [
|
|
348
|
-
{ id: 'a', name: 'A', tasks: [{ id: 'review', prompt: 'p' }] },
|
|
349
|
-
{ id: 'b', name: 'B', tasks: [{ id: 'review', prompt: 'p' }] },
|
|
350
|
-
{
|
|
351
|
-
id: 'c',
|
|
352
|
-
name: 'C',
|
|
353
|
-
tasks: [{ id: 'use', prompt: 'p', continue_from: 'review' }],
|
|
354
|
-
},
|
|
355
|
-
],
|
|
356
|
-
};
|
|
357
|
-
const raw = buildRawDag(cfg);
|
|
358
|
-
expect(raw.nodes.size).toBe(3);
|
|
359
|
-
// No edge for the ambiguous ref — the editor panel should prompt the
|
|
360
|
-
// user to qualify it instead of silently linking to the wrong track.
|
|
361
|
-
expect(raw.edges.find((e) => e.to === 'c.use')).toBeUndefined();
|
|
362
|
-
});
|
|
363
|
-
});
|
|
364
|
-
//# sourceMappingURL=task-ref.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task-ref.test.js","sourceRoot":"","sources":["../src/task-ref.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-raw-ports.test.d.ts","sourceRoot":"","sources":["../src/validate-raw-ports.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'bun:test';
|
|
2
|
-
import { validateRaw } from './validate-raw';
|
|
3
|
-
function task(overrides) {
|
|
4
|
-
return { prompt: 'do a thing', ...overrides };
|
|
5
|
-
}
|
|
6
|
-
function pipeline(tasks) {
|
|
7
|
-
const track = { id: 't', name: 't', tasks };
|
|
8
|
-
return { name: 'test', tracks: [track] };
|
|
9
|
-
}
|
|
10
|
-
function errorsFor(taskConfig) {
|
|
11
|
-
return validateRaw(pipeline([taskConfig]));
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Return only the errors whose path points inside the given task's
|
|
15
|
-
* `.ports` subtree, so assertions don't pick up unrelated cycle or
|
|
16
|
-
* name-validation errors that the rest of validate-raw emits.
|
|
17
|
-
*/
|
|
18
|
-
function portsErrors(errors) {
|
|
19
|
-
return errors.filter((e) => e.path.includes('.ports.') || e.path.includes('.ports[') || /\.ports$/.test(e.path));
|
|
20
|
-
}
|
|
21
|
-
// ─── Structural validation ───────────────────────────────────────────
|
|
22
|
-
describe('validateRaw — port structure', () => {
|
|
23
|
-
test('empty ports object is accepted (no-op)', () => {
|
|
24
|
-
const errors = errorsFor(task({ id: 'a', ports: {} }));
|
|
25
|
-
expect(portsErrors(errors)).toEqual([]);
|
|
26
|
-
});
|
|
27
|
-
test('rejects non-array ports.inputs', () => {
|
|
28
|
-
const ports = { inputs: 'not-an-array' };
|
|
29
|
-
const errors = errorsFor(task({ id: 'a', ports }));
|
|
30
|
-
const e = portsErrors(errors);
|
|
31
|
-
expect(e.length).toBeGreaterThan(0);
|
|
32
|
-
expect(e[0].message).toMatch(/must be an array/);
|
|
33
|
-
});
|
|
34
|
-
test('rejects non-object port entry', () => {
|
|
35
|
-
const ports = { inputs: ['not-an-object'] };
|
|
36
|
-
const errors = errorsFor(task({ id: 'a', ports }));
|
|
37
|
-
expect(portsErrors(errors).some((e) => /must be an object/.test(e.message))).toBe(true);
|
|
38
|
-
});
|
|
39
|
-
test('requires port.name to be a non-empty string', () => {
|
|
40
|
-
const ports = { inputs: [{ name: '', type: 'string' }] };
|
|
41
|
-
const errors = errorsFor(task({ id: 'a', ports }));
|
|
42
|
-
expect(portsErrors(errors).some((e) => /port\.name is required/.test(e.message))).toBe(true);
|
|
43
|
-
});
|
|
44
|
-
test('rejects invalid port name characters', () => {
|
|
45
|
-
const ports = {
|
|
46
|
-
inputs: [
|
|
47
|
-
{ name: 'has-hyphen', type: 'string' },
|
|
48
|
-
{ name: '1starts-with-digit', type: 'string' },
|
|
49
|
-
{ name: 'has.dot', type: 'string' },
|
|
50
|
-
],
|
|
51
|
-
};
|
|
52
|
-
const errors = errorsFor(task({ id: 'a', ports }));
|
|
53
|
-
const msgs = portsErrors(errors).map((e) => e.message);
|
|
54
|
-
expect(msgs.filter((m) => /port name .* is invalid/.test(m)).length).toBe(3);
|
|
55
|
-
});
|
|
56
|
-
test('flags duplicate port names within the same list', () => {
|
|
57
|
-
const ports = {
|
|
58
|
-
inputs: [
|
|
59
|
-
{ name: 'x', type: 'string' },
|
|
60
|
-
{ name: 'x', type: 'number' },
|
|
61
|
-
],
|
|
62
|
-
};
|
|
63
|
-
const errors = errorsFor(task({ id: 'a', ports }));
|
|
64
|
-
expect(portsErrors(errors).some((e) => /Duplicate ports\.inputs name/.test(e.message))).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
test('rejects unknown port type', () => {
|
|
67
|
-
const ports = { inputs: [{ name: 'x', type: 'made-up' }] };
|
|
68
|
-
const errors = errorsFor(task({ id: 'a', ports }));
|
|
69
|
-
expect(portsErrors(errors).some((e) => /type must be one of/.test(e.message))).toBe(true);
|
|
70
|
-
});
|
|
71
|
-
test('enum port requires a non-empty enum array', () => {
|
|
72
|
-
const ports = { inputs: [{ name: 'x', type: 'enum' }] };
|
|
73
|
-
const errors = errorsFor(task({ id: 'a', ports }));
|
|
74
|
-
expect(portsErrors(errors).some((e) => /non-empty "enum"/.test(e.message))).toBe(true);
|
|
75
|
-
});
|
|
76
|
-
test('enum values must all be strings', () => {
|
|
77
|
-
const ports = {
|
|
78
|
-
inputs: [{ name: 'x', type: 'enum', enum: ['a', 1] }],
|
|
79
|
-
};
|
|
80
|
-
const errors = errorsFor(task({ id: 'a', ports }));
|
|
81
|
-
expect(portsErrors(errors).some((e) => /enum values must all be strings/.test(e.message))).toBe(true);
|
|
82
|
-
});
|
|
83
|
-
test('`from` must be a string', () => {
|
|
84
|
-
const ports = {
|
|
85
|
-
inputs: [
|
|
86
|
-
{ name: 'x', type: 'string', from: 42 },
|
|
87
|
-
],
|
|
88
|
-
};
|
|
89
|
-
const errors = errorsFor(task({ id: 'a', ports }));
|
|
90
|
-
expect(portsErrors(errors).some((e) => /"from" must be a string/.test(e.message))).toBe(true);
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
// ─── Input/output separation ─────────────────────────────────────────
|
|
94
|
-
describe('validateRaw — input vs output constraints', () => {
|
|
95
|
-
test('`required` on an output emits a warning (not an error)', () => {
|
|
96
|
-
const ports = {
|
|
97
|
-
outputs: [{ name: 'x', type: 'string', required: true }],
|
|
98
|
-
};
|
|
99
|
-
const errors = errorsFor(task({ id: 'a', ports, prompt: 'x' }));
|
|
100
|
-
const portErrs = portsErrors(errors);
|
|
101
|
-
expect(portErrs.length).toBeGreaterThan(0);
|
|
102
|
-
expect(portErrs[0].severity).toBe('warning');
|
|
103
|
-
expect(portErrs[0].message).toMatch(/input-only/);
|
|
104
|
-
});
|
|
105
|
-
test('`from` on an output also warns', () => {
|
|
106
|
-
const ports = {
|
|
107
|
-
outputs: [{ name: 'x', type: 'string', from: 'whatever' }],
|
|
108
|
-
};
|
|
109
|
-
const errors = errorsFor(task({ id: 'a', ports }));
|
|
110
|
-
const portErrs = portsErrors(errors);
|
|
111
|
-
expect(portErrs[0].severity).toBe('warning');
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
// ─── {{inputs.X}} cross-check ────────────────────────────────────────
|
|
115
|
-
describe('validateRaw — placeholder cross-check', () => {
|
|
116
|
-
test('references to undeclared inputs in prompt are errors', () => {
|
|
117
|
-
const errors = errorsFor(task({
|
|
118
|
-
id: 'a',
|
|
119
|
-
prompt: 'city={{inputs.city}} id={{inputs.id}}',
|
|
120
|
-
ports: { inputs: [{ name: 'city', type: 'string' }] },
|
|
121
|
-
}));
|
|
122
|
-
const msgs = errors.map((e) => e.message);
|
|
123
|
-
expect(msgs.some((m) => m.includes('references "{{inputs.id}}"'))).toBe(true);
|
|
124
|
-
expect(msgs.some((m) => m.includes('references "{{inputs.city}}"'))).toBe(false);
|
|
125
|
-
});
|
|
126
|
-
test('references to undeclared inputs in command are errors', () => {
|
|
127
|
-
const errors = errorsFor(task({
|
|
128
|
-
id: 'a',
|
|
129
|
-
prompt: undefined,
|
|
130
|
-
command: 'echo {{inputs.oops}}',
|
|
131
|
-
}));
|
|
132
|
-
expect(errors.some((e) => e.message.includes('references "{{inputs.oops}}"'))).toBe(true);
|
|
133
|
-
});
|
|
134
|
-
test('declared inputs with no references emit a warning for command tasks', () => {
|
|
135
|
-
const errors = errorsFor(task({
|
|
136
|
-
id: 'a',
|
|
137
|
-
prompt: undefined,
|
|
138
|
-
command: 'echo hi',
|
|
139
|
-
ports: { inputs: [{ name: 'unused', type: 'string' }] },
|
|
140
|
-
}));
|
|
141
|
-
const warnings = errors.filter((e) => e.severity === 'warning' && /declared input is unused/.test(e.message));
|
|
142
|
-
expect(warnings.length).toBe(1);
|
|
143
|
-
});
|
|
144
|
-
test('declared inputs with no references do NOT warn for prompt tasks', () => {
|
|
145
|
-
// Prompt tasks consume inputs through the auto-injected [Inputs]
|
|
146
|
-
// context block, so "unused" is a false alarm for them. Only command
|
|
147
|
-
// tasks should see the unused-input warning.
|
|
148
|
-
const errors = errorsFor(task({
|
|
149
|
-
id: 'a',
|
|
150
|
-
prompt: 'do the thing',
|
|
151
|
-
ports: { inputs: [{ name: 'context', type: 'string' }] },
|
|
152
|
-
}));
|
|
153
|
-
const warnings = errors.filter((e) => e.severity === 'warning' && /declared input is unused/.test(e.message));
|
|
154
|
-
expect(warnings.length).toBe(0);
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
//# sourceMappingURL=validate-raw-ports.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-raw-ports.test.js","sourceRoot":"","sources":["../src/validate-raw-ports.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,SAAS,IAAI,CAAC,SAAkD;IAC9D,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAsB;IACtC,MAAM,KAAK,GAAmB,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,SAAS,CAAC,UAAyB;IAC1C,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,MAAsC;IACzD,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAC3F,CAAC;AACJ,CAAC;AAED,wEAAwE;AAExE,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,cAA+B,EAAe,CAAC;QACvE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,CAAC,eAAmC,CAAC,EAAe,CAAC;QAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAc,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAc;YACvB,MAAM,EAAE;gBACN,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACtC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC9C,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;aACpC;SACF,CAAC;QACF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAAc;YACvB,MAAM,EAAE;gBACN,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC7B,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC9B;SACF,CAAC;QACF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAC1F,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAkB,EAAE,CAAC,EAAe,CAAC;QACjF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACrD,MAAM,KAAK,GAAc,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACnE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,MAAM,KAAK,GAAG;YACZ,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,CAAsB,CAAC,EAAE,CAAC;SACvE,CAAC;QACf,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAC7F,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACnC,MAAM,KAAK,GAAG;YACZ,MAAM,EAAE;gBACN,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAiB,EAAE,IAAI,EAAE,EAAuB,EAAE;aACtE;SACW,CAAC;QACf,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAClE,MAAM,KAAK,GAAc;YACvB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;SACzD,CAAC;QACF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAc;YACvB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;SAC3D,CAAC;QACF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAChE,MAAM,MAAM,GAAG,SAAS,CACtB,IAAI,CAAC;YACH,EAAE,EAAE,GAAG;YACP,MAAM,EAAE,uCAAuC;YAC/C,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;SACtD,CAAC,CACH,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QACjE,MAAM,MAAM,GAAG,SAAS,CACtB,IAAI,CAAC;YACH,EAAE,EAAE,GAAG;YACP,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,sBAAsB;SAChC,CAAC,CACH,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC/E,MAAM,MAAM,GAAG,SAAS,CACtB,IAAI,CAAC;YACH,EAAE,EAAE,GAAG;YACP,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;SACxD,CAAC,CACH,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAC9E,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;QAC3E,iEAAiE;QACjE,qEAAqE;QACrE,6CAA6C;QAC7C,MAAM,MAAM,GAAG,SAAS,CACtB,IAAI,CAAC;YACH,EAAE,EAAE,GAAG;YACP,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;SACzD,CAAC,CACH,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAC9E,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|