homegraph 1.5.2 → 1.5.4

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 (242) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/README.md +63 -10
  3. package/dist/addons/dynamic-import.d.ts +18 -0
  4. package/dist/addons/dynamic-import.d.ts.map +1 -0
  5. package/dist/addons/dynamic-import.js +25 -0
  6. package/dist/addons/dynamic-import.js.map +1 -0
  7. package/dist/addons/init-template.d.ts +15 -0
  8. package/dist/addons/init-template.d.ts.map +1 -0
  9. package/dist/addons/init-template.js +290 -0
  10. package/dist/addons/init-template.js.map +1 -0
  11. package/dist/addons/loader.d.ts +18 -0
  12. package/dist/addons/loader.d.ts.map +1 -0
  13. package/dist/addons/loader.js +88 -0
  14. package/dist/addons/loader.js.map +1 -0
  15. package/dist/addons/manager.d.ts +106 -0
  16. package/dist/addons/manager.d.ts.map +1 -0
  17. package/dist/addons/manager.js +437 -0
  18. package/dist/addons/manager.js.map +1 -0
  19. package/dist/addons/paths.d.ts +22 -0
  20. package/dist/addons/paths.d.ts.map +1 -0
  21. package/dist/addons/paths.js +65 -0
  22. package/dist/addons/paths.js.map +1 -0
  23. package/dist/addons/registry.d.ts +38 -0
  24. package/dist/addons/registry.d.ts.map +1 -0
  25. package/dist/addons/registry.js +160 -0
  26. package/dist/addons/registry.js.map +1 -0
  27. package/dist/addons/semver.d.ts +21 -0
  28. package/dist/addons/semver.d.ts.map +1 -0
  29. package/dist/addons/semver.js +79 -0
  30. package/dist/addons/semver.js.map +1 -0
  31. package/dist/addons/types.d.ts +51 -0
  32. package/dist/addons/types.d.ts.map +1 -0
  33. package/dist/addons/types.js +14 -0
  34. package/dist/addons/types.js.map +1 -0
  35. package/dist/addons/validate.d.ts +38 -0
  36. package/dist/addons/validate.d.ts.map +1 -0
  37. package/dist/addons/validate.js +165 -0
  38. package/dist/addons/validate.js.map +1 -0
  39. package/dist/arkui/index.d.ts +4 -0
  40. package/dist/arkui/index.d.ts.map +1 -0
  41. package/dist/arkui/index.js +23 -0
  42. package/dist/arkui/index.js.map +1 -0
  43. package/dist/arkui/migrate-passage.d.ts +28 -0
  44. package/dist/arkui/migrate-passage.d.ts.map +1 -0
  45. package/dist/arkui/migrate-passage.js +310 -0
  46. package/dist/arkui/migrate-passage.js.map +1 -0
  47. package/dist/arkui/migrate-semantics.d.ts +47 -0
  48. package/dist/arkui/migrate-semantics.d.ts.map +1 -0
  49. package/dist/arkui/migrate-semantics.js +229 -0
  50. package/dist/arkui/migrate-semantics.js.map +1 -0
  51. package/dist/arkui/migrate-snapshot.d.ts +79 -0
  52. package/dist/arkui/migrate-snapshot.d.ts.map +1 -0
  53. package/dist/arkui/migrate-snapshot.js +364 -0
  54. package/dist/arkui/migrate-snapshot.js.map +1 -0
  55. package/dist/bin/addon-commands.d.ts +27 -0
  56. package/dist/bin/addon-commands.d.ts.map +1 -0
  57. package/dist/bin/addon-commands.js +254 -0
  58. package/dist/bin/addon-commands.js.map +1 -0
  59. package/dist/bin/fatal-handler.js +2 -2
  60. package/dist/bin/homegraph.js +111 -157
  61. package/dist/bin/homegraph.js.map +1 -1
  62. package/dist/bin/node-version-check.d.ts +6 -15
  63. package/dist/bin/node-version-check.d.ts.map +1 -1
  64. package/dist/bin/node-version-check.js +8 -37
  65. package/dist/bin/node-version-check.js.map +1 -1
  66. package/dist/db/index.d.ts +36 -1
  67. package/dist/db/index.d.ts.map +1 -1
  68. package/dist/db/index.js +92 -6
  69. package/dist/db/index.js.map +1 -1
  70. package/dist/db/migrations.d.ts +1 -1
  71. package/dist/db/migrations.d.ts.map +1 -1
  72. package/dist/db/migrations.js +15 -1
  73. package/dist/db/migrations.js.map +1 -1
  74. package/dist/db/queries.d.ts +42 -0
  75. package/dist/db/queries.d.ts.map +1 -1
  76. package/dist/db/queries.js +177 -10
  77. package/dist/db/queries.js.map +1 -1
  78. package/dist/db/schema.sql +6 -1
  79. package/dist/db/sqlite-adapter.d.ts +7 -3
  80. package/dist/db/sqlite-adapter.d.ts.map +1 -1
  81. package/dist/db/sqlite-adapter.js +44 -3
  82. package/dist/db/sqlite-adapter.js.map +1 -1
  83. package/dist/extraction/extraction-version.d.ts +1 -1
  84. package/dist/extraction/extraction-version.js +1 -1
  85. package/dist/extraction/generated-detection.d.ts +42 -11
  86. package/dist/extraction/generated-detection.d.ts.map +1 -1
  87. package/dist/extraction/generated-detection.js +141 -20
  88. package/dist/extraction/generated-detection.js.map +1 -1
  89. package/dist/extraction/index.d.ts +42 -0
  90. package/dist/extraction/index.d.ts.map +1 -1
  91. package/dist/extraction/index.js +96 -0
  92. package/dist/extraction/index.js.map +1 -1
  93. package/dist/extraction/languages/arkts.d.ts +33 -2
  94. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  95. package/dist/extraction/languages/arkts.js +525 -129
  96. package/dist/extraction/languages/arkts.js.map +1 -1
  97. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
  98. package/dist/extraction/wasm-runtime-flags.js +9 -6
  99. package/dist/extraction/wasm-runtime-flags.js.map +1 -1
  100. package/dist/graph-sources.d.ts +41 -0
  101. package/dist/graph-sources.d.ts.map +1 -0
  102. package/dist/graph-sources.js +82 -0
  103. package/dist/graph-sources.js.map +1 -0
  104. package/dist/index.d.ts +20 -1
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +79 -9
  107. package/dist/index.js.map +1 -1
  108. package/dist/installer/index.d.ts.map +1 -1
  109. package/dist/installer/index.js +0 -48
  110. package/dist/installer/index.js.map +1 -1
  111. package/dist/installer/targets/antigravity.js +1 -1
  112. package/dist/installer/targets/antigravity.js.map +1 -1
  113. package/dist/installer/targets/deveco.js +1 -1
  114. package/dist/installer/targets/deveco.js.map +1 -1
  115. package/dist/installer/targets/hermes.d.ts +1 -1
  116. package/dist/installer/targets/hermes.js +2 -2
  117. package/dist/installer/targets/hermes.js.map +1 -1
  118. package/dist/installer/targets/opencode.js +1 -1
  119. package/dist/installer/targets/opencode.js.map +1 -1
  120. package/dist/installer/targets/shared.js +1 -1
  121. package/dist/installer/targets/shared.js.map +1 -1
  122. package/dist/mcp/daemon-paths.d.ts +5 -4
  123. package/dist/mcp/daemon-paths.d.ts.map +1 -1
  124. package/dist/mcp/daemon-paths.js +28 -13
  125. package/dist/mcp/daemon-paths.js.map +1 -1
  126. package/dist/mcp/daemon-registry.d.ts.map +1 -1
  127. package/dist/mcp/daemon-registry.js +4 -1
  128. package/dist/mcp/daemon-registry.js.map +1 -1
  129. package/dist/mcp/daemon.d.ts +1 -1
  130. package/dist/mcp/daemon.js +1 -1
  131. package/dist/mcp/engine.d.ts.map +1 -1
  132. package/dist/mcp/engine.js +12 -3
  133. package/dist/mcp/engine.js.map +1 -1
  134. package/dist/mcp/explore-dedup.d.ts +137 -0
  135. package/dist/mcp/explore-dedup.d.ts.map +1 -0
  136. package/dist/mcp/explore-dedup.js +236 -0
  137. package/dist/mcp/explore-dedup.js.map +1 -0
  138. package/dist/mcp/explore-repeat-guard.d.ts +123 -0
  139. package/dist/mcp/explore-repeat-guard.d.ts.map +1 -0
  140. package/dist/mcp/explore-repeat-guard.js +503 -0
  141. package/dist/mcp/explore-repeat-guard.js.map +1 -0
  142. package/dist/mcp/explore-session-state.d.ts +237 -0
  143. package/dist/mcp/explore-session-state.d.ts.map +1 -0
  144. package/dist/mcp/explore-session-state.js +353 -0
  145. package/dist/mcp/explore-session-state.js.map +1 -0
  146. package/dist/mcp/index.d.ts.map +1 -1
  147. package/dist/mcp/index.js +4 -7
  148. package/dist/mcp/index.js.map +1 -1
  149. package/dist/mcp/proxy.d.ts.map +1 -1
  150. package/dist/mcp/proxy.js +20 -18
  151. package/dist/mcp/proxy.js.map +1 -1
  152. package/dist/mcp/query-pool.d.ts.map +1 -1
  153. package/dist/mcp/query-pool.js +10 -13
  154. package/dist/mcp/query-pool.js.map +1 -1
  155. package/dist/mcp/query-worker.d.ts +1 -1
  156. package/dist/mcp/query-worker.js +1 -1
  157. package/dist/mcp/server-instructions.d.ts +5 -2
  158. package/dist/mcp/server-instructions.d.ts.map +1 -1
  159. package/dist/mcp/server-instructions.js +43 -32
  160. package/dist/mcp/server-instructions.js.map +1 -1
  161. package/dist/mcp/session.d.ts +14 -3
  162. package/dist/mcp/session.d.ts.map +1 -1
  163. package/dist/mcp/session.js +17 -14
  164. package/dist/mcp/session.js.map +1 -1
  165. package/dist/mcp/startup-handshake.d.ts +1 -1
  166. package/dist/mcp/startup-handshake.js +1 -1
  167. package/dist/mcp/tools.d.ts +149 -8
  168. package/dist/mcp/tools.d.ts.map +1 -1
  169. package/dist/mcp/tools.js +4265 -575
  170. package/dist/mcp/tools.js.map +1 -1
  171. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  172. package/dist/resolution/callback-synthesizer.js +166 -0
  173. package/dist/resolution/callback-synthesizer.js.map +1 -1
  174. package/dist/resolution/frameworks/arkts-napi.d.ts +14 -0
  175. package/dist/resolution/frameworks/arkts-napi.d.ts.map +1 -1
  176. package/dist/resolution/frameworks/arkts-napi.js +169 -49
  177. package/dist/resolution/frameworks/arkts-napi.js.map +1 -1
  178. package/dist/search/query-utils.d.ts +157 -5
  179. package/dist/search/query-utils.d.ts.map +1 -1
  180. package/dist/search/query-utils.js +1105 -70
  181. package/dist/search/query-utils.js.map +1 -1
  182. package/dist/spec/build/scan.js +1 -1
  183. package/dist/spec/build/scan.js.map +1 -1
  184. package/dist/spec/build/scope-resolver.d.ts +24 -5
  185. package/dist/spec/build/scope-resolver.d.ts.map +1 -1
  186. package/dist/spec/build/scope-resolver.js +76 -10
  187. package/dist/spec/build/scope-resolver.js.map +1 -1
  188. package/dist/spec/config.d.ts +8 -0
  189. package/dist/spec/config.d.ts.map +1 -1
  190. package/dist/spec/config.js +3 -0
  191. package/dist/spec/config.js.map +1 -1
  192. package/dist/spec/evolve/pipeline.d.ts.map +1 -1
  193. package/dist/spec/evolve/pipeline.js +2 -1
  194. package/dist/spec/evolve/pipeline.js.map +1 -1
  195. package/dist/spec/git/commits.d.ts +8 -3
  196. package/dist/spec/git/commits.d.ts.map +1 -1
  197. package/dist/spec/git/commits.js +12 -11
  198. package/dist/spec/git/commits.js.map +1 -1
  199. package/dist/spec/mine/addon/adapter.d.ts +45 -0
  200. package/dist/spec/mine/addon/adapter.d.ts.map +1 -0
  201. package/dist/spec/mine/addon/adapter.js +118 -0
  202. package/dist/spec/mine/addon/adapter.js.map +1 -0
  203. package/dist/spec/mine/addon/render.d.ts +20 -0
  204. package/dist/spec/mine/addon/render.d.ts.map +1 -0
  205. package/dist/spec/mine/addon/render.js +41 -0
  206. package/dist/spec/mine/addon/render.js.map +1 -0
  207. package/dist/spec/mine/addon/types.d.ts +70 -0
  208. package/dist/spec/mine/addon/types.d.ts.map +1 -0
  209. package/dist/spec/mine/addon/types.js +14 -0
  210. package/dist/spec/mine/addon/types.js.map +1 -0
  211. package/dist/spec/mine/generator.d.ts +5 -1
  212. package/dist/spec/mine/generator.d.ts.map +1 -1
  213. package/dist/spec/mine/generator.js +69 -7
  214. package/dist/spec/mine/generator.js.map +1 -1
  215. package/dist/spec/mine/pipeline.d.ts.map +1 -1
  216. package/dist/spec/mine/pipeline.js +5 -1
  217. package/dist/spec/mine/pipeline.js.map +1 -1
  218. package/dist/spec/mine/scanner.d.ts +1 -0
  219. package/dist/spec/mine/scanner.d.ts.map +1 -1
  220. package/dist/spec/mine/scanner.js +1 -1
  221. package/dist/spec/mine/scanner.js.map +1 -1
  222. package/dist/spec/types.d.ts +1 -1
  223. package/dist/spec/types.d.ts.map +1 -1
  224. package/dist/types.d.ts +8 -0
  225. package/dist/types.d.ts.map +1 -1
  226. package/dist/upgrade/index.d.ts +14 -26
  227. package/dist/upgrade/index.d.ts.map +1 -1
  228. package/dist/upgrade/index.js +28 -123
  229. package/dist/upgrade/index.js.map +1 -1
  230. package/dist/upgrade/remove-binary.d.ts +19 -19
  231. package/dist/upgrade/remove-binary.d.ts.map +1 -1
  232. package/dist/upgrade/remove-binary.js +20 -21
  233. package/dist/upgrade/remove-binary.js.map +1 -1
  234. package/dist/upgrade/update-check.d.ts +4 -3
  235. package/dist/upgrade/update-check.d.ts.map +1 -1
  236. package/dist/upgrade/update-check.js +4 -3
  237. package/dist/upgrade/update-check.js.map +1 -1
  238. package/package.json +13 -9
  239. package/dist/telemetry/index.d.ts +0 -143
  240. package/dist/telemetry/index.d.ts.map +0 -1
  241. package/dist/telemetry/index.js +0 -541
  242. package/dist/telemetry/index.js.map +0 -1
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ /**
3
+ * Cross-call source dedup for `homegraph_explore` (CG-18).
4
+ *
5
+ * The session record (CG-17) knows what earlier calls already sent. This module
6
+ * is the algebra that turns that record into a decision for the call being
7
+ * rendered: of the line ranges this call WOULD emit, which does the agent
8
+ * already hold, and what is genuinely new.
9
+ *
10
+ * Three rules shape everything here, and all three come from the same place —
11
+ * an insufficient-feeling response is what sends an agent to Read, and one or
12
+ * two of those early in a session teach it to abandon homegraph entirely
13
+ * (CLAUDE.md):
14
+ *
15
+ * 1. **A pointer, never a bare omission.** Removed source is replaced by a
16
+ * back-reference naming the file, the symbols, and the line span, worded so
17
+ * it is unmistakable that the source was already delivered IN THIS
18
+ * CONVERSATION and is still current. Silence reads as "homegraph didn't
19
+ * find it".
20
+ * 2. **Only prove-it dedup.** A span is withheld only when the file's bytes
21
+ * are byte-identical to what was served (a content fingerprint, not an
22
+ * mtime and not the index's drift flag). An edit between calls means the
23
+ * agent's copy is wrong, so the source is re-emitted in full.
24
+ * 3. **Cut chunks, not slivers.** Only a covered run of at least
25
+ * {@link EXPLORE_DEDUP.MIN_COVERED_LINES} lines is worth replacing. Below
26
+ * that the pointer costs more than the source, and shattering a block into
27
+ * one-line fragments produces exactly the ragged output that reads as a
28
+ * failure. Everything not withheld is emitted — where the algebra is
29
+ * unsure, it re-serves.
30
+ *
31
+ * Which way to be wrong, restated for this layer: re-serving something the agent
32
+ * has is a few hundred wasted chars; withholding something it never saw is a
33
+ * Read. Every threshold below leans to the first.
34
+ */
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.EXPLORE_DEDUP = void 0;
37
+ exports.exploreDedupEnabled = exploreDedupEnabled;
38
+ exports.fileFingerprint = fileFingerprint;
39
+ exports.mergeRanges = mergeRanges;
40
+ exports.intersectRange = intersectRange;
41
+ exports.subtractRange = subtractRange;
42
+ exports.dedupeRange = dedupeRange;
43
+ exports.servedRangesForFile = servedRangesForFile;
44
+ exports.formatSpans = formatSpans;
45
+ exports.formatBackReference = formatBackReference;
46
+ exports.symbolsInSpans = symbolsInSpans;
47
+ const crypto_1 = require("crypto");
48
+ exports.EXPLORE_DEDUP = {
49
+ /**
50
+ * Shortest already-served run that may be replaced by a back-reference.
51
+ *
52
+ * Sized against what dedup is actually FOR — a later call re-serving a whole
53
+ * method or file it already sent. A shorter covered run is either a signature
54
+ * line in a skeleton render or the ±3 lines of context padding around a
55
+ * cluster, and swapping either for a pointer trades bytes for noise: the
56
+ * pointer sentence is itself ~140 chars, so under this length dedup would
57
+ * make the response BIGGER while making it read as full of holes.
58
+ */
59
+ MIN_COVERED_LINES: 8,
60
+ /**
61
+ * Below this many chars of NEW source, a file's remainder is folded into its
62
+ * back-reference instead of being fenced on its own.
63
+ *
64
+ * The shape this exists for, seen on the CG-17 fixture: a third call whose
65
+ * only unheld line was the file's trailing blank one, rendered as a code fence
66
+ * containing `228\t`. A fence holding two lines of nothing reads as a broken
67
+ * response, and reading as broken is the expensive failure — it is the thing
68
+ * that sends an agent to Read and keeps it there. So a remainder this small is
69
+ * dropped rather than shown. It is the one place this module withholds
70
+ * something the agent has not seen, and it is bounded to ~two lines that sit
71
+ * directly against source the agent does hold; the file is still named, with
72
+ * its symbols, so one follow-up explore fetches it whole.
73
+ */
74
+ MIN_DELTA_CHARS: 160,
75
+ /** Line spans named in one pointer before it summarises the rest. */
76
+ MAX_SPANS_IN_POINTER: 4,
77
+ /** Symbols named in one pointer before it summarises the rest. */
78
+ MAX_SYMBOLS_IN_POINTER: 5,
79
+ };
80
+ const OFF = new Set(['0', 'false', 'off', 'no']);
81
+ /**
82
+ * Kill switch: `HOMEGRAPH_EXPLORE_DEDUP=0` renders every call as if the session
83
+ * had no history. Read per call (not memoized) so a test can toggle it.
84
+ */
85
+ function exploreDedupEnabled() {
86
+ const raw = process.env.HOMEGRAPH_EXPLORE_DEDUP;
87
+ if (raw === undefined)
88
+ return true;
89
+ return !OFF.has(raw.trim().toLowerCase());
90
+ }
91
+ /**
92
+ * Identity of the bytes a call served for one file.
93
+ *
94
+ * This — not the index's drift flag — is what gates dedup. `isFileStaleOnDisk`
95
+ * answers "did the file change since the last INDEX SYNC", which is a different
96
+ * question with a different answer: two calls inside one drift window served the
97
+ * same current bytes (dedup is correct), while a file edited and re-synced
98
+ * between two calls is never "stale" and yet the agent's copy is now wrong
99
+ * (dedup would be actively harmful). Length is prefixed so a hash prefix
100
+ * collision cannot alias two files of different size.
101
+ */
102
+ function fileFingerprint(content) {
103
+ return `${content.length}:${(0, crypto_1.createHash)('sha1').update(content).digest('hex').slice(0, 16)}`;
104
+ }
105
+ /** Sort + merge overlapping/adjacent spans into the smallest equivalent set. */
106
+ function mergeRanges(ranges) {
107
+ const valid = ranges
108
+ .filter((r) => Number.isFinite(r.start) && Number.isFinite(r.end) && r.end >= r.start && r.start >= 1)
109
+ .map((r) => ({ start: Math.floor(r.start), end: Math.floor(r.end) }))
110
+ .sort((a, b) => a.start - b.start || a.end - b.end);
111
+ const out = [];
112
+ for (const r of valid) {
113
+ const last = out[out.length - 1];
114
+ if (last && r.start <= last.end + 1)
115
+ last.end = Math.max(last.end, r.end);
116
+ else
117
+ out.push({ ...r });
118
+ }
119
+ return out;
120
+ }
121
+ /** The parts of `range` that `served` covers. */
122
+ function intersectRange(range, served) {
123
+ const out = [];
124
+ for (const s of served) {
125
+ const start = Math.max(range.start, s.start);
126
+ const end = Math.min(range.end, s.end);
127
+ if (end >= start)
128
+ out.push({ start, end });
129
+ }
130
+ return mergeRanges(out);
131
+ }
132
+ /** The parts of `range` that `cut` does NOT cover. */
133
+ function subtractRange(range, cut) {
134
+ const out = [];
135
+ let cursor = range.start;
136
+ for (const c of mergeRanges(cut)) {
137
+ if (c.end < cursor)
138
+ continue;
139
+ if (c.start > range.end)
140
+ break;
141
+ if (c.start > cursor)
142
+ out.push({ start: cursor, end: Math.min(c.start - 1, range.end) });
143
+ cursor = Math.max(cursor, c.end + 1);
144
+ if (cursor > range.end)
145
+ break;
146
+ }
147
+ if (cursor <= range.end)
148
+ out.push({ start: cursor, end: range.end });
149
+ return out;
150
+ }
151
+ /**
152
+ * Split one intended span into what to emit and what to point back at.
153
+ *
154
+ * Covered runs shorter than {@link EXPLORE_DEDUP.MIN_COVERED_LINES} are left in
155
+ * the emit set on purpose (rule 3 above) — so a span the agent holds "almost
156
+ * all of" still comes back whole rather than as a stutter of fragments around
157
+ * pointers.
158
+ */
159
+ function dedupeRange(range, served, minCovered = exports.EXPLORE_DEDUP.MIN_COVERED_LINES) {
160
+ if (served.length === 0 || range.end < range.start)
161
+ return { emit: [range], covered: [] };
162
+ const covered = intersectRange(range, served).filter((r) => r.end - r.start + 1 >= minCovered);
163
+ if (covered.length === 0)
164
+ return { emit: [range], covered: [] };
165
+ return { emit: subtractRange(range, covered), covered };
166
+ }
167
+ /**
168
+ * Every line span this session has already served for one file, but ONLY from
169
+ * calls that served the SAME BYTES.
170
+ *
171
+ * A record with no fingerprint is ignored rather than trusted: it cannot prove
172
+ * the agent's copy matches the file on disk now, and an unprovable match is
173
+ * exactly the case where re-serving is right.
174
+ */
175
+ function servedRangesForFile(prior, filePath, fingerprint) {
176
+ if (!prior)
177
+ return [];
178
+ const spans = [];
179
+ for (const call of prior.calls) {
180
+ for (const file of call.files) {
181
+ if (file.path !== filePath)
182
+ continue;
183
+ if (!file.fingerprint || file.fingerprint !== fingerprint)
184
+ continue;
185
+ spans.push(...file.ranges);
186
+ }
187
+ }
188
+ return mergeRanges(spans);
189
+ }
190
+ /** `L12`, `L12-40`, capped with a `+N more` tail. */
191
+ function formatSpans(spans) {
192
+ const shown = spans.slice(0, exports.EXPLORE_DEDUP.MAX_SPANS_IN_POINTER)
193
+ .map((r) => (r.start === r.end ? `L${r.start}` : `L${r.start}-${r.end}`))
194
+ .join(', ');
195
+ const more = spans.length - exports.EXPLORE_DEDUP.MAX_SPANS_IN_POINTER;
196
+ return more > 0 ? `${shown}, +${more} more span${more === 1 ? '' : 's'}` : shown;
197
+ }
198
+ /**
199
+ * The line that replaces withheld source.
200
+ *
201
+ * It has one job: make the agent reach into its own context instead of into
202
+ * Read. So it carries the three things needed to find the source it already has
203
+ * — path, symbols, line spans — plus the two facts that make using it safe:
204
+ * that it came from THIS conversation, and that the file has not changed since
205
+ * (which is checked, not asserted — see {@link fileFingerprint}). It never says
206
+ * "omitted", and it never steers to Read.
207
+ */
208
+ function formatBackReference(filePath, covered, symbols, opts) {
209
+ const names = symbols.slice(0, exports.EXPLORE_DEDUP.MAX_SYMBOLS_IN_POINTER);
210
+ const moreNames = symbols.length - names.length;
211
+ const symbolPart = names.length > 0
212
+ ? ` (${names.join(', ')}${moreNames > 0 ? `, +${moreNames} more` : ''})`
213
+ : '';
214
+ const head = `> **Already sent earlier in this conversation:** \`${filePath}\` ${formatSpans(covered)}${symbolPart}`;
215
+ const tail = opts.partial
216
+ ? ' — unchanged on disk since, so that copy is still exact. Only the NEW lines are shown below; scroll back for the rest. Do NOT Read this file.'
217
+ : ' — unchanged on disk since, so that copy is still exact and is not repeated here. Use it from your context; do NOT Read this file.';
218
+ return head + tail;
219
+ }
220
+ /** Symbol names whose definitions fall inside the withheld spans. */
221
+ function symbolsInSpans(nodes, spans) {
222
+ const out = [];
223
+ const seen = new Set();
224
+ for (const n of nodes) {
225
+ if (n.kind === 'import' || n.kind === 'export')
226
+ continue;
227
+ if (!spans.some((s) => n.startLine <= s.end && (n.endLine || n.startLine) >= s.start))
228
+ continue;
229
+ if (seen.has(n.name))
230
+ continue;
231
+ seen.add(n.name);
232
+ out.push(n.name);
233
+ }
234
+ return out;
235
+ }
236
+ //# sourceMappingURL=explore-dedup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explore-dedup.js","sourceRoot":"","sources":["../../src/mcp/explore-dedup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Session-level explore repeat / partial guidance (generic).
3
+ *
4
+ * Stops agents from treating `homegraph_explore` as an iterative keyword
5
+ * searcher: overlapping queries after a successful explore get a short refuse
6
+ * instead of another multi-kB payload. Partial/busy replies carry concrete
7
+ * retry anchors extracted from the query — never an empty 242-char shell.
8
+ *
9
+ * Failure fuse (post A/B): hard-cap explores per session, require tight
10
+ * single-Type follow-ups after 2 calls, and bind Partial → named Next anchor.
11
+ *
12
+ * Shape-driven only — no product nouns.
13
+ */
14
+ import type { ExploreCallRecord, ExploreProjectState } from './explore-session-state';
15
+ /**
16
+ * Significant tokens for bag-overlap (ASCII identifiers + CJK runs ≥2).
17
+ */
18
+ export declare function exploreQueryTokens(query: string): Set<string>;
19
+ /** Jaccard overlap in [0, 1]. */
20
+ export declare function queryTokenJaccard(a: ReadonlySet<string>, b: ReadonlySet<string>): number;
21
+ /**
22
+ * Bag similarity: max(Jaccard, one-sided containment).
23
+ * Paraphrases often keep the same English seeds while swapping CJK filler —
24
+ * pure Jaccard under-fires on those; containment catches them.
25
+ */
26
+ export declare function queryTokenOverlapScore(a: ReadonlySet<string>, b: ReadonlySet<string>): number;
27
+ /**
28
+ * Concrete anchors an agent can put in a tighter follow-up explore.
29
+ * Pure string extraction — no DB.
30
+ */
31
+ export declare function extractRetryAnchorsFromQuery(query: string): string[];
32
+ /** Anchors present in `query` that never appeared in any prior query string. */
33
+ export declare function novelAnchorsVsPriors(query: string, priors: ReadonlyArray<ExploreCallRecord>): string[];
34
+ /**
35
+ * Follow-up after the soft budget must be a tight Type/file bag — not another
36
+ * NL paraphrase that merely picks a Type name from a prior inventory.
37
+ */
38
+ export declare function isTightExploreFollowUp(query: string): boolean;
39
+ /** Pull `Next anchor` name from a Partial response body. */
40
+ export declare function extractNextAnchorFromText(text: string): string | undefined;
41
+ export declare function inferExplorePartialMeta(text: string): {
42
+ partial: boolean;
43
+ nextAnchor?: string;
44
+ };
45
+ export interface ExploreRepeatDecision {
46
+ refuse: boolean;
47
+ /** Matched prior call when refusing for overlap. */
48
+ matched?: ExploreCallRecord;
49
+ reason: 'overlap' | 'call-budget' | 'hard-cap' | 'next-anchor' | 'ok';
50
+ }
51
+ /**
52
+ * Whether this explore should short-refuse instead of re-running.
53
+ */
54
+ export declare function decideExploreRepeat(prior: ExploreProjectState | null | undefined, query: string): ExploreRepeatDecision;
55
+ /** Short success-shaped refuse when a repeat explore would waste tokens. */
56
+ export declare function formatExploreRepeatRefuse(decision: ExploreRepeatDecision, query: string): string;
57
+ export interface DepthToolFuseDecision {
58
+ refuse: boolean;
59
+ reason: 'partial-depth-cap' | 'partial-no-callers' | 'ok';
60
+ nextAnchor?: string;
61
+ }
62
+ /** Latest counted explore call (≥400 response bytes), if any. */
63
+ export declare function latestCountedExplore(prior: ExploreProjectState | null | undefined): ExploreCallRecord | undefined;
64
+ /**
65
+ * Whether `homegraph_node` / callers / callees should short-refuse after a
66
+ * Partial explore (same failure class as explore×N — depth fan-out).
67
+ *
68
+ * After Partial: callers/callees are refused immediately (wrong tool + often a
69
+ * multi-def token bomb). `homegraph_node` gets one shot, then refuse.
70
+ */
71
+ export declare function decideDepthToolFuse(prior: ExploreProjectState | null | undefined, depthCallCount: number, toolName?: string): DepthToolFuseDecision;
72
+ /** Success-shaped refuse when Partial already spent its one depth drill. */
73
+ export declare function formatDepthToolRefuse(decision: DepthToolFuseDecision, toolName: string, symbolHint?: string): string;
74
+ /** Candidate Type for Partial **Next anchor** / digest preference. */
75
+ export interface DomainRoleAnchorCandidate {
76
+ name: string;
77
+ kind: string;
78
+ filePath: string;
79
+ startLine?: number;
80
+ }
81
+ /**
82
+ * Score a domain Manager/Service for Next-anchor / digest preference.
83
+ * Prefer query-token overlap + *Manager /manager/ paths; demote weak *Utils /
84
+ * *Constants / bare *Subscriber helpers without strong token overlap.
85
+ *
86
+ * `domainTokens` (from {@link mechanismDomainPathTokens}) carries CJK→ASCII
87
+ * stems so NL asks like 通知订阅 rank SubscribeManager over screenlock StateManager.
88
+ */
89
+ export declare function scoreDomainRoleForQuery(candidate: DomainRoleAnchorCandidate, query: string, domainTokens?: readonly string[]): number;
90
+ /** Best domain-role Type for Next anchor, or undefined when inventory empty. */
91
+ export declare function pickBestDomainRoleAnchor(candidates: ReadonlyArray<DomainRoleAnchorCandidate>, query: string, domainTokens?: readonly string[]): DomainRoleAnchorCandidate | undefined;
92
+ /** Format Next anchor caption used in Partial / soft-close footers. */
93
+ export declare function formatNextAnchorCaption(c: DomainRoleAnchorCandidate): string;
94
+ /**
95
+ * Soft-close opening banner (must match footer — never pair with Partial locator).
96
+ */
97
+ export declare function formatMechanismSoftCloseHeader(): string;
98
+ /**
99
+ * Soft-close footer: enough inventory + digest to answer without another explore.
100
+ * Must NOT contain "Partial locator" so the session fuse treats the call as closed.
101
+ */
102
+ export declare function formatMechanismSoftCloseFooter(next?: DomainRoleAnchorCandidate): string;
103
+ /** Honest Partial footer with a single Next anchor + ONE Grep. */
104
+ export declare function formatMechanismPartialFooter(nextCaption: string): string;
105
+ /**
106
+ * Appended when a second counted Partial is emitted in the same session —
107
+ * stop HomeGraph; do not take a third explore.
108
+ */
109
+ export declare function formatSecondPartialStopFooter(nextAnchor?: string): string;
110
+ /**
111
+ * Intent phrases that must ride with a bare Type on Partial retry —
112
+ * dropping them collapses data-source / event-dispatch surveys into empty compact.
113
+ */
114
+ export declare function extractRetryIntentHints(query: string): string[];
115
+ /**
116
+ * Busy/deadline Partial with actionable anchors from the query (no DB).
117
+ */
118
+ export declare function formatPartialExploreGuidance(opts: {
119
+ seconds: number;
120
+ query?: string;
121
+ why?: string;
122
+ }): string;
123
+ //# sourceMappingURL=explore-repeat-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explore-repeat-guard.d.ts","sourceRoot":"","sources":["../../src/mcp/explore-repeat-guard.ts"],"names":[],"mappings":"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"}