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.
Files changed (213) hide show
  1. package/dist/bin/command-supervision.d.ts.map +1 -1
  2. package/dist/bin/command-supervision.js +7 -4
  3. package/dist/bin/command-supervision.js.map +1 -1
  4. package/dist/extraction/index.d.ts +1 -1
  5. package/dist/extraction/index.d.ts.map +1 -1
  6. package/dist/extraction/index.js +54 -43
  7. package/dist/extraction/index.js.map +1 -1
  8. package/dist/extraction/languages/arkts.d.ts +69 -12
  9. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  10. package/dist/extraction/languages/arkts.js +739 -86
  11. package/dist/extraction/languages/arkts.js.map +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/mcp/diff-impact.d.ts +131 -0
  16. package/dist/mcp/diff-impact.d.ts.map +1 -0
  17. package/dist/mcp/diff-impact.js +385 -0
  18. package/dist/mcp/diff-impact.js.map +1 -0
  19. package/dist/mcp/liveness-watchdog.d.ts +18 -0
  20. package/dist/mcp/liveness-watchdog.d.ts.map +1 -1
  21. package/dist/mcp/liveness-watchdog.js +134 -22
  22. package/dist/mcp/liveness-watchdog.js.map +1 -1
  23. package/dist/mcp/server-instructions.d.ts +1 -1
  24. package/dist/mcp/server-instructions.d.ts.map +1 -1
  25. package/dist/mcp/server-instructions.js +2 -0
  26. package/dist/mcp/server-instructions.js.map +1 -1
  27. package/dist/mcp/tools.d.ts +21 -5
  28. package/dist/mcp/tools.d.ts.map +1 -1
  29. package/dist/mcp/tools.js +305 -55
  30. package/dist/mcp/tools.js.map +1 -1
  31. package/dist/resolution/callback-synthesizer.d.ts +2 -1
  32. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  33. package/dist/resolution/callback-synthesizer.js +153 -53
  34. package/dist/resolution/callback-synthesizer.js.map +1 -1
  35. package/dist/resolution/frameworks/arkts-entry.d.ts.map +1 -1
  36. package/dist/resolution/frameworks/arkts-entry.js +20 -9
  37. package/dist/resolution/frameworks/arkts-entry.js.map +1 -1
  38. package/dist/resolution/index.d.ts.map +1 -1
  39. package/dist/resolution/index.js +1 -1
  40. package/dist/resolution/index.js.map +1 -1
  41. package/dist/resolution/memory-budget.d.ts +33 -0
  42. package/dist/resolution/memory-budget.d.ts.map +1 -1
  43. package/dist/resolution/memory-budget.js +58 -0
  44. package/dist/resolution/memory-budget.js.map +1 -1
  45. package/dist/resolution/resolver-pool.d.ts +2 -0
  46. package/dist/resolution/resolver-pool.d.ts.map +1 -1
  47. package/dist/resolution/resolver-pool.js +4 -0
  48. package/dist/resolution/resolver-pool.js.map +1 -1
  49. package/dist/ui/shimmer-progress.d.ts.map +1 -1
  50. package/dist/ui/shimmer-progress.js +4 -1
  51. package/dist/ui/shimmer-progress.js.map +1 -1
  52. package/package.json +4 -5
  53. package/dist/arkts/ohos-api-index.d.ts +0 -15
  54. package/dist/arkts/ohos-api-index.d.ts.map +0 -1
  55. package/dist/arkts/ohos-api-index.js +0 -190
  56. package/dist/arkts/ohos-api-index.js.map +0 -1
  57. package/dist/arkts/ohos-sdk-input.d.ts +0 -36
  58. package/dist/arkts/ohos-sdk-input.d.ts.map +0 -1
  59. package/dist/arkts/ohos-sdk-input.js +0 -214
  60. package/dist/arkts/ohos-sdk-input.js.map +0 -1
  61. package/dist/extraction/languages/arkts-state-decorators.d.ts +0 -13
  62. package/dist/extraction/languages/arkts-state-decorators.d.ts.map +0 -1
  63. package/dist/extraction/languages/arkts-state-decorators.js +0 -26
  64. package/dist/extraction/languages/arkts-state-decorators.js.map +0 -1
  65. package/dist/extraction/languages/arkts-viewtree.d.ts +0 -24
  66. package/dist/extraction/languages/arkts-viewtree.d.ts.map +0 -1
  67. package/dist/extraction/languages/arkts-viewtree.js +0 -148
  68. package/dist/extraction/languages/arkts-viewtree.js.map +0 -1
  69. package/dist/extraction/languages/ohos-api-consumer.d.ts +0 -34
  70. package/dist/extraction/languages/ohos-api-consumer.d.ts.map +0 -1
  71. package/dist/extraction/languages/ohos-api-consumer.js +0 -283
  72. package/dist/extraction/languages/ohos-api-consumer.js.map +0 -1
  73. package/dist/reasoning/config.d.ts +0 -45
  74. package/dist/reasoning/config.d.ts.map +0 -1
  75. package/dist/reasoning/config.js +0 -171
  76. package/dist/reasoning/config.js.map +0 -1
  77. package/dist/reasoning/credentials.d.ts +0 -5
  78. package/dist/reasoning/credentials.d.ts.map +0 -1
  79. package/dist/reasoning/credentials.js +0 -83
  80. package/dist/reasoning/credentials.js.map +0 -1
  81. package/dist/reasoning/login.d.ts +0 -21
  82. package/dist/reasoning/login.d.ts.map +0 -1
  83. package/dist/reasoning/login.js +0 -85
  84. package/dist/reasoning/login.js.map +0 -1
  85. package/dist/reasoning/reasoner.d.ts +0 -43
  86. package/dist/reasoning/reasoner.d.ts.map +0 -1
  87. package/dist/reasoning/reasoner.js +0 -308
  88. package/dist/reasoning/reasoner.js.map +0 -1
  89. package/dist/spec/build/git-scanner.d.ts +0 -93
  90. package/dist/spec/build/git-scanner.d.ts.map +0 -1
  91. package/dist/spec/build/git-scanner.js +0 -254
  92. package/dist/spec/build/git-scanner.js.map +0 -1
  93. package/dist/spec/evolve/llm-client.d.ts +0 -50
  94. package/dist/spec/evolve/llm-client.d.ts.map +0 -1
  95. package/dist/spec/evolve/llm-client.js +0 -176
  96. package/dist/spec/evolve/llm-client.js.map +0 -1
  97. package/dist/spec/evolve/logic-checker.d.ts +0 -12
  98. package/dist/spec/evolve/logic-checker.d.ts.map +0 -1
  99. package/dist/spec/evolve/logic-checker.js +0 -24
  100. package/dist/spec/evolve/logic-checker.js.map +0 -1
  101. package/dist/spec/git-utils.d.ts +0 -8
  102. package/dist/spec/git-utils.d.ts.map +0 -1
  103. package/dist/spec/git-utils.js +0 -14
  104. package/dist/spec/git-utils.js.map +0 -1
  105. package/dist/spec/llm/index.d.ts +0 -3
  106. package/dist/spec/llm/index.d.ts.map +0 -1
  107. package/dist/spec/llm/index.js +0 -11
  108. package/dist/spec/llm/index.js.map +0 -1
  109. package/dist/spec/mine/clusterer.d.ts +0 -63
  110. package/dist/spec/mine/clusterer.d.ts.map +0 -1
  111. package/dist/spec/mine/clusterer.js +0 -904
  112. package/dist/spec/mine/clusterer.js.map +0 -1
  113. package/dist/spec/mine/progress-handler.d.ts +0 -22
  114. package/dist/spec/mine/progress-handler.d.ts.map +0 -1
  115. package/dist/spec/mine/progress-handler.js +0 -108
  116. package/dist/spec/mine/progress-handler.js.map +0 -1
  117. package/dist/spec/mine/progress.d.ts +0 -23
  118. package/dist/spec/mine/progress.d.ts.map +0 -1
  119. package/dist/spec/mine/progress.js +0 -12
  120. package/dist/spec/mine/progress.js.map +0 -1
  121. package/dist/spec/mining/diff-parser.d.ts +0 -33
  122. package/dist/spec/mining/diff-parser.d.ts.map +0 -1
  123. package/dist/spec/mining/diff-parser.js +0 -166
  124. package/dist/spec/mining/diff-parser.js.map +0 -1
  125. package/dist/spec/mining/git-scanner.d.ts +0 -103
  126. package/dist/spec/mining/git-scanner.d.ts.map +0 -1
  127. package/dist/spec/mining/git-scanner.js +0 -307
  128. package/dist/spec/mining/git-scanner.js.map +0 -1
  129. package/dist/spec/mining/pipeline.d.ts +0 -53
  130. package/dist/spec/mining/pipeline.d.ts.map +0 -1
  131. package/dist/spec/mining/pipeline.js +0 -178
  132. package/dist/spec/mining/pipeline.js.map +0 -1
  133. package/dist/spec/mining/scope-resolver.d.ts +0 -45
  134. package/dist/spec/mining/scope-resolver.d.ts.map +0 -1
  135. package/dist/spec/mining/scope-resolver.js +0 -103
  136. package/dist/spec/mining/scope-resolver.js.map +0 -1
  137. package/dist/spec/mining/spec-extractor.d.ts +0 -69
  138. package/dist/spec/mining/spec-extractor.d.ts.map +0 -1
  139. package/dist/spec/mining/spec-extractor.js +0 -369
  140. package/dist/spec/mining/spec-extractor.js.map +0 -1
  141. package/dist/spec/utils.d.ts +0 -155
  142. package/dist/spec/utils.d.ts.map +0 -1
  143. package/dist/spec/utils.js +0 -411
  144. package/dist/spec/utils.js.map +0 -1
  145. package/scripts/add-lang/bench.sh +0 -60
  146. package/scripts/add-lang/check-grammar.mjs +0 -75
  147. package/scripts/add-lang/dump-ast.mjs +0 -103
  148. package/scripts/add-lang/verify-extraction.mjs +0 -70
  149. package/scripts/agent-eval/ab-adoption.sh +0 -91
  150. package/scripts/agent-eval/ab-hook.sh +0 -86
  151. package/scripts/agent-eval/ab-impl.sh +0 -78
  152. package/scripts/agent-eval/ab-new-vs-baseline.sh +0 -102
  153. package/scripts/agent-eval/ab-sufficiency.sh +0 -78
  154. package/scripts/agent-eval/arms-F.sh +0 -21
  155. package/scripts/agent-eval/arms-matrix.sh +0 -37
  156. package/scripts/agent-eval/audit.sh +0 -68
  157. package/scripts/agent-eval/bench-readme.sh +0 -28
  158. package/scripts/agent-eval/bench-why-repo.sh +0 -22
  159. package/scripts/agent-eval/block-read-hook.sh +0 -19
  160. package/scripts/agent-eval/hook-settings.json +0 -15
  161. package/scripts/agent-eval/itrun.sh +0 -120
  162. package/scripts/agent-eval/offload-eval-3arm.sh +0 -72
  163. package/scripts/agent-eval/offload-eval-cost.mjs +0 -133
  164. package/scripts/agent-eval/offload-eval-effort.mjs +0 -108
  165. package/scripts/agent-eval/offload-eval-frontload-matrix.sh +0 -25
  166. package/scripts/agent-eval/offload-eval-frontload.sh +0 -47
  167. package/scripts/agent-eval/offload-eval-ground-truth.json +0 -18
  168. package/scripts/agent-eval/offload-eval-hook.mjs +0 -84
  169. package/scripts/agent-eval/offload-eval-judge.mjs +0 -103
  170. package/scripts/agent-eval/offload-eval-matrix.sh +0 -20
  171. package/scripts/agent-eval/offload-eval-metrics.mjs +0 -94
  172. package/scripts/agent-eval/offload-eval-refs1.sh +0 -50
  173. package/scripts/agent-eval/offload-eval-setup.sh +0 -24
  174. package/scripts/agent-eval/offload-eval-styles.sh +0 -72
  175. package/scripts/agent-eval/offload-eval-summarize.mjs +0 -68
  176. package/scripts/agent-eval/offload-eval.md +0 -76
  177. package/scripts/agent-eval/parse-arms.mjs +0 -116
  178. package/scripts/agent-eval/parse-bench-readme.mjs +0 -84
  179. package/scripts/agent-eval/parse-run.mjs +0 -45
  180. package/scripts/agent-eval/parse-session.mjs +0 -93
  181. package/scripts/agent-eval/probe-context.mjs +0 -21
  182. package/scripts/agent-eval/probe-explore.mjs +0 -40
  183. package/scripts/agent-eval/probe-node.mjs +0 -20
  184. package/scripts/agent-eval/probe-sweep.mjs +0 -119
  185. package/scripts/agent-eval/probe-trace.mjs +0 -20
  186. package/scripts/agent-eval/redirect-read-hook.sh +0 -38
  187. package/scripts/agent-eval/repro-concurrent-explore.mjs +0 -119
  188. package/scripts/agent-eval/repro-daemon-clients.mjs +0 -125
  189. package/scripts/agent-eval/run-agent.sh +0 -34
  190. package/scripts/agent-eval/run-all.sh +0 -75
  191. package/scripts/agent-eval/run-arms.sh +0 -56
  192. package/scripts/agent-eval/seq-matrix.mjs +0 -137
  193. package/scripts/build-bundle.sh +0 -123
  194. package/scripts/exp_boundary_eval/README.md +0 -247
  195. package/scripts/exp_boundary_eval/_test_mcp_chain.py +0 -78
  196. package/scripts/exp_boundary_eval/_test_stdin.py +0 -8
  197. package/scripts/exp_boundary_eval/_utils.py +0 -1116
  198. package/scripts/exp_boundary_eval/analyze.py +0 -1313
  199. package/scripts/exp_boundary_eval/deveco_arm.py +0 -519
  200. package/scripts/exp_boundary_eval/run_all.py +0 -378
  201. package/scripts/exp_boundary_eval/run_one.py +0 -165
  202. package/scripts/exp_boundary_eval/run_session.py +0 -158
  203. package/scripts/exp_boundary_eval/setup.py +0 -120
  204. package/scripts/exp_boundary_eval/win_mcp_launcher.py +0 -73
  205. package/scripts/exp_boundary_eval/win_mcp_stdio_wrap.js +0 -36
  206. package/scripts/exp_boundary_eval/win_node_launcher.py +0 -24
  207. package/scripts/extract-release-notes.mjs +0 -130
  208. package/scripts/local-install.sh +0 -41
  209. package/scripts/npm-sdk.js +0 -75
  210. package/scripts/npm-shim.js +0 -275
  211. package/scripts/ohos-sdk-publish.mjs +0 -133
  212. package/scripts/pack-npm.sh +0 -119
  213. 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":"AAwDA,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;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,GAAG,IAAI,CAgE9F"}
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
- * Install the main-thread liveness watchdog for a long-lived process. Returns a
191
- * handle to stop it, or `null` when disabled or when the child can't be spawned
192
- * (degraded, never throws a missing watchdog must never keep a process from
193
- * starting).
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
- function installMainThreadWatchdog(options = {}) {
196
- if (isEnvTruthy(process.env.HOMEGRAPH_NO_WATCHDOG))
197
- return null;
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
- stop() {
252
- if (stopped)
253
- return;
254
- stopped = true;
255
- clearInterval(heartbeat);
256
- try {
257
- stdin.end();
258
- }
259
- catch { /* ignore */ } // EOF -> child exits cleanly
260
- try {
261
- child.kill();
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":"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"}
1
+ {"version":3,"file":"liveness-watchdog.js","sourceRoot":"","sources":["../../src/mcp/liveness-watchdog.ts"],"names":[],"mappings":"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"}
@@ -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