vigiles 2.0.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 (156) hide show
  1. package/.claude/settings.json +46 -0
  2. package/.claude/settings.local.json +8 -0
  3. package/.claude-plugin/hooks/post-edit.sh +34 -0
  4. package/.claude-plugin/hooks/pre-edit.sh +40 -0
  5. package/.claude-plugin/hooks/session-start.sh +38 -0
  6. package/.claude-plugin/marketplace.json +14 -0
  7. package/.claude-plugin/plugin.json +47 -0
  8. package/.github/workflows/ci.yml +81 -0
  9. package/.prettierignore +1 -0
  10. package/.vigiles/generated.d.ts +205 -0
  11. package/CLAUDE.md +95 -0
  12. package/CLAUDE.md.spec.ts +142 -0
  13. package/CONTRIBUTING.md +121 -0
  14. package/LICENSE +21 -0
  15. package/README.md +377 -0
  16. package/action.yml +25 -0
  17. package/dist/action.d.ts +7 -0
  18. package/dist/action.d.ts.map +1 -0
  19. package/dist/action.js +180 -0
  20. package/dist/action.js.map +1 -0
  21. package/dist/cli.d.ts +12 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +1267 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/cli.test.d.ts +2 -0
  26. package/dist/cli.test.d.ts.map +1 -0
  27. package/dist/cli.test.js +650 -0
  28. package/dist/cli.test.js.map +1 -0
  29. package/dist/compile.d.ts +101 -0
  30. package/dist/compile.d.ts.map +1 -0
  31. package/dist/compile.js +503 -0
  32. package/dist/compile.js.map +1 -0
  33. package/dist/evolve.d.ts +132 -0
  34. package/dist/evolve.d.ts.map +1 -0
  35. package/dist/evolve.js +599 -0
  36. package/dist/evolve.js.map +1 -0
  37. package/dist/freshness.d.ts +67 -0
  38. package/dist/freshness.d.ts.map +1 -0
  39. package/dist/freshness.js +244 -0
  40. package/dist/freshness.js.map +1 -0
  41. package/dist/freshness.test.d.ts +2 -0
  42. package/dist/freshness.test.d.ts.map +1 -0
  43. package/dist/freshness.test.js +356 -0
  44. package/dist/freshness.test.js.map +1 -0
  45. package/dist/generate-types.d.ts +34 -0
  46. package/dist/generate-types.d.ts.map +1 -0
  47. package/dist/generate-types.js +381 -0
  48. package/dist/generate-types.js.map +1 -0
  49. package/dist/inline.d.ts +58 -0
  50. package/dist/inline.d.ts.map +1 -0
  51. package/dist/inline.js +142 -0
  52. package/dist/inline.js.map +1 -0
  53. package/dist/inline.test.d.ts +5 -0
  54. package/dist/inline.test.d.ts.map +1 -0
  55. package/dist/inline.test.js +152 -0
  56. package/dist/inline.test.js.map +1 -0
  57. package/dist/linters.d.ts +38 -0
  58. package/dist/linters.d.ts.map +1 -0
  59. package/dist/linters.js +588 -0
  60. package/dist/linters.js.map +1 -0
  61. package/dist/proofs.d.ts +272 -0
  62. package/dist/proofs.d.ts.map +1 -0
  63. package/dist/proofs.js +622 -0
  64. package/dist/proofs.js.map +1 -0
  65. package/dist/proofs.test.d.ts +9 -0
  66. package/dist/proofs.test.d.ts.map +1 -0
  67. package/dist/proofs.test.js +952 -0
  68. package/dist/proofs.test.js.map +1 -0
  69. package/dist/spec.d.ts +258 -0
  70. package/dist/spec.d.ts.map +1 -0
  71. package/dist/spec.js +113 -0
  72. package/dist/spec.js.map +1 -0
  73. package/dist/spec.test.d.ts +2 -0
  74. package/dist/spec.test.d.ts.map +1 -0
  75. package/dist/spec.test.js +1222 -0
  76. package/dist/spec.test.js.map +1 -0
  77. package/dist/types.d.ts +101 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +3 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/validate.d.ts +10 -0
  82. package/dist/validate.d.ts.map +1 -0
  83. package/dist/validate.js +286 -0
  84. package/dist/validate.js.map +1 -0
  85. package/dist/validate.test.d.ts +2 -0
  86. package/dist/validate.test.d.ts.map +1 -0
  87. package/dist/validate.test.js +531 -0
  88. package/dist/validate.test.js.map +1 -0
  89. package/docs/agent-setup.md +85 -0
  90. package/docs/agent-workflows.md +103 -0
  91. package/docs/comparison.md +71 -0
  92. package/docs/freshness.md +124 -0
  93. package/docs/inline-mode.md +119 -0
  94. package/docs/linter-support.md +166 -0
  95. package/docs/spec-format.md +194 -0
  96. package/eslint.config.mjs +79 -0
  97. package/examples/CLAUDE.md +54 -0
  98. package/examples/CLAUDE.md.spec.ts +65 -0
  99. package/examples/SKILL.md +50 -0
  100. package/examples/SKILL.md.spec.ts +57 -0
  101. package/fixtures/example-project/CLAUDE.md +11 -0
  102. package/fixtures/example-project/package.json +9 -0
  103. package/fixtures/example-project/src/index.ts +3 -0
  104. package/fixtures/example-project/src/utils.test.ts +2 -0
  105. package/fixtures/example-project/src/utils.ts +3 -0
  106. package/logo.png +0 -0
  107. package/package.json +42 -0
  108. package/research/adoption-strategy.md +111 -0
  109. package/research/agent-integration.md +145 -0
  110. package/research/ai-code-quality.md +197 -0
  111. package/research/code-search-for-agents.md +313 -0
  112. package/research/competitive-landscape.md +163 -0
  113. package/research/doc-freshness.md +516 -0
  114. package/research/executable-specs.md +368 -0
  115. package/research/feature-ideas.md +464 -0
  116. package/research/formal-proofs-for-agents.md +338 -0
  117. package/research/fp-for-agent-harness.md +150 -0
  118. package/research/fp-for-deterministic-ai.md +131 -0
  119. package/research/self-evolving-specs.md +298 -0
  120. package/schemas/claude-md-strict.yml +18 -0
  121. package/schemas/claude-md.yml +6 -0
  122. package/schemas/skill-strict.yml +12 -0
  123. package/schemas/skill.yml +5 -0
  124. package/skills/audit-feedback-loop/SKILL.md +76 -0
  125. package/skills/edit-spec/SKILL.md +131 -0
  126. package/skills/enforce-rules-format/SKILL.md +71 -0
  127. package/skills/generate-logo/SKILL.md +102 -0
  128. package/skills/generate-rule/SKILL.md +90 -0
  129. package/skills/linter-docs/clippy.md +241 -0
  130. package/skills/linter-docs/eslint.md +384 -0
  131. package/skills/linter-docs/pylint.md +288 -0
  132. package/skills/linter-docs/rubocop.md +277 -0
  133. package/skills/linter-docs/ruff.md +187 -0
  134. package/skills/linter-docs/stylelint.md +247 -0
  135. package/skills/migrate-to-spec/SKILL.md +124 -0
  136. package/skills/pr-to-lint-rule/SKILL.md +97 -0
  137. package/skills/strengthen/SKILL.md +168 -0
  138. package/src/action.ts +214 -0
  139. package/src/cli.test.ts +914 -0
  140. package/src/cli.ts +1631 -0
  141. package/src/compile.ts +691 -0
  142. package/src/evolve.ts +781 -0
  143. package/src/freshness.test.ts +449 -0
  144. package/src/freshness.ts +299 -0
  145. package/src/generate-types.ts +448 -0
  146. package/src/inline.test.ts +206 -0
  147. package/src/inline.ts +164 -0
  148. package/src/linters.ts +739 -0
  149. package/src/proofs.test.ts +1314 -0
  150. package/src/proofs.ts +849 -0
  151. package/src/spec.test.ts +1471 -0
  152. package/src/spec.ts +427 -0
  153. package/src/types.ts +117 -0
  154. package/src/validate.test.ts +701 -0
  155. package/src/validate.ts +381 -0
  156. package/tsconfig.json +23 -0
package/dist/evolve.js ADDED
@@ -0,0 +1,599 @@
1
+ "use strict";
2
+ /**
3
+ * vigiles — Evolution engine for self-evolving specifications.
4
+ *
5
+ * AI agents propose mutations. The engine applies them, runs the proof suite,
6
+ * and only accepts mutations that pass all proofs AND improve fitness.
7
+ *
8
+ * Pattern: "LLM proposes, deterministic algorithm disposes."
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.EvolutionEngine = void 0;
12
+ exports.applyMutation = applyMutation;
13
+ exports.runProofSuite = runProofSuite;
14
+ const proofs_js_1 = require("./proofs.js");
15
+ const compile_js_1 = require("./compile.js");
16
+ /**
17
+ * Shallow-clone a Rule. Rules are simple value types (primitive fields only),
18
+ * so a spread is sufficient to decouple engine state from the caller's
19
+ * mutation object — without this, later caller-side edits would silently
20
+ * alter accepted engine state without re-running proofs.
21
+ */
22
+ function cloneRule(rule) {
23
+ return { ...rule };
24
+ }
25
+ /**
26
+ * Canonical string representation of a rules map for hashing.
27
+ *
28
+ * `JSON.stringify` preserves insertion order, so two logically identical
29
+ * rule maps built in a different order would hash to different values.
30
+ * That would make the Merkle head/specHash comparison in the constructor
31
+ * falsely reject a valid imported history just because the caller
32
+ * reconstructed rules in a different order.
33
+ *
34
+ * Sort by rule id, stringify each entry with its own stable key order,
35
+ * and join with a separator.
36
+ */
37
+ function canonicalRulesJson(rules) {
38
+ const sortedIds = Object.keys(rules).sort();
39
+ const entries = sortedIds.map((id) => {
40
+ const rule = rules[id];
41
+ // Also sort the keys within each rule object so { _kind, text } and
42
+ // { text, _kind } produce the same output.
43
+ const ruleKeys = Object.keys(rule).sort();
44
+ const orderedRule = {};
45
+ for (const k of ruleKeys) {
46
+ orderedRule[k] = rule[k];
47
+ }
48
+ return [id, orderedRule];
49
+ });
50
+ return JSON.stringify(entries);
51
+ }
52
+ /**
53
+ * Apply a mutation to a spec's rules, producing a new rule map.
54
+ * Returns null + error if the mutation is invalid.
55
+ */
56
+ function applyMutation(rules, mutation) {
57
+ const next = { ...rules };
58
+ switch (mutation.type) {
59
+ case "add": {
60
+ if (mutation.ruleId in next) {
61
+ return {
62
+ rules,
63
+ error: {
64
+ mutation,
65
+ reason: `Rule "${mutation.ruleId}" already exists`,
66
+ },
67
+ };
68
+ }
69
+ next[mutation.ruleId] = cloneRule(mutation.rule);
70
+ return { rules: next };
71
+ }
72
+ case "remove": {
73
+ if (!(mutation.ruleId in next)) {
74
+ return {
75
+ rules,
76
+ error: {
77
+ mutation,
78
+ reason: `Rule "${mutation.ruleId}" not found`,
79
+ },
80
+ };
81
+ }
82
+ const { [mutation.ruleId]: _removed, ...rest } = next;
83
+ void _removed;
84
+ return { rules: rest };
85
+ }
86
+ case "strengthen": {
87
+ const rule = next[mutation.ruleId];
88
+ if (!rule) {
89
+ return {
90
+ rules,
91
+ error: {
92
+ mutation,
93
+ reason: `Rule "${mutation.ruleId}" not found`,
94
+ },
95
+ };
96
+ }
97
+ if (rule._kind === "guidance") {
98
+ if (mutation.linterRule) {
99
+ // guidance → enforce
100
+ next[mutation.ruleId] = {
101
+ _kind: "enforce",
102
+ linterRule: mutation.linterRule,
103
+ why: rule.text,
104
+ verify: true,
105
+ };
106
+ }
107
+ else {
108
+ return {
109
+ rules,
110
+ error: {
111
+ mutation,
112
+ reason: "Strengthening guidance requires a linterRule to enforce against.",
113
+ },
114
+ };
115
+ }
116
+ }
117
+ else {
118
+ return {
119
+ rules,
120
+ error: {
121
+ mutation,
122
+ reason: `Rule "${mutation.ruleId}" is already at maximum strength (enforce)`,
123
+ },
124
+ };
125
+ }
126
+ return { rules: next };
127
+ }
128
+ case "weaken": {
129
+ const rule = next[mutation.ruleId];
130
+ if (!rule) {
131
+ return {
132
+ rules,
133
+ error: {
134
+ mutation,
135
+ reason: `Rule "${mutation.ruleId}" not found`,
136
+ },
137
+ };
138
+ }
139
+ if (rule._kind === "enforce") {
140
+ next[mutation.ruleId] = {
141
+ _kind: "guidance",
142
+ text: rule.why,
143
+ };
144
+ }
145
+ else {
146
+ return {
147
+ rules,
148
+ error: {
149
+ mutation,
150
+ reason: `Rule "${mutation.ruleId}" is already at minimum strength (guidance)`,
151
+ },
152
+ };
153
+ }
154
+ return { rules: next };
155
+ }
156
+ case "merge": {
157
+ const [idA, idB] = mutation.sourceIds;
158
+ if (idA === idB) {
159
+ return {
160
+ rules,
161
+ error: {
162
+ mutation,
163
+ reason: `Merge requires two distinct source rules; got "${idA}" twice`,
164
+ },
165
+ };
166
+ }
167
+ if (!(idA in next) || !(idB in next)) {
168
+ return {
169
+ rules,
170
+ error: {
171
+ mutation,
172
+ reason: `One or both source rules not found: "${idA}", "${idB}"`,
173
+ },
174
+ };
175
+ }
176
+ // mergedId must not collide with an unrelated existing rule —
177
+ // otherwise the assignment would silently overwrite that rule and
178
+ // drop its constraints. Allowed only when mergedId is one of the
179
+ // sources being consumed (renaming-in-place).
180
+ if (mutation.mergedId in next &&
181
+ mutation.mergedId !== idA &&
182
+ mutation.mergedId !== idB) {
183
+ return {
184
+ rules,
185
+ error: {
186
+ mutation,
187
+ reason: `Merge target "${mutation.mergedId}" collides with an existing unrelated rule; pick a new id or remove the existing rule first`,
188
+ },
189
+ };
190
+ }
191
+ // Merge must not silently weaken enforcement. The merged rule's
192
+ // strength must be at least as strong as the strongest source —
193
+ // otherwise a caller could launder two enforced rules into a
194
+ // single guidance rule and bypass monotonicity (because the
195
+ // per-call allowWeaken for merge sources means removals don't
196
+ // trigger the violation).
197
+ const sourceStrengths = mutation.sourceIds.map((id) => (0, proofs_js_1.ruleStrength)(next[id]._kind));
198
+ const maxSourceStrength = Math.max(...sourceStrengths);
199
+ const mergedStrength = (0, proofs_js_1.ruleStrength)(mutation.mergedRule._kind);
200
+ if (mergedStrength < maxSourceStrength) {
201
+ return {
202
+ rules,
203
+ error: {
204
+ mutation,
205
+ reason: `Merged rule "${mutation.mergedId}" (${mutation.mergedRule._kind}) is weaker than source rules (strongest was ${maxSourceStrength === 1 ? "enforce" : "guidance"}). Merges may not downgrade enforcement.`,
206
+ },
207
+ };
208
+ }
209
+ const { [idA]: _a, [idB]: _b, ...rest } = next;
210
+ void _a;
211
+ void _b;
212
+ return {
213
+ rules: { ...rest, [mutation.mergedId]: cloneRule(mutation.mergedRule) },
214
+ };
215
+ }
216
+ case "reword": {
217
+ const rule = next[mutation.ruleId];
218
+ if (!rule) {
219
+ return {
220
+ rules,
221
+ error: {
222
+ mutation,
223
+ reason: `Rule "${mutation.ruleId}" not found`,
224
+ },
225
+ };
226
+ }
227
+ if (rule._kind === "guidance") {
228
+ next[mutation.ruleId] = { ...rule, text: mutation.newText };
229
+ }
230
+ else if (rule._kind === "enforce") {
231
+ next[mutation.ruleId] = { ...rule, why: mutation.newText };
232
+ }
233
+ return { rules: next };
234
+ }
235
+ }
236
+ }
237
+ /**
238
+ * Run all proofs on a candidate spec mutation.
239
+ *
240
+ * Proofs:
241
+ * 1. Monotonicity — rules don't weaken (unless explicitly allowed)
242
+ * 2. NCD deduplication — no near-duplicate rules introduced
243
+ * 3. Bloom filter overlap — fast cross-check for token similarity
244
+ */
245
+ function runProofSuite(before, after, options = {}) {
246
+ const receipts = [];
247
+ const ncdThreshold = options.ncdThreshold ?? 0.3;
248
+ // 1. Monotonicity
249
+ const mono = (0, proofs_js_1.checkMonotonicity)(before, after, {
250
+ allowWeaken: options.allowWeaken,
251
+ });
252
+ receipts.push({
253
+ name: "monotonicity",
254
+ passed: mono.valid,
255
+ detail: mono.valid
256
+ ? `${mono.strengthened.length} strengthened, ${mono.added.length} added`
257
+ : `${mono.violations.length} violations: ${mono.violations.map((v) => `${v.ruleId} (${v.from}→${v.to})`).join(", ")}`,
258
+ });
259
+ // 2. NCD deduplication. Only fail on pairs NEWLY INTRODUCED by the
260
+ // candidate change — a repo with historical duplication must not
261
+ // block every unrelated mutation. Compute similar pairs on `after`
262
+ // and `before`, then subtract.
263
+ //
264
+ // Wrapped in try/catch so an unknown rule kind (legacy data / JS
265
+ // caller) surfaces as a clean proof failure rather than crashing
266
+ // the whole audit pipeline.
267
+ try {
268
+ const beforePairs = new Set((0, proofs_js_1.findSimilarRules)(before, ncdThreshold).map((p) => [p.idA, p.idB].sort().join("|")));
269
+ const similar = (0, proofs_js_1.findSimilarRules)(after, ncdThreshold).filter((p) => !beforePairs.has([p.idA, p.idB].sort().join("|")));
270
+ const ncdPassed = similar.length === 0;
271
+ receipts.push({
272
+ name: "ncd-dedup",
273
+ passed: ncdPassed,
274
+ detail: ncdPassed
275
+ ? "No new near-duplicate rules"
276
+ : `${similar.length} new near-duplicate pairs: ${similar.map((p) => `${p.idA}↔${p.idB} (${p.distance.toFixed(3)})`).join(", ")}`,
277
+ });
278
+ }
279
+ catch (e) {
280
+ receipts.push({
281
+ name: "ncd-dedup",
282
+ passed: false,
283
+ detail: `Similarity check failed: ${e instanceof Error ? e.message : String(e)}`,
284
+ });
285
+ }
286
+ // 3. Bloom filter cross-check (fast sanity check for token overlap).
287
+ // Baseline is built from rules that still exist in `after` — any
288
+ // rule removed by the candidate mutation (e.g. the two sources of
289
+ // a merge) must be excluded, otherwise the newly introduced merge
290
+ // rule would collide against its own sources and the merge would
291
+ // be rejected for the very similarity it was meant to deduplicate.
292
+ //
293
+ // Wrapped for the same reason as NCD: ruleToBloomFilter → ruleToText
294
+ // throws on unknown rule kinds.
295
+ try {
296
+ let bloomPassed = true;
297
+ const newRuleIds = Object.keys(after).filter((id) => !(id in before));
298
+ const existingFilters = new Map();
299
+ for (const [id, rule] of Object.entries(before)) {
300
+ if (!(id in after))
301
+ continue; // removed — skip
302
+ existingFilters.set(id, (0, proofs_js_1.ruleToBloomFilter)(rule));
303
+ }
304
+ const bloomOverlaps = [];
305
+ for (const newId of newRuleIds) {
306
+ const newFilter = (0, proofs_js_1.ruleToBloomFilter)(after[newId]);
307
+ for (const [existingId, existingFilter] of existingFilters) {
308
+ if (existingId === newId)
309
+ continue;
310
+ try {
311
+ const similarity = proofs_js_1.BloomFilter.jaccardSimilarity(newFilter, existingFilter);
312
+ if (similarity > 0.7) {
313
+ bloomOverlaps.push(`${newId}↔${existingId} (jaccard=${similarity.toFixed(3)})`);
314
+ bloomPassed = false;
315
+ }
316
+ }
317
+ catch {
318
+ // Different filter sizes — skip comparison
319
+ }
320
+ }
321
+ }
322
+ receipts.push({
323
+ name: "bloom-overlap",
324
+ passed: bloomPassed,
325
+ detail: bloomPassed
326
+ ? "No suspicious token overlap"
327
+ : `High overlap: ${bloomOverlaps.join(", ")}`,
328
+ });
329
+ }
330
+ catch (e) {
331
+ receipts.push({
332
+ name: "bloom-overlap",
333
+ passed: false,
334
+ detail: `Bloom filter check failed: ${e instanceof Error ? e.message : String(e)}`,
335
+ });
336
+ }
337
+ // Compute fitness of the new spec. Guard against bad runtime data: fitness
338
+ // recomputes similarity internally and would otherwise crash on unknown
339
+ // rule kinds (legacy `check`, JS caller), propagating the throw up through
340
+ // the engine. Fall back to a neutral fitness and mark the proof failed.
341
+ const specForFitness = { rules: after };
342
+ let fitnessResult;
343
+ try {
344
+ fitnessResult = (0, proofs_js_1.fitness)(specForFitness, {
345
+ maxTokens: options.maxTokens,
346
+ ncdThreshold,
347
+ });
348
+ }
349
+ catch (e) {
350
+ receipts.push({
351
+ name: "fitness",
352
+ passed: false,
353
+ detail: `Fitness computation failed: ${e instanceof Error ? e.message : String(e)}`,
354
+ });
355
+ fitnessResult = {
356
+ score: 0,
357
+ coverage: 0,
358
+ redundancy: 0,
359
+ budgetPressure: 0,
360
+ };
361
+ }
362
+ const allPassed = receipts.every((r) => r.passed);
363
+ return { passed: allPassed, receipts, fitness: fitnessResult };
364
+ }
365
+ /**
366
+ * The evolution engine: the core of the self-evolving spec system.
367
+ *
368
+ * Maintains a spec, a proof suite, and a Merkle history.
369
+ * Accepts mutations that pass all proofs and improve (or maintain) fitness.
370
+ */
371
+ class EvolutionEngine {
372
+ rules;
373
+ history;
374
+ options;
375
+ constructor(initialRules, options = {}) {
376
+ this.rules = Object.fromEntries(Object.entries(initialRules).map(([id, rule]) => [id, cloneRule(rule)]));
377
+ // Snapshot the supplied history by serializing and rehydrating, so a
378
+ // caller that retains their reference to the original MerkleHistory
379
+ // can't append to the audit trail behind the engine's back. Without
380
+ // this, external code could bypass propose()'s proof + fitness gates
381
+ // and mutate provenance — defeating the whole tamper-evident point.
382
+ this.history = options.history
383
+ ? proofs_js_1.MerkleHistory.fromJSON(options.history.toJSON())
384
+ : new proofs_js_1.MerkleHistory();
385
+ this.options = {
386
+ // Clone the Set so a caller mutating their own reference after
387
+ // construction can't silently change acceptance policy (e.g. by
388
+ // adding a rule id to allow a weakening mutation that would
389
+ // otherwise be rejected).
390
+ allowWeaken: new Set(options.allowWeaken ?? []),
391
+ ncdThreshold: options.ncdThreshold ?? 0.3,
392
+ maxTokens: options.maxTokens ?? 2000,
393
+ acceptNeutral: options.acceptNeutral ?? false,
394
+ };
395
+ // If a history was supplied, verify its chain integrity and that its
396
+ // head corresponds to initialRules. A stale or mismatched history would
397
+ // produce misleading provenance for subsequent mutations.
398
+ if (options.history) {
399
+ const verification = this.history.verify();
400
+ if (!verification.valid) {
401
+ throw new Error(`Supplied Merkle history is invalid at node ${String(verification.invalidAt)}. Tamper detected or corrupted chain.`);
402
+ }
403
+ if (this.history.length > 0) {
404
+ const expectedHash = (0, compile_js_1.computeHash)(canonicalRulesJson(this.rules));
405
+ const head = this.history.head();
406
+ if (head && head.specHash !== expectedHash) {
407
+ throw new Error(`Supplied Merkle history head does not match initialRules. ` +
408
+ `History head specHash="${head.specHash}", expected="${expectedHash}". ` +
409
+ `The history and rules are mismatched; refusing to record new mutations on the wrong chain.`);
410
+ }
411
+ }
412
+ }
413
+ // Record genesis state
414
+ if (this.history.length === 0) {
415
+ const specHash = (0, compile_js_1.computeHash)(canonicalRulesJson(this.rules));
416
+ this.history.append(specHash, {
417
+ type: "add",
418
+ ruleIds: Object.keys(this.rules),
419
+ description: "Genesis",
420
+ }, [{ name: "genesis", passed: true }]);
421
+ }
422
+ }
423
+ /**
424
+ * Get current rules as a deep defensive copy. Callers cannot mutate
425
+ * engine state through the returned map because every rule is cloned —
426
+ * otherwise a JS caller or a TS cast could silently alter accepted
427
+ * state without running proofs or appending to history.
428
+ */
429
+ getRules() {
430
+ return Object.fromEntries(Object.entries(this.rules).map(([id, rule]) => [id, cloneRule(rule)]));
431
+ }
432
+ /**
433
+ * Get a snapshot of the Merkle history.
434
+ *
435
+ * Returns a freshly deserialized copy so even a JS caller that casts
436
+ * to MerkleHistory and calls `.append()` cannot inject nodes into the
437
+ * engine's real chain. The snapshot is read-only at the TS level
438
+ * (ReadonlyMerkleHistory) and isolated at the runtime level (separate
439
+ * instance via toJSON/fromJSON).
440
+ */
441
+ getHistory() {
442
+ return proofs_js_1.MerkleHistory.fromJSON(this.history.toJSON());
443
+ }
444
+ /** Get current fitness. */
445
+ getFitness() {
446
+ return (0, proofs_js_1.fitness)({ rules: this.rules }, {
447
+ maxTokens: this.options.maxTokens,
448
+ ncdThreshold: this.options.ncdThreshold,
449
+ });
450
+ }
451
+ /**
452
+ * Propose a mutation. The engine applies it, runs proofs, and accepts or rejects.
453
+ *
454
+ * Returns a detailed result including proof receipts and fitness comparison.
455
+ */
456
+ propose(mutation) {
457
+ // Guard baseline fitness: if engine state contains a malformed rule
458
+ // (legacy _kind, JS caller, cast bypass), fitness() reaches ruleToText
459
+ // and throws BEFORE we enter runProofSuite's own try/catch. Return a
460
+ // clean rejection with a neutral fitness instead of crashing the flow.
461
+ let beforeFitness;
462
+ try {
463
+ beforeFitness = this.getFitness();
464
+ }
465
+ catch (e) {
466
+ const neutral = {
467
+ score: 0,
468
+ coverage: 0,
469
+ redundancy: 0,
470
+ budgetPressure: 0,
471
+ };
472
+ return {
473
+ accepted: false,
474
+ mutation,
475
+ proofs: {
476
+ passed: false,
477
+ receipts: [
478
+ {
479
+ name: "baseline-fitness",
480
+ passed: false,
481
+ detail: `Baseline fitness failed: ${e instanceof Error ? e.message : String(e)}`,
482
+ },
483
+ ],
484
+ fitness: neutral,
485
+ },
486
+ beforeFitness: neutral,
487
+ afterFitness: neutral,
488
+ error: `Baseline fitness failed: ${e instanceof Error ? e.message : String(e)}`,
489
+ };
490
+ }
491
+ // Apply the mutation
492
+ const { rules: candidateRules, error } = applyMutation(this.rules, mutation);
493
+ if (error) {
494
+ return {
495
+ accepted: false,
496
+ mutation,
497
+ proofs: { passed: false, receipts: [], fitness: beforeFitness },
498
+ beforeFitness,
499
+ afterFitness: beforeFitness,
500
+ error: error.reason,
501
+ };
502
+ }
503
+ // For merge mutations, the source rule IDs are removed by design.
504
+ // Add them to a per-call allowWeaken set so checkMonotonicity doesn't
505
+ // reject the removal as a monotonicity violation — merging is the
506
+ // intended constraint-reducing operation, not silent deletion.
507
+ const perCallAllowWeaken = new Set(this.options.allowWeaken);
508
+ if (mutation.type === "merge") {
509
+ for (const id of mutation.sourceIds) {
510
+ perCallAllowWeaken.add(id);
511
+ }
512
+ }
513
+ // Run proof suite
514
+ const proofResult = runProofSuite(this.rules, candidateRules, {
515
+ allowWeaken: perCallAllowWeaken,
516
+ ncdThreshold: this.options.ncdThreshold,
517
+ maxTokens: this.options.maxTokens,
518
+ });
519
+ const afterFitness = proofResult.fitness;
520
+ // Decision: all proofs pass AND fitness doesn't decrease.
521
+ //
522
+ // `acceptNeutral` relaxes strict improvement (>) to ≥ — i.e. it accepts
523
+ // mutations that keep fitness the same. It must NOT accept regressions:
524
+ // a previous version short-circuited on acceptNeutral, which meant any
525
+ // proof-passing mutation was accepted regardless of score, silently
526
+ // driving spec quality downward over time.
527
+ const fitnessOk = this.options.acceptNeutral
528
+ ? afterFitness.score >= beforeFitness.score
529
+ : afterFitness.score > beforeFitness.score;
530
+ const accepted = proofResult.passed && fitnessOk;
531
+ let historyHash;
532
+ if (accepted) {
533
+ // Accept the mutation
534
+ this.rules = candidateRules;
535
+ // Record in Merkle history
536
+ const specHash = (0, compile_js_1.computeHash)(canonicalRulesJson(this.rules));
537
+ const historyMutation = {
538
+ type: mutation.type === "merge" ? "merge" : mutation.type,
539
+ ruleIds: mutation.type === "merge"
540
+ ? [...mutation.sourceIds, mutation.mergedId]
541
+ : ["ruleId" in mutation ? mutation.ruleId : "unknown"],
542
+ description: describeMutation(mutation),
543
+ };
544
+ // Defensive copy: the same proofResult is returned to the caller,
545
+ // so without this clone a caller mutating result.proofs.receipts
546
+ // would retroactively alter the stored history node.
547
+ historyHash = this.history.append(specHash, historyMutation, proofResult.receipts.map((r) => ({ ...r })));
548
+ }
549
+ return {
550
+ accepted,
551
+ mutation,
552
+ proofs: proofResult,
553
+ beforeFitness,
554
+ afterFitness,
555
+ historyHash,
556
+ error: !proofResult.passed
557
+ ? `Proofs failed: ${proofResult.receipts
558
+ .filter((r) => !r.passed)
559
+ .map((r) => r.name)
560
+ .join(", ")}`
561
+ : !fitnessOk
562
+ ? `Fitness decreased: ${beforeFitness.score.toFixed(3)} → ${afterFitness.score.toFixed(3)}`
563
+ : undefined,
564
+ };
565
+ }
566
+ /**
567
+ * Propose multiple mutations in sequence.
568
+ * Stops at the first rejection unless `continueOnReject` is true.
569
+ */
570
+ proposeAll(mutations, options = {}) {
571
+ const results = [];
572
+ for (const mutation of mutations) {
573
+ const result = this.propose(mutation);
574
+ results.push(result);
575
+ if (!result.accepted && !options.continueOnReject)
576
+ break;
577
+ }
578
+ return results;
579
+ }
580
+ }
581
+ exports.EvolutionEngine = EvolutionEngine;
582
+ /** Human-readable description of a mutation. */
583
+ function describeMutation(mutation) {
584
+ switch (mutation.type) {
585
+ case "add":
586
+ return `Add rule "${mutation.ruleId}" (${mutation.rule._kind})`;
587
+ case "remove":
588
+ return `Remove rule "${mutation.ruleId}"`;
589
+ case "strengthen":
590
+ return `Strengthen rule "${mutation.ruleId}"${mutation.linterRule ? ` → enforce(${mutation.linterRule})` : ""}`;
591
+ case "weaken":
592
+ return `Weaken rule "${mutation.ruleId}": ${mutation.justification}`;
593
+ case "merge":
594
+ return `Merge "${mutation.sourceIds[0]}" + "${mutation.sourceIds[1]}" → "${mutation.mergedId}"`;
595
+ case "reword":
596
+ return `Reword rule "${mutation.ruleId}"`;
597
+ }
598
+ }
599
+ //# sourceMappingURL=evolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evolve.js","sourceRoot":"","sources":["../src/evolve.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAsHH,sCAiMC;AAoBD,sCA4IC;AApdD,2CAYqB;AACrB,6CAA2C;AA4D3C;;;;;GAKG;AACH,SAAS,SAAS,CAAC,IAAU;IAC3B,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,kBAAkB,CAAC,KAA2B;IACrD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,oEAAoE;QACpE,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,WAAW,GAA4B,EAAE,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,WAAW,CAAC,CAAC,CAAC,GAAI,IAA2C,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAC3B,KAA2B,EAC3B,QAAsB;IAEtB,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAE1B,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC5B,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE;wBACL,QAAQ;wBACR,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,kBAAkB;qBACnD;iBACF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC;gBAC/B,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE;wBACL,QAAQ;wBACR,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,aAAa;qBAC9C;iBACF,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YACtD,KAAK,QAAQ,CAAC;YACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE;wBACL,QAAQ;wBACR,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,aAAa;qBAC9C;iBACF,CAAC;YACJ,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC9B,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACxB,qBAAqB;oBACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG;wBACtB,KAAK,EAAE,SAAS;wBAChB,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,GAAG,EAAE,IAAI,CAAC,IAAI;wBACd,MAAM,EAAE,IAAI;qBACE,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,OAAO;wBACL,KAAK;wBACL,KAAK,EAAE;4BACL,QAAQ;4BACR,MAAM,EACJ,kEAAkE;yBACrE;qBACF,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE;wBACL,QAAQ;wBACR,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,4CAA4C;qBAC7E;iBACF,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE;wBACL,QAAQ;wBACR,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,aAAa;qBAC9C;iBACF,CAAC;YACJ,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG;oBACtB,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE,IAAI,CAAC,GAAG;iBACC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE;wBACL,QAAQ;wBACR,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,6CAA6C;qBAC9E;iBACF,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC;YACtC,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;gBAChB,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE;wBACL,QAAQ;wBACR,MAAM,EAAE,kDAAkD,GAAG,SAAS;qBACvE;iBACF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;gBACrC,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE;wBACL,QAAQ;wBACR,MAAM,EAAE,wCAAwC,GAAG,OAAO,GAAG,GAAG;qBACjE;iBACF,CAAC;YACJ,CAAC;YACD,8DAA8D;YAC9D,kEAAkE;YAClE,iEAAiE;YACjE,8CAA8C;YAC9C,IACE,QAAQ,CAAC,QAAQ,IAAI,IAAI;gBACzB,QAAQ,CAAC,QAAQ,KAAK,GAAG;gBACzB,QAAQ,CAAC,QAAQ,KAAK,GAAG,EACzB,CAAC;gBACD,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE;wBACL,QAAQ;wBACR,MAAM,EAAE,iBAAiB,QAAQ,CAAC,QAAQ,6FAA6F;qBACxI;iBACF,CAAC;YACJ,CAAC;YACD,gEAAgE;YAChE,gEAAgE;YAChE,6DAA6D;YAC7D,4DAA4D;YAC5D,8DAA8D;YAC9D,0BAA0B;YAC1B,MAAM,eAAe,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CACpD,IAAA,wBAAY,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAC7B,CAAC;YACF,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC;YACvD,MAAM,cAAc,GAAG,IAAA,wBAAY,EAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,cAAc,GAAG,iBAAiB,EAAE,CAAC;gBACvC,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE;wBACL,QAAQ;wBACR,MAAM,EAAE,gBAAgB,QAAQ,CAAC,QAAQ,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,gDAAgD,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,0CAA0C;qBACnN;iBACF,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YAC/C,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;YACR,OAAO;gBACL,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;aACxE,CAAC;QACJ,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE;wBACL,QAAQ;wBACR,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,aAAa;qBAC9C;iBACF,CAAC;YACJ,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC9D,CAAC;iBAAM,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACpC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC7D,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAYD;;;;;;;GAOG;AACH,SAAgB,aAAa,CAC3B,MAA4B,EAC5B,KAA2B,EAC3B,UAII,EAAE;IAEN,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC;IAEjD,kBAAkB;IAClB,MAAM,IAAI,GAAG,IAAA,6BAAiB,EAAC,MAAM,EAAE,KAAK,EAAE;QAC5C,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;IACH,QAAQ,CAAC,IAAI,CAAC;QACZ,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,IAAI,CAAC,KAAK;QAClB,MAAM,EAAE,IAAI,CAAC,KAAK;YAChB,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,kBAAkB,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ;YACxE,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,gBAAgB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACxH,CAAC,CAAC;IAEH,mEAAmE;IACnE,iEAAiE;IACjE,mEAAmE;IACnE,+BAA+B;IAC/B,EAAE;IACF,iEAAiE;IACjE,iEAAiE;IACjE,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,IAAA,4BAAgB,EAAC,MAAM,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/C,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAChC,CACF,CAAC;QACF,MAAM,OAAO,GAAG,IAAA,4BAAgB,EAAC,KAAK,EAAE,YAAY,CAAC,CAAC,MAAM,CAC1D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CACzD,CAAC;QACF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;gBACf,CAAC,CAAC,6BAA6B;gBAC/B,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,8BAA8B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACnI,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,4BAA4B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;SACjF,CAAC,CAAC;IACL,CAAC;IAED,qEAAqE;IACrE,iEAAiE;IACjE,kEAAkE;IAClE,kEAAkE;IAClE,iEAAiE;IACjE,mEAAmE;IACnE,EAAE;IACF,qEAAqE;IACrE,gCAAgC;IAChC,IAAI,CAAC;QACH,IAAI,WAAW,GAAG,IAAI,CAAC;QACvB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC;QACtE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAuB,CAAC;QAEvD,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC;gBAAE,SAAS,CAAC,iBAAiB;YAC/C,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,IAAA,6BAAiB,EAAC,IAAI,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,IAAA,6BAAiB,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAClD,KAAK,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,IAAI,eAAe,EAAE,CAAC;gBAC3D,IAAI,UAAU,KAAK,KAAK;oBAAE,SAAS;gBACnC,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,uBAAW,CAAC,iBAAiB,CAC9C,SAAS,EACT,cAAc,CACf,CAAC;oBACF,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;wBACrB,aAAa,CAAC,IAAI,CAChB,GAAG,KAAK,IAAI,UAAU,aAAa,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAC5D,CAAC;wBACF,WAAW,GAAG,KAAK,CAAC;oBACtB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,2CAA2C;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,WAAW;gBACjB,CAAC,CAAC,6BAA6B;gBAC/B,CAAC,CAAC,iBAAiB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAChD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,8BAA8B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;SACnF,CAAC,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,wEAAwE;IACxE,2EAA2E;IAC3E,wEAAwE;IACxE,MAAM,cAAc,GAAG,EAAE,KAAK,EAAE,KAAK,EAAgB,CAAC;IACtD,IAAI,aAA4B,CAAC;IACjC,IAAI,CAAC;QACH,aAAa,GAAG,IAAA,mBAAO,EAAC,cAAc,EAAE;YACtC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,+BAA+B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;SACpF,CAAC,CAAC;QACH,aAAa,GAAG;YACd,KAAK,EAAE,CAAC;YACR,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;AACjE,CAAC;AAgBD;;;;;GAKG;AACH,MAAa,eAAe;IAClB,KAAK,CAAuB;IACnB,OAAO,CAAgB;IACvB,OAAO,CAMtB;IAEF,YACE,YAAkC,EAClC,UAMI,EAAE;QAEN,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAC7B,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CACxE,CAAC;QACF,qEAAqE;QACrE,oEAAoE;QACpE,oEAAoE;QACpE,qEAAqE;QACrE,oEAAoE;QACpE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO;YAC5B,CAAC,CAAC,yBAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAClD,CAAC,CAAC,IAAI,yBAAa,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG;YACb,+DAA+D;YAC/D,gEAAgE;YAChE,4DAA4D;YAC5D,0BAA0B;YAC1B,WAAW,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;YAC/C,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,GAAG;YACzC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;YACpC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,KAAK;SAC9C,CAAC;QAEF,qEAAqE;QACrE,wEAAwE;QACxE,0DAA0D;QAC1D,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3C,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,8CAA8C,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,uCAAuC,CACpH,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,YAAY,GAAG,IAAA,wBAAW,EAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjC,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;oBAC3C,MAAM,IAAI,KAAK,CACb,4DAA4D;wBAC1D,0BAA0B,IAAI,CAAC,QAAQ,gBAAgB,YAAY,KAAK;wBACxE,4FAA4F,CAC/F,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAA,wBAAW,EAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO,CAAC,MAAM,CACjB,QAAQ,EACR;gBACE,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;gBAChC,WAAW,EAAE,SAAS;aACvB,EACD,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CACpC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,QAAQ;QACN,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CACtE,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,UAAU;QACR,OAAO,yBAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,2BAA2B;IAC3B,UAAU;QACR,OAAO,IAAA,mBAAO,EAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAgB,EAAE;YAClD,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;SACxC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,QAAsB;QAC5B,oEAAoE;QACpE,uEAAuE;QACvE,qEAAqE;QACrE,uEAAuE;QACvE,IAAI,aAA4B,CAAC;QACjC,IAAI,CAAC;YACH,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GAAkB;gBAC7B,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,CAAC;gBACX,UAAU,EAAE,CAAC;gBACb,cAAc,EAAE,CAAC;aAClB,CAAC;YACF,OAAO;gBACL,QAAQ,EAAE,KAAK;gBACf,QAAQ;gBACR,MAAM,EAAE;oBACN,MAAM,EAAE,KAAK;oBACb,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,kBAAkB;4BACxB,MAAM,EAAE,KAAK;4BACb,MAAM,EAAE,4BAA4B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;yBACjF;qBACF;oBACD,OAAO,EAAE,OAAO;iBACjB;gBACD,aAAa,EAAE,OAAO;gBACtB,YAAY,EAAE,OAAO;gBACrB,KAAK,EAAE,4BAA4B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;aAChF,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,aAAa,CACpD,IAAI,CAAC,KAAK,EACV,QAAQ,CACT,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO;gBACL,QAAQ,EAAE,KAAK;gBACf,QAAQ;gBACR,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE;gBAC/D,aAAa;gBACb,YAAY,EAAE,aAAa;gBAC3B,KAAK,EAAE,KAAK,CAAC,MAAM;aACpB,CAAC;QACJ,CAAC;QAED,kEAAkE;QAClE,sEAAsE;QACtE,kEAAkE;QAClE,+DAA+D;QAC/D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7D,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC9B,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACpC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE;YAC5D,WAAW,EAAE,kBAAkB;YAC/B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;YACvC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;SAClC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC;QAEzC,0DAA0D;QAC1D,EAAE;QACF,wEAAwE;QACxE,wEAAwE;QACxE,uEAAuE;QACvE,oEAAoE;QACpE,2CAA2C;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;YAC1C,CAAC,CAAC,YAAY,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK;YAC3C,CAAC,CAAC,YAAY,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC;QAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,IAAI,SAAS,CAAC;QAEjD,IAAI,WAA+B,CAAC;QAEpC,IAAI,QAAQ,EAAE,CAAC;YACb,sBAAsB;YACtB,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC;YAE5B,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,IAAA,wBAAW,EAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7D,MAAM,eAAe,GAAa;gBAChC,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;gBACzD,OAAO,EACL,QAAQ,CAAC,IAAI,KAAK,OAAO;oBACvB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC;oBAC5C,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1D,WAAW,EAAE,gBAAgB,CAAC,QAAQ,CAAC;aACxC,CAAC;YACF,kEAAkE;YAClE,iEAAiE;YACjE,qDAAqD;YACrD,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAC/B,QAAQ,EACR,eAAe,EACf,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAC5C,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ;YACR,QAAQ;YACR,MAAM,EAAE,WAAW;YACnB,aAAa;YACb,YAAY;YACZ,WAAW;YACX,KAAK,EAAE,CAAC,WAAW,CAAC,MAAM;gBACxB,CAAC,CAAC,kBAAkB,WAAW,CAAC,QAAQ;qBACnC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;qBACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBAClB,IAAI,CAAC,IAAI,CAAC,EAAE;gBACjB,CAAC,CAAC,CAAC,SAAS;oBACV,CAAC,CAAC,sBAAsB,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAC3F,CAAC,CAAC,SAAS;SAChB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,UAAU,CACR,SAAyB,EACzB,UAA0C,EAAE;QAE5C,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,gBAAgB;gBAAE,MAAM;QAC3D,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAtQD,0CAsQC;AAED,gDAAgD;AAChD,SAAS,gBAAgB,CAAC,QAAsB;IAC9C,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,KAAK;YACR,OAAO,aAAa,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;QAClE,KAAK,QAAQ;YACX,OAAO,gBAAgB,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC5C,KAAK,YAAY;YACf,OAAO,oBAAoB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClH,KAAK,QAAQ;YACX,OAAO,gBAAgB,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;QACvE,KAAK,OAAO;YACV,OAAO,UAAU,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,QAAQ,GAAG,CAAC;QAClG,KAAK,QAAQ;YACX,OAAO,gBAAgB,QAAQ,CAAC,MAAM,GAAG,CAAC;IAC9C,CAAC;AACH,CAAC"}