@nxuss/lemma 1.37.0 → 1.39.0

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 (284) hide show
  1. package/README.md +9 -6
  2. package/bin/brain-ingest.js +86 -27
  3. package/bin/doctor.js +31 -4
  4. package/bin/init.js +98 -60
  5. package/dashboard/dist/assets/index-DNTQXLER.css +1 -0
  6. package/dashboard/dist/assets/index-DzL_Zu3m.js +452 -0
  7. package/dashboard/dist/index.html +2 -2
  8. package/dist/cjs/cli/gitHooks.d.ts +9 -2
  9. package/dist/cjs/cli/gitHooks.d.ts.map +1 -1
  10. package/dist/cjs/cli/gitHooks.js +31 -4
  11. package/dist/cjs/cli/gitHooks.js.map +1 -1
  12. package/dist/cjs/cli/hostHooks.d.ts +13 -1
  13. package/dist/cjs/cli/hostHooks.d.ts.map +1 -1
  14. package/dist/cjs/cli/hostHooks.js +34 -4
  15. package/dist/cjs/cli/hostHooks.js.map +1 -1
  16. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  17. package/dist/cjs/cli/lemma-proxy.js +42 -5
  18. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  19. package/dist/cjs/infra/analyzers/index.d.ts +0 -2
  20. package/dist/cjs/infra/analyzers/index.d.ts.map +1 -1
  21. package/dist/cjs/infra/analyzers/index.js +1 -6
  22. package/dist/cjs/infra/analyzers/index.js.map +1 -1
  23. package/dist/cjs/infra/cli.d.ts +4 -0
  24. package/dist/cjs/infra/cli.d.ts.map +1 -1
  25. package/dist/cjs/infra/cli.js +6 -199
  26. package/dist/cjs/infra/cli.js.map +1 -1
  27. package/dist/cjs/infra/index.d.ts +1 -3
  28. package/dist/cjs/infra/index.d.ts.map +1 -1
  29. package/dist/cjs/infra/index.js +1 -16
  30. package/dist/cjs/infra/index.js.map +1 -1
  31. package/dist/cjs/infra/mcp-tools.d.ts.map +1 -1
  32. package/dist/cjs/infra/mcp-tools.js +8 -453
  33. package/dist/cjs/infra/mcp-tools.js.map +1 -1
  34. package/dist/cjs/infra/types.d.ts +0 -101
  35. package/dist/cjs/infra/types.d.ts.map +1 -1
  36. package/dist/cjs/infra/types.js +2 -1
  37. package/dist/cjs/infra/types.js.map +1 -1
  38. package/dist/cjs/mcp/index.js +33 -10
  39. package/dist/cjs/mcp/index.js.map +1 -1
  40. package/dist/cjs/mcp/prompts.d.ts +1 -1
  41. package/dist/cjs/mcp/prompts.d.ts.map +1 -1
  42. package/dist/cjs/mcp/prompts.js +8 -21
  43. package/dist/cjs/mcp/prompts.js.map +1 -1
  44. package/dist/cjs/mcp/tool-profiles.d.ts +8 -3
  45. package/dist/cjs/mcp/tool-profiles.d.ts.map +1 -1
  46. package/dist/cjs/mcp/tool-profiles.js +25 -54
  47. package/dist/cjs/mcp/tool-profiles.js.map +1 -1
  48. package/dist/cjs/mcp/tools/memory.d.ts +8 -0
  49. package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
  50. package/dist/cjs/mcp/tools/memory.js +154 -125
  51. package/dist/cjs/mcp/tools/memory.js.map +1 -1
  52. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  53. package/dist/cjs/mcp/tools.js +11 -6
  54. package/dist/cjs/mcp/tools.js.map +1 -1
  55. package/dist/cjs/mcp/workspaceShared.d.ts.map +1 -1
  56. package/dist/cjs/mcp/workspaceShared.js +13 -12
  57. package/dist/cjs/mcp/workspaceShared.js.map +1 -1
  58. package/dist/cjs/proxy/ProjectRegistry.d.ts +44 -0
  59. package/dist/cjs/proxy/ProjectRegistry.d.ts.map +1 -1
  60. package/dist/cjs/proxy/ProjectRegistry.js +92 -3
  61. package/dist/cjs/proxy/ProjectRegistry.js.map +1 -1
  62. package/dist/cjs/subconscious/HostRecall.d.ts +36 -3
  63. package/dist/cjs/subconscious/HostRecall.d.ts.map +1 -1
  64. package/dist/cjs/subconscious/HostRecall.js +164 -37
  65. package/dist/cjs/subconscious/HostRecall.js.map +1 -1
  66. package/dist/cjs/subconscious/NarrowEvidence.d.ts +47 -0
  67. package/dist/cjs/subconscious/NarrowEvidence.d.ts.map +1 -0
  68. package/dist/cjs/subconscious/NarrowEvidence.js +252 -0
  69. package/dist/cjs/subconscious/NarrowEvidence.js.map +1 -0
  70. package/dist/cjs/subconscious/TheBrainV2.d.ts +37 -0
  71. package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
  72. package/dist/cjs/subconscious/TheBrainV2.js +147 -15
  73. package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
  74. package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
  75. package/dist/cjs/subconscious/freshness/LocalFsResolver.js +17 -0
  76. package/dist/cjs/subconscious/freshness/LocalFsResolver.js.map +1 -1
  77. package/dist/cjs/subconscious/recallDigest.d.ts +42 -0
  78. package/dist/cjs/subconscious/recallDigest.d.ts.map +1 -0
  79. package/dist/cjs/subconscious/recallDigest.js +94 -0
  80. package/dist/cjs/subconscious/recallDigest.js.map +1 -0
  81. package/dist/cjs/utils/OtherLanguageSymbols.d.ts +31 -0
  82. package/dist/cjs/utils/OtherLanguageSymbols.d.ts.map +1 -0
  83. package/dist/cjs/utils/OtherLanguageSymbols.js +283 -0
  84. package/dist/cjs/utils/OtherLanguageSymbols.js.map +1 -0
  85. package/dist/cjs/utils/SavingsLedger.d.ts +27 -0
  86. package/dist/cjs/utils/SavingsLedger.d.ts.map +1 -1
  87. package/dist/cjs/utils/SavingsLedger.js +51 -0
  88. package/dist/cjs/utils/SavingsLedger.js.map +1 -1
  89. package/dist/cjs/utils/StoreDraft.d.ts +12 -0
  90. package/dist/cjs/utils/StoreDraft.d.ts.map +1 -1
  91. package/dist/cjs/utils/StoreDraft.js +53 -1
  92. package/dist/cjs/utils/StoreDraft.js.map +1 -1
  93. package/dist/cjs/utils/SymbolSurgicalContext.d.ts +2 -0
  94. package/dist/cjs/utils/SymbolSurgicalContext.d.ts.map +1 -1
  95. package/dist/cjs/utils/SymbolSurgicalContext.js +1 -0
  96. package/dist/cjs/utils/SymbolSurgicalContext.js.map +1 -1
  97. package/dist/cjs/utils/reportSavings.d.ts +17 -4
  98. package/dist/cjs/utils/reportSavings.d.ts.map +1 -1
  99. package/dist/cjs/utils/reportSavings.js +67 -22
  100. package/dist/cjs/utils/reportSavings.js.map +1 -1
  101. package/dist/esm/cli/gitHooks.d.ts +9 -2
  102. package/dist/esm/cli/gitHooks.d.ts.map +1 -1
  103. package/dist/esm/cli/gitHooks.js +31 -4
  104. package/dist/esm/cli/gitHooks.js.map +1 -1
  105. package/dist/esm/cli/hostHooks.d.ts +13 -1
  106. package/dist/esm/cli/hostHooks.d.ts.map +1 -1
  107. package/dist/esm/cli/hostHooks.js +32 -3
  108. package/dist/esm/cli/hostHooks.js.map +1 -1
  109. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  110. package/dist/esm/cli/lemma-proxy.js +42 -5
  111. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  112. package/dist/esm/infra/analyzers/index.d.ts +0 -2
  113. package/dist/esm/infra/analyzers/index.d.ts.map +1 -1
  114. package/dist/esm/infra/analyzers/index.js +0 -2
  115. package/dist/esm/infra/analyzers/index.js.map +1 -1
  116. package/dist/esm/infra/cli.d.ts +4 -0
  117. package/dist/esm/infra/cli.d.ts.map +1 -1
  118. package/dist/esm/infra/cli.js +6 -199
  119. package/dist/esm/infra/cli.js.map +1 -1
  120. package/dist/esm/infra/index.d.ts +1 -3
  121. package/dist/esm/infra/index.d.ts.map +1 -1
  122. package/dist/esm/infra/index.js +1 -3
  123. package/dist/esm/infra/index.js.map +1 -1
  124. package/dist/esm/infra/mcp-tools.d.ts.map +1 -1
  125. package/dist/esm/infra/mcp-tools.js +9 -454
  126. package/dist/esm/infra/mcp-tools.js.map +1 -1
  127. package/dist/esm/infra/types.d.ts +0 -101
  128. package/dist/esm/infra/types.d.ts.map +1 -1
  129. package/dist/esm/infra/types.js +2 -1
  130. package/dist/esm/infra/types.js.map +1 -1
  131. package/dist/esm/mcp/index.js +33 -10
  132. package/dist/esm/mcp/index.js.map +1 -1
  133. package/dist/esm/mcp/prompts.d.ts +1 -1
  134. package/dist/esm/mcp/prompts.d.ts.map +1 -1
  135. package/dist/esm/mcp/prompts.js +8 -21
  136. package/dist/esm/mcp/prompts.js.map +1 -1
  137. package/dist/esm/mcp/tool-profiles.d.ts +8 -3
  138. package/dist/esm/mcp/tool-profiles.d.ts.map +1 -1
  139. package/dist/esm/mcp/tool-profiles.js +25 -54
  140. package/dist/esm/mcp/tool-profiles.js.map +1 -1
  141. package/dist/esm/mcp/tools/memory.d.ts +8 -0
  142. package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
  143. package/dist/esm/mcp/tools/memory.js +156 -128
  144. package/dist/esm/mcp/tools/memory.js.map +1 -1
  145. package/dist/esm/mcp/tools.d.ts.map +1 -1
  146. package/dist/esm/mcp/tools.js +12 -7
  147. package/dist/esm/mcp/tools.js.map +1 -1
  148. package/dist/esm/mcp/workspaceShared.d.ts.map +1 -1
  149. package/dist/esm/mcp/workspaceShared.js +13 -12
  150. package/dist/esm/mcp/workspaceShared.js.map +1 -1
  151. package/dist/esm/proxy/ProjectRegistry.d.ts +44 -0
  152. package/dist/esm/proxy/ProjectRegistry.d.ts.map +1 -1
  153. package/dist/esm/proxy/ProjectRegistry.js +91 -2
  154. package/dist/esm/proxy/ProjectRegistry.js.map +1 -1
  155. package/dist/esm/subconscious/HostRecall.d.ts +36 -3
  156. package/dist/esm/subconscious/HostRecall.d.ts.map +1 -1
  157. package/dist/esm/subconscious/HostRecall.js +159 -36
  158. package/dist/esm/subconscious/HostRecall.js.map +1 -1
  159. package/dist/esm/subconscious/NarrowEvidence.d.ts +47 -0
  160. package/dist/esm/subconscious/NarrowEvidence.d.ts.map +1 -0
  161. package/dist/esm/subconscious/NarrowEvidence.js +211 -0
  162. package/dist/esm/subconscious/NarrowEvidence.js.map +1 -0
  163. package/dist/esm/subconscious/TheBrainV2.d.ts +37 -0
  164. package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
  165. package/dist/esm/subconscious/TheBrainV2.js +146 -14
  166. package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
  167. package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
  168. package/dist/esm/subconscious/freshness/LocalFsResolver.js +17 -0
  169. package/dist/esm/subconscious/freshness/LocalFsResolver.js.map +1 -1
  170. package/dist/esm/subconscious/recallDigest.d.ts +42 -0
  171. package/dist/esm/subconscious/recallDigest.d.ts.map +1 -0
  172. package/dist/esm/subconscious/recallDigest.js +87 -0
  173. package/dist/esm/subconscious/recallDigest.js.map +1 -0
  174. package/dist/esm/utils/OtherLanguageSymbols.d.ts +31 -0
  175. package/dist/esm/utils/OtherLanguageSymbols.d.ts.map +1 -0
  176. package/dist/esm/utils/OtherLanguageSymbols.js +275 -0
  177. package/dist/esm/utils/OtherLanguageSymbols.js.map +1 -0
  178. package/dist/esm/utils/SavingsLedger.d.ts +27 -0
  179. package/dist/esm/utils/SavingsLedger.d.ts.map +1 -1
  180. package/dist/esm/utils/SavingsLedger.js +51 -0
  181. package/dist/esm/utils/SavingsLedger.js.map +1 -1
  182. package/dist/esm/utils/StoreDraft.d.ts +12 -0
  183. package/dist/esm/utils/StoreDraft.d.ts.map +1 -1
  184. package/dist/esm/utils/StoreDraft.js +52 -1
  185. package/dist/esm/utils/StoreDraft.js.map +1 -1
  186. package/dist/esm/utils/SymbolSurgicalContext.d.ts +2 -0
  187. package/dist/esm/utils/SymbolSurgicalContext.d.ts.map +1 -1
  188. package/dist/esm/utils/SymbolSurgicalContext.js +1 -1
  189. package/dist/esm/utils/SymbolSurgicalContext.js.map +1 -1
  190. package/dist/esm/utils/reportSavings.d.ts +17 -4
  191. package/dist/esm/utils/reportSavings.d.ts.map +1 -1
  192. package/dist/esm/utils/reportSavings.js +65 -22
  193. package/dist/esm/utils/reportSavings.js.map +1 -1
  194. package/package.json +2 -1
  195. package/dashboard/dist/assets/index-BoeQau6n.css +0 -1
  196. package/dashboard/dist/assets/index-Clf3qR64.js +0 -451
  197. package/dist/cjs/infra/analyzers/DriftDetector.d.ts +0 -4
  198. package/dist/cjs/infra/analyzers/DriftDetector.d.ts.map +0 -1
  199. package/dist/cjs/infra/analyzers/DriftDetector.js +0 -88
  200. package/dist/cjs/infra/analyzers/DriftDetector.js.map +0 -1
  201. package/dist/cjs/infra/analyzers/InfraAnalyzer.d.ts +0 -3
  202. package/dist/cjs/infra/analyzers/InfraAnalyzer.d.ts.map +0 -1
  203. package/dist/cjs/infra/analyzers/InfraAnalyzer.js +0 -73
  204. package/dist/cjs/infra/analyzers/InfraAnalyzer.js.map +0 -1
  205. package/dist/cjs/infra/config.d.ts +0 -17
  206. package/dist/cjs/infra/config.d.ts.map +0 -1
  207. package/dist/cjs/infra/config.js +0 -111
  208. package/dist/cjs/infra/config.js.map +0 -1
  209. package/dist/cjs/infra/errorCause.d.ts +0 -36
  210. package/dist/cjs/infra/errorCause.d.ts.map +0 -1
  211. package/dist/cjs/infra/errorCause.js +0 -143
  212. package/dist/cjs/infra/errorCause.js.map +0 -1
  213. package/dist/cjs/infra/providers/InfraProvider.d.ts +0 -9
  214. package/dist/cjs/infra/providers/InfraProvider.d.ts.map +0 -1
  215. package/dist/cjs/infra/providers/InfraProvider.js +0 -3
  216. package/dist/cjs/infra/providers/InfraProvider.js.map +0 -1
  217. package/dist/cjs/infra/providers/JenkinsProvider.d.ts +0 -16
  218. package/dist/cjs/infra/providers/JenkinsProvider.d.ts.map +0 -1
  219. package/dist/cjs/infra/providers/JenkinsProvider.js +0 -193
  220. package/dist/cjs/infra/providers/JenkinsProvider.js.map +0 -1
  221. package/dist/cjs/infra/providers/OKDProvider.d.ts +0 -24
  222. package/dist/cjs/infra/providers/OKDProvider.d.ts.map +0 -1
  223. package/dist/cjs/infra/providers/OKDProvider.js +0 -296
  224. package/dist/cjs/infra/providers/OKDProvider.js.map +0 -1
  225. package/dist/cjs/infra/providers/TerraformProvider.d.ts +0 -17
  226. package/dist/cjs/infra/providers/TerraformProvider.d.ts.map +0 -1
  227. package/dist/cjs/infra/providers/TerraformProvider.js +0 -111
  228. package/dist/cjs/infra/providers/TerraformProvider.js.map +0 -1
  229. package/dist/cjs/infra/providers/index.d.ts +0 -9
  230. package/dist/cjs/infra/providers/index.d.ts.map +0 -1
  231. package/dist/cjs/infra/providers/index.js +0 -34
  232. package/dist/cjs/infra/providers/index.js.map +0 -1
  233. package/dist/cjs/infra/templates/jenkins/index.d.ts +0 -15
  234. package/dist/cjs/infra/templates/jenkins/index.d.ts.map +0 -1
  235. package/dist/cjs/infra/templates/jenkins/index.js +0 -128
  236. package/dist/cjs/infra/templates/jenkins/index.js.map +0 -1
  237. package/dist/cjs/infra/templates/okd/index.d.ts +0 -31
  238. package/dist/cjs/infra/templates/okd/index.d.ts.map +0 -1
  239. package/dist/cjs/infra/templates/okd/index.js +0 -149
  240. package/dist/cjs/infra/templates/okd/index.js.map +0 -1
  241. package/dist/esm/infra/analyzers/DriftDetector.d.ts +0 -4
  242. package/dist/esm/infra/analyzers/DriftDetector.d.ts.map +0 -1
  243. package/dist/esm/infra/analyzers/DriftDetector.js +0 -84
  244. package/dist/esm/infra/analyzers/DriftDetector.js.map +0 -1
  245. package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts +0 -3
  246. package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts.map +0 -1
  247. package/dist/esm/infra/analyzers/InfraAnalyzer.js +0 -70
  248. package/dist/esm/infra/analyzers/InfraAnalyzer.js.map +0 -1
  249. package/dist/esm/infra/config.d.ts +0 -17
  250. package/dist/esm/infra/config.d.ts.map +0 -1
  251. package/dist/esm/infra/config.js +0 -101
  252. package/dist/esm/infra/config.js.map +0 -1
  253. package/dist/esm/infra/errorCause.d.ts +0 -36
  254. package/dist/esm/infra/errorCause.d.ts.map +0 -1
  255. package/dist/esm/infra/errorCause.js +0 -138
  256. package/dist/esm/infra/errorCause.js.map +0 -1
  257. package/dist/esm/infra/providers/InfraProvider.d.ts +0 -9
  258. package/dist/esm/infra/providers/InfraProvider.d.ts.map +0 -1
  259. package/dist/esm/infra/providers/InfraProvider.js +0 -2
  260. package/dist/esm/infra/providers/InfraProvider.js.map +0 -1
  261. package/dist/esm/infra/providers/JenkinsProvider.d.ts +0 -16
  262. package/dist/esm/infra/providers/JenkinsProvider.d.ts.map +0 -1
  263. package/dist/esm/infra/providers/JenkinsProvider.js +0 -186
  264. package/dist/esm/infra/providers/JenkinsProvider.js.map +0 -1
  265. package/dist/esm/infra/providers/OKDProvider.d.ts +0 -24
  266. package/dist/esm/infra/providers/OKDProvider.d.ts.map +0 -1
  267. package/dist/esm/infra/providers/OKDProvider.js +0 -292
  268. package/dist/esm/infra/providers/OKDProvider.js.map +0 -1
  269. package/dist/esm/infra/providers/TerraformProvider.d.ts +0 -17
  270. package/dist/esm/infra/providers/TerraformProvider.d.ts.map +0 -1
  271. package/dist/esm/infra/providers/TerraformProvider.js +0 -107
  272. package/dist/esm/infra/providers/TerraformProvider.js.map +0 -1
  273. package/dist/esm/infra/providers/index.d.ts +0 -9
  274. package/dist/esm/infra/providers/index.d.ts.map +0 -1
  275. package/dist/esm/infra/providers/index.js +0 -27
  276. package/dist/esm/infra/providers/index.js.map +0 -1
  277. package/dist/esm/infra/templates/jenkins/index.d.ts +0 -15
  278. package/dist/esm/infra/templates/jenkins/index.d.ts.map +0 -1
  279. package/dist/esm/infra/templates/jenkins/index.js +0 -124
  280. package/dist/esm/infra/templates/jenkins/index.js.map +0 -1
  281. package/dist/esm/infra/templates/okd/index.d.ts +0 -31
  282. package/dist/esm/infra/templates/okd/index.d.ts.map +0 -1
  283. package/dist/esm/infra/templates/okd/index.js +0 -142
  284. package/dist/esm/infra/templates/okd/index.js.map +0 -1
@@ -8,7 +8,7 @@
8
8
  * has no reason to. This module answers a host PostToolUse hook payload with the same kind of
9
9
  * note, at the same three moments:
10
10
  *
11
- * - Reading a file the Brain has memories about → their ids (formatRecallNote's rule).
11
+ * - Reading a file the Brain has memories about → a digest of the most relevant (recallDigest).
12
12
  * - Editing a file a documented FAILED attempt depends on → a warning. Plain "this will go
13
13
  * stale" notes stay off for native edits: they are the common case and not worth context.
14
14
  * - A verdict command (test/build/lint) failing with an error the Brain already has a recorded
@@ -28,12 +28,13 @@
28
28
  */
29
29
  import fs from 'fs';
30
30
  import path from 'path';
31
- import { deriveProjectId, entrySource, getBrain } from './TheBrainV2.js';
31
+ import { deriveProjectId, entrySource, getBrain, tokenize } from './TheBrainV2.js';
32
32
  import { repoRoot } from './TeamBrain.js';
33
33
  import { extractFailure, hookVerdict, isVerdictCommand } from '../utils/FixCapture.js';
34
34
  import { ageLabel } from '../utils/ageLabel.js';
35
35
  import { consumeStoreDraft } from '../utils/StoreDraft.js';
36
36
  import { staleMcpProcessNote } from '../mcp/staleBuild.js';
37
+ import { digestFileHits, formatFileDigest, recallableHits } from './recallDigest.js';
37
38
  const STATE_FILE = path.join('.lemma', 'session', 'host-recall.json');
38
39
  /**
39
40
  * BM25 similarity is normalized against the corpus, so the top result of any query scores
@@ -75,12 +76,12 @@ function fileNote(brain, toolName, filePath) {
75
76
  return null;
76
77
  const name = path.basename(filePath);
77
78
  if (READ_TOOLS.has(toolName)) {
78
- const ids = result.hits.map((h) => h.id).sort();
79
- let text = `🧠 Lemma Brain has ${result.hits.length} ${plural(result.hits.length, 'memory', 'memories')} about ${name}: ${ids.join(', ')}. verify_memory ${plural(ids.length, 'it', 'them')} before investigating from scratch.`;
80
- if (result.failedHits.length > 0) {
81
- text += ` ⚠️ ${result.failedHits.map((h) => h.id).join(', ')} document an approach that FAILED here — read before repeating it.`;
82
- }
83
- return { key: `read::${path.resolve(filePath)}::${ids.join(',')}`, text };
79
+ const hits = recallableHits(brain, result.hits);
80
+ if (hits.length === 0)
81
+ return null;
82
+ const ids = hits.map((h) => h.id).sort();
83
+ const digest = digestFileHits(brain, hits);
84
+ return { key: `read::${path.resolve(filePath)}::${ids.join(',')}`, text: formatFileDigest(name, digest), offered: digest.ids, trigger: 'read' };
84
85
  }
85
86
  // Native edits: only the escalated case. "N memories will go stale" on every edit is noise.
86
87
  if (result.failedHits.length === 0)
@@ -89,6 +90,8 @@ function fileNote(brain, toolName, filePath) {
89
90
  return {
90
91
  key: `edit::${path.resolve(filePath)}::${failedIds.join(',')}`,
91
92
  text: `⚠️ Lemma Brain: ${failedIds.join(', ')} document an approach to ${name} that was tried and FAILED. get_memory them before continuing down this path.`,
93
+ offered: failedIds,
94
+ trigger: 'edit',
92
95
  };
93
96
  }
94
97
  function headlineTerms(text) {
@@ -133,6 +136,8 @@ function failureNote(brain, root, output) {
133
136
  return {
134
137
  key: `fix::${match.id}`,
135
138
  text: `🧠 Lemma Brain has a recorded fix for a failure like this one (id ${match.id}): "${match.query.slice(0, 120)}". get_memory ${match.id} for the files and diff that fixed it.`,
139
+ offered: [match.id],
140
+ trigger: 'failure',
136
141
  };
137
142
  }
138
143
  /**
@@ -140,9 +145,13 @@ function failureNote(brain, root, output) {
140
145
  * Never throws: a recall hint must never be the reason a tool call reports an error.
141
146
  */
142
147
  export function recallForHookPayload(payload, cwd, brain) {
148
+ return hookRecall(payload, cwd, brain)?.text ?? '';
149
+ }
150
+ /** recallForHookPayload with what the note offered, for reporting. Null when there's no note. */
151
+ export function hookRecall(payload, cwd, brain) {
143
152
  try {
144
153
  if (!payload || typeof payload !== 'object')
145
- return '';
154
+ return null;
146
155
  const p = payload;
147
156
  const toolName = typeof p.tool_name === 'string' ? p.tool_name : '';
148
157
  const root = repoRoot(cwd || p.cwd || process.cwd());
@@ -151,31 +160,31 @@ export function recallForHookPayload(payload, cwd, brain) {
151
160
  if (READ_TOOLS.has(toolName) || EDIT_TOOLS.has(toolName)) {
152
161
  const raw = p.tool_input?.file_path ?? p.tool_input?.notebook_path;
153
162
  if (typeof raw !== 'string' || !raw)
154
- return '';
163
+ return null;
155
164
  const filePath = path.isAbsolute(raw) ? raw : path.join(root, raw);
156
165
  note = fileNote(b, toolName, filePath);
157
166
  }
158
167
  else if (toolName === 'Bash') {
159
168
  const command = p.tool_input?.command;
160
169
  if (typeof command !== 'string' || !isVerdictCommand(command))
161
- return '';
170
+ return null;
162
171
  const verdict = hookVerdict(p);
163
172
  if (!verdict || verdict.passed)
164
- return '';
173
+ return null;
165
174
  note = failureNote(b, root, verdict.output);
166
175
  }
167
176
  if (!note)
168
- return '';
177
+ return null;
169
178
  const sessionId = typeof p.session_id === 'string' ? p.session_id : '';
170
179
  const state = readState(root, sessionId);
171
180
  if (state.noted.includes(note.key))
172
- return '';
181
+ return null;
173
182
  state.noted.push(note.key);
174
183
  writeState(root, state);
175
- return note.text;
184
+ return { text: note.text, offered: note.offered, trigger: note.trigger };
176
185
  }
177
186
  catch {
178
- return '';
187
+ return null;
179
188
  }
180
189
  }
181
190
  /**
@@ -190,20 +199,52 @@ export function isStatusQuestion(prompt) {
190
199
  }
191
200
  /** At most this many memories are named in one prompt note. */
192
201
  const MAX_PROMPT_HITS = 3;
193
- /** A prompt is long and a memory headline short, so overlap is measured against the headline. */
202
+ /**
203
+ * Share of the prompt's information (IDF-weighted) a memory headline must carry: the best-ranked
204
+ * memory needs PROMPT_TOP_COVERAGE, the next ones PROMPT_MIN_COVERAGE. Measured on Lemma's own
205
+ * Brain: 13 of 35 real questions get the right memory and none a wrong one, while 1 of 40
206
+ * unrelated work prompts gets an offer. The lexical rank is right far more often than any
207
+ * single memory's coverage says, so the top result gets the lower bar.
208
+ */
209
+ const PROMPT_TOP_COVERAGE = 0.4;
194
210
  const PROMPT_MIN_COVERAGE = 0.5;
195
- const PROMPT_MIN_HEADLINE_TERMS = 3;
196
- /** Share of the memory headline's terms that also appear in the prompt. */
197
- export function headlineCoverage(headline, prompt) {
198
- const h = headlineTerms(headline);
199
- if (h.size < PROMPT_MIN_HEADLINE_TERMS)
211
+ /** Prompts with fewer informative words ("run the tests", "commit and push") carry no topic. */
212
+ const PROMPT_MIN_UNITS = 3;
213
+ /** Each word of `text` with its index expansions (stem, synonym tag); stop words drop out. */
214
+ function wordUnits(text) {
215
+ const words = new Set(text
216
+ .normalize('NFD')
217
+ .replace(/[\u0300-\u036f]/g, '')
218
+ .toLowerCase()
219
+ .split(/[^a-z0-9]+/)
220
+ .filter(Boolean));
221
+ return [...words].map((w) => tokenize(w)).filter((u) => u.length > 0);
222
+ }
223
+ /**
224
+ * How much of what the prompt is about appears in a memory's headline: the IDF-weighted share
225
+ * of the prompt's words (or their stem / bilingual synonym) found among the headline's terms.
226
+ *
227
+ * This replaced "share of the headline found in the prompt", which needed a short prompt to
228
+ * restate half of a long, specific headline: measured on Lemma's own Brain it offered the right
229
+ * memory for 1 of 30 real questions; weighted toward the prompt's rare words it offers several
230
+ * times more and never a wrong one (thresholds above). Prompts with under PROMPT_MIN_UNITS
231
+ * informative words are skipped, which is where the false offers were. This note arrives unasked on every prompt, so it keeps
232
+ * a floor — search_memory, which the agent calls on purpose, does not.
233
+ */
234
+ export function promptCoverage(headline, prompt, idf) {
235
+ const units = wordUnits(prompt);
236
+ if (units.length < PROMPT_MIN_UNITS)
200
237
  return 0;
201
- const p = headlineTerms(prompt);
202
- let shared = 0;
203
- for (const t of h)
204
- if (p.has(t))
205
- shared++;
206
- return shared / h.size;
238
+ const head = new Set(tokenize(headline));
239
+ let total = 0;
240
+ let covered = 0;
241
+ for (const unit of units) {
242
+ const weight = Math.max(...unit.map(idf));
243
+ total += weight;
244
+ if (unit.some((t) => head.has(t)))
245
+ covered += weight;
246
+ }
247
+ return total > 0 ? covered / total : 0;
207
248
  }
208
249
  function promptKey(prompt) {
209
250
  let h = 0;
@@ -212,27 +253,37 @@ function promptKey(prompt) {
212
253
  return `prompt::${h}`;
213
254
  }
214
255
  export function recallForPrompt(payload, cwd, brain, options = {}) {
256
+ return promptRecall(payload, cwd, brain, options)?.text ?? '';
257
+ }
258
+ /** recallForPrompt with the memories it offered, for reporting. Null when there's nothing to say. */
259
+ export function promptRecall(payload, cwd, brain, options = {}) {
215
260
  try {
216
261
  if (!payload || typeof payload !== 'object')
217
- return '';
262
+ return null;
218
263
  const p = payload;
219
264
  const prompt = typeof p.prompt === 'string' ? p.prompt.trim() : '';
220
265
  // Slash commands and one-word replies carry no topic worth a lookup.
221
266
  if (prompt.length < 12 || prompt.startsWith('/'))
222
- return '';
267
+ return null;
223
268
  const root = repoRoot(cwd || p.cwd || process.cwd());
224
269
  const b = brain ?? getBrain();
225
270
  const lines = [];
226
271
  const hits = b
227
272
  .search(prompt.slice(0, 600), 8, 0, { countStats: false, projectId: deriveProjectId(root), strictProject: true })
228
- .filter((r) => headlineCoverage(r.query, prompt) >= PROMPT_MIN_COVERAGE)
273
+ .filter((r, rank) => promptCoverage(r.query, prompt, (t) => b.termIdf(t)) >= (rank === 0 ? PROMPT_TOP_COVERAGE : PROMPT_MIN_COVERAGE))
274
+ .filter((r) => {
275
+ const entry = b.getEntry(r.id);
276
+ return !entry || entrySource(entry) !== 'auto-git';
277
+ })
229
278
  .slice(0, MAX_PROMPT_HITS);
230
279
  if (hits.length > 0) {
280
+ // With the headline: an id alone gives the agent nothing to judge relevance by.
231
281
  const described = hits.map((r) => {
232
282
  const verdict = !r.fresh ? 'STALE' : r.untracked ? 'untracked' : 'fresh';
233
- return `${r.id} (${ageLabel(r.timestamp)}, ${verdict}${r.outcome === 'failed' ? ', FAILED approach' : ''})`;
283
+ const head = r.query.replace(/\s+/g, ' ').trim();
284
+ return ` • ${r.id} (${verdict}, ${ageLabel(r.timestamp)}${r.outcome === 'failed' ? ', FAILED approach' : ''}): ${head.length > 110 ? `${head.slice(0, 109)}…` : head}`;
234
285
  });
235
- lines.push(`🧠 Lemma Brain has ${plural(hits.length, 'a memory', 'memories')} that may bear on this: ${described.join('; ')}. get_memory / verify_memory before relying on ${plural(hits.length, 'it', 'them')}.`);
286
+ lines.push(`🧠 Lemma Brain has ${plural(hits.length, 'a memory', 'memories')} that may bear on this:`, ...described, `get_memory the one that applies before relying on it; a STALE one must be re-checked against the current code.`);
236
287
  }
237
288
  if (isStatusQuestion(prompt)) {
238
289
  lines.push('🧠 This is a status question: recalled memories and notes go stale as MRs merge and issues close. Verify live state (git fetch/log, gh/glab) before saying what is pending.');
@@ -242,9 +293,11 @@ export function recallForPrompt(payload, cwd, brain, options = {}) {
242
293
  const out = [];
243
294
  // Topical lines are deduped per prompt; the other two have their own one-shot rules.
244
295
  const key = promptKey(prompt);
296
+ let offered = [];
245
297
  if (lines.length > 0 && !state.noted.includes(key)) {
246
298
  out.push(...lines);
247
299
  state.noted.push(key);
300
+ offered = hits.map((r) => r.id);
248
301
  }
249
302
  // A build newer than the running MCP process is spoken once per host session: it is true
250
303
  // until the user reconnects, and the tool-result suffix never reaches someone who does not
@@ -260,12 +313,82 @@ export function recallForPrompt(payload, cwd, brain, options = {}) {
260
313
  if (draft)
261
314
  out.push(draft);
262
315
  if (out.length === 0)
263
- return '';
316
+ return null;
264
317
  writeState(root, state);
265
- return out.join('\n');
318
+ return { text: out.join('\n'), offered, trigger: 'prompt' };
266
319
  }
267
320
  catch {
268
- return '';
321
+ return null;
322
+ }
323
+ }
324
+ // ── SessionStart: the briefing that used to depend on the agent calling for it ──────────
325
+ //
326
+ // CLAUDE.md said "call get_project_onboarding at the start" and "search_memory before
327
+ // investigating". Both were prose the agent could weigh and skip — and did: a session could
328
+ // run start to finish on native tools and never learn the Brain held the answer. A SessionStart
329
+ // hook puts the essentials in context before the first prompt, with no tool call to forget.
330
+ /** Tools the playbook names, in one ToolSearch line for hosts that defer MCP schemas. */
331
+ export const PLAYBOOK_TOOLS = [
332
+ 'search_memory',
333
+ 'get_memory',
334
+ 'verify_memory',
335
+ 'store_memory',
336
+ 'update_memory',
337
+ 'read_workspace_file',
338
+ 'search_workspace',
339
+ ];
340
+ /**
341
+ * When to reach for Lemma — triggers, not judgment calls. "Use it when it adds value" let every
342
+ * individual call look cheaper native; these are the moments where Lemma does something the
343
+ * native tools can't, so there is no cheaper alternative to weigh.
344
+ */
345
+ export const LEMMA_PLAYBOOK = [
346
+ 'Lemma playbook — follow these triggers:',
347
+ ' - Before investigating a bug, error or "why does X": search_memory with the error text or question.',
348
+ ' - A 🧠 note names memories: get_memory the top one before re-deriving what it says.',
349
+ ' - A fix is verified (tests pass, build succeeds, user confirms): store_memory with filePaths — the root cause, trap or failed approach, not a summary of what changed (git log has that).',
350
+ ' - A memory turned out outdated or wrong: update_memory / forget_memory — never store a near-duplicate.',
351
+ ' - Reading code you have not located yet, or that may hold secrets: search_workspace / read_workspace_file (they scrub keys).',
352
+ `If Lemma's tools are deferred, load them in ONE ToolSearch: select:${PLAYBOOK_TOOLS.map((t) => `mcp__lemma__${t}`).join(',')}`,
353
+ ].join('\n');
354
+ const BRIEFING_MEMORIES = 3;
355
+ export function sessionBriefing(payload, cwd, brain) {
356
+ return sessionRecall(payload, cwd, brain)?.text ?? '';
357
+ }
358
+ /** sessionBriefing with the memories it named, for reporting. */
359
+ export function sessionRecall(payload, cwd, brain) {
360
+ try {
361
+ const p = payload && typeof payload === 'object' ? payload : {};
362
+ const root = repoRoot(cwd || p.cwd || process.cwd());
363
+ const b = brain ?? getBrain();
364
+ const projectId = deriveProjectId(root);
365
+ const lines = [];
366
+ let offered = [];
367
+ const { total, items } = b.list({ projectId, limit: 50 });
368
+ if (total === 0) {
369
+ lines.push(`🧠 Lemma is active in ${path.basename(root)}. The Brain has no memories for this project yet — store_memory once a fix is verified so the next session starts ahead.`);
370
+ }
371
+ else {
372
+ // Newest memories someone wrote on purpose; commit-log ingests are recalled per file instead.
373
+ const deliberate = items
374
+ .filter((i) => {
375
+ const entry = b.getEntry(i.id);
376
+ return !!entry && entrySource(entry) !== 'auto-git';
377
+ })
378
+ .slice(0, BRIEFING_MEMORIES);
379
+ lines.push(`🧠 Lemma is active in ${path.basename(root)}: the Brain holds ${total} ${plural(total, 'memory', 'memories')} for this project.`);
380
+ if (deliberate.length > 0) {
381
+ lines.push('Most recent decisions and fixes:');
382
+ const digest = digestFileHits(b, deliberate, BRIEFING_MEMORIES);
383
+ lines.push(...digest.lines);
384
+ offered = digest.ids;
385
+ }
386
+ }
387
+ lines.push(LEMMA_PLAYBOOK);
388
+ return { text: lines.join('\n'), offered, trigger: 'session' };
389
+ }
390
+ catch {
391
+ return null;
269
392
  }
270
393
  }
271
394
  //# sourceMappingURL=HostRecall.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HostRecall.js","sourceRoot":"","sources":["../../../src/subconscious/HostRecall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HostRecall.js","sourceRoot":"","sources":["../../../src/subconscious/HostRecall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * NarrowEvidence — track the code a memory talks about, not the whole file it lives in.
3
+ *
4
+ * A memory anchored to a whole file goes stale on any edit anywhere in that file. On Lemma's
5
+ * own Brain that was 29 of 38 memories, most of them pointing at hub files (lemma-proxy.ts,
6
+ * init.js, tools.ts) that change daily — so STALE stopped meaning anything and an agent could
7
+ * no longer tell a memory whose subject changed from one whose file merely got longer. The
8
+ * Brain already tracks symbols precisely; callers almost never pass them. A memory usually
9
+ * names what it is about (`stripComments`, `safeResolvePath`, `TheBrainV2.search`), so those
10
+ * names are read out of its text and tracked instead of the file.
11
+ *
12
+ * Two uses:
13
+ * - narrowEvidence: at store/update time, swap a code file for the symbols the text names.
14
+ * - narrowStaleEntry: for a memory already stale on a whole file, prove from git that the
15
+ * named symbols are unchanged since it was stored, and only then re-point it at them.
16
+ */
17
+ import type { BrainEntry, SymbolRef } from './TheBrainV2.js';
18
+ /**
19
+ * Names in prose that look like code: camelCase, PascalCase with a second capital,
20
+ * snake_case, `Class.member`, or anything in backticks. A plain word ("search", "store") is
21
+ * left out even when a method has that name — prose uses it in its ordinary sense.
22
+ */
23
+ export declare function codeIdentifiers(text: string): string[];
24
+ export interface NarrowResult {
25
+ filePaths: string[];
26
+ symbols: SymbolRef[];
27
+ /** Files swapped for symbols, as "file → a, b". Empty when nothing was narrowed. */
28
+ narrowed: string[];
29
+ }
30
+ /**
31
+ * Swap each code file for the symbols `text` names in it. A file the text names nothing in
32
+ * (or that isn't code, or can't be read) stays tracked whole — narrowing only ever replaces
33
+ * a file with something the memory explicitly points at.
34
+ */
35
+ export declare function narrowEvidence(filePaths: string[], text: string, root?: string): NarrowResult;
36
+ /**
37
+ * For a memory stale on whole files: the narrower evidence it can be re-pointed at, or null.
38
+ *
39
+ * Only returned when it is provable that what the memory talks about did not change. For each
40
+ * tracked file that changed, the content the memory was anchored to is recovered from the
41
+ * commit it was stored on — and accepted only if it hashes to exactly the stored hash (an
42
+ * uncommitted edit at store time would make the commit the wrong baseline). Every symbol the
43
+ * memory names in that file must then be textually identical then and now. A file that is
44
+ * unchanged stays tracked whole; anything unprovable leaves the memory stale.
45
+ */
46
+ export declare function narrowStaleEntry(entry: Pick<BrainEntry, 'query' | 'response' | 'fileHashes' | 'symbolHashes' | 'claims' | 'gitCommit'>, root: string): NarrowResult | null;
47
+ //# sourceMappingURL=NarrowEvidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NarrowEvidence.d.ts","sourceRoot":"","sources":["../../../src/subconscious/NarrowEvidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAQ1D;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAUtD;AAqDD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAsB,GAAG,YAAY,CAqB5G;AAkCD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAC,EACtG,IAAI,EAAE,MAAM,GACX,YAAY,GAAG,IAAI,CAqCrB"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * NarrowEvidence — track the code a memory talks about, not the whole file it lives in.
3
+ *
4
+ * A memory anchored to a whole file goes stale on any edit anywhere in that file. On Lemma's
5
+ * own Brain that was 29 of 38 memories, most of them pointing at hub files (lemma-proxy.ts,
6
+ * init.js, tools.ts) that change daily — so STALE stopped meaning anything and an agent could
7
+ * no longer tell a memory whose subject changed from one whose file merely got longer. The
8
+ * Brain already tracks symbols precisely; callers almost never pass them. A memory usually
9
+ * names what it is about (`stripComments`, `safeResolvePath`, `TheBrainV2.search`), so those
10
+ * names are read out of its text and tracked instead of the file.
11
+ *
12
+ * Two uses:
13
+ * - narrowEvidence: at store/update time, swap a code file for the symbols the text names.
14
+ * - narrowStaleEntry: for a memory already stale on a whole file, prove from git that the
15
+ * named symbols are unchanged since it was stored, and only then re-point it at them.
16
+ */
17
+ import fs from 'fs';
18
+ import path from 'path';
19
+ import crypto from 'crypto';
20
+ import { execFileSync } from 'child_process';
21
+ import * as ts from 'typescript';
22
+ import { findOtherLanguageSymbol, supportsOtherLanguage } from '../utils/OtherLanguageSymbols.js';
23
+ const CODE_EXT = /\.(ts|tsx|js|jsx|mjs|cjs|mts|cts)$/i;
24
+ /** A symbol bigger than this share of its file is the file (a class wrapping everything). */
25
+ const MAX_SYMBOL_SHARE = 0.4;
26
+ const MAX_SYMBOLS_PER_FILE = 8;
27
+ /**
28
+ * Names in prose that look like code: camelCase, PascalCase with a second capital,
29
+ * snake_case, `Class.member`, or anything in backticks. A plain word ("search", "store") is
30
+ * left out even when a method has that name — prose uses it in its ordinary sense.
31
+ */
32
+ export function codeIdentifiers(text) {
33
+ const out = new Set();
34
+ for (const m of text.matchAll(/`([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)?)(?:\(\))?`/g))
35
+ out.add(m[1]);
36
+ for (const m of text.matchAll(/(?<![\w$.])([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)?)(?![\w$])/g)) {
37
+ const id = m[1];
38
+ if (id.length < 4)
39
+ continue;
40
+ const codeLike = id.includes('.') || id.includes('_') || /[a-z][A-Z]/.test(id) || /^[A-Z][a-z0-9]+[A-Z]/.test(id);
41
+ if (codeLike)
42
+ out.add(id);
43
+ }
44
+ return [...out];
45
+ }
46
+ function parse(fileName, content) {
47
+ return ts.createSourceFile(fileName, content, ts.ScriptTarget.Latest, true);
48
+ }
49
+ function declName(node) {
50
+ if ((ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node) ||
51
+ ts.isTypeAliasDeclaration(node) || ts.isEnumDeclaration(node)) &&
52
+ node.name) {
53
+ return [node.name.text];
54
+ }
55
+ if (ts.isVariableStatement(node)) {
56
+ return node.declarationList.declarations.flatMap((d) => (ts.isIdentifier(d.name) ? [d.name.text] : []));
57
+ }
58
+ return [];
59
+ }
60
+ /**
61
+ * A declaration at the top of the file, or `Class.member`. Deliberately not the recursive
62
+ * lookup get_symbol_surgical_context uses: that one also finds locals and object properties
63
+ * (`filePath`, `loopId`), which prose names all the time and which are not what a memory is
64
+ * about. For these names both lookups land on the same node, so the hashes agree.
65
+ */
66
+ function findDeclaration(sf, name) {
67
+ const [owner, member] = name.split('.');
68
+ const top = sf.statements.find((st) => declName(st).includes(owner));
69
+ if (!top)
70
+ return null;
71
+ if (!member)
72
+ return top;
73
+ if (!ts.isClassDeclaration(top))
74
+ return null;
75
+ return top.members.find((m) => m.name && ts.isIdentifier(m.name) && m.name.text === member) ?? null;
76
+ }
77
+ /** Text of each named symbol found in `content`, skipping ones as big as the file. */
78
+ function symbolTexts(fileName, content, names) {
79
+ const other = supportsOtherLanguage(fileName);
80
+ const sf = other ? null : parse(fileName, content);
81
+ const found = new Map();
82
+ for (const name of names) {
83
+ const text = other ? findOtherLanguageSymbol(fileName, content, name) : (() => {
84
+ const node = findDeclaration(sf, name);
85
+ return node ? node.getText(sf) : null;
86
+ })();
87
+ if (text === null)
88
+ continue;
89
+ if (text.length > content.length * MAX_SYMBOL_SHARE)
90
+ continue;
91
+ found.set(name, text);
92
+ if (found.size >= MAX_SYMBOLS_PER_FILE)
93
+ break;
94
+ }
95
+ return found;
96
+ }
97
+ /**
98
+ * Swap each code file for the symbols `text` names in it. A file the text names nothing in
99
+ * (or that isn't code, or can't be read) stays tracked whole — narrowing only ever replaces
100
+ * a file with something the memory explicitly points at.
101
+ */
102
+ export function narrowEvidence(filePaths, text, root = process.cwd()) {
103
+ const ids = codeIdentifiers(text);
104
+ const result = { filePaths: [], symbols: [], narrowed: [] };
105
+ for (const fp of filePaths) {
106
+ const abs = path.resolve(root, fp);
107
+ let found = new Map();
108
+ if (ids.length > 0 && (CODE_EXT.test(abs) || supportsOtherLanguage(abs))) {
109
+ try {
110
+ found = symbolTexts(abs, fs.readFileSync(abs, 'utf8'), ids);
111
+ }
112
+ catch {
113
+ // Unreadable: keep the file, whose hash will say MISSING honestly.
114
+ }
115
+ }
116
+ if (found.size === 0) {
117
+ result.filePaths.push(fp);
118
+ continue;
119
+ }
120
+ for (const name of found.keys())
121
+ result.symbols.push({ filePath: fp, symbolName: name });
122
+ result.narrowed.push(`${fp} → ${[...found.keys()].join(', ')}`);
123
+ }
124
+ return result;
125
+ }
126
+ function git(root, args) {
127
+ try {
128
+ return execFileSync('git', ['-C', root, ...args], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], maxBuffer: 32 * 1024 * 1024 });
129
+ }
130
+ catch {
131
+ return null;
132
+ }
133
+ }
134
+ const sha256 = (s) => crypto.createHash('sha256').update(s).digest('hex');
135
+ /** Commits after the store commit searched for the anchored content. */
136
+ const MAX_BASELINE_COMMITS = 20;
137
+ /**
138
+ * The file as the memory was anchored to it. Usually that is the store commit, but a memory is
139
+ * often stored right after a fix and before it is committed — then the anchored content is in
140
+ * a later commit (the fix itself). Accepted only on an exact hash match either way.
141
+ */
142
+ function baselineContent(top, commit, rel, storedHash) {
143
+ const at = git(top, ['show', `${commit}:${rel}`]);
144
+ if (at !== null && sha256(at) === storedHash)
145
+ return at;
146
+ const later = (git(top, ['log', '--reverse', '--format=%H', `${commit}..HEAD`, '--', rel]) || '')
147
+ .split('\n')
148
+ .filter(Boolean)
149
+ .slice(0, MAX_BASELINE_COMMITS);
150
+ for (const c of later) {
151
+ const content = git(top, ['show', `${c}:${rel}`]);
152
+ if (content !== null && sha256(content) === storedHash)
153
+ return content;
154
+ }
155
+ return null;
156
+ }
157
+ /**
158
+ * For a memory stale on whole files: the narrower evidence it can be re-pointed at, or null.
159
+ *
160
+ * Only returned when it is provable that what the memory talks about did not change. For each
161
+ * tracked file that changed, the content the memory was anchored to is recovered from the
162
+ * commit it was stored on — and accepted only if it hashes to exactly the stored hash (an
163
+ * uncommitted edit at store time would make the commit the wrong baseline). Every symbol the
164
+ * memory names in that file must then be textually identical then and now. A file that is
165
+ * unchanged stays tracked whole; anything unprovable leaves the memory stale.
166
+ */
167
+ export function narrowStaleEntry(entry, root) {
168
+ if (!entry.fileHashes || !entry.gitCommit || (entry.claims && entry.claims.length > 0))
169
+ return null;
170
+ const top = git(root, ['rev-parse', '--show-toplevel'])?.trim();
171
+ if (!top)
172
+ return null;
173
+ const ids = codeIdentifiers(`${entry.query}\n${entry.response}`);
174
+ const rel = (abs) => path.relative(root, abs);
175
+ const result = { filePaths: [], symbols: [], narrowed: [] };
176
+ for (const [abs, storedHash] of Object.entries(entry.fileHashes)) {
177
+ let now;
178
+ try {
179
+ now = fs.readFileSync(abs, 'utf8');
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ if (sha256(now) === storedHash) {
185
+ result.filePaths.push(rel(abs));
186
+ continue;
187
+ }
188
+ if (!(CODE_EXT.test(abs) || supportsOtherLanguage(abs)) || ids.length === 0)
189
+ return null;
190
+ const then = baselineContent(top, entry.gitCommit, path.relative(top, abs), storedHash);
191
+ if (then === null)
192
+ return null;
193
+ const before = symbolTexts(abs, then, ids);
194
+ if (before.size === 0)
195
+ return null;
196
+ const after = symbolTexts(abs, now, [...before.keys()]);
197
+ for (const [name, text] of before)
198
+ if (after.get(name) !== text)
199
+ return null;
200
+ for (const name of before.keys())
201
+ result.symbols.push({ filePath: rel(abs), symbolName: name });
202
+ result.narrowed.push(`${rel(abs)} → ${[...before.keys()].join(', ')}`);
203
+ }
204
+ // Symbols it already tracked are kept as they are.
205
+ for (const key of Object.keys(entry.symbolHashes || {})) {
206
+ const sep = key.lastIndexOf('::');
207
+ result.symbols.push({ filePath: rel(key.substring(0, sep)), symbolName: key.substring(sep + 2) });
208
+ }
209
+ return result.narrowed.length > 0 ? result : null;
210
+ }
211
+ //# sourceMappingURL=NarrowEvidence.js.map