@smartmemory/stratum 0.3.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 (81) hide show
  1. package/dist/cli/guard.js +91 -0
  2. package/dist/cli/guard.js.map +1 -0
  3. package/dist/cli/mcp_install.js +302 -0
  4. package/dist/cli/mcp_install.js.map +1 -0
  5. package/dist/cli/query_gate.js +316 -0
  6. package/dist/cli/query_gate.js.map +1 -0
  7. package/dist/cli/stratum.js +291 -0
  8. package/dist/cli/stratum.js.map +1 -0
  9. package/dist/connectors/background.js +531 -0
  10. package/dist/connectors/background.js.map +1 -0
  11. package/dist/connectors/base.js +12 -0
  12. package/dist/connectors/base.js.map +1 -0
  13. package/dist/connectors/claude-bg-worker.js +99 -0
  14. package/dist/connectors/claude-bg-worker.js.map +1 -0
  15. package/dist/connectors/claude.js +170 -0
  16. package/dist/connectors/claude.js.map +1 -0
  17. package/dist/connectors/codex.js +319 -0
  18. package/dist/connectors/codex.js.map +1 -0
  19. package/dist/connectors/index.js +7 -0
  20. package/dist/connectors/index.js.map +1 -0
  21. package/dist/connectors/proc_identity.js +90 -0
  22. package/dist/connectors/proc_identity.js.map +1 -0
  23. package/dist/connectors/runner.js +63 -0
  24. package/dist/connectors/runner.js.map +1 -0
  25. package/dist/contracts/events.json +65 -0
  26. package/dist/contracts/mcp-surface.json +215 -0
  27. package/dist/engine/checkpoint.js +50 -0
  28. package/dist/engine/checkpoint.js.map +1 -0
  29. package/dist/engine/engine.js +2356 -0
  30. package/dist/engine/engine.js.map +1 -0
  31. package/dist/engine/ledger.js +36 -0
  32. package/dist/engine/ledger.js.map +1 -0
  33. package/dist/engine/state.js +42 -0
  34. package/dist/engine/state.js.map +1 -0
  35. package/dist/eval/expr.js +679 -0
  36. package/dist/eval/expr.js.map +1 -0
  37. package/dist/eval/files.js +130 -0
  38. package/dist/eval/files.js.map +1 -0
  39. package/dist/guard/canonical.js +116 -0
  40. package/dist/guard/canonical.js.map +1 -0
  41. package/dist/guard/errors.js +80 -0
  42. package/dist/guard/errors.js.map +1 -0
  43. package/dist/guard/evidence.js +475 -0
  44. package/dist/guard/evidence.js.map +1 -0
  45. package/dist/guard/fingerprint.js +13 -0
  46. package/dist/guard/fingerprint.js.map +1 -0
  47. package/dist/guard/lock.js +360 -0
  48. package/dist/guard/lock.js.map +1 -0
  49. package/dist/guard/store.js +396 -0
  50. package/dist/guard/store.js.map +1 -0
  51. package/dist/guard/transition.js +477 -0
  52. package/dist/guard/transition.js.map +1 -0
  53. package/dist/ir/refs.js +69 -0
  54. package/dist/ir/refs.js.map +1 -0
  55. package/dist/ir/schema.js +123 -0
  56. package/dist/ir/schema.js.map +1 -0
  57. package/dist/ir/validate.js +595 -0
  58. package/dist/ir/validate.js.map +1 -0
  59. package/dist/judge/codex_judged.js +85 -0
  60. package/dist/judge/codex_judged.js.map +1 -0
  61. package/dist/judge/fixture_judged.js +62 -0
  62. package/dist/judge/fixture_judged.js.map +1 -0
  63. package/dist/judge/judged.js +89 -0
  64. package/dist/judge/judged.js.map +1 -0
  65. package/dist/judge/pricing.js +22 -0
  66. package/dist/judge/pricing.js.map +1 -0
  67. package/dist/mcp/contracts.js +162 -0
  68. package/dist/mcp/contracts.js.map +1 -0
  69. package/dist/mcp/main.js +7 -0
  70. package/dist/mcp/main.js.map +1 -0
  71. package/dist/mcp/server.js +370 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/migrate/check.js +164 -0
  74. package/dist/migrate/check.js.map +1 -0
  75. package/dist/parallel/certificate.js +37 -0
  76. package/dist/parallel/certificate.js.map +1 -0
  77. package/dist/parallel/evaluate.js +73 -0
  78. package/dist/parallel/evaluate.js.map +1 -0
  79. package/dist/speckit/compiler.js +162 -0
  80. package/dist/speckit/compiler.js.map +1 -0
  81. package/package.json +47 -0
@@ -0,0 +1,477 @@
1
+ /** Guarded-transition orchestration with evaluation outside the resource lock. */
2
+ import { createHash } from "node:crypto";
3
+ import { existsSync, statSync } from "node:fs";
4
+ import { isAbsolute } from "node:path";
5
+ import { canonicalJson } from "./canonical.js";
6
+ import { commandsAllowed, evaluateEvidence, parsePredicateStatement, } from "./evidence.js";
7
+ import { CommandExecutionDisabled, EvidenceParseError, GuardAlreadyRegistered, GuardEngineOwned, GuardNotFound, GuardTampered, IdempotencyConflict, IllegalEdge, InvalidStateName, InvalidWorkspaceRoot, OverrideUnavailable, ParanoidEdgeNeedsTrustedEvidence, StaleFromState, } from "./errors.js";
8
+ import { guardChecksum } from "./fingerprint.js";
9
+ import { GuardRegistry, LedgerEntry, appendLedger, assertStillHeld, findByIdempotencyKey, isValidStateName, loadRegistry, loadRegistryRaw, persistRegistry, readEngineOwner, readLedger, resourceDir, resourceLock, writeTsOwnerMarker, } from "./store.js";
10
+ import { evaluateJudgedViaCodex } from "../judge/codex_judged.js";
11
+ import { evaluateJudged, } from "../judge/judged.js";
12
+ import { judgeBackend } from "../mcp/server.js";
13
+ const TRUSTED_TYPE = "deterministic";
14
+ const LLM_TYPES = new Set(["verified", "judged"]);
15
+ let acquireResourceLock = resourceLock;
16
+ let fenceResourceLock = assertStillHeld;
17
+ /** Replace only the orchestration lock seams in isolated tests. */
18
+ export function setGuardLockingForTests(lock, fence) {
19
+ const previousLock = acquireResourceLock;
20
+ const previousFence = fenceResourceLock;
21
+ acquireResourceLock = lock;
22
+ fenceResourceLock = fence;
23
+ return () => {
24
+ acquireResourceLock = previousLock;
25
+ fenceResourceLock = previousFence;
26
+ };
27
+ }
28
+ export function _ptype(predicate) {
29
+ if (!Object.hasOwn(predicate, "type"))
30
+ return TRUSTED_TYPE;
31
+ return typeof predicate.type === "string" ? predicate.type : String(predicate.type);
32
+ }
33
+ export function _nowMs() {
34
+ return Date.now();
35
+ }
36
+ export function _edgeKey(fromState, toState) {
37
+ return `${fromState}->${toState}`;
38
+ }
39
+ export function _payloadDigest(fromState, toState, artifacts, modifiedFiles, resolvedBy) {
40
+ const canonical = canonicalJson({
41
+ from_state: fromState,
42
+ to_state: toState,
43
+ artifacts,
44
+ modified_files: [...modifiedFiles].sort(),
45
+ resolved_by: resolvedBy,
46
+ });
47
+ return createHash("sha256").update(canonical, "utf8").digest("hex");
48
+ }
49
+ function assertTsOwnedForMutation(resourceId) {
50
+ if (readEngineOwner(resourceId) === "ts")
51
+ return;
52
+ throw new GuardEngineOwned(`guard ${JSON.stringify(resourceId)} is not owned by the TypeScript engine; run the Python-side guard handoff first`);
53
+ }
54
+ /**
55
+ * TS-written verdicts deliberately normalize float telemetry to integers.
56
+ * JavaScript cannot preserve Python's `0.0` shape, no guard consumer reads
57
+ * these telemetry fields, and chain verification uses the C1 raw-line path.
58
+ */
59
+ function normalizeVerdictForLedger(verdict) {
60
+ const active = new WeakSet();
61
+ const normalize = (value) => {
62
+ if (value === null || typeof value === "string" || typeof value === "boolean")
63
+ return value;
64
+ if (typeof value === "number") {
65
+ if (!Number.isFinite(value))
66
+ return 0;
67
+ // Round deterministically, then clamp so canonicalJson always receives a safe integer.
68
+ return Math.max(Number.MIN_SAFE_INTEGER, Math.min(Number.MAX_SAFE_INTEGER, Math.round(value)));
69
+ }
70
+ if (typeof value !== "object")
71
+ return null;
72
+ if (active.has(value))
73
+ return null;
74
+ active.add(value);
75
+ try {
76
+ // Array.from also fills sparse holes with normalized nulls.
77
+ if (Array.isArray(value))
78
+ return Array.from(value, normalize);
79
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, normalize(item)]));
80
+ }
81
+ finally {
82
+ active.delete(value);
83
+ }
84
+ };
85
+ return normalize(verdict);
86
+ }
87
+ function baseVerdict(met, summary, stakes, predicates, meta) {
88
+ return {
89
+ clean: met,
90
+ summary,
91
+ findings: [],
92
+ meta,
93
+ consensus: [],
94
+ claude_only: [],
95
+ codex_only: [],
96
+ lenses_run: [],
97
+ auto_fixes: [],
98
+ asks: [],
99
+ judge_version: "1.0",
100
+ met,
101
+ stakes,
102
+ predicates,
103
+ tier_disagreements: [],
104
+ budget_consumed: { dollars: 0, turns: 0, wall_clock_s: 0 },
105
+ judge_kernel_meta: { decomposer_mode: "user", degraded_judged: false, smartmemory_priors_consulted: 0 },
106
+ };
107
+ }
108
+ function evidencePredicates(evidence) {
109
+ return evidence.perPredicate.map((predicate, index) => ({
110
+ id: String(predicate.id || `e${index}`),
111
+ type: TRUSTED_TYPE,
112
+ statement: predicate.statement,
113
+ verdict: predicate.met ? "met" : "not_met",
114
+ confidence: 10,
115
+ applied_gate: 0,
116
+ evidence: [],
117
+ tier_history: [],
118
+ t3: null,
119
+ }));
120
+ }
121
+ function serializableEvidence(evidence) {
122
+ return evidence.perPredicate.map((predicate) => ({
123
+ id: predicate.id ?? null,
124
+ statement: predicate.statement,
125
+ met: predicate.met,
126
+ evidence: predicate.evidence,
127
+ }));
128
+ }
129
+ export function _evidenceToVerdictDict(evidence, stakes, summary) {
130
+ return baseVerdict(evidence.met, summary, stakes, evidencePredicates(evidence), {
131
+ agent_type: "guard",
132
+ source: "evidence",
133
+ guard_evidence: serializableEvidence(evidence),
134
+ });
135
+ }
136
+ export function _mergeVerdict(evidence, judgeResult, stakes) {
137
+ const combined = evidence.met && judgeResult.met;
138
+ const verdict = baseVerdict(combined, judgeResult.summary || "guard transition verdict", stakes, [...evidencePredicates(evidence), ...judgeResult.predicates], { ...judgeResult.meta, agent_type: "guard", guard_evidence: serializableEvidence(evidence) });
139
+ verdict.findings = judgeResult.findings;
140
+ verdict.budget_consumed = { dollars: judgeResult.dollars, turns: judgeResult.turns, wall_clock_s: 0 };
141
+ return [combined, verdict];
142
+ }
143
+ export function* _allEdgePredicates(edgePredicates) {
144
+ for (const [edge, predicates] of Object.entries(edgePredicates)) {
145
+ for (const predicate of predicates)
146
+ yield [edge, predicate];
147
+ }
148
+ }
149
+ export function _validatePolicy(graph, edgePredicates, initial, terminal, stakes, workspaceRoot) {
150
+ const names = new Set([...Object.keys(graph), ...terminal, initial]);
151
+ for (const targets of Object.values(graph))
152
+ for (const target of targets)
153
+ names.add(target);
154
+ for (const name of names) {
155
+ if (!isValidStateName(name)) {
156
+ throw new InvalidStateName(`invalid state name ${JSON.stringify(name)} (allowed: [A-Za-z0-9_.-])`);
157
+ }
158
+ }
159
+ if (!Object.hasOwn(graph, initial) && !terminal.includes(initial)) {
160
+ throw new InvalidStateName(`initial state ${JSON.stringify(initial)} is not a node in the graph`);
161
+ }
162
+ let needsWorkspace = false;
163
+ let usesCommand = false;
164
+ for (const [, predicate] of _allEdgePredicates(edgePredicates)) {
165
+ const type = _ptype(predicate);
166
+ const statement = typeof predicate.statement === "string" ? predicate.statement : "";
167
+ if (LLM_TYPES.has(type))
168
+ continue;
169
+ if (type !== TRUSTED_TYPE) {
170
+ throw new EvidenceParseError(`unknown predicate type ${JSON.stringify(type)} (expected deterministic|verified|judged)`);
171
+ }
172
+ const parsed = parsePredicateStatement(statement);
173
+ if (parsed.name === "command_exit_zero")
174
+ usesCommand = true;
175
+ if (["server_file_exists", "git_commit_exists", "command_exit_zero"].includes(parsed.name))
176
+ needsWorkspace = true;
177
+ }
178
+ if (usesCommand && !commandsAllowed()) {
179
+ throw new CommandExecutionDisabled("guard declares command_exit_zero predicates; set STRATUM_GUARD_ALLOW_COMMANDS=1 to register");
180
+ }
181
+ if (needsWorkspace && !workspaceRoot) {
182
+ throw new InvalidWorkspaceRoot("guard declares file/git/command evidence but no workspace_root given");
183
+ }
184
+ if (workspaceRoot) {
185
+ let isDirectory = false;
186
+ try {
187
+ isDirectory = existsSync(workspaceRoot) && statSync(workspaceRoot).isDirectory();
188
+ }
189
+ catch {
190
+ isDirectory = false;
191
+ }
192
+ if (!isAbsolute(workspaceRoot) || !isDirectory) {
193
+ throw new InvalidWorkspaceRoot(`workspace_root must be an existing absolute directory: ${JSON.stringify(workspaceRoot)}`);
194
+ }
195
+ }
196
+ for (const [edge, predicates] of Object.entries(edgePredicates)) {
197
+ if (stakes[edge] === "paranoid" && !predicates.some((predicate) => _ptype(predicate) === TRUSTED_TYPE)) {
198
+ throw new ParanoidEdgeNeedsTrustedEvidence(`paranoid edge ${JSON.stringify(edge)} has no trusted-evidence predicate`);
199
+ }
200
+ }
201
+ }
202
+ export async function registerGuard(resourceId, graph, edgePredicates, initial, terminal = [], stakes = {}, workspaceRoot = null) {
203
+ _validatePolicy(graph, edgePredicates, initial, terminal, stakes, workspaceRoot);
204
+ const checksum = guardChecksum(graph, edgePredicates, terminal, stakes);
205
+ const resourceDirectoryExisted = existsSync(resourceDir(resourceId));
206
+ const status = await acquireResourceLock(resourceId, async ({ token }) => {
207
+ const owner = readEngineOwner(resourceId);
208
+ if (owner !== "ts") {
209
+ if (resourceDirectoryExisted || owner !== null)
210
+ assertTsOwnedForMutation(resourceId);
211
+ writeTsOwnerMarker(resourceId);
212
+ }
213
+ const existing = loadRegistryRaw(resourceId);
214
+ if (existing !== null) {
215
+ if (existing.checksum === checksum)
216
+ return "exists";
217
+ throw new GuardAlreadyRegistered(`guard ${JSON.stringify(resourceId)} already registered with a different policy; use migrate`);
218
+ }
219
+ const registry = new GuardRegistry({
220
+ resource_id: resourceId,
221
+ graph,
222
+ edge_predicates: edgePredicates,
223
+ initial,
224
+ terminal,
225
+ stakes,
226
+ checksum,
227
+ graph_version: 1,
228
+ workspace_root: workspaceRoot,
229
+ current_state: initial,
230
+ });
231
+ await fenceResourceLock(resourceId, token);
232
+ persistRegistry(registry);
233
+ return "registered";
234
+ });
235
+ return { guard_id: resourceId, checksum, status };
236
+ }
237
+ export function _maybeReplay(registry, idempotencyKey, payloadDigest) {
238
+ if (!idempotencyKey)
239
+ return null;
240
+ const prior = findByIdempotencyKey(registry.resource_id, idempotencyKey);
241
+ if (prior === null)
242
+ return null;
243
+ if (prior.payload_digest !== payloadDigest) {
244
+ throw new IdempotencyConflict(`idempotency_key ${JSON.stringify(idempotencyKey)} reused with a different payload`);
245
+ }
246
+ const verdict = prior.verdict ?? _evidenceToVerdictDict({ met: prior.outcome === "applied", perPredicate: [] }, registry.stakes[_edgeKey(prior.from_state, prior.to_state)] ?? "default", "replayed idempotent transition");
247
+ return { status: "replayed", verdict, ledger_ref: prior.entry_digest, current_state: registry.current_state };
248
+ }
249
+ function defaultJudge() {
250
+ return judgeBackend() === "openai"
251
+ ? (predicate, context) => evaluateJudged(predicate, context)
252
+ : (predicate, context) => evaluateJudgedViaCodex(predicate, context);
253
+ }
254
+ async function evaluateLlmPredicates(predicates, stakes, judge, context) {
255
+ const results = [];
256
+ for (const predicate of predicates) {
257
+ const statement = typeof predicate.statement === "string" ? predicate.statement : "";
258
+ const result = await judge({ statement, stakes: stakes }, context);
259
+ results.push({ predicate, result });
260
+ }
261
+ return {
262
+ met: results.every(({ result }) => result.holds),
263
+ summary: results.map(({ result }) => result.reason).filter(Boolean).join("; ") || "guard transition verdict",
264
+ predicates: results.map(({ predicate, result }, index) => ({
265
+ id: String(predicate.id || `j${index}`),
266
+ type: _ptype(predicate),
267
+ statement: typeof predicate.statement === "string" ? predicate.statement : "",
268
+ verdict: result.holds ? "met" : "not_met",
269
+ confidence: result.holds ? 10 : 0,
270
+ applied_gate: 0,
271
+ evidence: [],
272
+ tier_history: [],
273
+ t3: null,
274
+ })),
275
+ findings: [],
276
+ meta: {
277
+ source: "judge",
278
+ judge_results: results.map(({ result }) => ({
279
+ holds: result.holds,
280
+ reason: result.reason,
281
+ stakes: result.stakes,
282
+ model: result.model,
283
+ usage: { tokens: result.usage.tokens ?? 0 },
284
+ })),
285
+ },
286
+ // Guard canonical JSON intentionally rejects floats. The TS judge's USD
287
+ // estimate remains operational telemetry rather than ledger material.
288
+ dollars: 0,
289
+ turns: results.length,
290
+ };
291
+ }
292
+ export async function guardTransition(resourceId, fromState, toState, options = {}) {
293
+ const artifacts = options.artifacts ?? {};
294
+ const modifiedFiles = options.modifiedFiles ?? [];
295
+ const idempotencyKey = options.idempotencyKey ?? null;
296
+ const resolvedBy = options.resolvedBy ?? "agent";
297
+ const payloadDigest = _payloadDigest(fromState, toState, artifacts, modifiedFiles, resolvedBy);
298
+ // Phase 1: cheap structural checks while holding the resource lock.
299
+ const snapshot = await acquireResourceLock(resourceId, () => {
300
+ assertTsOwnedForMutation(resourceId);
301
+ const registry = loadRegistry(resourceId); // may throw LedgerCorrupt
302
+ if (registry === null)
303
+ throw new GuardNotFound(`no guard registered for ${JSON.stringify(resourceId)}`);
304
+ if (guardChecksum(registry.graph, registry.edge_predicates, registry.terminal, registry.stakes) !== registry.checksum) {
305
+ throw new GuardTampered(`guard ${JSON.stringify(resourceId)} policy checksum mismatch`);
306
+ }
307
+ const replay = _maybeReplay(registry, idempotencyKey, payloadDigest);
308
+ if (replay !== null)
309
+ return { replay };
310
+ if (fromState !== registry.current_state) {
311
+ throw new StaleFromState(`from_state ${JSON.stringify(fromState)} != current_state ${JSON.stringify(registry.current_state)}`);
312
+ }
313
+ if (!(registry.graph[fromState] ?? []).includes(toState)) {
314
+ throw new IllegalEdge(`${_edgeKey(fromState, toState)} is not a legal edge`);
315
+ }
316
+ const edge = _edgeKey(fromState, toState);
317
+ return {
318
+ replay: null,
319
+ edge,
320
+ predicates: [...(registry.edge_predicates[edge] ?? [])],
321
+ stakes: registry.stakes[edge] ?? "default",
322
+ workspaceRoot: registry.workspace_root,
323
+ ledgerEntries: readLedger(resourceId),
324
+ };
325
+ });
326
+ if (snapshot.replay !== null)
327
+ return snapshot.replay;
328
+ // Phase 2: evidence and judge evaluation deliberately run outside the lock.
329
+ const trusted = snapshot.predicates.filter((predicate) => _ptype(predicate) === TRUSTED_TYPE);
330
+ const llm = snapshot.predicates.filter((predicate) => LLM_TYPES.has(_ptype(predicate)));
331
+ const evidence = await evaluateEvidence(trusted, snapshot.workspaceRoot, snapshot.ledgerEntries);
332
+ let combinedMet;
333
+ let verdict;
334
+ if (llm.length === 0) {
335
+ combinedMet = evidence.met;
336
+ verdict = _evidenceToVerdictDict(evidence, snapshot.stakes, "guard transition verdict");
337
+ }
338
+ else if (options.judge === null) {
339
+ combinedMet = false;
340
+ verdict = _evidenceToVerdictDict({ met: false, perPredicate: evidence.perPredicate }, snapshot.stakes, "LLM-tier predicates present but no verifier available");
341
+ }
342
+ else {
343
+ const judged = await evaluateLlmPredicates(llm, snapshot.stakes, options.judge ?? defaultJudge(), {
344
+ result: { resource_id: resourceId, edge: snapshot.edge, artifacts, modified_files: modifiedFiles },
345
+ });
346
+ [combinedMet, verdict] = _mergeVerdict(evidence, judged, snapshot.stakes);
347
+ }
348
+ verdict = normalizeVerdictForLedger(verdict);
349
+ // Phase 3: optimistic commit under a newly-acquired lock.
350
+ return acquireResourceLock(resourceId, async ({ token }) => {
351
+ assertTsOwnedForMutation(resourceId);
352
+ const registry = loadRegistry(resourceId);
353
+ if (registry === null)
354
+ throw new GuardNotFound(`no guard registered for ${JSON.stringify(resourceId)}`);
355
+ const replay = _maybeReplay(registry, idempotencyKey, payloadDigest);
356
+ if (replay !== null)
357
+ return replay;
358
+ if (registry.current_state !== fromState) {
359
+ throw new StaleFromState(`current_state advanced to ${JSON.stringify(registry.current_state)} during evaluation`);
360
+ }
361
+ if (guardChecksum(registry.graph, registry.edge_predicates, registry.terminal, registry.stakes) !== registry.checksum) {
362
+ throw new GuardTampered(`guard ${JSON.stringify(resourceId)} policy checksum mismatch during commit`);
363
+ }
364
+ if (!(registry.graph[fromState] ?? []).includes(toState)) {
365
+ // Python has the same latent eval-outside-lock race; Slice E should add this re-check there too.
366
+ throw new IllegalEdge(`${_edgeKey(fromState, toState)} is no longer a legal edge after evaluation`);
367
+ }
368
+ const outcome = combinedMet ? "applied" : "refused";
369
+ const entry = new LedgerEntry({
370
+ ts_ms: _nowMs(),
371
+ from_state: fromState,
372
+ to_state: toState,
373
+ outcome,
374
+ kind: "transition",
375
+ resolved_by: resolvedBy,
376
+ idempotency_key: idempotencyKey,
377
+ payload_digest: payloadDigest,
378
+ verdict,
379
+ });
380
+ await fenceResourceLock(resourceId, token);
381
+ const ledgerRef = appendLedger(resourceId, entry);
382
+ if (combinedMet) {
383
+ registry.current_state = toState;
384
+ persistRegistry(registry);
385
+ }
386
+ return { status: outcome, verdict, ledger_ref: ledgerRef, current_state: registry.current_state };
387
+ });
388
+ }
389
+ export function _checkOverrideToken(token) {
390
+ const expected = process.env.STRATUM_GUARD_OVERRIDE_TOKEN;
391
+ if (!expected) {
392
+ throw new OverrideUnavailable("override unavailable: STRATUM_GUARD_OVERRIDE_TOKEN not set in server env");
393
+ }
394
+ if (token !== expected)
395
+ throw new OverrideUnavailable("override token mismatch");
396
+ }
397
+ export async function guardOverride(resourceId, fromState, toState, overrideToken, rationale, resolvedBy = "human") {
398
+ _checkOverrideToken(overrideToken);
399
+ if (resolvedBy !== "human")
400
+ throw new OverrideUnavailable("override requires resolved_by='human'");
401
+ if (!rationale || !rationale.trim())
402
+ throw new OverrideUnavailable("override requires a non-empty rationale");
403
+ return acquireResourceLock(resourceId, async ({ token }) => {
404
+ assertTsOwnedForMutation(resourceId);
405
+ const registry = loadRegistry(resourceId);
406
+ if (registry === null)
407
+ throw new GuardNotFound(`no guard registered for ${JSON.stringify(resourceId)}`);
408
+ if (fromState !== registry.current_state) {
409
+ throw new StaleFromState(`from_state ${JSON.stringify(fromState)} != current_state ${JSON.stringify(registry.current_state)}`);
410
+ }
411
+ if (!(registry.graph[fromState] ?? []).includes(toState)) {
412
+ throw new IllegalEdge(`${_edgeKey(fromState, toState)} is not a legal edge (override bypasses predicates, not the graph)`);
413
+ }
414
+ const entry = new LedgerEntry({
415
+ ts_ms: _nowMs(),
416
+ from_state: fromState,
417
+ to_state: toState,
418
+ outcome: "deviation",
419
+ kind: "deviation",
420
+ resolved_by: resolvedBy,
421
+ rationale,
422
+ });
423
+ await fenceResourceLock(resourceId, token);
424
+ const ledgerRef = appendLedger(resourceId, entry);
425
+ registry.current_state = toState;
426
+ persistRegistry(registry);
427
+ return { status: "deviation", ledger_ref: ledgerRef, current_state: registry.current_state, rationale };
428
+ });
429
+ }
430
+ export async function guardMigrate(resourceId, newGraph, newEdgePredicates, overrideToken, rationale, newTerminal = [], newStakes = {}) {
431
+ _checkOverrideToken(overrideToken);
432
+ if (!rationale || !rationale.trim())
433
+ throw new OverrideUnavailable("migrate requires a non-empty rationale");
434
+ return acquireResourceLock(resourceId, async ({ token }) => {
435
+ assertTsOwnedForMutation(resourceId);
436
+ const registry = loadRegistry(resourceId);
437
+ if (registry === null)
438
+ throw new GuardNotFound(`no guard registered for ${JSON.stringify(resourceId)}`);
439
+ _validatePolicy(newGraph, newEdgePredicates, registry.initial, newTerminal, newStakes, registry.workspace_root);
440
+ if (!Object.hasOwn(newGraph, registry.current_state) && !newTerminal.includes(registry.current_state)) {
441
+ throw new InvalidStateName(`current_state ${JSON.stringify(registry.current_state)} is not a node in the new graph`);
442
+ }
443
+ const checksum = guardChecksum(newGraph, newEdgePredicates, newTerminal, newStakes);
444
+ const graphVersion = registry.graph_version + 1;
445
+ const entry = new LedgerEntry({
446
+ ts_ms: _nowMs(),
447
+ from_state: registry.current_state,
448
+ to_state: registry.current_state,
449
+ outcome: "graph_version",
450
+ kind: "graph_version",
451
+ resolved_by: "human",
452
+ rationale,
453
+ });
454
+ await fenceResourceLock(resourceId, token);
455
+ const ledgerRef = appendLedger(resourceId, entry);
456
+ registry.graph = newGraph;
457
+ registry.edge_predicates = newEdgePredicates;
458
+ registry.terminal = newTerminal;
459
+ registry.stakes = newStakes;
460
+ registry.checksum = checksum;
461
+ registry.graph_version = graphVersion;
462
+ persistRegistry(registry);
463
+ return { status: "migrated", checksum, graph_version: graphVersion, ledger_ref: ledgerRef, rationale };
464
+ });
465
+ }
466
+ export function guardHistory(resourceId) {
467
+ const registry = loadRegistry(resourceId);
468
+ if (registry === null)
469
+ throw new GuardNotFound(`no guard registered for ${JSON.stringify(resourceId)}`);
470
+ return {
471
+ resource_id: resourceId,
472
+ current_state: registry.current_state,
473
+ graph_version: registry.graph_version,
474
+ ledger: readLedger(resourceId).map((entry) => entry.toDict()),
475
+ };
476
+ }
477
+ //# sourceMappingURL=transition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transition.js","sourceRoot":"","sources":["../../src/guard/transition.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,uBAAuB,GAGxB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,gCAAgC,EAChC,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,eAAe,EACf,UAAU,EACV,WAAW,EACX,YAAY,EACZ,kBAAkB,GAGnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,cAAc,GAKf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,YAAY,GAAG,eAAe,CAAC;AACrC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAUlD,IAAI,mBAAmB,GAAiB,YAAY,CAAC;AACrD,IAAI,iBAAiB,GAAkB,eAAe,CAAC;AAEvD,mEAAmE;AACnE,MAAM,UAAU,uBAAuB,CAAC,IAAkB,EAAE,KAAoB;IAC9E,MAAM,YAAY,GAAG,mBAAmB,CAAC;IACzC,MAAM,aAAa,GAAG,iBAAiB,CAAC;IACxC,mBAAmB,GAAG,IAAI,CAAC;IAC3B,iBAAiB,GAAG,KAAK,CAAC;IAC1B,OAAO,GAAG,EAAE;QACV,mBAAmB,GAAG,YAAY,CAAC;QACnC,iBAAiB,GAAG,aAAa,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC;AAWD,MAAM,UAAU,MAAM,CAAC,SAAoB;IACzC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;QAAE,OAAO,YAAY,CAAC;IAC3D,OAAO,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,SAAiB,EAAE,OAAe;IACzD,OAAO,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,OAAe,EACf,SAAiC,EACjC,aAAuB,EACvB,UAAkB;IAElB,MAAM,SAAS,GAAG,aAAa,CAAC;QAC9B,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,OAAO;QACjB,SAAS;QACT,cAAc,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,IAAI,EAAE;QACzC,WAAW,EAAE,UAAU;KACxB,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAkB;IAClD,IAAI,eAAe,CAAC,UAAU,CAAC,KAAK,IAAI;QAAE,OAAO;IACjD,MAAM,IAAI,gBAAgB,CACxB,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,iFAAiF,CACrH,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,yBAAyB,CAAC,OAAgB;IACjD,MAAM,MAAM,GAAG,IAAI,OAAO,EAAU,CAAC;IACrC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAW,EAAE;QAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC5F,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC;YACtC,uFAAuF;YACvF,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3C,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,CAAC;YACH,4DAA4D;YAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC9D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAChG,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IACF,OAAO,SAAS,CAAC,OAAO,CAAY,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,GAAY,EAAE,OAAe,EAAE,MAAc,EAAE,UAAqB,EAAE,IAAa;IACtG,OAAO;QACL,KAAK,EAAE,GAAG;QACV,OAAO;QACP,QAAQ,EAAE,EAAE;QACZ,IAAI;QACJ,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,EAAE;QACd,IAAI,EAAE,EAAE;QACR,aAAa,EAAE,KAAK;QACpB,GAAG;QACH,MAAM;QACN,UAAU;QACV,kBAAkB,EAAE,EAAE;QACtB,eAAe,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;QAC1D,iBAAiB,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,EAAE;KACxG,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAwB;IAClD,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACtD,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,KAAK,EAAE,CAAC;QACvC,IAAI,EAAE,YAAY;QAClB,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAC1C,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,CAAC;QACf,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,EAAE;QAChB,EAAE,EAAE,IAAI;KACT,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAwB;IACpD,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/C,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI,IAAI;QACxB,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,GAAG,EAAE,SAAS,CAAC,GAAG;QAClB,QAAQ,EAAE,SAAS,CAAC,QAAQ;KAC7B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAwB,EAAE,MAAc,EAAE,OAAe;IAC9F,OAAO,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE;QAC9E,UAAU,EAAE,OAAO;QACnB,MAAM,EAAE,UAAU;QAClB,cAAc,EAAE,oBAAoB,CAAC,QAAQ,CAAC;KAC/C,CAAC,CAAC;AACL,CAAC;AAYD,MAAM,UAAU,aAAa,CAAC,QAAwB,EAAE,WAA2B,EAAE,MAAc;IACjG,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC;IACjD,MAAM,OAAO,GAAG,WAAW,CACzB,QAAQ,EACR,WAAW,CAAC,OAAO,IAAI,0BAA0B,EACjD,MAAM,EACN,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,EAAE,GAAG,WAAW,CAAC,UAAU,CAAC,EAC5D,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAC7F,CAAC;IACF,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;IACxC,OAAO,CAAC,eAAe,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACtG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,kBAAkB,CAAC,cAA8B;IAChE,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAChE,KAAK,MAAM,SAAS,IAAI,UAAU;YAAE,MAAM,CAAC,IAAI,EAAE,SAAsB,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAiB,EACjB,cAA8B,EAC9B,OAAe,EACf,QAAkB,EAClB,MAA8B,EAC9B,aAA4B;IAE5B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,gBAAgB,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,gBAAgB,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACpG,CAAC;IAED,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,KAAK,MAAM,CAAC,EAAE,SAAS,CAAC,IAAI,kBAAkB,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,MAAM,IAAI,kBAAkB,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC1H,CAAC;QACD,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,IAAI,KAAK,mBAAmB;YAAE,WAAW,GAAG,IAAI,CAAC;QAC5D,IAAI,CAAC,oBAAoB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,cAAc,GAAG,IAAI,CAAC;IACpH,CAAC;IAED,IAAI,WAAW,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,wBAAwB,CAChC,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IACD,IAAI,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,oBAAoB,CAAC,sEAAsE,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC;YACH,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,IAAI,oBAAoB,CAAC,0DAA0D,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC5H,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAChE,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAsB,CAAC,KAAK,YAAY,CAAC,EAAE,CAAC;YACpH,MAAM,IAAI,gCAAgC,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACxH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,KAAiB,EACjB,cAA8B,EAC9B,OAAe,EACf,WAAqB,EAAE,EACvB,SAAiC,EAAE,EACnC,gBAA+B,IAAI;IAEnC,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxE,MAAM,wBAAwB,GAAG,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACvE,MAAM,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,wBAAwB,IAAI,KAAK,KAAK,IAAI;gBAAE,wBAAwB,CAAC,UAAU,CAAC,CAAC;YACrF,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ;gBAAE,OAAO,QAAiB,CAAC;YAC7D,MAAM,IAAI,sBAAsB,CAC9B,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,0DAA0D,CAC9F,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC;YACjC,WAAW,EAAE,UAAU;YACvB,KAAK;YACL,eAAe,EAAE,cAAc;YAC/B,OAAO;YACP,QAAQ;YACR,MAAM;YACN,QAAQ;YACR,aAAa,EAAE,CAAC;YAChB,cAAc,EAAE,aAAa;YAC7B,aAAa,EAAE,OAAO;SACvB,CAAC,CAAC;QACH,MAAM,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3C,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,YAAqB,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAuB,EACvB,cAAyC,EACzC,aAAqB;IAErB,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACzE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,KAAK,CAAC,cAAc,KAAK,aAAa,EAAE,CAAC;QAC3C,MAAM,IAAI,mBAAmB,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,kCAAkC,CAAC,CAAC;IACrH,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,sBAAsB,CACrD,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,EACtD,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,SAAS,EACxE,gCAAgC,CACjC,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,YAAY,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC;AAChH,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,YAAY,EAAE,KAAK,QAAQ;QAChC,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC;QAC5D,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,UAAuB,EACvB,MAAc,EACd,KAAiB,EACjB,OAAsB;IAEtB,MAAM,OAAO,GAA0D,EAAE,CAAC;IAC1E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAgB,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;QAChD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,0BAA0B;QAC5G,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACzD,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,KAAK,EAAE,CAAC;YACvC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC;YACvB,SAAS,EAAE,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YAC7E,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACzC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACjC,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,EAAE;YAChB,EAAE,EAAE,IAAI;SACT,CAAC,CAAC;QACH,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE;YACJ,MAAM,EAAE,OAAO;YACf,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC1C,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;aAC5C,CAAC,CAAC;SACJ;QACD,wEAAwE;QACxE,sEAAsE;QACtE,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,OAAO,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,SAAiB,EACjB,OAAe,EACf,UAAkC,EAAE;IAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAClD,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC;IACjD,MAAM,aAAa,GAAG,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAE/F,oEAAoE;IACpE,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,GAAG,EAAE;QAC1D,wBAAwB,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,0BAA0B;QACrE,IAAI,QAAQ,KAAK,IAAI;YAAE,MAAM,IAAI,aAAa,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACxG,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtH,MAAM,IAAI,aAAa,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QACrE,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAW,CAAC;QAChD,IAAI,SAAS,KAAK,QAAQ,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,IAAI,cAAc,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACjI,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,WAAW,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,IAAI;YACJ,UAAU,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAgB;YACtE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS;YAC1C,aAAa,EAAE,QAAQ,CAAC,cAAc;YACtC,aAAa,EAAE,UAAU,CAAC,UAAU,CAAC;SAC7B,CAAC;IACb,CAAC,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;IAErD,4EAA4E;IAC5E,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,YAAY,CAAC,CAAC;IAC9F,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAA8B,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAExH,IAAI,WAAoB,CAAC;IACzB,IAAI,OAAgB,CAAC;IACrB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC3B,OAAO,GAAG,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IAC1F,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAClC,WAAW,GAAG,KAAK,CAAC;QACpB,OAAO,GAAG,sBAAsB,CAC9B,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,EACnD,QAAQ,CAAC,MAAM,EACf,uDAAuD,CACxD,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,YAAY,EAAE,EAAE;YAChG,MAAM,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE;SACnG,CAAC,CAAC;QACH,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAE7C,0DAA0D;IAC1D,OAAO,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACzD,wBAAwB,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,IAAI;YAAE,MAAM,IAAI,aAAa,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACxG,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QACrE,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;QACnC,IAAI,QAAQ,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,IAAI,cAAc,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACpH,CAAC;QACD,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtH,MAAM,IAAI,aAAa,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAC;QACxG,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,iGAAiG;YACjG,MAAM,IAAI,WAAW,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,6CAA6C,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,OAAO,GAAqB,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC;YAC5B,KAAK,EAAE,MAAM,EAAE;YACf,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO;YACjB,OAAO;YACP,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,UAAU;YACvB,eAAe,EAAE,cAAc;YAC/B,cAAc,EAAE,aAAa;YAC7B,OAAO;SACR,CAAC,CAAC;QACH,MAAM,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,WAAW,EAAE,CAAC;YAChB,QAAQ,CAAC,aAAa,GAAG,OAAO,CAAC;YACjC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC;IACpG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,mBAAmB,CAAC,0EAA0E,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,KAAK,KAAK,QAAQ;QAAE,MAAM,IAAI,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,SAAiB,EACjB,OAAe,EACf,aAAqB,EACrB,SAAiB,EACjB,UAAU,GAAG,OAAO;IAEpB,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACnC,IAAI,UAAU,KAAK,OAAO;QAAE,MAAM,IAAI,mBAAmB,CAAC,uCAAuC,CAAC,CAAC;IACnG,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,mBAAmB,CAAC,yCAAyC,CAAC,CAAC;IAE9G,OAAO,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACzD,wBAAwB,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,IAAI;YAAE,MAAM,IAAI,aAAa,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACxG,IAAI,SAAS,KAAK,QAAQ,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,IAAI,cAAc,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACjI,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,WAAW,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,oEAAoE,CAAC,CAAC;QAC7H,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC;YAC5B,KAAK,EAAE,MAAM,EAAE;YACf,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,UAAU;YACvB,SAAS;SACV,CAAC,CAAC;QACH,MAAM,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClD,QAAQ,CAAC,aAAa,GAAG,OAAO,CAAC;QACjC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;IAC1G,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,QAAoB,EACpB,iBAAiC,EACjC,aAAqB,EACrB,SAAiB,EACjB,cAAwB,EAAE,EAC1B,YAAoC,EAAE;IAEtC,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACnC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,mBAAmB,CAAC,wCAAwC,CAAC,CAAC;IAE7G,OAAO,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACzD,wBAAwB,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,IAAI;YAAE,MAAM,IAAI,aAAa,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACxG,eAAe,CACb,QAAQ,EACR,iBAAiB,EACjB,QAAQ,CAAC,OAAO,EAChB,WAAW,EACX,SAAS,EACT,QAAQ,CAAC,cAAc,CACxB,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACtG,MAAM,IAAI,gBAAgB,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,iCAAiC,CAAC,CAAC;QACvH,CAAC;QACD,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACpF,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,GAAG,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC;YAC5B,KAAK,EAAE,MAAM,EAAE;YACf,UAAU,EAAE,QAAQ,CAAC,aAAa;YAClC,QAAQ,EAAE,QAAQ,CAAC,aAAa;YAChC,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,OAAO;YACpB,SAAS;SACV,CAAC,CAAC;QACH,MAAM,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClD,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC;QAC1B,QAAQ,CAAC,eAAe,GAAG,iBAAiB,CAAC;QAC7C,QAAQ,CAAC,QAAQ,GAAG,WAAW,CAAC;QAChC,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;QAC5B,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,QAAQ,CAAC,aAAa,GAAG,YAAY,CAAC;QACtC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IACzG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB;IAM7C,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,QAAQ,KAAK,IAAI;QAAE,MAAM,IAAI,aAAa,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACxG,OAAO;QACL,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,69 @@
1
+ export const STEP_ID_PATTERN = /^[a-z][a-z0-9_-]*$/;
2
+ export const PATH_FIELD_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
3
+ function parsePath(source) {
4
+ if (source.length === 0)
5
+ return [];
6
+ const path = [];
7
+ let rest = source;
8
+ while (rest.length > 0) {
9
+ if (rest.startsWith(".")) {
10
+ const match = /^\.([a-zA-Z_][a-zA-Z0-9_]*)/.exec(rest);
11
+ if (!match?.[1])
12
+ return undefined;
13
+ path.push(match[1]);
14
+ rest = rest.slice(match[0].length);
15
+ continue;
16
+ }
17
+ if (rest.startsWith("[")) {
18
+ const match = /^\[([0-9]+)\]/.exec(rest);
19
+ if (!match?.[1])
20
+ return undefined;
21
+ path.push(Number(match[1]));
22
+ rest = rest.slice(match[0].length);
23
+ continue;
24
+ }
25
+ return undefined;
26
+ }
27
+ return path;
28
+ }
29
+ /** Parses the complete contents of one `${...}` reference. */
30
+ export function parseReference(source) {
31
+ if (source === "item")
32
+ return { kind: "item" };
33
+ if (source === "prev")
34
+ return { kind: "prev" };
35
+ if (source.startsWith("input.")) {
36
+ const path = parsePath(source.slice("input".length));
37
+ return path && path.length > 0 ? { kind: "input", path } : undefined;
38
+ }
39
+ const match = /^([a-z][a-z0-9_-]*)\.output(.*)$/.exec(source);
40
+ if (!match?.[1])
41
+ return undefined;
42
+ const path = parsePath(match[2] ?? "");
43
+ return path === undefined ? undefined : { kind: "step", stepId: match[1], path };
44
+ }
45
+ /** Finds every reference in a string and records interpolation versus typed reference use. */
46
+ export function extractReferences(value) {
47
+ const references = [];
48
+ const matcher = /\$\{([^}]*)\}/g;
49
+ let match;
50
+ while ((match = matcher.exec(value)) !== null) {
51
+ const raw = match[0];
52
+ const content = match[1] ?? "";
53
+ const reference = parseReference(content);
54
+ if (!reference)
55
+ return undefined;
56
+ references.push({ raw, reference, fullValue: raw === value });
57
+ }
58
+ // A dangling opening token is never a literal reference spelling.
59
+ if (value.includes("${") && references.length === 0)
60
+ return undefined;
61
+ if (value.lastIndexOf("${") > value.lastIndexOf("}"))
62
+ return undefined;
63
+ return references;
64
+ }
65
+ /** Converts only step-output references into their data-dependency edges. */
66
+ export function referenceEdges(to, references) {
67
+ return references.flatMap(({ reference }) => reference.kind === "step" ? [{ from: reference.stepId, to }] : []);
68
+ }
69
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/ir/refs.ts"],"names":[],"mappings":"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"}