homegraph 1.5.0 → 1.5.2
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/bin/command-supervision.d.ts.map +1 -1
- package/dist/bin/command-supervision.js +7 -4
- package/dist/bin/command-supervision.js.map +1 -1
- package/dist/extraction/index.d.ts +1 -1
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +54 -43
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/arkts.d.ts +69 -12
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +739 -86
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/diff-impact.d.ts +131 -0
- package/dist/mcp/diff-impact.d.ts.map +1 -0
- package/dist/mcp/diff-impact.js +385 -0
- package/dist/mcp/diff-impact.js.map +1 -0
- package/dist/mcp/liveness-watchdog.d.ts +18 -0
- package/dist/mcp/liveness-watchdog.d.ts.map +1 -1
- package/dist/mcp/liveness-watchdog.js +134 -22
- package/dist/mcp/liveness-watchdog.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +2 -0
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/tools.d.ts +21 -5
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +305 -55
- package/dist/mcp/tools.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts +2 -1
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +153 -53
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/frameworks/arkts-entry.d.ts.map +1 -1
- package/dist/resolution/frameworks/arkts-entry.js +20 -9
- package/dist/resolution/frameworks/arkts-entry.js.map +1 -1
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +1 -1
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/memory-budget.d.ts +33 -0
- package/dist/resolution/memory-budget.d.ts.map +1 -1
- package/dist/resolution/memory-budget.js +58 -0
- package/dist/resolution/memory-budget.js.map +1 -1
- package/dist/resolution/resolver-pool.d.ts +2 -0
- package/dist/resolution/resolver-pool.d.ts.map +1 -1
- package/dist/resolution/resolver-pool.js +4 -0
- package/dist/resolution/resolver-pool.js.map +1 -1
- package/dist/ui/shimmer-progress.d.ts.map +1 -1
- package/dist/ui/shimmer-progress.js +4 -1
- package/dist/ui/shimmer-progress.js.map +1 -1
- package/package.json +4 -5
- package/dist/arkts/ohos-api-index.d.ts +0 -15
- package/dist/arkts/ohos-api-index.d.ts.map +0 -1
- package/dist/arkts/ohos-api-index.js +0 -190
- package/dist/arkts/ohos-api-index.js.map +0 -1
- package/dist/arkts/ohos-sdk-input.d.ts +0 -36
- package/dist/arkts/ohos-sdk-input.d.ts.map +0 -1
- package/dist/arkts/ohos-sdk-input.js +0 -214
- package/dist/arkts/ohos-sdk-input.js.map +0 -1
- package/dist/extraction/languages/arkts-state-decorators.d.ts +0 -13
- package/dist/extraction/languages/arkts-state-decorators.d.ts.map +0 -1
- package/dist/extraction/languages/arkts-state-decorators.js +0 -26
- package/dist/extraction/languages/arkts-state-decorators.js.map +0 -1
- package/dist/extraction/languages/arkts-viewtree.d.ts +0 -24
- package/dist/extraction/languages/arkts-viewtree.d.ts.map +0 -1
- package/dist/extraction/languages/arkts-viewtree.js +0 -148
- package/dist/extraction/languages/arkts-viewtree.js.map +0 -1
- package/dist/extraction/languages/ohos-api-consumer.d.ts +0 -34
- package/dist/extraction/languages/ohos-api-consumer.d.ts.map +0 -1
- package/dist/extraction/languages/ohos-api-consumer.js +0 -283
- package/dist/extraction/languages/ohos-api-consumer.js.map +0 -1
- package/dist/reasoning/config.d.ts +0 -45
- package/dist/reasoning/config.d.ts.map +0 -1
- package/dist/reasoning/config.js +0 -171
- package/dist/reasoning/config.js.map +0 -1
- package/dist/reasoning/credentials.d.ts +0 -5
- package/dist/reasoning/credentials.d.ts.map +0 -1
- package/dist/reasoning/credentials.js +0 -83
- package/dist/reasoning/credentials.js.map +0 -1
- package/dist/reasoning/login.d.ts +0 -21
- package/dist/reasoning/login.d.ts.map +0 -1
- package/dist/reasoning/login.js +0 -85
- package/dist/reasoning/login.js.map +0 -1
- package/dist/reasoning/reasoner.d.ts +0 -43
- package/dist/reasoning/reasoner.d.ts.map +0 -1
- package/dist/reasoning/reasoner.js +0 -308
- package/dist/reasoning/reasoner.js.map +0 -1
- package/dist/spec/build/git-scanner.d.ts +0 -93
- package/dist/spec/build/git-scanner.d.ts.map +0 -1
- package/dist/spec/build/git-scanner.js +0 -254
- package/dist/spec/build/git-scanner.js.map +0 -1
- package/dist/spec/evolve/llm-client.d.ts +0 -50
- package/dist/spec/evolve/llm-client.d.ts.map +0 -1
- package/dist/spec/evolve/llm-client.js +0 -176
- package/dist/spec/evolve/llm-client.js.map +0 -1
- package/dist/spec/evolve/logic-checker.d.ts +0 -12
- package/dist/spec/evolve/logic-checker.d.ts.map +0 -1
- package/dist/spec/evolve/logic-checker.js +0 -24
- package/dist/spec/evolve/logic-checker.js.map +0 -1
- package/dist/spec/git-utils.d.ts +0 -8
- package/dist/spec/git-utils.d.ts.map +0 -1
- package/dist/spec/git-utils.js +0 -14
- package/dist/spec/git-utils.js.map +0 -1
- package/dist/spec/llm/index.d.ts +0 -3
- package/dist/spec/llm/index.d.ts.map +0 -1
- package/dist/spec/llm/index.js +0 -11
- package/dist/spec/llm/index.js.map +0 -1
- package/dist/spec/mine/clusterer.d.ts +0 -63
- package/dist/spec/mine/clusterer.d.ts.map +0 -1
- package/dist/spec/mine/clusterer.js +0 -904
- package/dist/spec/mine/clusterer.js.map +0 -1
- package/dist/spec/mine/progress-handler.d.ts +0 -22
- package/dist/spec/mine/progress-handler.d.ts.map +0 -1
- package/dist/spec/mine/progress-handler.js +0 -108
- package/dist/spec/mine/progress-handler.js.map +0 -1
- package/dist/spec/mine/progress.d.ts +0 -23
- package/dist/spec/mine/progress.d.ts.map +0 -1
- package/dist/spec/mine/progress.js +0 -12
- package/dist/spec/mine/progress.js.map +0 -1
- package/dist/spec/mining/diff-parser.d.ts +0 -33
- package/dist/spec/mining/diff-parser.d.ts.map +0 -1
- package/dist/spec/mining/diff-parser.js +0 -166
- package/dist/spec/mining/diff-parser.js.map +0 -1
- package/dist/spec/mining/git-scanner.d.ts +0 -103
- package/dist/spec/mining/git-scanner.d.ts.map +0 -1
- package/dist/spec/mining/git-scanner.js +0 -307
- package/dist/spec/mining/git-scanner.js.map +0 -1
- package/dist/spec/mining/pipeline.d.ts +0 -53
- package/dist/spec/mining/pipeline.d.ts.map +0 -1
- package/dist/spec/mining/pipeline.js +0 -178
- package/dist/spec/mining/pipeline.js.map +0 -1
- package/dist/spec/mining/scope-resolver.d.ts +0 -45
- package/dist/spec/mining/scope-resolver.d.ts.map +0 -1
- package/dist/spec/mining/scope-resolver.js +0 -103
- package/dist/spec/mining/scope-resolver.js.map +0 -1
- package/dist/spec/mining/spec-extractor.d.ts +0 -69
- package/dist/spec/mining/spec-extractor.d.ts.map +0 -1
- package/dist/spec/mining/spec-extractor.js +0 -369
- package/dist/spec/mining/spec-extractor.js.map +0 -1
- package/dist/spec/utils.d.ts +0 -155
- package/dist/spec/utils.d.ts.map +0 -1
- package/dist/spec/utils.js +0 -411
- package/dist/spec/utils.js.map +0 -1
- package/scripts/add-lang/bench.sh +0 -60
- package/scripts/add-lang/check-grammar.mjs +0 -75
- package/scripts/add-lang/dump-ast.mjs +0 -103
- package/scripts/add-lang/verify-extraction.mjs +0 -70
- package/scripts/agent-eval/ab-adoption.sh +0 -91
- package/scripts/agent-eval/ab-hook.sh +0 -86
- package/scripts/agent-eval/ab-impl.sh +0 -78
- package/scripts/agent-eval/ab-new-vs-baseline.sh +0 -102
- package/scripts/agent-eval/ab-sufficiency.sh +0 -78
- package/scripts/agent-eval/arms-F.sh +0 -21
- package/scripts/agent-eval/arms-matrix.sh +0 -37
- package/scripts/agent-eval/audit.sh +0 -68
- package/scripts/agent-eval/bench-readme.sh +0 -28
- package/scripts/agent-eval/bench-why-repo.sh +0 -22
- package/scripts/agent-eval/block-read-hook.sh +0 -19
- package/scripts/agent-eval/hook-settings.json +0 -15
- package/scripts/agent-eval/itrun.sh +0 -120
- package/scripts/agent-eval/offload-eval-3arm.sh +0 -72
- package/scripts/agent-eval/offload-eval-cost.mjs +0 -133
- package/scripts/agent-eval/offload-eval-effort.mjs +0 -108
- package/scripts/agent-eval/offload-eval-frontload-matrix.sh +0 -25
- package/scripts/agent-eval/offload-eval-frontload.sh +0 -47
- package/scripts/agent-eval/offload-eval-ground-truth.json +0 -18
- package/scripts/agent-eval/offload-eval-hook.mjs +0 -84
- package/scripts/agent-eval/offload-eval-judge.mjs +0 -103
- package/scripts/agent-eval/offload-eval-matrix.sh +0 -20
- package/scripts/agent-eval/offload-eval-metrics.mjs +0 -94
- package/scripts/agent-eval/offload-eval-refs1.sh +0 -50
- package/scripts/agent-eval/offload-eval-setup.sh +0 -24
- package/scripts/agent-eval/offload-eval-styles.sh +0 -72
- package/scripts/agent-eval/offload-eval-summarize.mjs +0 -68
- package/scripts/agent-eval/offload-eval.md +0 -76
- package/scripts/agent-eval/parse-arms.mjs +0 -116
- package/scripts/agent-eval/parse-bench-readme.mjs +0 -84
- package/scripts/agent-eval/parse-run.mjs +0 -45
- package/scripts/agent-eval/parse-session.mjs +0 -93
- package/scripts/agent-eval/probe-context.mjs +0 -21
- package/scripts/agent-eval/probe-explore.mjs +0 -40
- package/scripts/agent-eval/probe-node.mjs +0 -20
- package/scripts/agent-eval/probe-sweep.mjs +0 -119
- package/scripts/agent-eval/probe-trace.mjs +0 -20
- package/scripts/agent-eval/redirect-read-hook.sh +0 -38
- package/scripts/agent-eval/repro-concurrent-explore.mjs +0 -119
- package/scripts/agent-eval/repro-daemon-clients.mjs +0 -125
- package/scripts/agent-eval/run-agent.sh +0 -34
- package/scripts/agent-eval/run-all.sh +0 -75
- package/scripts/agent-eval/run-arms.sh +0 -56
- package/scripts/agent-eval/seq-matrix.mjs +0 -137
- package/scripts/build-bundle.sh +0 -123
- package/scripts/exp_boundary_eval/README.md +0 -247
- package/scripts/exp_boundary_eval/_test_mcp_chain.py +0 -78
- package/scripts/exp_boundary_eval/_test_stdin.py +0 -8
- package/scripts/exp_boundary_eval/_utils.py +0 -1116
- package/scripts/exp_boundary_eval/analyze.py +0 -1313
- package/scripts/exp_boundary_eval/deveco_arm.py +0 -519
- package/scripts/exp_boundary_eval/run_all.py +0 -378
- package/scripts/exp_boundary_eval/run_one.py +0 -165
- package/scripts/exp_boundary_eval/run_session.py +0 -158
- package/scripts/exp_boundary_eval/setup.py +0 -120
- package/scripts/exp_boundary_eval/win_mcp_launcher.py +0 -73
- package/scripts/exp_boundary_eval/win_mcp_stdio_wrap.js +0 -36
- package/scripts/exp_boundary_eval/win_node_launcher.py +0 -24
- package/scripts/extract-release-notes.mjs +0 -130
- package/scripts/local-install.sh +0 -41
- package/scripts/npm-sdk.js +0 -75
- package/scripts/npm-shim.js +0 -275
- package/scripts/ohos-sdk-publish.mjs +0 -133
- package/scripts/pack-npm.sh +0 -119
- package/scripts/prepare-release.mjs +0 -270
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Diff → changed-symbol impact helpers for `homegraph_diff_impact`.
|
|
4
|
+
*
|
|
5
|
+
* Parses unified diffs (new-side line ranges), intersects those ranges with
|
|
6
|
+
* indexed symbol spans, and builds a capped evidence pack (callers / impact
|
|
7
|
+
* summary / UI edges). Spec attachment is left to the MCP handler.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.DIFF_IMPACT_LIMITS = exports.DIFF_IMPACT_UI_SYNTHESIZED_BY = exports.DIFF_IMPACT_MAX_DIFF_CHARS = void 0;
|
|
11
|
+
exports.normalizeDiffFilePath = normalizeDiffFilePath;
|
|
12
|
+
exports.parseUnifiedDiff = parseUnifiedDiff;
|
|
13
|
+
exports.mergeRanges = mergeRanges;
|
|
14
|
+
exports.rangesOverlap = rangesOverlap;
|
|
15
|
+
exports.nodeOverlapsRanges = nodeOverlapsRanges;
|
|
16
|
+
exports.selectChangedSymbols = selectChangedSymbols;
|
|
17
|
+
exports.isDiffImpactUiEdge = isDiffImpactUiEdge;
|
|
18
|
+
exports.buildDiffImpactPack = buildDiffImpactPack;
|
|
19
|
+
exports.resolveDiffImpactHunks = resolveDiffImpactHunks;
|
|
20
|
+
/** Max chars accepted for the `diff` argument (DoS bound; still success-shaped). */
|
|
21
|
+
exports.DIFF_IMPACT_MAX_DIFF_CHARS = 500_000;
|
|
22
|
+
exports.DIFF_IMPACT_UI_SYNTHESIZED_BY = new Set([
|
|
23
|
+
'viewtree',
|
|
24
|
+
'arkui-state',
|
|
25
|
+
'arkui-route',
|
|
26
|
+
'arkui-emitter',
|
|
27
|
+
]);
|
|
28
|
+
/** Kinds that are almost never useful as "what changed" anchors for review. */
|
|
29
|
+
const SKIP_NODE_KINDS = new Set([
|
|
30
|
+
'file',
|
|
31
|
+
'module',
|
|
32
|
+
'parameter',
|
|
33
|
+
'import',
|
|
34
|
+
'export',
|
|
35
|
+
]);
|
|
36
|
+
exports.DIFF_IMPACT_LIMITS = {
|
|
37
|
+
maxSymbols: 80,
|
|
38
|
+
maxCallersPerSymbol: 8,
|
|
39
|
+
maxImpactSamples: 8,
|
|
40
|
+
maxUiEdges: 40,
|
|
41
|
+
maxSpecSymbols: 15,
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Strip unified-diff path prefixes (`a/`, `b/`, `./`) and normalize slashes.
|
|
45
|
+
*/
|
|
46
|
+
function normalizeDiffFilePath(raw) {
|
|
47
|
+
let p = raw.trim().replace(/\\/g, '/');
|
|
48
|
+
if (p === '/dev/null' || p === 'nul' || p === 'NUL')
|
|
49
|
+
return '';
|
|
50
|
+
// git often emits "b/src/foo.ts\t" or with timestamps after a tab
|
|
51
|
+
const tab = p.indexOf('\t');
|
|
52
|
+
if (tab >= 0)
|
|
53
|
+
p = p.slice(0, tab);
|
|
54
|
+
if (p.startsWith('a/') || p.startsWith('b/'))
|
|
55
|
+
p = p.slice(2);
|
|
56
|
+
p = p.replace(/^\.\//, '');
|
|
57
|
+
return p;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Parse unified diff text into per-file **new-side** (post-change) line ranges.
|
|
61
|
+
* Pure deletions (new count 0) contribute no ranges but still list the file.
|
|
62
|
+
*/
|
|
63
|
+
function parseUnifiedDiff(diff) {
|
|
64
|
+
const notes = [];
|
|
65
|
+
const byFile = new Map();
|
|
66
|
+
let currentPath = '';
|
|
67
|
+
const lines = diff.split(/\r?\n/);
|
|
68
|
+
for (const line of lines) {
|
|
69
|
+
if (line.startsWith('+++ ')) {
|
|
70
|
+
const path = normalizeDiffFilePath(line.slice(4));
|
|
71
|
+
currentPath = path;
|
|
72
|
+
if (path && !byFile.has(path))
|
|
73
|
+
byFile.set(path, []);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (line.startsWith('--- ')) {
|
|
77
|
+
// Prefer +++ when present; --- alone (e.g. unusual diffs) seeds the path.
|
|
78
|
+
const path = normalizeDiffFilePath(line.slice(4));
|
|
79
|
+
if (path && !currentPath) {
|
|
80
|
+
currentPath = path;
|
|
81
|
+
if (!byFile.has(path))
|
|
82
|
+
byFile.set(path, []);
|
|
83
|
+
}
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (line.startsWith('diff --git ')) {
|
|
87
|
+
currentPath = '';
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const m = /^@@\s+-(\d+)(?:,(\d+))?\s+\+(\d+)(?:,(\d+))?\s+@@/.exec(line);
|
|
91
|
+
if (!m)
|
|
92
|
+
continue;
|
|
93
|
+
if (!currentPath) {
|
|
94
|
+
notes.push('Skipped a hunk with no preceding +++ file path.');
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const newStart = parseInt(m[3], 10);
|
|
98
|
+
const newCount = m[4] !== undefined ? parseInt(m[4], 10) : 1;
|
|
99
|
+
if (newCount <= 0) {
|
|
100
|
+
// Pure deletion on the new side — keep file listed, no line ranges.
|
|
101
|
+
if (!byFile.has(currentPath))
|
|
102
|
+
byFile.set(currentPath, []);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const ranges = byFile.get(currentPath) ?? [];
|
|
106
|
+
ranges.push({
|
|
107
|
+
startLine: newStart,
|
|
108
|
+
endLine: newStart + newCount - 1,
|
|
109
|
+
});
|
|
110
|
+
byFile.set(currentPath, ranges);
|
|
111
|
+
}
|
|
112
|
+
const hunks = [];
|
|
113
|
+
for (const [path, ranges] of byFile) {
|
|
114
|
+
hunks.push({ path, ranges: mergeRanges(ranges) });
|
|
115
|
+
}
|
|
116
|
+
hunks.sort((a, b) => a.path.localeCompare(b.path));
|
|
117
|
+
return { hunks, notes };
|
|
118
|
+
}
|
|
119
|
+
/** Merge overlapping / adjacent line ranges. */
|
|
120
|
+
function mergeRanges(ranges) {
|
|
121
|
+
if (ranges.length === 0)
|
|
122
|
+
return [];
|
|
123
|
+
const sorted = [...ranges].sort((a, b) => a.startLine - b.startLine || a.endLine - b.endLine);
|
|
124
|
+
const out = [{ ...sorted[0] }];
|
|
125
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
126
|
+
const cur = sorted[i];
|
|
127
|
+
const last = out[out.length - 1];
|
|
128
|
+
if (cur.startLine <= last.endLine + 1) {
|
|
129
|
+
last.endLine = Math.max(last.endLine, cur.endLine);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
out.push({ ...cur });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
function rangesOverlap(a, b) {
|
|
138
|
+
return a.startLine <= b.endLine && b.startLine <= a.endLine;
|
|
139
|
+
}
|
|
140
|
+
function nodeOverlapsRanges(node, ranges) {
|
|
141
|
+
const span = { startLine: node.startLine, endLine: node.endLine };
|
|
142
|
+
return ranges.some((r) => rangesOverlap(span, r));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Select indexed nodes whose spans intersect any changed line range.
|
|
146
|
+
* Skips container/noise kinds. Prefers tighter (inner) symbols when sorting.
|
|
147
|
+
*/
|
|
148
|
+
function selectChangedSymbols(nodesByFile, hunks, limits = { maxSymbols: exports.DIFF_IMPACT_LIMITS.maxSymbols }) {
|
|
149
|
+
const picked = [];
|
|
150
|
+
for (const hunk of hunks) {
|
|
151
|
+
if (hunk.ranges.length === 0)
|
|
152
|
+
continue;
|
|
153
|
+
const nodes = nodesByFile.get(hunk.path) ?? [];
|
|
154
|
+
for (const n of nodes) {
|
|
155
|
+
if (SKIP_NODE_KINDS.has(n.kind))
|
|
156
|
+
continue;
|
|
157
|
+
if (!nodeOverlapsRanges(n, hunk.ranges))
|
|
158
|
+
continue;
|
|
159
|
+
picked.push({
|
|
160
|
+
id: n.id,
|
|
161
|
+
name: n.name,
|
|
162
|
+
kind: n.kind,
|
|
163
|
+
filePath: n.filePath,
|
|
164
|
+
startLine: n.startLine,
|
|
165
|
+
endLine: n.endLine,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Prefer smaller spans (inner defs) then earlier lines — review noise control.
|
|
170
|
+
picked.sort((a, b) => (a.endLine - a.startLine) - (b.endLine - b.startLine) ||
|
|
171
|
+
a.startLine - b.startLine ||
|
|
172
|
+
a.name.localeCompare(b.name));
|
|
173
|
+
const truncated = picked.length > limits.maxSymbols;
|
|
174
|
+
return {
|
|
175
|
+
symbols: truncated ? picked.slice(0, limits.maxSymbols) : picked,
|
|
176
|
+
truncated,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function isDiffImpactUiEdge(edge) {
|
|
180
|
+
if (edge.provenance !== 'heuristic')
|
|
181
|
+
return false;
|
|
182
|
+
const m = edge.metadata;
|
|
183
|
+
const by = m?.synthesizedBy;
|
|
184
|
+
return typeof by === 'string' && exports.DIFF_IMPACT_UI_SYNTHESIZED_BY.has(by);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Build the capped evidence pack from hunks + graph. Specs are not included.
|
|
188
|
+
*/
|
|
189
|
+
function buildDiffImpactPack(graph, hunks, options = {}) {
|
|
190
|
+
const limits = { ...exports.DIFF_IMPACT_LIMITS, ...options.limits };
|
|
191
|
+
const depth = Math.max(1, Math.min(options.depth ?? 2, 5));
|
|
192
|
+
const notes = [...(options.notes ?? [])];
|
|
193
|
+
const nodesByFile = new Map();
|
|
194
|
+
for (const h of hunks) {
|
|
195
|
+
try {
|
|
196
|
+
nodesByFile.set(h.path, graph.getNodesInFile(h.path));
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
nodesByFile.set(h.path, []);
|
|
200
|
+
notes.push(`Could not load nodes for ${h.path}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const { symbols, truncated: symbolsTruncated } = selectChangedSymbols(nodesByFile, hunks, {
|
|
204
|
+
maxSymbols: limits.maxSymbols,
|
|
205
|
+
});
|
|
206
|
+
if (symbols.length === 0) {
|
|
207
|
+
notes.push(hunks.some((h) => h.ranges.length > 0)
|
|
208
|
+
? 'No indexed symbols intersect the changed line ranges (index may be stale relative to the diff, or changes are non-symbol).'
|
|
209
|
+
: 'Diff had no new-side line ranges (pure deletions or empty).');
|
|
210
|
+
}
|
|
211
|
+
const symbolIds = new Set(symbols.map((s) => s.id));
|
|
212
|
+
const nameById = new Map(symbols.map((s) => [s.id, s.name]));
|
|
213
|
+
const callers = [];
|
|
214
|
+
let callersTruncated = false;
|
|
215
|
+
for (const sym of symbols) {
|
|
216
|
+
let list = [];
|
|
217
|
+
try {
|
|
218
|
+
list = graph.getCallers(sym.id, 1);
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (list.length > limits.maxCallersPerSymbol) {
|
|
224
|
+
callersTruncated = true;
|
|
225
|
+
list = list.slice(0, limits.maxCallersPerSymbol);
|
|
226
|
+
}
|
|
227
|
+
for (const { node, edge } of list) {
|
|
228
|
+
callers.push({
|
|
229
|
+
symbol: sym.name,
|
|
230
|
+
callerName: node.name,
|
|
231
|
+
callerFile: node.filePath,
|
|
232
|
+
line: edge.line ?? null,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const impactSummary = [];
|
|
237
|
+
let impactTruncated = false;
|
|
238
|
+
for (const sym of symbols) {
|
|
239
|
+
try {
|
|
240
|
+
const impact = graph.getImpactRadius(sym.id, depth);
|
|
241
|
+
const nodes = normalizeImpactNodes(impact.nodes).filter((n) => n.id !== sym.id);
|
|
242
|
+
if (nodes.length > limits.maxImpactSamples)
|
|
243
|
+
impactTruncated = true;
|
|
244
|
+
impactSummary.push({
|
|
245
|
+
symbol: sym.name,
|
|
246
|
+
affectedCount: nodes.length,
|
|
247
|
+
sampleNames: nodes.slice(0, limits.maxImpactSamples).map((n) => n.name),
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
impactSummary.push({ symbol: sym.name, affectedCount: 0, sampleNames: [] });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const uiEdges = [];
|
|
255
|
+
const seenUi = new Set();
|
|
256
|
+
let uiTruncated = false;
|
|
257
|
+
for (const sym of symbols) {
|
|
258
|
+
if (uiEdges.length >= limits.maxUiEdges) {
|
|
259
|
+
uiTruncated = true;
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
let edges = [];
|
|
263
|
+
try {
|
|
264
|
+
edges = [
|
|
265
|
+
...graph.getOutgoingEdges(sym.id),
|
|
266
|
+
...graph.getIncomingEdges(sym.id),
|
|
267
|
+
];
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
for (const edge of edges) {
|
|
273
|
+
if (!isDiffImpactUiEdge(edge))
|
|
274
|
+
continue;
|
|
275
|
+
if (!symbolIds.has(edge.source) && !symbolIds.has(edge.target))
|
|
276
|
+
continue;
|
|
277
|
+
const key = `${edge.source}>${edge.target}>${edge.kind}>${String(edge.metadata?.via ?? '')}`;
|
|
278
|
+
if (seenUi.has(key))
|
|
279
|
+
continue;
|
|
280
|
+
seenUi.add(key);
|
|
281
|
+
const m = edge.metadata;
|
|
282
|
+
const sourceName = nameById.get(edge.source) ?? graph.getNode?.(edge.source)?.name ?? edge.source;
|
|
283
|
+
const targetName = nameById.get(edge.target) ?? graph.getNode?.(edge.target)?.name ?? edge.target;
|
|
284
|
+
uiEdges.push({
|
|
285
|
+
source: edge.source,
|
|
286
|
+
sourceName,
|
|
287
|
+
target: edge.target,
|
|
288
|
+
targetName,
|
|
289
|
+
kind: edge.kind,
|
|
290
|
+
synthesizedBy: String(m?.synthesizedBy ?? ''),
|
|
291
|
+
via: typeof m?.via === 'string' ? m.via : null,
|
|
292
|
+
line: edge.line ?? null,
|
|
293
|
+
});
|
|
294
|
+
if (uiEdges.length >= limits.maxUiEdges) {
|
|
295
|
+
uiTruncated = true;
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
changedFiles: hunks.map((h) => h.path),
|
|
302
|
+
hunks,
|
|
303
|
+
changedSymbols: symbols,
|
|
304
|
+
callers,
|
|
305
|
+
impactSummary,
|
|
306
|
+
uiEdges,
|
|
307
|
+
truncated: {
|
|
308
|
+
symbols: symbolsTruncated,
|
|
309
|
+
callers: callersTruncated,
|
|
310
|
+
impact: impactTruncated,
|
|
311
|
+
uiEdges: uiTruncated,
|
|
312
|
+
},
|
|
313
|
+
notes,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
function normalizeImpactNodes(nodes) {
|
|
317
|
+
if (Array.isArray(nodes))
|
|
318
|
+
return nodes;
|
|
319
|
+
if (nodes instanceof Map)
|
|
320
|
+
return Array.from(nodes.values());
|
|
321
|
+
return Array.from(nodes);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Accept either a unified `diff` string or explicit `hunks` from the agent.
|
|
325
|
+
*/
|
|
326
|
+
function resolveDiffImpactHunks(args) {
|
|
327
|
+
if (typeof args.diff === 'string' && args.diff.length > 0) {
|
|
328
|
+
if (args.diff.length > exports.DIFF_IMPACT_MAX_DIFF_CHARS) {
|
|
329
|
+
return {
|
|
330
|
+
hunks: [],
|
|
331
|
+
notes: [],
|
|
332
|
+
error: `\`diff\` exceeds maximum length of ${exports.DIFF_IMPACT_MAX_DIFF_CHARS} characters ` +
|
|
333
|
+
`(got ${args.diff.length}). Pass a smaller unified diff (e.g. one PR file at a time).`,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
return parseUnifiedDiff(args.diff);
|
|
337
|
+
}
|
|
338
|
+
if (Array.isArray(args.hunks)) {
|
|
339
|
+
const hunks = [];
|
|
340
|
+
const notes = [];
|
|
341
|
+
for (const raw of args.hunks) {
|
|
342
|
+
if (!raw || typeof raw !== 'object') {
|
|
343
|
+
notes.push('Ignored a non-object hunk entry.');
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
const rec = raw;
|
|
347
|
+
const path = typeof rec.path === 'string'
|
|
348
|
+
? normalizeDiffFilePath(rec.path)
|
|
349
|
+
: typeof rec.file === 'string'
|
|
350
|
+
? normalizeDiffFilePath(rec.file)
|
|
351
|
+
: '';
|
|
352
|
+
if (!path) {
|
|
353
|
+
notes.push('Ignored a hunk with no path.');
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
const startLine = Number(rec.startLine ?? rec.start);
|
|
357
|
+
const endLine = Number(rec.endLine ?? rec.end ?? startLine);
|
|
358
|
+
if (!Number.isFinite(startLine) || startLine < 1) {
|
|
359
|
+
notes.push(`Ignored hunk for ${path}: invalid startLine.`);
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
const end = Number.isFinite(endLine) && endLine >= startLine ? endLine : startLine;
|
|
363
|
+
hunks.push({ path, ranges: [{ startLine, endLine: end }] });
|
|
364
|
+
}
|
|
365
|
+
// Merge by path
|
|
366
|
+
const byPath = new Map();
|
|
367
|
+
for (const h of hunks) {
|
|
368
|
+
const list = byPath.get(h.path) ?? [];
|
|
369
|
+
list.push(...h.ranges);
|
|
370
|
+
byPath.set(h.path, list);
|
|
371
|
+
}
|
|
372
|
+
const merged = [...byPath.entries()].map(([p, ranges]) => ({
|
|
373
|
+
path: p,
|
|
374
|
+
ranges: mergeRanges(ranges),
|
|
375
|
+
}));
|
|
376
|
+
merged.sort((a, b) => a.path.localeCompare(b.path));
|
|
377
|
+
return { hunks: merged, notes };
|
|
378
|
+
}
|
|
379
|
+
return {
|
|
380
|
+
hunks: [],
|
|
381
|
+
notes: [],
|
|
382
|
+
error: 'Provide either `diff` (unified diff text) or `hunks` (array of { path, startLine, endLine }).',
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=diff-impact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-impact.js","sourceRoot":"","sources":["../../src/mcp/diff-impact.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,24 @@ export interface WatchdogOptions {
|
|
|
30
30
|
* handle to stop it, or `null` when disabled or when the child can't be spawned
|
|
31
31
|
* (degraded, never throws — a missing watchdog must never keep a process from
|
|
32
32
|
* starting).
|
|
33
|
+
*
|
|
34
|
+
* The returned handle is process-wide and stable across
|
|
35
|
+
* {@link suspendLivenessWatchdog} re-arms — `stop()` always tears down the
|
|
36
|
+
* current generation.
|
|
33
37
|
*/
|
|
34
38
|
export declare function installMainThreadWatchdog(options?: WatchdogOptions): WatchdogHandle | null;
|
|
39
|
+
/**
|
|
40
|
+
* Suspend the armed liveness watchdog for an opaque synchronous span that
|
|
41
|
+
* cannot cooperatively yield (ArkAnalyzer Scene builds). Returns an idempotent
|
|
42
|
+
* resume function. Nested calls refcount; a `stop()` while suspended cancels
|
|
43
|
+
* the pending re-arm.
|
|
44
|
+
*
|
|
45
|
+
* No-op when nothing is armed (tests, `HOMEGRAPH_NO_WATCHDOG`, library embeds).
|
|
46
|
+
*/
|
|
47
|
+
export declare function suspendLivenessWatchdog(): () => void;
|
|
48
|
+
/**
|
|
49
|
+
* Run `fn` with the liveness watchdog suspended, then resume. Use for native
|
|
50
|
+
* spans with no JS yield points; prefer cooperative yielding for JS-owned loops.
|
|
51
|
+
*/
|
|
52
|
+
export declare function runWithoutLivenessWatchdog<T>(fn: () => T): T;
|
|
35
53
|
//# sourceMappingURL=liveness-watchdog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liveness-watchdog.d.ts","sourceRoot":"","sources":["../../src/mcp/liveness-watchdog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"liveness-watchdog.d.ts","sourceRoot":"","sources":["../../src/mcp/liveness-watchdog.ts"],"names":[],"mappings":"AAiEA,uGAAuG;AACvG,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAElD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAQ1C,qFAAqF;AACrF,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,GAAE,MAAoC,GAC7C,MAAM,CAIR;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AASD,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,IAAI,IAAI,IAAI,CAAC;CACd;AA8DD,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAkHD;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,GAAG,IAAI,CAY9F;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,IAAI,CAqBpD;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAO5D"}
|
|
@@ -37,6 +37,8 @@ exports.PROGRESS_CAP_MULTIPLIER = exports.DEFAULT_WATCHDOG_TIMEOUT_MS = void 0;
|
|
|
37
37
|
exports.parseWatchdogTimeoutMs = parseWatchdogTimeoutMs;
|
|
38
38
|
exports.deriveCheckIntervalMs = deriveCheckIntervalMs;
|
|
39
39
|
exports.installMainThreadWatchdog = installMainThreadWatchdog;
|
|
40
|
+
exports.suspendLivenessWatchdog = suspendLivenessWatchdog;
|
|
41
|
+
exports.runWithoutLivenessWatchdog = runWithoutLivenessWatchdog;
|
|
40
42
|
/**
|
|
41
43
|
* Main-thread liveness watchdog — belt-and-suspenders for #850.
|
|
42
44
|
*
|
|
@@ -88,6 +90,15 @@ exports.installMainThreadWatchdog = installMainThreadWatchdog;
|
|
|
88
90
|
* coinciding with unrelated file activity — or I/O hung beyond all reason —
|
|
89
91
|
* still dies. A true wedge with no disk progress dies at the base timeout,
|
|
90
92
|
* exactly as before.
|
|
93
|
+
*
|
|
94
|
+
* **Opaque native spans (`suspendLivenessWatchdog` / `runWithoutLivenessWatchdog`).**
|
|
95
|
+
* ArkAnalyzer Scene builds (`analyseByModule` / full Scene) run synchronous
|
|
96
|
+
* native work on this thread with no JS yield points — a single module's BODIES
|
|
97
|
+
* load can exceed the 60s window while the process is healthy. Cooperative
|
|
98
|
+
* yielding can't help (the stall is between callbacks, inside native code), and
|
|
99
|
+
* disk-progress deferral's hard cap is too short for multi-module Harmony
|
|
100
|
+
* indexes. Those spans suspend the watchdog for the duration and re-arm after;
|
|
101
|
+
* prefer yielding for any JS-owned loop.
|
|
91
102
|
*/
|
|
92
103
|
const fs = __importStar(require("fs"));
|
|
93
104
|
const os = __importStar(require("os"));
|
|
@@ -187,14 +198,42 @@ process.stdin.on('error', () => process.exit(0)); // pipe broke -> parent gone
|
|
|
187
198
|
process.stdin.resume();
|
|
188
199
|
`;
|
|
189
200
|
/**
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
* (
|
|
193
|
-
*
|
|
201
|
+
* Process-wide armed watchdog. `install` / `suspend` / `stop` all mutate this
|
|
202
|
+
* so a handle returned before a suspend+re-arm still stops the *current*
|
|
203
|
+
* generation (CLI supervision and the MCP server hold the handle across
|
|
204
|
+
* ArkTS Scene builds that suspend).
|
|
194
205
|
*/
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
206
|
+
let active = null;
|
|
207
|
+
/** Nested `suspendLivenessWatchdog` depth; disarm only at 0→1, re-arm at 1→0. */
|
|
208
|
+
let suspendDepth = 0;
|
|
209
|
+
/** Options to re-arm with after the outermost resume; cleared by `stop()`. */
|
|
210
|
+
let optionsWhileSuspended = null;
|
|
211
|
+
/** Stable handle: always stops whatever generation is current (or pending re-arm). */
|
|
212
|
+
const SHARED_HANDLE = {
|
|
213
|
+
stop() {
|
|
214
|
+
suspendDepth = 0;
|
|
215
|
+
optionsWhileSuspended = null;
|
|
216
|
+
disarmActive();
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
function copyOptions(options) {
|
|
220
|
+
return {
|
|
221
|
+
progressPaths: options.progressPaths ? [...options.progressPaths] : undefined,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function disarmActive() {
|
|
225
|
+
if (!active)
|
|
226
|
+
return;
|
|
227
|
+
try {
|
|
228
|
+
active.disarm();
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
/* best-effort teardown */
|
|
232
|
+
}
|
|
233
|
+
active = null;
|
|
234
|
+
}
|
|
235
|
+
/** Spawn the watchdog child; returns a disarm fn, or null on spawn failure. */
|
|
236
|
+
function armWatchdog(options) {
|
|
198
237
|
const timeoutMs = parseWatchdogTimeoutMs(process.env.HOMEGRAPH_WATCHDOG_TIMEOUT_MS);
|
|
199
238
|
const checkMs = deriveCheckIntervalMs(timeoutMs);
|
|
200
239
|
const capMs = timeoutMs * exports.PROGRESS_CAP_MULTIPLIER;
|
|
@@ -247,21 +286,94 @@ function installMainThreadWatchdog(options = {}) {
|
|
|
247
286
|
catch { /* ignore */ }
|
|
248
287
|
debug(`armed (child pid ${child.pid ?? '?'}): timeoutMs=${timeoutMs} checkMs=${checkMs} progressPaths=${progressPaths.length}`);
|
|
249
288
|
let stopped = false;
|
|
250
|
-
return {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
catch { /* ignore */ } // belt-and-suspenders
|
|
264
|
-
},
|
|
289
|
+
return () => {
|
|
290
|
+
if (stopped)
|
|
291
|
+
return;
|
|
292
|
+
stopped = true;
|
|
293
|
+
clearInterval(heartbeat);
|
|
294
|
+
try {
|
|
295
|
+
stdin.end();
|
|
296
|
+
}
|
|
297
|
+
catch { /* ignore */ } // EOF -> child exits cleanly
|
|
298
|
+
try {
|
|
299
|
+
child.kill();
|
|
300
|
+
}
|
|
301
|
+
catch { /* ignore */ } // belt-and-suspenders
|
|
265
302
|
};
|
|
266
303
|
}
|
|
304
|
+
function rearmFromOptions(options) {
|
|
305
|
+
const disarm = armWatchdog(options);
|
|
306
|
+
if (!disarm)
|
|
307
|
+
return;
|
|
308
|
+
active = { disarm, options: copyOptions(options) };
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Install the main-thread liveness watchdog for a long-lived process. Returns a
|
|
312
|
+
* handle to stop it, or `null` when disabled or when the child can't be spawned
|
|
313
|
+
* (degraded, never throws — a missing watchdog must never keep a process from
|
|
314
|
+
* starting).
|
|
315
|
+
*
|
|
316
|
+
* The returned handle is process-wide and stable across
|
|
317
|
+
* {@link suspendLivenessWatchdog} re-arms — `stop()` always tears down the
|
|
318
|
+
* current generation.
|
|
319
|
+
*/
|
|
320
|
+
function installMainThreadWatchdog(options = {}) {
|
|
321
|
+
if (isEnvTruthy(process.env.HOMEGRAPH_NO_WATCHDOG))
|
|
322
|
+
return null;
|
|
323
|
+
// Replace any prior generation (including a mid-suspend pending re-arm).
|
|
324
|
+
suspendDepth = 0;
|
|
325
|
+
optionsWhileSuspended = null;
|
|
326
|
+
disarmActive();
|
|
327
|
+
const disarm = armWatchdog(options);
|
|
328
|
+
if (!disarm)
|
|
329
|
+
return null;
|
|
330
|
+
active = { disarm, options: copyOptions(options) };
|
|
331
|
+
return SHARED_HANDLE;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Suspend the armed liveness watchdog for an opaque synchronous span that
|
|
335
|
+
* cannot cooperatively yield (ArkAnalyzer Scene builds). Returns an idempotent
|
|
336
|
+
* resume function. Nested calls refcount; a `stop()` while suspended cancels
|
|
337
|
+
* the pending re-arm.
|
|
338
|
+
*
|
|
339
|
+
* No-op when nothing is armed (tests, `HOMEGRAPH_NO_WATCHDOG`, library embeds).
|
|
340
|
+
*/
|
|
341
|
+
function suspendLivenessWatchdog() {
|
|
342
|
+
suspendDepth++;
|
|
343
|
+
if (suspendDepth === 1 && active) {
|
|
344
|
+
optionsWhileSuspended = active.options;
|
|
345
|
+
disarmActive();
|
|
346
|
+
debug('suspended for opaque sync span');
|
|
347
|
+
}
|
|
348
|
+
let resumed = false;
|
|
349
|
+
return () => {
|
|
350
|
+
if (resumed)
|
|
351
|
+
return;
|
|
352
|
+
resumed = true;
|
|
353
|
+
if (suspendDepth <= 0)
|
|
354
|
+
return;
|
|
355
|
+
suspendDepth--;
|
|
356
|
+
if (suspendDepth > 0)
|
|
357
|
+
return;
|
|
358
|
+
if (optionsWhileSuspended) {
|
|
359
|
+
const opts = optionsWhileSuspended;
|
|
360
|
+
optionsWhileSuspended = null;
|
|
361
|
+
rearmFromOptions(opts);
|
|
362
|
+
debug('resumed after opaque sync span');
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Run `fn` with the liveness watchdog suspended, then resume. Use for native
|
|
368
|
+
* spans with no JS yield points; prefer cooperative yielding for JS-owned loops.
|
|
369
|
+
*/
|
|
370
|
+
function runWithoutLivenessWatchdog(fn) {
|
|
371
|
+
const resume = suspendLivenessWatchdog();
|
|
372
|
+
try {
|
|
373
|
+
return fn();
|
|
374
|
+
}
|
|
375
|
+
finally {
|
|
376
|
+
resume();
|
|
377
|
+
}
|
|
378
|
+
}
|
|
267
379
|
//# sourceMappingURL=liveness-watchdog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liveness-watchdog.js","sourceRoot":"","sources":["../../src/mcp/liveness-watchdog.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"liveness-watchdog.js","sourceRoot":"","sources":["../../src/mcp/liveness-watchdog.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFA,wDAOC;AAGD,sDAEC;AA+MD,8DAYC;AAUD,0DAqBC;AAMD,gEAOC;AAtWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AACH,uCAAyB;AACzB,uCAAyB;AACzB,iDAAoD;AAEpD,uGAAuG;AAC1F,QAAA,2BAA2B,GAAG,MAAM,CAAC;AAElD;;;;;GAKG;AACU,QAAA,uBAAuB,GAAG,EAAE,CAAC;AAE1C,wEAAwE;AACxE,SAAS,WAAW,CAAC,GAAuB;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,qFAAqF;AACrF,SAAgB,sBAAsB,CACpC,GAAuB,EACvB,WAAmB,mCAA2B;IAE9C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpD,CAAC;AAED,qFAAqF;AACrF,SAAgB,qBAAqB,CAAC,SAAiB;IACrD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,2EAA2E;AAC3E,SAAS,KAAK,CAAC,GAAW;IACxB,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACpC,IAAI,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDpB,CAAC;AAmBF;;;;;GAKG;AACH,IAAI,MAAM,GAAyB,IAAI,CAAC;AACxC,iFAAiF;AACjF,IAAI,YAAY,GAAG,CAAC,CAAC;AACrB,8EAA8E;AAC9E,IAAI,qBAAqB,GAA2B,IAAI,CAAC;AAEzD,sFAAsF;AACtF,MAAM,aAAa,GAAmB;IACpC,IAAI;QACF,YAAY,GAAG,CAAC,CAAC;QACjB,qBAAqB,GAAG,IAAI,CAAC;QAC7B,YAAY,EAAE,CAAC;IACjB,CAAC;CACF,CAAC;AAEF,SAAS,WAAW,CAAC,OAAwB;IAC3C,OAAO;QACL,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9E,CAAC;AACJ,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,IAAI,CAAC;QACH,MAAM,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IACD,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,SAAS,WAAW,CAAC,OAAwB;IAC3C,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,SAAS,GAAG,+BAAuB,CAAC;IAClD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAElD,IAAI,KAAmB,CAAC;IACxB,IAAI,CAAC;QACH,4EAA4E;QAC5E,0EAA0E;QAC1E,uEAAuE;QACvE,KAAK,GAAG,IAAA,qBAAK,EACX,OAAO,CAAC,QAAQ,EAChB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,aAAa,CAAC,EAC7F;YACE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;YACpC,WAAW,EAAE,IAAI;YACjB,uEAAuE;YACvE,mEAAmE;YACnE,uBAAuB;YACvB,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE;SACjB,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC7C,IAAI,CAAC;YAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,6EAA6E;IAC7E,mEAAmE;IACnE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAsD,CAAC,CAAC,CAAC;IAChF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEjE,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,IAAI,CAAC;YAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACvD,CAAC,EAAE,OAAO,CAAC,CAAC;IACZ,SAAS,CAAC,KAAK,EAAE,CAAC;IAElB,6EAA6E;IAC7E,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,IAAI,CAAC;QAAE,KAA2C,CAAC,KAAK,EAAE,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAEtF,KAAK,CAAC,oBAAoB,KAAK,CAAC,GAAG,IAAI,GAAG,gBAAgB,SAAS,YAAY,OAAO,kBAAkB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IAEhI,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,GAAG,EAAE;QACV,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,aAAa,CAAC,SAAS,CAAC,CAAC;QACzB,IAAI,CAAC;YAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,6BAA6B;QACzE,IAAI,CAAC;YAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,sBAAsB;IACrE,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAwB;IAChD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;AACrD,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,yBAAyB,CAAC,UAA2B,EAAE;IACrE,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhE,yEAAyE;IACzE,YAAY,GAAG,CAAC,CAAC;IACjB,qBAAqB,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,CAAC;IAEf,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;IACnD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,uBAAuB;IACrC,YAAY,EAAE,CAAC;IACf,IAAI,YAAY,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACjC,qBAAqB,GAAG,MAAM,CAAC,OAAO,CAAC;QACvC,YAAY,EAAE,CAAC;QACf,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,GAAG,EAAE;QACV,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,YAAY,IAAI,CAAC;YAAE,OAAO;QAC9B,YAAY,EAAE,CAAC;QACf,IAAI,YAAY,GAAG,CAAC;YAAE,OAAO;QAC7B,IAAI,qBAAqB,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,qBAAqB,CAAC;YACnC,qBAAqB,GAAG,IAAI,CAAC;YAC7B,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,0BAA0B,CAAI,EAAW;IACvD,MAAM,MAAM,GAAG,uBAAuB,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC;IACX,CAAC;AACH,CAAC"}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* Single source of truth for agent-facing tool guidance (issue #529).
|
|
5
5
|
* Edit here — not installer prompts or eval harness prompts.
|
|
6
6
|
*/
|
|
7
|
-
export declare const SERVER_INSTRUCTIONS = "# HomeGraph \u2014 when to call\n\nHomeGraph is a **local structural index of THIS repo**: symbols + call/import/extends edges + files. Use it only when the answer needs that graph.\n\n## Call HomeGraph (closed set)\n\nUse `homegraph_explore` (primary) when **all** of these hold:\n\n1. The evidence lives **in this repository's source** (not an external SDK manual).\n2. You need **structure**: definition location, who calls whom, how A reaches B, multi-file wiring, or in-repo import/usage of a named API/`@kit` module.\n3. You can put **concrete names** in `query` \u2014 symbol, `Type.member`, file basename, or `@kit\u2026` (skip `homegraph_search` when names are already known).\n\nTypical fits:\n\n- How a **feature in this repo** is wired (mechanism / cross-file / click\u2192handler flow)\n- Callers / callees / blast radius of a **named** symbol\n- What a **named component/method** does (include the name; one explore is enough)\n- In-repo usages of an imported API (not the official feature catalog)\n\n**One explore with names** beats search\u2192explore\u2192node\u2192grep\u2192read. Treat returned line-numbered source as already Read. After a full explore \u2014 **answer**; do not re-verify with grep/read/node for the same symbols. Busy/partial \u2192 retry that **same** explore once.\n\n## Do not call HomeGraph otherwise\n\nIf the question is **outside the set above**, do **not** open any `homegraph_*` tool \u2014 use Read / Grep / Glob / SDK docs. HomeGraph is not a general Q&A layer; forcing it on the wrong shape costs time and tokens and often lowers quality.\n\n## Tool roles\n\n| Tool | Role |\n|------|------|\n| **homegraph_explore** | Primary for the closed set above |\n| homegraph_node | One known symbol body (or indexed file) after explore named it |\n| homegraph_callers / callees | Compact edge lists for a named symbol |\n| homegraph_search | Rare \u2014 unknown spelling only |\n| homegraph_files | Folder tree only |\n\n## Tips\n\n- **Deadline / partial** \u2014 success-shaped; retry ONE explore with the same names. Do not abandon to grep for those symbols.\n- **Staleness banner** \u2014 Read only the listed edited files.\n- **Not indexed** \u2014 built-in tools; user runs `homegraph init` \u2014 you do not.\n";
|
|
7
|
+
export declare const SERVER_INSTRUCTIONS = "# HomeGraph \u2014 when to call\n\nHomeGraph is a **local structural index of THIS repo**: symbols + call/import/extends edges + files. Use it only when the answer needs that graph.\n\n## Call HomeGraph (closed set)\n\nUse `homegraph_explore` (primary) when **all** of these hold:\n\n1. The evidence lives **in this repository's source** (not an external SDK manual).\n2. You need **structure**: definition location, who calls whom, how A reaches B, multi-file wiring, or in-repo import/usage of a named API/`@kit` module.\n3. You can put **concrete names** in `query` \u2014 symbol, `Type.member`, file basename, or `@kit\u2026` (skip `homegraph_search` when names are already known).\n\nTypical fits:\n\n- How a **feature in this repo** is wired (mechanism / cross-file / click\u2192handler flow)\n- Callers / callees / blast radius of a **named** symbol\n- What a **named component/method** does (include the name; one explore is enough)\n- In-repo usages of an imported API (not the official feature catalog)\n\n**One explore with names** beats search\u2192explore\u2192node\u2192grep\u2192read. Treat returned line-numbered source as already Read. After a full explore \u2014 **answer**; do not re-verify with grep/read/node for the same symbols. Busy/partial \u2192 retry that **same** explore once.\n\n## Do not call HomeGraph otherwise\n\nIf the question is **outside the set above**, do **not** open any `homegraph_*` tool \u2014 use Read / Grep / Glob / SDK docs. HomeGraph is not a general Q&A layer; forcing it on the wrong shape costs time and tokens and often lowers quality.\n\n## Tool roles\n\n| Tool | Role |\n|------|------|\n| **homegraph_explore** | Primary for the closed set above |\n| homegraph_diff_impact | PR/diff review: unified `diff` or `hunks` \u2192 changed symbols (line\u2229span) + capped callers/impact/UI edges |\n| homegraph_node | One known symbol body (or indexed file) after explore named it |\n| homegraph_callers / callees | Compact edge lists for a named symbol |\n| homegraph_impact | Blast radius for one named symbol (not a whole PR) |\n| homegraph_search | Rare \u2014 unknown spelling only |\n| homegraph_files | Folder tree only |\n\n## Tips\n\n- **Deadline / partial** \u2014 success-shaped; retry ONE explore with the same names. Do not abandon to grep for those symbols.\n- **Staleness banner** \u2014 Read only the listed edited files.\n- **Not indexed** \u2014 built-in tools; user runs `homegraph init` \u2014 you do not.\n";
|
|
8
8
|
export declare const SERVER_INSTRUCTIONS_NO_ROOT_INDEX = "# HomeGraph \u2014 per-project (pass projectPath)\n\nHomeGraph indexes a codebase into a symbol graph. Call it **only** for in-repo structural / flow / usage questions on a project that has `.homegraph/`. Pass that project as `projectPath`.\n\n- Fits the closed set (structure, callers, wiring, named symbol/file) \u2192 `homegraph_explore`\n- Anything else \u2192 Read/Grep/Glob \u2014 **do not call homegraph_***\n- No index \u2192 Read/Grep/Glob; user runs `homegraph init` if they want indexing\n";
|
|
9
9
|
//# sourceMappingURL=server-instructions.d.ts.map
|