@bragi-gmbh/codebus 1.4.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ci-hooks/ci-hooks.js +126 -0
- package/dist/ci-hooks/ci-hooks.js.map +1 -0
- package/dist/commands/adr.js +30 -0
- package/dist/commands/adr.js.map +1 -0
- package/dist/commands/agent.js +175 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/as.js +1 -1
- package/dist/commands/as.js.map +1 -1
- package/dist/commands/ask.js +1 -1
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/checkin.js +1 -1
- package/dist/commands/checkin.js.map +1 -1
- package/dist/commands/ci-findings.js +129 -0
- package/dist/commands/ci-findings.js.map +1 -0
- package/dist/commands/ci-reply.js +117 -0
- package/dist/commands/ci-reply.js.map +1 -0
- package/dist/commands/ci-steer-escalate.js +65 -0
- package/dist/commands/ci-steer-escalate.js.map +1 -0
- package/dist/commands/cli-mcp-correlation.js +131 -0
- package/dist/commands/cli-mcp-correlation.js.map +1 -0
- package/dist/commands/connector-attach-detach.js +542 -0
- package/dist/commands/connector-attach-detach.js.map +1 -0
- package/dist/commands/connector.js +513 -0
- package/dist/commands/connector.js.map +1 -0
- package/dist/commands/contract.js +33 -0
- package/dist/commands/contract.js.map +1 -0
- package/dist/commands/correlation.js +194 -0
- package/dist/commands/correlation.js.map +1 -0
- package/dist/commands/decision.js +63 -0
- package/dist/commands/decision.js.map +1 -1
- package/dist/commands/digest.js +14 -3
- package/dist/commands/digest.js.map +1 -1
- package/dist/commands/do.js +127 -0
- package/dist/commands/do.js.map +1 -0
- package/dist/commands/factory-attention.js +106 -0
- package/dist/commands/factory-attention.js.map +1 -0
- package/dist/commands/factory-context-read.js +171 -0
- package/dist/commands/factory-context-read.js.map +1 -0
- package/dist/commands/factory-interventions.js +102 -0
- package/dist/commands/factory-interventions.js.map +1 -0
- package/dist/commands/factory.js +187 -0
- package/dist/commands/factory.js.map +1 -1
- package/dist/commands/github-login.js +109 -53
- package/dist/commands/github-login.js.map +1 -1
- package/dist/commands/graph-pull.js +130 -0
- package/dist/commands/graph-pull.js.map +1 -0
- package/dist/commands/graph.js +5 -1
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/inbox.js +7 -7
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/ingest.js +1 -1
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.js +10 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +1160 -55
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/integration-ledger.js +81 -0
- package/dist/commands/integration-ledger.js.map +1 -0
- package/dist/commands/knowledge.js +194 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/links.js +1 -1
- package/dist/commands/links.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/morning.js +50 -1
- package/dist/commands/morning.js.map +1 -1
- package/dist/commands/plan-compiler.js +260 -0
- package/dist/commands/plan-compiler.js.map +1 -0
- package/dist/commands/plan-lint.js +275 -0
- package/dist/commands/plan-lint.js.map +1 -0
- package/dist/commands/plan-score.js +203 -0
- package/dist/commands/plan-score.js.map +1 -0
- package/dist/commands/plan.js +481 -15
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/product-validity.js +168 -0
- package/dist/commands/product-validity.js.map +1 -0
- package/dist/commands/question.js +1 -1
- package/dist/commands/question.js.map +1 -1
- package/dist/commands/read-policy.js +131 -0
- package/dist/commands/read-policy.js.map +1 -0
- package/dist/commands/read.js +1 -1
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/repo.js +106 -8
- package/dist/commands/repo.js.map +1 -1
- package/dist/commands/repository-protection.js +209 -0
- package/dist/commands/repository-protection.js.map +1 -0
- package/dist/commands/resolve.js +2 -2
- package/dist/commands/resolve.js.map +1 -1
- package/dist/commands/self-healing.js +26 -0
- package/dist/commands/self-healing.js.map +1 -0
- package/dist/commands/send.js +1 -1
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/serial-merge.js +303 -0
- package/dist/commands/serial-merge.js.map +1 -0
- package/dist/commands/session.js +1 -1
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/spend.js +31 -0
- package/dist/commands/spend.js.map +1 -0
- package/dist/commands/task.js +92 -1
- package/dist/commands/task.js.map +1 -1
- package/dist/commands/taxonomy.js +21 -0
- package/dist/commands/taxonomy.js.map +1 -0
- package/dist/commands/verify.js +77 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/config/self-healing-analysis.json +158 -0
- package/dist/errors.js +18 -4
- package/dist/errors.js.map +1 -1
- package/dist/execution/client.js +53 -0
- package/dist/execution/client.js.map +1 -0
- package/dist/execution/local.js +24 -0
- package/dist/execution/local.js.map +1 -0
- package/dist/execution/ssh.js +38 -0
- package/dist/execution/ssh.js.map +1 -0
- package/dist/graph.js +78 -16
- package/dist/graph.js.map +1 -1
- package/dist/index.js +40 -2
- package/dist/index.js.map +1 -1
- package/dist/json-lite.js +248 -0
- package/dist/json-lite.js.map +1 -0
- package/dist/knowledge-drift.js +40 -0
- package/dist/knowledge-drift.js.map +1 -0
- package/dist/lint/parallelism.js +414 -0
- package/dist/lint/parallelism.js.map +1 -0
- package/dist/mail-latency.js +11 -1
- package/dist/mail-latency.js.map +1 -1
- package/dist/mcp-ci-findings.js +31 -0
- package/dist/mcp-ci-findings.js.map +1 -0
- package/dist/mcp-correlation.js +290 -0
- package/dist/mcp-correlation.js.map +1 -0
- package/dist/mcp-factory-context-read.js +81 -0
- package/dist/mcp-factory-context-read.js.map +1 -0
- package/dist/mcp-registry.js +147 -1
- package/dist/mcp-registry.js.map +1 -1
- package/dist/mcp.js +94 -5
- package/dist/mcp.js.map +1 -1
- package/dist/openrouter-reservation-guard.js +97 -0
- package/dist/openrouter-reservation-guard.js.map +1 -0
- package/dist/self-healing-analysis-loader.js +150 -0
- package/dist/self-healing-analysis-loader.js.map +1 -0
- package/dist/sender.js +11 -9
- package/dist/sender.js.map +1 -1
- package/dist/toml-lite.js +546 -0
- package/dist/toml-lite.js.map +1 -0
- package/dist/version-check.js +23 -7
- package/dist/version-check.js.map +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { parse, YAMLParseError } from "yaml";
|
|
3
|
+
// Hermetic parallelism check for an execution manifest (ADR 0008; plan §0e).
|
|
4
|
+
// Ported from factory/dev01/~/plan-runs/phase2-triage/check-parallelism.py so the
|
|
5
|
+
// CLI and the triage loop score the same manifest identically. A manifest whose
|
|
6
|
+
// children form a chain is a plan defect regardless of prose quality.
|
|
7
|
+
//
|
|
8
|
+
// Thresholds (owner, 2026-09-17) — a manifest FAILS unless every one holds:
|
|
9
|
+
// wave 0 (children with no in-manifest dependency) >= 24
|
|
10
|
+
// dependency waves (distinct longest-path levels) <= 6
|
|
11
|
+
// critical path (max sum of max_minutes to a leaf) <= 6 h
|
|
12
|
+
// children per coordinator stage 4..10
|
|
13
|
+
// independent tracks (with at least one child) >= 3
|
|
14
|
+
//
|
|
15
|
+
// ADR 0008 isolation contract (same schema as the real execution manifests,
|
|
16
|
+
// com.bragi.contract.execution-manifest@0.5.0): every child declares
|
|
17
|
+
// own_worktree: true, own_pr: true and a non-empty allowed_paths list (P007);
|
|
18
|
+
// sibling children within one coordinator stage declare pairwise-disjoint
|
|
19
|
+
// allowed_paths and PR branches are unique across the manifest (P008).
|
|
20
|
+
// Both are waivable by the reasoned override like the numeric thresholds.
|
|
21
|
+
//
|
|
22
|
+
// A manifest may waive the five thresholds with an explicit, reasoned override:
|
|
23
|
+
// lint_overrides: { parallelism: { reason: "<why>" } }
|
|
24
|
+
// The override must carry a non-empty reason (a bare flag is ignored, so it can
|
|
25
|
+
// never be set by accident). Structural defects — a malformed manifest (P000)
|
|
26
|
+
// or a dependency cycle (P006) — are NOT waivable: they mean the input is not a
|
|
27
|
+
// well-formed DAG at all, so it is never scored.
|
|
28
|
+
//
|
|
29
|
+
// Structural contract (every violation is P000, checked before any scoring):
|
|
30
|
+
// tracks is an array; every track is an object with a non-empty string id
|
|
31
|
+
// (unique across the manifest, no '/' — stage keys are `trackId/stageId`) and
|
|
32
|
+
// a stages array; every stage is an object with a non-empty string id (unique
|
|
33
|
+
// within its track, no '/') and a children array; every child is an object
|
|
34
|
+
// with a non-empty string id (unique across the
|
|
35
|
+
// manifest), depends_on (when the key is present — an explicit null counts as present
|
|
36
|
+
// and is invalid; omit the key or use []) an array of non-empty strings, and
|
|
37
|
+
// max_minutes (same null rule) a finite number >= 0. Stage sizes are accounted
|
|
38
|
+
// per (track, stage) pair — with unique track and stage ids nothing can merge
|
|
39
|
+
// by id collision — and EVERY stage counts, so an empty stage is size 0 and
|
|
40
|
+
// trips P004 rather than disappearing. The tracks metric counts only tracks
|
|
41
|
+
// carrying at least one child: an empty track is not an independent track.
|
|
42
|
+
export const PARALLELISM_THRESHOLDS = {
|
|
43
|
+
minWave0: 24,
|
|
44
|
+
maxWaves: 6,
|
|
45
|
+
maxCriticalPathH: 6,
|
|
46
|
+
minChildrenPerStage: 4,
|
|
47
|
+
maxChildrenPerStage: 10,
|
|
48
|
+
minTracks: 3,
|
|
49
|
+
defaultChildMinutes: 75,
|
|
50
|
+
};
|
|
51
|
+
const text = (value) => (typeof value === "string" ? value : "");
|
|
52
|
+
const list = (value) => (Array.isArray(value) ? value : []);
|
|
53
|
+
const object = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
54
|
+
const num = (value) => (typeof value === "number" && Number.isFinite(value) ? value : undefined);
|
|
55
|
+
const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
56
|
+
// Codes waivable by an explicit reasoned override (the five ADR 0008 thresholds).
|
|
57
|
+
const WAIVABLE = new Set(["P001", "P002", "P003", "P004", "P005", "P007", "P008"]);
|
|
58
|
+
const emptyMetrics = () => ({
|
|
59
|
+
children: 0, tracks: 0, waves: 0, wave0: 0,
|
|
60
|
+
criticalPathMinutes: 0, criticalPathH: 0, wavesHist: {}, stageSizes: {},
|
|
61
|
+
});
|
|
62
|
+
function detectOverride(manifest) {
|
|
63
|
+
const reason = text(object(object(manifest.lint_overrides).parallelism).reason).trim();
|
|
64
|
+
return reason.length > 0 ? { overridden: true, reason } : { overridden: false };
|
|
65
|
+
}
|
|
66
|
+
const validMinutes = (value) => {
|
|
67
|
+
const mm = num(value);
|
|
68
|
+
return mm !== undefined && mm >= 0;
|
|
69
|
+
};
|
|
70
|
+
// Full structural pass BEFORE any scoring: a malformed document is never scored
|
|
71
|
+
// (and can therefore never be waived into a pass by an override).
|
|
72
|
+
function validateManifest(manifest) {
|
|
73
|
+
const findings = [];
|
|
74
|
+
const bad = (message, path) => findings.push({ code: "P000", message, path });
|
|
75
|
+
if (!Array.isArray(manifest.tracks)) {
|
|
76
|
+
bad("manifest.tracks must be an array of track objects", "tracks");
|
|
77
|
+
return findings;
|
|
78
|
+
}
|
|
79
|
+
const defaults = manifest.child_defaults;
|
|
80
|
+
if (defaults !== undefined) {
|
|
81
|
+
const mm = isObject(defaults) ? defaults.max_minutes : undefined;
|
|
82
|
+
if (!isObject(defaults) || (mm !== undefined && !validMinutes(mm))) {
|
|
83
|
+
bad("child_defaults must be an object with an optional non-negative numeric max_minutes (explicit null is invalid)", "child_defaults");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const childIds = new Set();
|
|
87
|
+
const trackIds = new Set();
|
|
88
|
+
for (const [ti, track] of manifest.tracks.entries()) {
|
|
89
|
+
const tp = `tracks[${ti}]`;
|
|
90
|
+
if (!isObject(track) || !text(track.id)) {
|
|
91
|
+
bad(`${tp} must be an object with a non-empty string id`, tp);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const trackId = text(track.id);
|
|
95
|
+
if (trackId.includes("/")) {
|
|
96
|
+
bad(`${tp}.id must not contain '/' — stage keys are trackId/stageId and must stay collision-free`, `${tp}.id`);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (trackIds.has(trackId)) {
|
|
100
|
+
bad(`${tp}.id '${trackId}' is duplicated in the manifest`, `${tp}.id`);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
trackIds.add(trackId);
|
|
104
|
+
if (!Array.isArray(track.stages)) {
|
|
105
|
+
bad(`${tp}.stages must be an array of stage objects`, `${tp}.stages`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const stageIds = new Set();
|
|
109
|
+
for (const [si, stage] of track.stages.entries()) {
|
|
110
|
+
const sp = `${tp}.stages[${si}]`;
|
|
111
|
+
if (!isObject(stage) || !text(stage.id)) {
|
|
112
|
+
bad(`${sp} must be an object with a non-empty string id`, sp);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const stageId = text(stage.id);
|
|
116
|
+
if (stageId.includes("/")) {
|
|
117
|
+
bad(`${sp}.id must not contain '/' — stage keys are trackId/stageId and must stay collision-free`, `${sp}.id`);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (stageIds.has(stageId)) {
|
|
121
|
+
bad(`${sp}.id '${stageId}' is duplicated within track '${trackId}'`, `${sp}.id`);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
stageIds.add(stageId);
|
|
125
|
+
if (!Array.isArray(stage.children)) {
|
|
126
|
+
bad(`${sp}.children must be an array of child objects`, `${sp}.children`);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
for (const [ci, child] of stage.children.entries()) {
|
|
130
|
+
const cpos = `${sp}.children[${ci}]`;
|
|
131
|
+
if (!isObject(child) || !text(child.id)) {
|
|
132
|
+
bad(`${cpos} must be an object with a non-empty string id`, cpos);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const id = text(child.id);
|
|
136
|
+
if (childIds.has(id)) {
|
|
137
|
+
bad(`${cpos}.id '${id}' is duplicated in the manifest`, `${cpos}.id`);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
childIds.add(id);
|
|
141
|
+
const deps = child.depends_on;
|
|
142
|
+
if (deps !== undefined && (!Array.isArray(deps) || deps.some((dep) => typeof dep !== "string" || dep.length === 0))) {
|
|
143
|
+
bad(`${cpos}.depends_on must be an array of non-empty child ids (explicit null is invalid — omit the key or use [])`, `${cpos}.depends_on`);
|
|
144
|
+
}
|
|
145
|
+
const mm = child.max_minutes;
|
|
146
|
+
if (mm !== undefined && !validMinutes(mm)) {
|
|
147
|
+
bad(`${cpos}.max_minutes must be a non-negative number (explicit null is invalid — omit the key)`, `${cpos}.max_minutes`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return findings;
|
|
153
|
+
}
|
|
154
|
+
// Every stage is accounted — including empty ones (size 0, trips P004) — and keyed
|
|
155
|
+
// by (track, stage); track and stage ids are validated unique, so nothing can merge
|
|
156
|
+
// by id collision. Tracks carrying at least one child are counted: an empty track
|
|
157
|
+
// is not an independent execution track and must not satisfy `tracks >= 3`.
|
|
158
|
+
function collectChildren(manifest) {
|
|
159
|
+
const fallback = num(object(manifest.child_defaults).max_minutes);
|
|
160
|
+
const defaultMinutes = fallback !== undefined && fallback !== 0 ? fallback : PARALLELISM_THRESHOLDS.defaultChildMinutes;
|
|
161
|
+
const nodes = new Map();
|
|
162
|
+
const stageSizes = {};
|
|
163
|
+
let activeTracks = 0;
|
|
164
|
+
for (const track of list(manifest.tracks)) {
|
|
165
|
+
const t = object(track);
|
|
166
|
+
const trackId = text(t.id);
|
|
167
|
+
let trackChildren = 0;
|
|
168
|
+
for (const stage of list(t.stages)) {
|
|
169
|
+
const s = object(stage);
|
|
170
|
+
const key = `${trackId}/${text(s.id)}`;
|
|
171
|
+
stageSizes[key] = stageSizes[key] ?? 0;
|
|
172
|
+
for (const child of list(s.children)) {
|
|
173
|
+
const c = object(child);
|
|
174
|
+
const raw = num(c.max_minutes);
|
|
175
|
+
nodes.set(text(c.id), {
|
|
176
|
+
id: text(c.id),
|
|
177
|
+
minutes: raw !== undefined && raw !== 0 ? raw : defaultMinutes,
|
|
178
|
+
deps: list(c.depends_on).map(text).filter((dep) => dep.length > 0),
|
|
179
|
+
stageKey: key,
|
|
180
|
+
ownWorktree: c.own_worktree,
|
|
181
|
+
ownPr: c.own_pr,
|
|
182
|
+
allowedPaths: c.allowed_paths,
|
|
183
|
+
prBranch: isObject(c.pr) ? c.pr.branch : undefined,
|
|
184
|
+
});
|
|
185
|
+
stageSizes[key] += 1;
|
|
186
|
+
trackChildren += 1;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (trackChildren > 0)
|
|
190
|
+
activeTracks += 1;
|
|
191
|
+
}
|
|
192
|
+
return { nodes, stageSizes, tracks: activeTracks };
|
|
193
|
+
}
|
|
194
|
+
// Iterative longest-path layering (Kahn). level(n) = 0 for roots else 1 + max(level(deps));
|
|
195
|
+
// cp(n) = minutes(n) + max(cp(deps)). Only in-manifest deps count as edges (unknown ids ignored,
|
|
196
|
+
// matching the reference). Any node left unresolved is part of a dependency cycle.
|
|
197
|
+
function layer(nodes) {
|
|
198
|
+
const level = new Map();
|
|
199
|
+
const cp = new Map();
|
|
200
|
+
const indegree = new Map();
|
|
201
|
+
const dependents = new Map();
|
|
202
|
+
for (const [id, node] of nodes) {
|
|
203
|
+
const known = node.deps.filter((dep) => nodes.has(dep));
|
|
204
|
+
indegree.set(id, known.length);
|
|
205
|
+
level.set(id, 0);
|
|
206
|
+
cp.set(id, node.minutes);
|
|
207
|
+
for (const dep of known) {
|
|
208
|
+
const bucket = dependents.get(dep);
|
|
209
|
+
if (bucket)
|
|
210
|
+
bucket.push(id);
|
|
211
|
+
else
|
|
212
|
+
dependents.set(dep, [id]);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const queue = [];
|
|
216
|
+
for (const [id, deg] of indegree)
|
|
217
|
+
if (deg === 0)
|
|
218
|
+
queue.push(id);
|
|
219
|
+
let processed = 0;
|
|
220
|
+
while (queue.length > 0) {
|
|
221
|
+
const id = queue.shift();
|
|
222
|
+
processed += 1;
|
|
223
|
+
for (const next of dependents.get(id) ?? []) {
|
|
224
|
+
level.set(next, Math.max(level.get(next), level.get(id) + 1));
|
|
225
|
+
cp.set(next, Math.max(cp.get(next), cp.get(id) + nodes.get(next).minutes));
|
|
226
|
+
const deg = indegree.get(next) - 1;
|
|
227
|
+
indegree.set(next, deg);
|
|
228
|
+
if (deg === 0)
|
|
229
|
+
queue.push(next);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const cyclic = processed < nodes.size ? [...nodes.keys()].filter((id) => indegree.get(id) > 0) : [];
|
|
233
|
+
return { level, cp, cyclic };
|
|
234
|
+
}
|
|
235
|
+
const segments = (path) => path.split("/").filter((part) => part.length > 0);
|
|
236
|
+
const isWildcard = (segment) => segment.includes("*") || segment.includes("?");
|
|
237
|
+
const literalPrefix = (path) => {
|
|
238
|
+
const out = [];
|
|
239
|
+
for (const segment of segments(path)) {
|
|
240
|
+
if (isWildcard(segment))
|
|
241
|
+
break;
|
|
242
|
+
out.push(segment);
|
|
243
|
+
}
|
|
244
|
+
return out;
|
|
245
|
+
};
|
|
246
|
+
// Two allowed_paths entries conflict when one can address the other's files: literal
|
|
247
|
+
// paths conflict when one is a segment-prefix of the other; a path containing a wildcard
|
|
248
|
+
// conflicts when the literal prefixes before the first wildcard are compatible. This is
|
|
249
|
+
// conservative for exotic globs (over-flags, never under-flags) and exact for the literal
|
|
250
|
+
// paths real manifests use.
|
|
251
|
+
export function pathsConflict(a, b) {
|
|
252
|
+
const A = literalPrefix(a);
|
|
253
|
+
const B = literalPrefix(b);
|
|
254
|
+
const n = Math.min(A.length, B.length);
|
|
255
|
+
for (let i = 0; i < n; i += 1)
|
|
256
|
+
if (A[i] !== B[i])
|
|
257
|
+
return false;
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
const validPaths = (value) => Array.isArray(value) && value.length > 0 && value.every((entry) => typeof entry === "string" && entry.trim().length > 0);
|
|
261
|
+
// ADR 0008: children depend on contract versions, not siblings; shared resources are split
|
|
262
|
+
// into disjoint files; every child has its own worktree and PR.
|
|
263
|
+
function isolationFindings(nodes) {
|
|
264
|
+
const findings = [];
|
|
265
|
+
const cap = (items) => `${items.slice(0, 8).join(", ")}${items.length > 8 ? ", …" : ""}`;
|
|
266
|
+
const missingMeta = [];
|
|
267
|
+
for (const node of nodes.values()) {
|
|
268
|
+
if (node.ownWorktree !== true || node.ownPr !== true || !validPaths(node.allowedPaths))
|
|
269
|
+
missingMeta.push(node.id);
|
|
270
|
+
}
|
|
271
|
+
if (missingMeta.length > 0) {
|
|
272
|
+
findings.push({
|
|
273
|
+
code: "P007",
|
|
274
|
+
message: `children without own_worktree: true, own_pr: true and a non-empty allowed_paths list: ${cap(missingMeta)}`,
|
|
275
|
+
path: "tracks[].stages[].children[]",
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
const conflicts = [];
|
|
279
|
+
const byStage = new Map();
|
|
280
|
+
for (const node of nodes.values()) {
|
|
281
|
+
const bucket = byStage.get(node.stageKey);
|
|
282
|
+
if (bucket)
|
|
283
|
+
bucket.push(node);
|
|
284
|
+
else
|
|
285
|
+
byStage.set(node.stageKey, [node]);
|
|
286
|
+
}
|
|
287
|
+
for (const [stageKey, kids] of byStage) {
|
|
288
|
+
for (let i = 0; i < kids.length; i += 1) {
|
|
289
|
+
for (let j = i + 1; j < kids.length; j += 1) {
|
|
290
|
+
const rawA = kids[i].allowedPaths;
|
|
291
|
+
const rawB = kids[j].allowedPaths;
|
|
292
|
+
const pathsA = validPaths(rawA) ? rawA : [];
|
|
293
|
+
const pathsB = validPaths(rawB) ? rawB : [];
|
|
294
|
+
for (const a of pathsA) {
|
|
295
|
+
for (const b of pathsB) {
|
|
296
|
+
if (pathsConflict(a, b))
|
|
297
|
+
conflicts.push(`${stageKey}: ${kids[i].id}[${a}] x ${kids[j].id}[${b}]`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
const branches = new Map();
|
|
304
|
+
for (const node of nodes.values()) {
|
|
305
|
+
if (typeof node.prBranch !== "string" || node.prBranch.length === 0)
|
|
306
|
+
continue;
|
|
307
|
+
const owner = branches.get(node.prBranch);
|
|
308
|
+
if (owner)
|
|
309
|
+
conflicts.push(`pr.branch '${node.prBranch}' shared by ${owner} and ${node.id}`);
|
|
310
|
+
else
|
|
311
|
+
branches.set(node.prBranch, node.id);
|
|
312
|
+
}
|
|
313
|
+
if (conflicts.length > 0) {
|
|
314
|
+
findings.push({
|
|
315
|
+
code: "P008",
|
|
316
|
+
message: `children in a stage must declare disjoint allowed_paths and own their PR branch: ${cap(conflicts)}`,
|
|
317
|
+
path: "tracks[].stages[].children[].allowed_paths",
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
return findings;
|
|
321
|
+
}
|
|
322
|
+
export function lintParallelism(source) {
|
|
323
|
+
if (!isObject(source)) {
|
|
324
|
+
return {
|
|
325
|
+
metrics: emptyMetrics(),
|
|
326
|
+
findings: [{ code: "P000", message: "execution manifest must be a YAML object with tracks[]" }],
|
|
327
|
+
overridden: false,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
const manifest = source;
|
|
331
|
+
const { overridden, reason } = detectOverride(manifest);
|
|
332
|
+
const structural = validateManifest(manifest);
|
|
333
|
+
if (structural.length > 0) {
|
|
334
|
+
// Never scored, never waivable: a malformed document is not an execution manifest.
|
|
335
|
+
// The override (if any) is reported for transparency but cannot affect the verdict.
|
|
336
|
+
return { metrics: emptyMetrics(), findings: structural, overridden, ...(reason ? { overrideReason: reason } : {}) };
|
|
337
|
+
}
|
|
338
|
+
const { nodes, stageSizes, tracks } = collectChildren(manifest);
|
|
339
|
+
const { level, cp, cyclic } = layer(nodes);
|
|
340
|
+
const findings = [];
|
|
341
|
+
if (cyclic.length > 0) {
|
|
342
|
+
findings.push({
|
|
343
|
+
code: "P006",
|
|
344
|
+
message: `depends_on contains a cycle among children: ${cyclic.slice(0, 8).join(", ")}${cyclic.length > 8 ? ", …" : ""}`,
|
|
345
|
+
path: "tracks[].stages[].children[].depends_on",
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
const wavesHist = {};
|
|
349
|
+
for (const lvl of level.values())
|
|
350
|
+
wavesHist[lvl] = (wavesHist[lvl] ?? 0) + 1;
|
|
351
|
+
const wave0 = wavesHist[0] ?? 0;
|
|
352
|
+
const waves = Object.keys(wavesHist).length;
|
|
353
|
+
let criticalPathMinutes = 0;
|
|
354
|
+
for (const value of cp.values())
|
|
355
|
+
criticalPathMinutes = Math.max(criticalPathMinutes, value);
|
|
356
|
+
const criticalPathH = criticalPathMinutes / 60;
|
|
357
|
+
const metrics = {
|
|
358
|
+
children: nodes.size, tracks, waves, wave0,
|
|
359
|
+
criticalPathMinutes, criticalPathH, wavesHist, stageSizes,
|
|
360
|
+
};
|
|
361
|
+
const t = PARALLELISM_THRESHOLDS;
|
|
362
|
+
if (wave0 < t.minWave0)
|
|
363
|
+
findings.push({ code: "P001", message: `wave0 ${wave0} < ${t.minWave0}`, path: "tracks[].stages[].children[]" });
|
|
364
|
+
if (waves > t.maxWaves)
|
|
365
|
+
findings.push({ code: "P002", message: `waves ${waves} > ${t.maxWaves}` });
|
|
366
|
+
if (criticalPathH > t.maxCriticalPathH)
|
|
367
|
+
findings.push({ code: "P003", message: `critical path ${criticalPathH.toFixed(1)}h > ${t.maxCriticalPathH}h` });
|
|
368
|
+
const badStages = Object.entries(stageSizes).filter(([, n]) => n < t.minChildrenPerStage || n > t.maxChildrenPerStage);
|
|
369
|
+
if (badStages.length > 0) {
|
|
370
|
+
const shown = badStages.map(([stage, n]) => `${stage}=${n}`).join(", ");
|
|
371
|
+
findings.push({ code: "P004", message: `stages outside ${t.minChildrenPerStage}-${t.maxChildrenPerStage} children: ${shown}`, path: "tracks[].stages[]" });
|
|
372
|
+
}
|
|
373
|
+
if (tracks < t.minTracks)
|
|
374
|
+
findings.push({ code: "P005", message: `tracks ${tracks} < ${t.minTracks}`, path: "tracks" });
|
|
375
|
+
findings.push(...isolationFindings(nodes));
|
|
376
|
+
return { metrics, findings, overridden, ...(reason ? { overrideReason: reason } : {}) };
|
|
377
|
+
}
|
|
378
|
+
export function lintParallelismFile(path) {
|
|
379
|
+
let source;
|
|
380
|
+
try {
|
|
381
|
+
// Real execution manifests reuse YAML anchors heavily (source/process/authority blocks
|
|
382
|
+
// aliased into every child, child_defaults merged into every child via `<<`); the library
|
|
383
|
+
// default (100 expanded aliases) rejects them and this library does not expand `<<` merge
|
|
384
|
+
// keys unless asked, while the PyYAML-based reference does both. Keep a generous finite
|
|
385
|
+
// alias cap so the guard against alias-expansion bombs stays intact.
|
|
386
|
+
source = parse(readFileSync(path, "utf8"), { maxAliasCount: 100_000, merge: true });
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
const message = error instanceof YAMLParseError ? `invalid YAML: ${error.message}` : `cannot read YAML: ${String(error)}`;
|
|
390
|
+
return {
|
|
391
|
+
verdict: "fail", overridden: false, metrics: emptyMetrics(),
|
|
392
|
+
findings: [{ code: "P000", message }], path,
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
const report = lintParallelism(source);
|
|
396
|
+
return { ...report, verdict: verdictOf(report), path };
|
|
397
|
+
}
|
|
398
|
+
// Structural findings (P000 malformed manifest, P006 cycle) always fail and are never waivable.
|
|
399
|
+
// Threshold findings (P001-P005, P007, P008) fail unless an explicit reasoned override is present.
|
|
400
|
+
export function verdictOf(report) {
|
|
401
|
+
const structural = report.findings.some((finding) => !WAIVABLE.has(finding.code));
|
|
402
|
+
const threshold = report.findings.some((finding) => WAIVABLE.has(finding.code));
|
|
403
|
+
if (structural)
|
|
404
|
+
return "fail";
|
|
405
|
+
return threshold && !report.overridden ? "fail" : "pass";
|
|
406
|
+
}
|
|
407
|
+
export function formatParallelism(report) {
|
|
408
|
+
const m = report.metrics;
|
|
409
|
+
const hist = Object.entries(m.wavesHist).sort((a, b) => Number(a[0]) - Number(b[0]))
|
|
410
|
+
.map(([lvl, n]) => `${lvl}:${n}`).join(" ");
|
|
411
|
+
return `children=${m.children} tracks=${m.tracks} waves=${m.waves} wave0=${m.wave0} ` +
|
|
412
|
+
`critical_path_h=${m.criticalPathH.toFixed(1)} waves_hist={${hist}}`;
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=parallelism.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallelism.js","sourceRoot":"","sources":["../../src/lint/parallelism.ts"],"names":[],"mappings":"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"}
|
package/dist/mail-latency.js
CHANGED
|
@@ -10,10 +10,20 @@ import { readFileSync } from "node:fs";
|
|
|
10
10
|
import { homedir } from "node:os";
|
|
11
11
|
import { join } from "node:path";
|
|
12
12
|
import { workspaceId } from "./client.js";
|
|
13
|
+
// Luna finding: this used a serialized substring check
|
|
14
|
+
// (JSON.stringify(...).includes("codebus tick")) over the WHOLE Stop array —
|
|
15
|
+
// the exact antipattern hookEventHasCommand (below) exists to replace, and
|
|
16
|
+
// which install.ts's own installClaude()/installCodexHooks() had already
|
|
17
|
+
// migrated away from for the same reason: any unrelated hook whose
|
|
18
|
+
// description, argument, or command merely CONTAINS "codebus tick" makes
|
|
19
|
+
// this report `true` when turn-boundary mail surfacing is not actually
|
|
20
|
+
// wired — doctor claims bounded delivery, checkin skips its watch fallback,
|
|
21
|
+
// and nothing ever pulls new mail. Now delegates to hookEventHasCommand for
|
|
22
|
+
// the same exact command-field match installCodex's detection path uses.
|
|
13
23
|
export function stopHookInstalled() {
|
|
14
24
|
try {
|
|
15
25
|
const s = JSON.parse(readFileSync(join(homedir(), ".claude", "settings.json"), "utf8"));
|
|
16
|
-
return
|
|
26
|
+
return hookEventHasCommand(s?.hooks?.Stop, "codebus tick --hook");
|
|
17
27
|
}
|
|
18
28
|
catch {
|
|
19
29
|
return false;
|
package/dist/mail-latency.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mail-latency.js","sourceRoot":"","sources":["../src/mail-latency.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,8EAA8E;AAC9E,qEAAqE;AACrE,qEAAqE;AACrE,yEAAyE;AACzE,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAY,MAAM,aAAa,CAAC;AAEpD,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACxF,OAAO,
|
|
1
|
+
{"version":3,"file":"mail-latency.js","sourceRoot":"","sources":["../src/mail-latency.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,8EAA8E;AAC9E,qEAAqE;AACrE,qEAAqE;AACrE,yEAAyE;AACzE,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAY,MAAM,aAAa,CAAC;AAEpD,uDAAuD;AACvD,6EAA6E;AAC7E,2EAA2E;AAC3E,yEAAyE;AACzE,mEAAmE;AACnE,yEAAyE;AACzE,uEAAuE;AACvE,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACxF,OAAO,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,+EAA+E;AAC/E,+EAA+E;AAC/E,+EAA+E;AAC/E,0EAA0E;AAC1E,0EAA0E;AAC1E,+EAA+E;AAC/E,4EAA4E;AAC5E,6DAA6D;AAC7D,iFAAiF;AACjF,gFAAgF;AAChF,kFAAkF;AAClF,gFAAgF;AAChF,kFAAkF;AAClF,0EAA0E;AAC1E,6EAA6E;AAC7E,iEAAiE;AACjE,MAAM,UAAU,mBAAmB,CAAC,SAAkB,EAAE,GAAW;IACjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,SAAS,CAAC,IAAI,CACnB,CAAC,KAAK,EAAE,EAAE,CACR,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,KAA6B,CAAC,KAAK,CAAC;QAC1F,KAA8B,CAAC,KAAK,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAC3B,CAAwB,CAAC,IAAI,KAAK,SAAS;YAC3C,CAA2B,CAAC,OAAO,KAAK,GAAG,CAC/C,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACpF,OAAO,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,0EAA0E;AAC1E,6EAA6E;AAC7E,4EAA4E;AAC5E,yEAAyE;AACzE,6EAA6E;AAC7E,2EAA2E;AAC3E,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AAClC,CAAC;AAED,+EAA+E;AAC/E,+EAA+E;AAC/E,mEAAmE;AACnE,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,oEAAoE;AACpE,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AACvC,CAAC;AAED,6EAA6E;AAC7E,iFAAiF;AACjF,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAErD,2EAA2E;AAC3E,0EAA0E;AAC1E,0EAA0E;AAC1E,4EAA4E;AAC5E,6EAA6E;AAC7E,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAQ,EAAE,WAAW,GAAG,sBAAsB;IACrF,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ;aAChC,IAAI,CAAC,aAAa,CAAC;aACnB,MAAM,CAAC,gCAAgC,CAAC;aACxC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;aACnB,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;aACtB,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,SAAS,CAAC;aAChC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;aACzC,KAAK,CAAC,CAAC,CAAC,CAAC;QACZ,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAuC,CAAC;QAClE,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,2EAA2E;AAC3E,0EAA0E;AAC1E,6EAA6E;AAC7E,wEAAwE;AACxE,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAoB;IAC5D,MAAM,OAAO,GAAG,CAAC,mBAAmB,EAAE,IAAI,iBAAiB,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,mBAAmB,EAAE,CAAC,CAAC;IAC9G,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,OAAO,EAAE,EAAE,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAC/B,iHAAiH;IACjH,mGAAmG;IACnG,yFAAyF,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP transport for CI findings — parity wrapper over the CLI command core.
|
|
3
|
+
*
|
|
4
|
+
* Implements the CLI/MCP parity rule: this module contains NO independent
|
|
5
|
+
* finding logic; it delegates to ./commands/ci-findings.js so CLI and MCP
|
|
6
|
+
* return identical findings for identical inputs.
|
|
7
|
+
*/
|
|
8
|
+
import { listFindings, parseFindings, validateFinding, } from "./commands/ci-findings.js";
|
|
9
|
+
/** MCP tool handler: parse payload text, run the shared core, return structured result. */
|
|
10
|
+
export function mcpCiFindingsList(payloadText, opts = {}) {
|
|
11
|
+
const findings = parseFindings(payloadText);
|
|
12
|
+
return listFindings(findings, opts);
|
|
13
|
+
}
|
|
14
|
+
/** MCP tool handler: validate a single finding. */
|
|
15
|
+
export function mcpCiFindingValidate(finding) {
|
|
16
|
+
const errors = validateFinding(finding);
|
|
17
|
+
return { valid: errors.length === 0, errors };
|
|
18
|
+
}
|
|
19
|
+
export const MCP_CI_FINDINGS_TOOL = {
|
|
20
|
+
name: "ci_findings_list",
|
|
21
|
+
description: "List CI findings (ci_finding work-orders). Same core as the ci-findings CLI command.",
|
|
22
|
+
inputSchema: {
|
|
23
|
+
type: "object",
|
|
24
|
+
properties: {
|
|
25
|
+
findings: { type: "array", description: "Array of ci-finding v1 objects" },
|
|
26
|
+
kind: { type: "string", description: "Filter by kind" },
|
|
27
|
+
next_action: { type: "string", description: "Filter by next_action" },
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=mcp-ci-findings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-ci-findings.js","sourceRoot":"","sources":["../src/mcp-ci-findings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAGL,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,2BAA2B,CAAC;AASnC,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,OAA0B,EAAE;IACjF,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,sFAAsF;IACnG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gCAAgC,EAAE;YAC1E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;YACvD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;SACtE;KACF;CACO,CAAC"}
|