@su-record/vibe 4.1.18 → 4.1.20
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +14 -1
- package/card.md +2 -2
- package/dist/cli/common.js +3 -0
- package/dist/cli/common.js.map +1 -1
- package/dist/cli/context.js +11 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/conventions.js +13 -0
- package/dist/cli/conventions.js.map +1 -0
- package/dist/cli/map.js +59 -0
- package/dist/cli/map.js.map +1 -0
- package/dist/cli/memory.js +10 -8
- package/dist/cli/memory.js.map +1 -1
- package/dist/cli/setup.js +6 -2
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/work.js +6 -1
- package/dist/cli/work.js.map +1 -1
- package/dist/cli.js +18 -5
- package/dist/cli.js.map +1 -1
- package/dist/core/analyze.js +82 -0
- package/dist/core/analyze.js.map +1 -0
- package/dist/core/capabilities.js +60 -0
- package/dist/core/capabilities.js.map +1 -0
- package/dist/core/checks/changed.js +17 -3
- package/dist/core/checks/changed.js.map +1 -1
- package/dist/core/checks/source.js +2 -1
- package/dist/core/checks/source.js.map +1 -1
- package/dist/core/context.js +206 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/conventions.js +149 -0
- package/dist/core/conventions.js.map +1 -0
- package/dist/core/knowledge.js +9 -3
- package/dist/core/knowledge.js.map +1 -1
- package/dist/core/ledger.js +53 -3
- package/dist/core/ledger.js.map +1 -1
- package/dist/core/map/format.js +52 -0
- package/dist/core/map/format.js.map +1 -0
- package/dist/core/map/imports.js +152 -0
- package/dist/core/map/imports.js.map +1 -0
- package/dist/core/map/index.js +142 -0
- package/dist/core/map/index.js.map +1 -0
- package/dist/core/map/symbols.js +123 -0
- package/dist/core/map/symbols.js.map +1 -0
- package/dist/core/paths.js +4 -0
- package/dist/core/paths.js.map +1 -1
- package/dist/core/reader.js +17 -3
- package/dist/core/reader.js.map +1 -1
- package/dist/core/readerSession.js +30 -3
- package/dist/core/readerSession.js.map +1 -1
- package/dist/core/size.js +13 -9
- package/dist/core/size.js.map +1 -1
- package/hooks/notify.js +14 -9
- package/package.json +1 -1
- package/skills/vibe-build/SKILL.md +2 -2
- package/skills/vibe-discover/SKILL.md +2 -0
- package/skills/vibe-prove/SKILL.md +2 -0
- package/skills/vibe-scope/SKILL.md +1 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { readLedger } from './ledger.js';
|
|
4
|
+
import { vibePath } from './paths.js';
|
|
5
|
+
import { listRegressions } from './regress.js';
|
|
6
|
+
import { ensureDir, readJson, readText, writeAtomic } from './store.js';
|
|
7
|
+
const LINT_FILES = ['.eslintrc.json', '.eslintrc.js', '.eslintrc.cjs', '.eslintrc.yml', '.eslintrc.yaml', '.eslintrc', 'eslint.config.js', 'eslint.config.mjs', 'eslint.config.cjs', 'eslint.config.ts'];
|
|
8
|
+
const FORMAT_FILES = ['.prettierrc', '.prettierrc.json', '.prettierrc.js', '.prettierrc.cjs', '.prettierrc.yml', '.prettierrc.yaml', 'prettier.config.js', 'biome.json', '.editorconfig', 'rustfmt.toml', '.golangci.yml', '.golangci.yaml'];
|
|
9
|
+
const TS_FLAGS = ['strict', 'noUncheckedIndexedAccess', 'noImplicitReturns', 'noFallthroughCasesInSwitch', 'exactOptionalPropertyTypes'];
|
|
10
|
+
function existingFiles(root, names) {
|
|
11
|
+
return names.filter((n) => fs.existsSync(path.join(root, n)));
|
|
12
|
+
}
|
|
13
|
+
function lintLines(root) {
|
|
14
|
+
const out = [];
|
|
15
|
+
for (const f of existingFiles(root, LINT_FILES))
|
|
16
|
+
out.push({ text: `lint config present (${f})`, source: f });
|
|
17
|
+
for (const f of existingFiles(root, FORMAT_FILES))
|
|
18
|
+
out.push({ text: `formatter config present (${f})`, source: f });
|
|
19
|
+
if (fs.existsSync(path.join(root, 'ruff.toml')))
|
|
20
|
+
out.push({ text: 'Python lint config present (ruff.toml)', source: 'ruff.toml' });
|
|
21
|
+
const pyproject = readText(path.join(root, 'pyproject.toml'));
|
|
22
|
+
if (pyproject && /\[tool\.(ruff|black)\]/.test(pyproject))
|
|
23
|
+
out.push({ text: 'Python lint/format config in pyproject.toml ([tool.ruff]/[tool.black])', source: 'pyproject.toml' });
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
function tsconfigLines(root) {
|
|
27
|
+
const raw = readJson(path.join(root, 'tsconfig.json'));
|
|
28
|
+
const options = raw?.compilerOptions;
|
|
29
|
+
if (!options)
|
|
30
|
+
return [];
|
|
31
|
+
const on = TS_FLAGS.filter((f) => options[f] === true);
|
|
32
|
+
return on.length ? [{ text: `tsconfig strict flags: ${on.join(', ')}`, source: 'tsconfig.json' }] : [];
|
|
33
|
+
}
|
|
34
|
+
function projectFileLines(root) {
|
|
35
|
+
const out = [];
|
|
36
|
+
const pyproject = readText(path.join(root, 'pyproject.toml'));
|
|
37
|
+
if (pyproject) {
|
|
38
|
+
const version = /^version\s*=\s*"([^"]+)"/m.exec(pyproject)?.[1];
|
|
39
|
+
out.push({ text: `Python project (pyproject.toml)${version ? ` version ${version}` : ''}`, source: 'pyproject.toml' });
|
|
40
|
+
}
|
|
41
|
+
const goMod = readText(path.join(root, 'go.mod'));
|
|
42
|
+
if (goMod) {
|
|
43
|
+
const mod = /^module\s+(\S+)/m.exec(goMod)?.[1] ?? '(unnamed)';
|
|
44
|
+
const goVersion = /^go\s+(\S+)/m.exec(goMod)?.[1];
|
|
45
|
+
out.push({ text: `Go module ${mod}${goVersion ? ` (go ${goVersion})` : ''}`, source: 'go.mod' });
|
|
46
|
+
}
|
|
47
|
+
const cargo = readText(path.join(root, 'Cargo.toml'));
|
|
48
|
+
if (cargo) {
|
|
49
|
+
const name = /^name\s*=\s*"([^"]+)"/m.exec(cargo)?.[1] ?? '(unnamed)';
|
|
50
|
+
const version = /^version\s*=\s*"([^"]+)"/m.exec(cargo)?.[1];
|
|
51
|
+
out.push({ text: `Rust crate ${name}${version ? ` ${version}` : ''}`, source: 'Cargo.toml' });
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
function scriptLines(root) {
|
|
56
|
+
const pkg = readJson(path.join(root, 'package.json'));
|
|
57
|
+
const scripts = pkg?.scripts ?? {};
|
|
58
|
+
const out = [];
|
|
59
|
+
for (const key of ['test', 'lint', 'build']) {
|
|
60
|
+
const cmd = scripts[key];
|
|
61
|
+
if (cmd)
|
|
62
|
+
out.push({ text: `package.json script ${key}: "${cmd}"`, source: 'package.json' });
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
function headingLines(root) {
|
|
67
|
+
const out = [];
|
|
68
|
+
for (const name of ['AGENTS.md', 'CLAUDE.md']) {
|
|
69
|
+
const text = readText(path.join(root, name));
|
|
70
|
+
const heading = text?.split('\n').find((l) => l.trim().startsWith('#'));
|
|
71
|
+
if (heading)
|
|
72
|
+
out.push({ text: `${name}: ${heading.replace(/^#+\s*/, '').trim()}`, source: name });
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
/** What the repository declares, one line per finding, each with the file it came from. */
|
|
77
|
+
export function readConventions(root) {
|
|
78
|
+
return [...lintLines(root), ...tsconfigLines(root), ...projectFileLines(root), ...scriptLines(root), ...headingLines(root)];
|
|
79
|
+
}
|
|
80
|
+
const REJECT_ITEM_RE = /^[^|]+\|[^|]+\|[^|]+\|[^|]+$/;
|
|
81
|
+
const KEEP_RE = /^KEEP\s*\|/;
|
|
82
|
+
/** Every reviewer line across every `check` run's evidence, grouped by exact text, with the runs that said it. */
|
|
83
|
+
function reviewLines(root) {
|
|
84
|
+
const byLine = new Map();
|
|
85
|
+
for (const e of readLedger(root)) {
|
|
86
|
+
if (e.event !== 'check' || !e.run)
|
|
87
|
+
continue;
|
|
88
|
+
const evidence = readJson(vibePath(root, 'evidence', `${e.run}.json`));
|
|
89
|
+
for (const r of evidence?.results ?? []) {
|
|
90
|
+
for (const raw of (r.tail ?? '').split('\n')) {
|
|
91
|
+
const line = raw.trim();
|
|
92
|
+
const kind = KEEP_RE.test(line) ? 'keep' : REJECT_ITEM_RE.test(line) && line !== 'REJECT' ? 'reject' : null;
|
|
93
|
+
if (!kind)
|
|
94
|
+
continue;
|
|
95
|
+
const entry = byLine.get(line) ?? { kind, runs: new Set() };
|
|
96
|
+
entry.runs.add(e.run);
|
|
97
|
+
byLine.set(line, entry);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return byLine;
|
|
102
|
+
}
|
|
103
|
+
/** A REJECT reason or a KEEP line that recurs across two or more `check` runs — the review is telling us something twice. */
|
|
104
|
+
function recurringReviewLines(root) {
|
|
105
|
+
const out = [];
|
|
106
|
+
for (const [line, { kind, runs }] of reviewLines(root)) {
|
|
107
|
+
if (runs.size < 2)
|
|
108
|
+
continue;
|
|
109
|
+
const label = kind === 'keep' ? 'KEEP line' : 'REJECT reason';
|
|
110
|
+
out.push({ text: `recurring ${label}: ${line}`, source: `check ${[...runs].sort().join(', ')}` });
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
function regressionLines(root) {
|
|
115
|
+
return listRegressions(root).map((r) => {
|
|
116
|
+
const title = /^\[regression\]\s*(.+?)\s*—\s*source/.exec(r.then)?.[1] ?? r.then;
|
|
117
|
+
return { text: `regression: ${title}`, source: `.vibe/regressions/${r.id}.yaml` };
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function decisionLines(root) {
|
|
121
|
+
return readLedger(root)
|
|
122
|
+
.filter((e) => e.event === 'approve')
|
|
123
|
+
.map((e) => ({ text: `decided: ${e.detail ?? ''}`, source: `ledger:approve ${e.at}` }));
|
|
124
|
+
}
|
|
125
|
+
/** What the ledger showed: recurring review findings, every regression, every approval decided. */
|
|
126
|
+
export function learnConventions(root) {
|
|
127
|
+
return [...recurringReviewLines(root), ...regressionLines(root), ...decisionLines(root)];
|
|
128
|
+
}
|
|
129
|
+
export function conventionsPath(root) {
|
|
130
|
+
return vibePath(root, 'knowledge', 'conventions.md');
|
|
131
|
+
}
|
|
132
|
+
function formatLine(l) {
|
|
133
|
+
return `- ${l.text} — source: ${l.source}`;
|
|
134
|
+
}
|
|
135
|
+
/** Append-only: a line already present, byte for byte, is never written twice. */
|
|
136
|
+
export function updateConventions(root) {
|
|
137
|
+
const lines = [...new Set([...readConventions(root), ...learnConventions(root)].map(formatLine))];
|
|
138
|
+
const file = conventionsPath(root);
|
|
139
|
+
const existingText = readText(file);
|
|
140
|
+
const existingLines = new Set((existingText ?? '').split('\n').map((l) => l.trim()).filter(Boolean));
|
|
141
|
+
const added = lines.filter((l) => !existingLines.has(l));
|
|
142
|
+
if (added.length > 0) {
|
|
143
|
+
ensureDir(path.dirname(file));
|
|
144
|
+
const prefix = existingText && existingText.trim() ? `${existingText.trimEnd()}\n` : '';
|
|
145
|
+
writeAtomic(file, `${prefix}${added.join('\n')}\n`);
|
|
146
|
+
}
|
|
147
|
+
return { added, total: existingLines.size + added.length };
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=conventions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conventions.js","sourceRoot":"","sources":["../../src/core/conventions.ts"],"names":[],"mappings":"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"}
|
package/dist/core/knowledge.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
1
2
|
import path from 'node:path';
|
|
2
3
|
import { detectClient, detectModel } from './client.js';
|
|
3
4
|
import { usage } from './errors.js';
|
|
@@ -8,15 +9,20 @@ import { writeAtomic } from './store.js';
|
|
|
8
9
|
export function knowledgeDir(root) {
|
|
9
10
|
return vibePath(root, 'knowledge');
|
|
10
11
|
}
|
|
11
|
-
|
|
12
|
+
/** Cross-project knowledge, outside any `.vibe/` — the same plain-file format, read after a project's own. */
|
|
13
|
+
export function globalKnowledgeDir(home = process.env['VIBE_HOME_DIR'] ?? os.homedir()) {
|
|
14
|
+
return path.join(home, '.config', 'vibe', 'knowledge');
|
|
15
|
+
}
|
|
16
|
+
export function addKnowledge(root, title, body, options = {}) {
|
|
12
17
|
if (!title.trim())
|
|
13
18
|
throw usage('--title is required');
|
|
14
19
|
if (!body.trim())
|
|
15
20
|
throw usage('body is empty');
|
|
16
21
|
const slug = title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 48) || 'note';
|
|
17
|
-
const
|
|
22
|
+
const dir = options.global ? globalKnowledgeDir() : knowledgeDir(root);
|
|
23
|
+
const file = path.join(dir, `${slug}.md`);
|
|
18
24
|
writeAtomic(file, `# ${title}\n\n${body.trim()}\n`);
|
|
19
|
-
record(root, { event: 'knowledge', client: detectClient(), model: detectModel(), detail: slug });
|
|
25
|
+
record(root, { event: 'knowledge', client: detectClient(), model: detectModel(), detail: options.global ? `global:${slug}` : slug });
|
|
20
26
|
return { file };
|
|
21
27
|
}
|
|
22
28
|
//# sourceMappingURL=knowledge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/core/knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAa,EAAE,IAAY;
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/core/knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACrC,CAAC;AAED,8GAA8G;AAC9G,MAAM,UAAU,kBAAkB,CAAC,OAAe,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE;IAC5F,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC;AAMD,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAa,EAAE,IAAY,EAAE,UAA+B,EAAE;IACvG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,MAAM,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC;IAC5G,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAC1C,WAAW,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrI,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
|
package/dist/core/ledger.js
CHANGED
|
@@ -74,8 +74,54 @@ function metricOf(e, metric) {
|
|
|
74
74
|
return typeof e.passed === 'number' ? e.passed : null;
|
|
75
75
|
if (metric === 'turns')
|
|
76
76
|
return typeof e.turns === 'number' ? e.turns : null;
|
|
77
|
+
if (metric === 'ms')
|
|
78
|
+
return typeof e.ms === 'number' ? e.ms : null;
|
|
77
79
|
return typeof e.costUsd === 'number' ? e.costUsd : null;
|
|
78
80
|
}
|
|
81
|
+
/** A run "passed" for pairing purposes when every scenario in it passed. */
|
|
82
|
+
function armPassed(e) {
|
|
83
|
+
return e.armPassed ?? (typeof e.failed === 'number' && e.failed === 0);
|
|
84
|
+
}
|
|
85
|
+
/** The key that lines up the same run across two arms: the `pair` field bench/run.js writes, or — for a
|
|
86
|
+
* ledger without one — the nth occurrence of a task within its own arm, in the order it was recorded. */
|
|
87
|
+
function pairKey(e, seenPerTask) {
|
|
88
|
+
if (e.pair)
|
|
89
|
+
return e.pair;
|
|
90
|
+
const task = e.task ?? 'unknown';
|
|
91
|
+
const n = seenPerTask.get(task) ?? 0;
|
|
92
|
+
seenPerTask.set(task, n + 1);
|
|
93
|
+
return `${task}#${n}`;
|
|
94
|
+
}
|
|
95
|
+
/** Keep only runs that pair with a run in the other arm on the same task, both of which passed. Needs
|
|
96
|
+
* exactly two arms — pairing across more than two has no single "other side" to match against. */
|
|
97
|
+
function pairedOnly(checks, by) {
|
|
98
|
+
const arms = new Map();
|
|
99
|
+
for (const e of checks) {
|
|
100
|
+
const key = armKey(e, by);
|
|
101
|
+
arms.set(key, [...(arms.get(key) ?? []), e]);
|
|
102
|
+
}
|
|
103
|
+
const [armA, armB] = [...arms.keys()];
|
|
104
|
+
if (arms.size !== 2 || armA === undefined || armB === undefined)
|
|
105
|
+
return checks;
|
|
106
|
+
const seenA = new Map();
|
|
107
|
+
const seenB = new Map();
|
|
108
|
+
const bByKey = new Map((arms.get(armB) ?? []).map((e) => [pairKey(e, seenB), e]));
|
|
109
|
+
const out = [];
|
|
110
|
+
for (const e of arms.get(armA) ?? []) {
|
|
111
|
+
const other = bByKey.get(pairKey(e, seenA));
|
|
112
|
+
if (other && armPassed(e) && armPassed(other))
|
|
113
|
+
out.push(e, other);
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
/** costRecomputed far (more than 3×) from the client-reported costUsd — a run worth a second look. */
|
|
118
|
+
function costMismatched(e) {
|
|
119
|
+
const a = e.costRecomputed;
|
|
120
|
+
const b = e.costUsd;
|
|
121
|
+
if (typeof a !== 'number' || typeof b !== 'number' || a === 0 || b === 0)
|
|
122
|
+
return false;
|
|
123
|
+
return Math.max(a, b) / Math.min(a, b) > 3;
|
|
124
|
+
}
|
|
79
125
|
function withUsage(e, metric, usageByRun) {
|
|
80
126
|
const own = metricOf(e, metric);
|
|
81
127
|
if (metric !== 'cost')
|
|
@@ -100,10 +146,13 @@ function armKey(e, by) {
|
|
|
100
146
|
return e.model ?? 'unknown';
|
|
101
147
|
return e.harness ?? 'unknown';
|
|
102
148
|
}
|
|
103
|
-
/** `ledgerFile` lets a bench keep its own ledger outside any project.
|
|
104
|
-
|
|
149
|
+
/** `ledgerFile` lets a bench keep its own ledger outside any project. `paired` keeps only runs that
|
|
150
|
+
* pair with a passing run in the other arm on the same task (see `pairedOnly`) — for a bench ledger,
|
|
151
|
+
* where efficiency is only comparable between runs that both did the work. */
|
|
152
|
+
export function compare(root, by, metric, minRuns = 5, ledgerFile, paired = false) {
|
|
105
153
|
const events = ledgerFile ? readJsonl(ledgerFile) : readLedger(root);
|
|
106
|
-
const
|
|
154
|
+
const allChecks = events.filter((e) => e.event === 'check');
|
|
155
|
+
const checks = paired ? pairedOnly(allChecks, by) : allChecks;
|
|
107
156
|
// What the readers and reviewers spent during a run belongs to that run's cost.
|
|
108
157
|
const usageByRun = new Map();
|
|
109
158
|
for (const e of events)
|
|
@@ -122,6 +171,7 @@ export function compare(root, by, metric, minRuns = 5, ledgerFile) {
|
|
|
122
171
|
usable: values.length,
|
|
123
172
|
scenarioSets: [...new Set(events.map((e) => e.scenarioSet ?? 'unknown'))],
|
|
124
173
|
range: range(values),
|
|
174
|
+
costMismatch: events.filter(costMismatched).length,
|
|
125
175
|
};
|
|
126
176
|
});
|
|
127
177
|
const base = { by, metric, arms, delta: null };
|
package/dist/core/ledger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/core/ledger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/core/ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
/** Text rendering for `vibe map`, `symbols`, `callers` and `blast` — one representation, whatever the caller (CLI, `changed`, `reader`). */
|
|
3
|
+
export function formatMap(map) {
|
|
4
|
+
const files = Object.keys(map.files).sort();
|
|
5
|
+
const lines = [`${files.length} files`];
|
|
6
|
+
let lastDir = '';
|
|
7
|
+
for (const rel of files) {
|
|
8
|
+
const dir = path.dirname(rel);
|
|
9
|
+
if (dir !== lastDir) {
|
|
10
|
+
lines.push(`${dir}/`);
|
|
11
|
+
lastDir = dir;
|
|
12
|
+
}
|
|
13
|
+
const f = map.files[rel];
|
|
14
|
+
lines.push(` ${path.basename(rel)}${f.imports.length ? ` → ${f.imports.join(', ')}` : ''}`);
|
|
15
|
+
for (const s of f.symbols)
|
|
16
|
+
lines.push(` ${s.kind} ${s.signature} L${s.startLine}-${s.endLine}${s.exported ? ' export' : ''}`);
|
|
17
|
+
}
|
|
18
|
+
return lines.join('\n');
|
|
19
|
+
}
|
|
20
|
+
export function formatSymbols(file, symbols) {
|
|
21
|
+
if (symbols.length === 0)
|
|
22
|
+
return `${file}: no symbols found`;
|
|
23
|
+
return [file, ...symbols.map((s) => ` ${s.kind} ${s.signature} L${s.startLine}-${s.endLine}${s.exported ? ' export' : ''}`)].join('\n');
|
|
24
|
+
}
|
|
25
|
+
export function formatCallers(symbol, callers) {
|
|
26
|
+
if (callers.length === 0)
|
|
27
|
+
return `${symbol}: no callers found`;
|
|
28
|
+
return [`${symbol}:`, ...callers.map((c) => ` ${c.file} (${c.confidence})`)].join('\n');
|
|
29
|
+
}
|
|
30
|
+
export function formatBlast(result) {
|
|
31
|
+
const changedLines = result.changed.length ? result.changed.map((c) => ` ${c.file} › ${c.name}() L${c.startLine}-${c.endLine}`) : [' none'];
|
|
32
|
+
const callerLines = result.callers.length ? result.callers.map((c) => ` ${c.file} (${c.confidence}, via ${c.symbol})`) : [' none'];
|
|
33
|
+
return ['Changed symbols:', ...changedLines, 'Affected symbols:', ...callerLines].join('\n');
|
|
34
|
+
}
|
|
35
|
+
/** The two summary lines `review`'s changed-with-blast bundle opens with, and the caller files behind them. */
|
|
36
|
+
export function blastSummary(result) {
|
|
37
|
+
const changedNames = [...new Set(result.changed.map((c) => c.name))];
|
|
38
|
+
const files = [...new Set(result.callers.map((c) => c.file))].sort();
|
|
39
|
+
return {
|
|
40
|
+
changedLine: `Changed symbols: ${changedNames.join(', ') || 'none'}`,
|
|
41
|
+
affectedLine: `Affected symbols: ${files.join(', ') || 'none'}`,
|
|
42
|
+
files,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** The skeleton `vibe read --ask` prepends to a code file: one line per symbol, name and signature with its line range. */
|
|
46
|
+
export function skeletonBlock(relPath, symbols) {
|
|
47
|
+
if (symbols.length === 0)
|
|
48
|
+
return '';
|
|
49
|
+
const lines = symbols.map((s) => `${s.signature} L${s.startLine}-${s.endLine}`);
|
|
50
|
+
return `<skeleton path="${relPath}">\n${lines.join('\n')}\n</skeleton>`;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/core/map/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { relPosix } from '../paths.js';
|
|
4
|
+
/**
|
|
5
|
+
* Import edges, resolved to a file that exists (or, for Go, a package directory expanded to the
|
|
6
|
+
* files inside it): JS/TS relative specifiers, Python `from`/`import`, Go module-relative imports
|
|
7
|
+
* against `go.mod`, Rust `use crate::…` / `mod x;`, and Java/Kotlin `import a.b.C` against a
|
|
8
|
+
* `src`/`java`/`kotlin` source root. Every result is filtered to files this map already knows.
|
|
9
|
+
*/
|
|
10
|
+
const JS_IMPORT = /(?:from\s+|import\s*\(?\s*|require\s*\(\s*)['"]([^'"]+)['"]/g;
|
|
11
|
+
const PY_FROM = /^\s*from\s+([.\w]+)\s+import\b/gm;
|
|
12
|
+
const PY_IMPORT = /^\s*import\s+([\w.]+(?:\s*,\s*[\w.]+)*)/gm;
|
|
13
|
+
const GO_IMPORT_BLOCK = /import\s*\(([^)]*)\)/gs;
|
|
14
|
+
const GO_IMPORT_SINGLE = /^\s*import\s+"([^"]+)"/gm;
|
|
15
|
+
const GO_PATH = /"([^"]+)"/g;
|
|
16
|
+
const RUST_USE = /^\s*(?:pub\s+)?use\s+((?:crate|self|super)(?:::[\w]+)+);/gm;
|
|
17
|
+
const RUST_MOD = /^\s*(?:pub\s+)?mod\s+([A-Za-z_]\w*)\s*;/gm;
|
|
18
|
+
const JAVA_IMPORT = /^\s*import\s+(?:static\s+)?([\w.]+)\s*;/gm;
|
|
19
|
+
const JS_EXTS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
|
|
20
|
+
function firstExisting(candidates) {
|
|
21
|
+
return candidates.find((c) => fs.existsSync(c) && fs.statSync(c).isFile()) ?? null;
|
|
22
|
+
}
|
|
23
|
+
/** A relative JS/TS specifier: as written, with an extension, `.js` read as `.ts`, or an index file. */
|
|
24
|
+
function jsTargets(fromDir, spec) {
|
|
25
|
+
if (!spec.startsWith('.'))
|
|
26
|
+
return [];
|
|
27
|
+
const base = path.resolve(fromDir, spec);
|
|
28
|
+
const out = [base, ...JS_EXTS.map((e) => base + e), ...JS_EXTS.map((e) => path.join(base, `index${e}`))];
|
|
29
|
+
if (/\.[cm]?js$/.test(base))
|
|
30
|
+
out.push(base.replace(/\.[cm]?js$/, '.ts'), base.replace(/\.[cm]?js$/, '.tsx'));
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
/** `from .x import` relative to the file, `from pkg.x import` / `import pkg.x` from the root and the file's directory. */
|
|
34
|
+
function pyTargets(root, fromDir, mod) {
|
|
35
|
+
if (mod.startsWith('.')) {
|
|
36
|
+
const ups = mod.match(/^\.+/)[0].length - 1;
|
|
37
|
+
const rest = mod.slice(ups + 1).split('.').filter(Boolean);
|
|
38
|
+
const base = path.resolve(fromDir, ...Array(ups).fill('..'), ...rest);
|
|
39
|
+
return [`${base}.py`, path.join(base, '__init__.py')];
|
|
40
|
+
}
|
|
41
|
+
const rest = mod.split('.');
|
|
42
|
+
return [root, fromDir].flatMap((start) => {
|
|
43
|
+
const base = path.resolve(start, ...rest);
|
|
44
|
+
return [`${base}.py`, path.join(base, '__init__.py')];
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** The nearest ancestor `go.mod`'s module path, and the directory it lives in. */
|
|
48
|
+
function findGoModule(dir, root) {
|
|
49
|
+
let cur = dir;
|
|
50
|
+
for (;;) {
|
|
51
|
+
const gomod = path.join(cur, 'go.mod');
|
|
52
|
+
if (fs.existsSync(gomod)) {
|
|
53
|
+
const m = /^module\s+(\S+)/m.exec(fs.readFileSync(gomod, 'utf-8'));
|
|
54
|
+
return m ? { name: m[1], dir: cur } : null;
|
|
55
|
+
}
|
|
56
|
+
const parent = path.dirname(cur);
|
|
57
|
+
if (cur === root || parent === cur)
|
|
58
|
+
return null;
|
|
59
|
+
cur = parent;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** A Go import path under the module: the package directory it names, expanded to its files by the caller. */
|
|
63
|
+
function goTargets(mod, importPath) {
|
|
64
|
+
if (!mod || !(importPath === mod.name || importPath.startsWith(`${mod.name}/`)))
|
|
65
|
+
return [];
|
|
66
|
+
const rel = importPath.slice(mod.name.length).replace(/^\//, '');
|
|
67
|
+
return [path.join(mod.dir, rel)];
|
|
68
|
+
}
|
|
69
|
+
/** `crate::a::b` against the crate's `src/`, most specific candidate first. */
|
|
70
|
+
function rustTargets(file, use) {
|
|
71
|
+
let srcRoot = path.dirname(file);
|
|
72
|
+
while (srcRoot && path.basename(srcRoot) !== 'src') {
|
|
73
|
+
const parent = path.dirname(srcRoot);
|
|
74
|
+
srcRoot = parent === srcRoot ? null : parent;
|
|
75
|
+
}
|
|
76
|
+
if (!srcRoot)
|
|
77
|
+
return [];
|
|
78
|
+
const parts = use.split('::').filter((p) => !['crate', 'self', 'super'].includes(p));
|
|
79
|
+
const out = [];
|
|
80
|
+
for (let k = parts.length; k >= 1; k -= 1) {
|
|
81
|
+
const base = path.join(srcRoot, ...parts.slice(0, k));
|
|
82
|
+
out.push(`${base}.rs`, path.join(base, 'mod.rs'));
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
/** `import a.b.C` against the nearest `java`/`kotlin`/`src` ancestor. */
|
|
87
|
+
function javaTargets(file, importPath) {
|
|
88
|
+
let root = path.dirname(file);
|
|
89
|
+
while (root && !['java', 'kotlin', 'src'].includes(path.basename(root))) {
|
|
90
|
+
const parent = path.dirname(root);
|
|
91
|
+
root = parent === root ? null : parent;
|
|
92
|
+
}
|
|
93
|
+
if (!root)
|
|
94
|
+
return [];
|
|
95
|
+
const base = path.join(root, ...importPath.split('.'));
|
|
96
|
+
return [`${base}.java`, `${base}.kt`];
|
|
97
|
+
}
|
|
98
|
+
function goFilesIn(dir, knownFiles, root) {
|
|
99
|
+
return [...knownFiles].filter((rel) => path.dirname(path.resolve(root, rel)) === dir);
|
|
100
|
+
}
|
|
101
|
+
function targetsFor(root, file, text) {
|
|
102
|
+
const dir = path.dirname(file);
|
|
103
|
+
const ext = path.extname(file);
|
|
104
|
+
const out = [];
|
|
105
|
+
if (JS_EXTS.includes(ext)) {
|
|
106
|
+
for (const m of text.matchAll(JS_IMPORT))
|
|
107
|
+
out.push(...jsTargets(dir, m[1]));
|
|
108
|
+
}
|
|
109
|
+
else if (ext === '.py') {
|
|
110
|
+
for (const m of text.matchAll(PY_FROM))
|
|
111
|
+
out.push(...pyTargets(root, dir, m[1]));
|
|
112
|
+
for (const m of text.matchAll(PY_IMPORT))
|
|
113
|
+
for (const mod of m[1].split(','))
|
|
114
|
+
out.push(...pyTargets(root, dir, mod.trim()));
|
|
115
|
+
}
|
|
116
|
+
else if (ext === '.go') {
|
|
117
|
+
const mod = findGoModule(dir, root);
|
|
118
|
+
const block = [...text.matchAll(GO_IMPORT_BLOCK)].map((m) => m[1]).join('\n');
|
|
119
|
+
for (const m of [...block.matchAll(GO_PATH), ...text.matchAll(GO_IMPORT_SINGLE)])
|
|
120
|
+
out.push(...goTargets(mod, (m[1] ?? m[0]).replace(/^"|"$/g, '')));
|
|
121
|
+
}
|
|
122
|
+
else if (ext === '.rs') {
|
|
123
|
+
for (const m of text.matchAll(RUST_USE))
|
|
124
|
+
out.push(...rustTargets(file, m[1]));
|
|
125
|
+
for (const m of text.matchAll(RUST_MOD))
|
|
126
|
+
out.push(...rustTargets(file, `crate::${m[1]}`));
|
|
127
|
+
}
|
|
128
|
+
else if (ext === '.java' || ext === '.kt') {
|
|
129
|
+
for (const m of text.matchAll(JAVA_IMPORT))
|
|
130
|
+
out.push(...javaTargets(file, m[1]));
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
/** `file`'s import edges resolved to files this map knows, as paths relative to `root`. Go targets that name a directory expand to every known file directly inside it. */
|
|
135
|
+
export function resolveImports(root, file, text, knownFiles) {
|
|
136
|
+
const out = new Set();
|
|
137
|
+
for (const candidate of targetsFor(root, file, text)) {
|
|
138
|
+
if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
|
|
139
|
+
for (const rel of goFilesIn(candidate, knownFiles, root))
|
|
140
|
+
out.add(rel);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const hit = firstExisting([candidate]) ?? (path.extname(candidate) ? null : firstExisting([`${candidate}.go`]));
|
|
144
|
+
if (!hit)
|
|
145
|
+
continue;
|
|
146
|
+
const rel = relPosix(root, hit);
|
|
147
|
+
if (knownFiles.has(rel))
|
|
148
|
+
out.add(rel);
|
|
149
|
+
}
|
|
150
|
+
return [...out].sort();
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=imports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imports.js","sourceRoot":"","sources":["../../../src/core/map/imports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,SAAS,GAAG,8DAA8D,CAAC;AACjF,MAAM,OAAO,GAAG,kCAAkC,CAAC;AACnD,MAAM,SAAS,GAAG,2CAA2C,CAAC;AAC9D,MAAM,eAAe,GAAG,wBAAwB,CAAC;AACjD,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AACpD,MAAM,OAAO,GAAG,YAAY,CAAC;AAC7B,MAAM,QAAQ,GAAG,4DAA4D,CAAC;AAC9E,MAAM,QAAQ,GAAG,2CAA2C,CAAC;AAC7D,MAAM,WAAW,GAAG,2CAA2C,CAAC;AAChE,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/D,SAAS,aAAa,CAAC,UAAoB;IACzC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC;AACrF,CAAC;AAED,wGAAwG;AACxG,SAAS,SAAS,CAAC,OAAe,EAAE,IAAY;IAC9C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzG,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7G,OAAO,GAAG,CAAC;AACb,CAAC;AAED,0HAA0H;AAC1H,SAAS,SAAS,CAAC,IAAY,EAAE,OAAe,EAAE,GAAW;IAC3D,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAClF,SAAS,YAAY,CAAC,GAAW,EAAE,IAAY;IAC7C,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,SAAS,CAAC;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACvC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9C,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,8GAA8G;AAC9G,SAAS,SAAS,CAAC,GAAyC,EAAE,UAAkB;IAC9E,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3F,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,+EAA+E;AAC/E,SAAS,WAAW,CAAC,IAAY,EAAE,GAAW;IAC5C,IAAI,OAAO,GAAkB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yEAAyE;AACzE,SAAS,WAAW,CAAC,IAAY,EAAE,UAAkB;IACnD,IAAI,IAAI,GAAkB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,IAAI,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,UAA+B,EAAE,IAAY;IAC3E,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;QACjF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9H,CAAC;SAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/E,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACtJ,CAAC;SAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;QAC/E,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2KAA2K;AAC3K,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,UAA+B;IACtG,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACrE,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvE,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC;QAChH,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChC,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
|