@nxuss/lemma 1.38.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 (271) hide show
  1. package/README.md +3 -4
  2. package/bin/brain-ingest.js +68 -31
  3. package/bin/init.js +25 -28
  4. package/dashboard/dist/assets/index-DNTQXLER.css +1 -0
  5. package/dashboard/dist/assets/index-DzL_Zu3m.js +452 -0
  6. package/dashboard/dist/index.html +2 -2
  7. package/dist/cjs/cli/gitHooks.d.ts +9 -2
  8. package/dist/cjs/cli/gitHooks.d.ts.map +1 -1
  9. package/dist/cjs/cli/gitHooks.js +31 -4
  10. package/dist/cjs/cli/gitHooks.js.map +1 -1
  11. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  12. package/dist/cjs/cli/lemma-proxy.js +21 -1
  13. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  14. package/dist/cjs/infra/analyzers/index.d.ts +0 -2
  15. package/dist/cjs/infra/analyzers/index.d.ts.map +1 -1
  16. package/dist/cjs/infra/analyzers/index.js +1 -6
  17. package/dist/cjs/infra/analyzers/index.js.map +1 -1
  18. package/dist/cjs/infra/cli.d.ts +4 -0
  19. package/dist/cjs/infra/cli.d.ts.map +1 -1
  20. package/dist/cjs/infra/cli.js +6 -199
  21. package/dist/cjs/infra/cli.js.map +1 -1
  22. package/dist/cjs/infra/index.d.ts +1 -3
  23. package/dist/cjs/infra/index.d.ts.map +1 -1
  24. package/dist/cjs/infra/index.js +1 -16
  25. package/dist/cjs/infra/index.js.map +1 -1
  26. package/dist/cjs/infra/mcp-tools.d.ts.map +1 -1
  27. package/dist/cjs/infra/mcp-tools.js +8 -453
  28. package/dist/cjs/infra/mcp-tools.js.map +1 -1
  29. package/dist/cjs/infra/types.d.ts +0 -101
  30. package/dist/cjs/infra/types.d.ts.map +1 -1
  31. package/dist/cjs/infra/types.js +2 -1
  32. package/dist/cjs/infra/types.js.map +1 -1
  33. package/dist/cjs/mcp/prompts.d.ts +1 -1
  34. package/dist/cjs/mcp/prompts.d.ts.map +1 -1
  35. package/dist/cjs/mcp/prompts.js +8 -23
  36. package/dist/cjs/mcp/prompts.js.map +1 -1
  37. package/dist/cjs/mcp/tool-profiles.d.ts +8 -3
  38. package/dist/cjs/mcp/tool-profiles.d.ts.map +1 -1
  39. package/dist/cjs/mcp/tool-profiles.js +25 -54
  40. package/dist/cjs/mcp/tool-profiles.js.map +1 -1
  41. package/dist/cjs/mcp/tools/memory.d.ts +8 -0
  42. package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
  43. package/dist/cjs/mcp/tools/memory.js +154 -125
  44. package/dist/cjs/mcp/tools/memory.js.map +1 -1
  45. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  46. package/dist/cjs/mcp/tools.js +11 -6
  47. package/dist/cjs/mcp/tools.js.map +1 -1
  48. package/dist/cjs/mcp/workspaceShared.d.ts.map +1 -1
  49. package/dist/cjs/mcp/workspaceShared.js +8 -4
  50. package/dist/cjs/mcp/workspaceShared.js.map +1 -1
  51. package/dist/cjs/proxy/ProjectRegistry.d.ts +20 -0
  52. package/dist/cjs/proxy/ProjectRegistry.d.ts.map +1 -1
  53. package/dist/cjs/proxy/ProjectRegistry.js +46 -4
  54. package/dist/cjs/proxy/ProjectRegistry.js.map +1 -1
  55. package/dist/cjs/subconscious/HostRecall.d.ts +26 -2
  56. package/dist/cjs/subconscious/HostRecall.d.ts.map +1 -1
  57. package/dist/cjs/subconscious/HostRecall.js +101 -36
  58. package/dist/cjs/subconscious/HostRecall.js.map +1 -1
  59. package/dist/cjs/subconscious/NarrowEvidence.d.ts +47 -0
  60. package/dist/cjs/subconscious/NarrowEvidence.d.ts.map +1 -0
  61. package/dist/cjs/subconscious/NarrowEvidence.js +252 -0
  62. package/dist/cjs/subconscious/NarrowEvidence.js.map +1 -0
  63. package/dist/cjs/subconscious/TheBrainV2.d.ts +37 -0
  64. package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
  65. package/dist/cjs/subconscious/TheBrainV2.js +147 -15
  66. package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
  67. package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
  68. package/dist/cjs/subconscious/freshness/LocalFsResolver.js +17 -0
  69. package/dist/cjs/subconscious/freshness/LocalFsResolver.js.map +1 -1
  70. package/dist/cjs/subconscious/recallDigest.d.ts +8 -0
  71. package/dist/cjs/subconscious/recallDigest.d.ts.map +1 -1
  72. package/dist/cjs/subconscious/recallDigest.js +13 -1
  73. package/dist/cjs/subconscious/recallDigest.js.map +1 -1
  74. package/dist/cjs/utils/OtherLanguageSymbols.d.ts +31 -0
  75. package/dist/cjs/utils/OtherLanguageSymbols.d.ts.map +1 -0
  76. package/dist/cjs/utils/OtherLanguageSymbols.js +283 -0
  77. package/dist/cjs/utils/OtherLanguageSymbols.js.map +1 -0
  78. package/dist/cjs/utils/SavingsLedger.d.ts +27 -0
  79. package/dist/cjs/utils/SavingsLedger.d.ts.map +1 -1
  80. package/dist/cjs/utils/SavingsLedger.js +51 -0
  81. package/dist/cjs/utils/SavingsLedger.js.map +1 -1
  82. package/dist/cjs/utils/StoreDraft.d.ts +12 -0
  83. package/dist/cjs/utils/StoreDraft.d.ts.map +1 -1
  84. package/dist/cjs/utils/StoreDraft.js +53 -1
  85. package/dist/cjs/utils/StoreDraft.js.map +1 -1
  86. package/dist/cjs/utils/SymbolSurgicalContext.d.ts +2 -0
  87. package/dist/cjs/utils/SymbolSurgicalContext.d.ts.map +1 -1
  88. package/dist/cjs/utils/SymbolSurgicalContext.js +1 -0
  89. package/dist/cjs/utils/SymbolSurgicalContext.js.map +1 -1
  90. package/dist/cjs/utils/reportSavings.d.ts +17 -4
  91. package/dist/cjs/utils/reportSavings.d.ts.map +1 -1
  92. package/dist/cjs/utils/reportSavings.js +67 -22
  93. package/dist/cjs/utils/reportSavings.js.map +1 -1
  94. package/dist/esm/cli/gitHooks.d.ts +9 -2
  95. package/dist/esm/cli/gitHooks.d.ts.map +1 -1
  96. package/dist/esm/cli/gitHooks.js +31 -4
  97. package/dist/esm/cli/gitHooks.js.map +1 -1
  98. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  99. package/dist/esm/cli/lemma-proxy.js +21 -1
  100. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  101. package/dist/esm/infra/analyzers/index.d.ts +0 -2
  102. package/dist/esm/infra/analyzers/index.d.ts.map +1 -1
  103. package/dist/esm/infra/analyzers/index.js +0 -2
  104. package/dist/esm/infra/analyzers/index.js.map +1 -1
  105. package/dist/esm/infra/cli.d.ts +4 -0
  106. package/dist/esm/infra/cli.d.ts.map +1 -1
  107. package/dist/esm/infra/cli.js +6 -199
  108. package/dist/esm/infra/cli.js.map +1 -1
  109. package/dist/esm/infra/index.d.ts +1 -3
  110. package/dist/esm/infra/index.d.ts.map +1 -1
  111. package/dist/esm/infra/index.js +1 -3
  112. package/dist/esm/infra/index.js.map +1 -1
  113. package/dist/esm/infra/mcp-tools.d.ts.map +1 -1
  114. package/dist/esm/infra/mcp-tools.js +9 -454
  115. package/dist/esm/infra/mcp-tools.js.map +1 -1
  116. package/dist/esm/infra/types.d.ts +0 -101
  117. package/dist/esm/infra/types.d.ts.map +1 -1
  118. package/dist/esm/infra/types.js +2 -1
  119. package/dist/esm/infra/types.js.map +1 -1
  120. package/dist/esm/mcp/prompts.d.ts +1 -1
  121. package/dist/esm/mcp/prompts.d.ts.map +1 -1
  122. package/dist/esm/mcp/prompts.js +8 -23
  123. package/dist/esm/mcp/prompts.js.map +1 -1
  124. package/dist/esm/mcp/tool-profiles.d.ts +8 -3
  125. package/dist/esm/mcp/tool-profiles.d.ts.map +1 -1
  126. package/dist/esm/mcp/tool-profiles.js +25 -54
  127. package/dist/esm/mcp/tool-profiles.js.map +1 -1
  128. package/dist/esm/mcp/tools/memory.d.ts +8 -0
  129. package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
  130. package/dist/esm/mcp/tools/memory.js +156 -128
  131. package/dist/esm/mcp/tools/memory.js.map +1 -1
  132. package/dist/esm/mcp/tools.d.ts.map +1 -1
  133. package/dist/esm/mcp/tools.js +12 -7
  134. package/dist/esm/mcp/tools.js.map +1 -1
  135. package/dist/esm/mcp/workspaceShared.d.ts.map +1 -1
  136. package/dist/esm/mcp/workspaceShared.js +9 -5
  137. package/dist/esm/mcp/workspaceShared.js.map +1 -1
  138. package/dist/esm/proxy/ProjectRegistry.d.ts +20 -0
  139. package/dist/esm/proxy/ProjectRegistry.d.ts.map +1 -1
  140. package/dist/esm/proxy/ProjectRegistry.js +45 -3
  141. package/dist/esm/proxy/ProjectRegistry.js.map +1 -1
  142. package/dist/esm/subconscious/HostRecall.d.ts +26 -2
  143. package/dist/esm/subconscious/HostRecall.d.ts.map +1 -1
  144. package/dist/esm/subconscious/HostRecall.js +99 -37
  145. package/dist/esm/subconscious/HostRecall.js.map +1 -1
  146. package/dist/esm/subconscious/NarrowEvidence.d.ts +47 -0
  147. package/dist/esm/subconscious/NarrowEvidence.d.ts.map +1 -0
  148. package/dist/esm/subconscious/NarrowEvidence.js +211 -0
  149. package/dist/esm/subconscious/NarrowEvidence.js.map +1 -0
  150. package/dist/esm/subconscious/TheBrainV2.d.ts +37 -0
  151. package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
  152. package/dist/esm/subconscious/TheBrainV2.js +146 -14
  153. package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
  154. package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
  155. package/dist/esm/subconscious/freshness/LocalFsResolver.js +17 -0
  156. package/dist/esm/subconscious/freshness/LocalFsResolver.js.map +1 -1
  157. package/dist/esm/subconscious/recallDigest.d.ts +8 -0
  158. package/dist/esm/subconscious/recallDigest.d.ts.map +1 -1
  159. package/dist/esm/subconscious/recallDigest.js +12 -1
  160. package/dist/esm/subconscious/recallDigest.js.map +1 -1
  161. package/dist/esm/utils/OtherLanguageSymbols.d.ts +31 -0
  162. package/dist/esm/utils/OtherLanguageSymbols.d.ts.map +1 -0
  163. package/dist/esm/utils/OtherLanguageSymbols.js +275 -0
  164. package/dist/esm/utils/OtherLanguageSymbols.js.map +1 -0
  165. package/dist/esm/utils/SavingsLedger.d.ts +27 -0
  166. package/dist/esm/utils/SavingsLedger.d.ts.map +1 -1
  167. package/dist/esm/utils/SavingsLedger.js +51 -0
  168. package/dist/esm/utils/SavingsLedger.js.map +1 -1
  169. package/dist/esm/utils/StoreDraft.d.ts +12 -0
  170. package/dist/esm/utils/StoreDraft.d.ts.map +1 -1
  171. package/dist/esm/utils/StoreDraft.js +52 -1
  172. package/dist/esm/utils/StoreDraft.js.map +1 -1
  173. package/dist/esm/utils/SymbolSurgicalContext.d.ts +2 -0
  174. package/dist/esm/utils/SymbolSurgicalContext.d.ts.map +1 -1
  175. package/dist/esm/utils/SymbolSurgicalContext.js +1 -1
  176. package/dist/esm/utils/SymbolSurgicalContext.js.map +1 -1
  177. package/dist/esm/utils/reportSavings.d.ts +17 -4
  178. package/dist/esm/utils/reportSavings.d.ts.map +1 -1
  179. package/dist/esm/utils/reportSavings.js +65 -22
  180. package/dist/esm/utils/reportSavings.js.map +1 -1
  181. package/package.json +2 -1
  182. package/dashboard/dist/assets/index-CLXWgzTm.css +0 -1
  183. package/dashboard/dist/assets/index-CoMIMxyC.js +0 -451
  184. package/dist/cjs/infra/analyzers/DriftDetector.d.ts +0 -4
  185. package/dist/cjs/infra/analyzers/DriftDetector.d.ts.map +0 -1
  186. package/dist/cjs/infra/analyzers/DriftDetector.js +0 -88
  187. package/dist/cjs/infra/analyzers/DriftDetector.js.map +0 -1
  188. package/dist/cjs/infra/analyzers/InfraAnalyzer.d.ts +0 -3
  189. package/dist/cjs/infra/analyzers/InfraAnalyzer.d.ts.map +0 -1
  190. package/dist/cjs/infra/analyzers/InfraAnalyzer.js +0 -73
  191. package/dist/cjs/infra/analyzers/InfraAnalyzer.js.map +0 -1
  192. package/dist/cjs/infra/config.d.ts +0 -17
  193. package/dist/cjs/infra/config.d.ts.map +0 -1
  194. package/dist/cjs/infra/config.js +0 -111
  195. package/dist/cjs/infra/config.js.map +0 -1
  196. package/dist/cjs/infra/errorCause.d.ts +0 -36
  197. package/dist/cjs/infra/errorCause.d.ts.map +0 -1
  198. package/dist/cjs/infra/errorCause.js +0 -143
  199. package/dist/cjs/infra/errorCause.js.map +0 -1
  200. package/dist/cjs/infra/providers/InfraProvider.d.ts +0 -9
  201. package/dist/cjs/infra/providers/InfraProvider.d.ts.map +0 -1
  202. package/dist/cjs/infra/providers/InfraProvider.js +0 -3
  203. package/dist/cjs/infra/providers/InfraProvider.js.map +0 -1
  204. package/dist/cjs/infra/providers/JenkinsProvider.d.ts +0 -16
  205. package/dist/cjs/infra/providers/JenkinsProvider.d.ts.map +0 -1
  206. package/dist/cjs/infra/providers/JenkinsProvider.js +0 -193
  207. package/dist/cjs/infra/providers/JenkinsProvider.js.map +0 -1
  208. package/dist/cjs/infra/providers/OKDProvider.d.ts +0 -24
  209. package/dist/cjs/infra/providers/OKDProvider.d.ts.map +0 -1
  210. package/dist/cjs/infra/providers/OKDProvider.js +0 -296
  211. package/dist/cjs/infra/providers/OKDProvider.js.map +0 -1
  212. package/dist/cjs/infra/providers/TerraformProvider.d.ts +0 -17
  213. package/dist/cjs/infra/providers/TerraformProvider.d.ts.map +0 -1
  214. package/dist/cjs/infra/providers/TerraformProvider.js +0 -111
  215. package/dist/cjs/infra/providers/TerraformProvider.js.map +0 -1
  216. package/dist/cjs/infra/providers/index.d.ts +0 -9
  217. package/dist/cjs/infra/providers/index.d.ts.map +0 -1
  218. package/dist/cjs/infra/providers/index.js +0 -34
  219. package/dist/cjs/infra/providers/index.js.map +0 -1
  220. package/dist/cjs/infra/templates/jenkins/index.d.ts +0 -15
  221. package/dist/cjs/infra/templates/jenkins/index.d.ts.map +0 -1
  222. package/dist/cjs/infra/templates/jenkins/index.js +0 -128
  223. package/dist/cjs/infra/templates/jenkins/index.js.map +0 -1
  224. package/dist/cjs/infra/templates/okd/index.d.ts +0 -31
  225. package/dist/cjs/infra/templates/okd/index.d.ts.map +0 -1
  226. package/dist/cjs/infra/templates/okd/index.js +0 -149
  227. package/dist/cjs/infra/templates/okd/index.js.map +0 -1
  228. package/dist/esm/infra/analyzers/DriftDetector.d.ts +0 -4
  229. package/dist/esm/infra/analyzers/DriftDetector.d.ts.map +0 -1
  230. package/dist/esm/infra/analyzers/DriftDetector.js +0 -84
  231. package/dist/esm/infra/analyzers/DriftDetector.js.map +0 -1
  232. package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts +0 -3
  233. package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts.map +0 -1
  234. package/dist/esm/infra/analyzers/InfraAnalyzer.js +0 -70
  235. package/dist/esm/infra/analyzers/InfraAnalyzer.js.map +0 -1
  236. package/dist/esm/infra/config.d.ts +0 -17
  237. package/dist/esm/infra/config.d.ts.map +0 -1
  238. package/dist/esm/infra/config.js +0 -101
  239. package/dist/esm/infra/config.js.map +0 -1
  240. package/dist/esm/infra/errorCause.d.ts +0 -36
  241. package/dist/esm/infra/errorCause.d.ts.map +0 -1
  242. package/dist/esm/infra/errorCause.js +0 -138
  243. package/dist/esm/infra/errorCause.js.map +0 -1
  244. package/dist/esm/infra/providers/InfraProvider.d.ts +0 -9
  245. package/dist/esm/infra/providers/InfraProvider.d.ts.map +0 -1
  246. package/dist/esm/infra/providers/InfraProvider.js +0 -2
  247. package/dist/esm/infra/providers/InfraProvider.js.map +0 -1
  248. package/dist/esm/infra/providers/JenkinsProvider.d.ts +0 -16
  249. package/dist/esm/infra/providers/JenkinsProvider.d.ts.map +0 -1
  250. package/dist/esm/infra/providers/JenkinsProvider.js +0 -186
  251. package/dist/esm/infra/providers/JenkinsProvider.js.map +0 -1
  252. package/dist/esm/infra/providers/OKDProvider.d.ts +0 -24
  253. package/dist/esm/infra/providers/OKDProvider.d.ts.map +0 -1
  254. package/dist/esm/infra/providers/OKDProvider.js +0 -292
  255. package/dist/esm/infra/providers/OKDProvider.js.map +0 -1
  256. package/dist/esm/infra/providers/TerraformProvider.d.ts +0 -17
  257. package/dist/esm/infra/providers/TerraformProvider.d.ts.map +0 -1
  258. package/dist/esm/infra/providers/TerraformProvider.js +0 -107
  259. package/dist/esm/infra/providers/TerraformProvider.js.map +0 -1
  260. package/dist/esm/infra/providers/index.d.ts +0 -9
  261. package/dist/esm/infra/providers/index.d.ts.map +0 -1
  262. package/dist/esm/infra/providers/index.js +0 -27
  263. package/dist/esm/infra/providers/index.js.map +0 -1
  264. package/dist/esm/infra/templates/jenkins/index.d.ts +0 -15
  265. package/dist/esm/infra/templates/jenkins/index.d.ts.map +0 -1
  266. package/dist/esm/infra/templates/jenkins/index.js +0 -124
  267. package/dist/esm/infra/templates/jenkins/index.js.map +0 -1
  268. package/dist/esm/infra/templates/okd/index.d.ts +0 -31
  269. package/dist/esm/infra/templates/okd/index.d.ts.map +0 -1
  270. package/dist/esm/infra/templates/okd/index.js +0 -142
  271. package/dist/esm/infra/templates/okd/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"LocalFsResolver.js","sourceRoot":"","sources":["../../../../src/subconscious/freshness/LocalFsResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAKpG,MAAM,OAAO,eAAe;IAU1B,YAAY,UAAkB,OAAO,CAAC,GAAG,EAAE;QATlC,SAAI,GAAG,GAAG,CAAC;QAEpB,oFAAoF;QACpF,mFAAmF;QACnF,oFAAoF;QACpF,sFAAsF;QACtF,oEAAoE;QAC5D,cAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;QAGpD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,gGAAgG;IACxF,WAAW,CAAC,CAAS;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC3E,OAAO,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5F,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,UAAU,CAAC,OAAe,EAAE,UAAkB;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;YACxF,OAAO;gBACL,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACzE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aACxG,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;CACF;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"LocalFsResolver.js","sourceRoot":"","sources":["../../../../src/subconscious/freshness/LocalFsResolver.ts"],"names":[],"mappings":"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"}
@@ -19,8 +19,16 @@ export interface FileDigest {
19
19
  total: number;
20
20
  /** One "• id (fresh, 3d ago): headline" line per memory shown, most relevant first. */
21
21
  lines: string[];
22
+ /** The ids those lines name — what the note actually offered the agent. */
23
+ ids: string[];
22
24
  failedCount: number;
23
25
  }
26
+ /**
27
+ * The hits worth naming in a note: commit-log ingests are dropped. They restate `git log`, and on
28
+ * a hub file they were most of the list — Lemma's own repo held 295 of them, recalled twice in
29
+ * total, and a file with no deliberate memory got a note made only of them.
30
+ */
31
+ export declare function recallableHits<T extends DigestHit>(brain: TheBrainV2, hits: T[]): T[];
24
32
  /**
25
33
  * Relevance without a query to rank against: a failed approach first (repeating it is the
26
34
  * costliest mistake), then memories someone wrote on purpose over commit-log ingests (a hub
@@ -1 +1 @@
1
- {"version":3,"file":"recallDigest.d.ts","sourceRoot":"","sources":["../../../src/subconscious/recallDigest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAG5D;;;;;;;;;GASG;AAEH,eAAO,MAAM,UAAU,IAAI,CAAC;AAG5B,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAOD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAoB9E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,SAAa,GAAG,UAAU,CAkBjG;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAY5E"}
1
+ {"version":3,"file":"recallDigest.d.ts","sourceRoot":"","sources":["../../../src/subconscious/recallDigest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAG5D;;;;;;;;;GASG;AAEH,eAAO,MAAM,UAAU,IAAI,CAAC;AAG5B,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,2EAA2E;IAC3E,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAOD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAKrF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAoB9E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,SAAa,GAAG,UAAU,CAkBjG;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAY5E"}
@@ -16,6 +16,17 @@ function headline(query) {
16
16
  const q = query.replace(/\s+/g, ' ').trim();
17
17
  return q.length > HEADLINE_MAX ? `${q.slice(0, HEADLINE_MAX - 1)}…` : q;
18
18
  }
19
+ /**
20
+ * The hits worth naming in a note: commit-log ingests are dropped. They restate `git log`, and on
21
+ * a hub file they were most of the list — Lemma's own repo held 295 of them, recalled twice in
22
+ * total, and a file with no deliberate memory got a note made only of them.
23
+ */
24
+ export function recallableHits(brain, hits) {
25
+ return hits.filter((h) => {
26
+ const entry = brain.getEntry(h.id);
27
+ return !entry || entrySource(entry) !== 'auto-git';
28
+ });
29
+ }
19
30
  /**
20
31
  * Relevance without a query to rank against: a failed approach first (repeating it is the
21
32
  * costliest mistake), then memories someone wrote on purpose over commit-log ingests (a hub
@@ -59,7 +70,7 @@ export function digestFileHits(brain, hits, max = DIGEST_MAX) {
59
70
  const failed = h.outcome === 'failed' ? ', FAILED approach' : '';
60
71
  return ` • ${h.id} (${verdict}, ${age}${failed}): ${headline(h.query)}`;
61
72
  });
62
- return { total: hits.length, lines, failedCount: hits.filter((h) => h.outcome === 'failed').length };
73
+ return { total: hits.length, lines, ids: top.map((h) => h.id), failedCount: hits.filter((h) => h.outcome === 'failed').length };
63
74
  }
64
75
  /** The full note: header, the digest lines, and what to do with them. */
65
76
  export function formatFileDigest(subject, digest) {
@@ -1 +1 @@
1
- {"version":3,"file":"recallDigest.js","sourceRoot":"","sources":["../../../src/subconscious/recallDigest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recallDigest.js","sourceRoot":"","sources":["../../../src/subconscious/recallDigest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Symbol lookup for languages the TypeScript compiler cannot parse.
3
+ *
4
+ * Freshness tracks the symbols a memory names instead of the whole file, so an edit elsewhere
5
+ * in the file does not make the memory STALE. That only worked for .ts/.js: in a Python, Go or
6
+ * Java project every memory tracked a whole file and went STALE on any edit to it, which is
7
+ * exactly the noise symbol tracking exists to remove.
8
+ *
9
+ * This is a declaration locator, not a parser. It finds where a named function/class/method
10
+ * starts and where its block ends (indentation for Python and Ruby, brace depth for the rest).
11
+ * It is deliberately conservative in both directions the Brain cares about:
12
+ * - a name it cannot find, or finds in more than one place, returns null — the caller then
13
+ * tracks the whole file, which can only be too sensitive, never blind;
14
+ * - comments are stripped only where a scanner that tracks string literals is sure they are
15
+ * comments, so a `#` or `//` inside a string is never mistaken for one. Treating a code
16
+ * change as cosmetic would stamp "fresh" on a memory whose subject changed.
17
+ */
18
+ export declare function supportsOtherLanguage(filePath: string): boolean;
19
+ /**
20
+ * The source text of the named declaration, or null when it is absent or ambiguous.
21
+ * `Class.member` looks the member up inside the class's own block.
22
+ */
23
+ export declare function findOtherLanguageSymbol(filePath: string, source: string, name: string): string | null;
24
+ /**
25
+ * The declaration with comments dropped and whitespace collapsed, for the cosmetic-vs-real
26
+ * change test. Python keeps each line's indentation because it is syntax there; everything
27
+ * else collapses to one token stream. Anything the scanner is unsure about stays in, so the
28
+ * worst outcome is a cosmetic edit reported as a change, never a change reported as cosmetic.
29
+ */
30
+ export declare function normalizeOtherLanguage(filePath: string, source: string): string;
31
+ //# sourceMappingURL=OtherLanguageSymbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtherLanguageSymbols.d.ts","sourceRoot":"","sources":["../../../src/utils/OtherLanguageSymbols.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA2DH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/D;AAWD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAarG;AAuGD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA8C/E"}
@@ -0,0 +1,275 @@
1
+ /**
2
+ * Symbol lookup for languages the TypeScript compiler cannot parse.
3
+ *
4
+ * Freshness tracks the symbols a memory names instead of the whole file, so an edit elsewhere
5
+ * in the file does not make the memory STALE. That only worked for .ts/.js: in a Python, Go or
6
+ * Java project every memory tracked a whole file and went STALE on any edit to it, which is
7
+ * exactly the noise symbol tracking exists to remove.
8
+ *
9
+ * This is a declaration locator, not a parser. It finds where a named function/class/method
10
+ * starts and where its block ends (indentation for Python and Ruby, brace depth for the rest).
11
+ * It is deliberately conservative in both directions the Brain cares about:
12
+ * - a name it cannot find, or finds in more than one place, returns null — the caller then
13
+ * tracks the whole file, which can only be too sensitive, never blind;
14
+ * - comments are stripped only where a scanner that tracks string literals is sure they are
15
+ * comments, so a `#` or `//` inside a string is never mistaken for one. Treating a code
16
+ * change as cosmetic would stamp "fresh" on a memory whose subject changed.
17
+ */
18
+ import path from 'path';
19
+ const C_LIKE_COMMENTS = { lineComment: ['//'], blockComment: ['/*', '*/'] };
20
+ const LANGS = {
21
+ '.py': {
22
+ style: 'indent',
23
+ decl: ['^(\\s*)(?:async\\s+)?(?:def|class)\\s+$NAME\\b'],
24
+ lineComment: ['#'],
25
+ quotes: ['"""', "'''", '"', "'"],
26
+ },
27
+ '.rb': {
28
+ style: 'ruby',
29
+ decl: ['^(\\s*)(?:def|class|module)\\s+(?:self\\.)?$NAME\\b'],
30
+ lineComment: ['#'],
31
+ quotes: ['"', "'"],
32
+ },
33
+ '.go': {
34
+ style: 'braces',
35
+ decl: ['^(\\s*)func\\s+(?:\\([^)]*\\)\\s*)?$NAME\\s*[(\\[]', '^(\\s*)type\\s+$NAME\\b'],
36
+ ...C_LIKE_COMMENTS,
37
+ quotes: ['`', '"', "'"],
38
+ },
39
+ '.rs': {
40
+ style: 'braces',
41
+ decl: ['^(\\s*)(?:pub(?:\\([^)]*\\))?\\s+)?(?:async\\s+)?(?:unsafe\\s+)?(?:fn|struct|enum|trait)\\s+$NAME\\b'],
42
+ ...C_LIKE_COMMENTS,
43
+ quotes: ['"', "'"],
44
+ },
45
+ // Java/Kotlin/C#/PHP/Swift: a method or class declaration — modifiers and a return type, then
46
+ // the name and an opening paren or brace. A call such as `foo(x);` has no brace and no type.
47
+ '.java': { style: 'braces', decl: braceDecl(), ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
48
+ '.kt': { style: 'braces', decl: ['^(\\s*)(?:[\\w@]+\\s+)*(?:fun|class|object|interface)\\s+(?:<[^>]*>\\s*)?$NAME\\b'], ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
49
+ '.cs': { style: 'braces', decl: braceDecl(), ...C_LIKE_COMMENTS, quotes: ['"', "'"] },
50
+ '.php': { style: 'braces', decl: ['^(\\s*)(?:(?:public|private|protected|static|abstract|final)\\s+)*(?:function|class|interface|trait)\\s+&?$NAME\\b'], ...C_LIKE_COMMENTS, lineComment: ['//', '#'], quotes: ['"', "'"] },
51
+ '.swift': { style: 'braces', decl: ['^(\\s*)(?:[\\w@]+\\s+)*(?:func|class|struct|enum|protocol)\\s+$NAME\\b'], ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
52
+ };
53
+ function braceDecl() {
54
+ return [
55
+ '^(\\s*)(?:(?:public|private|protected|internal|static|final|abstract|virtual|override|async|sealed|partial)\\s+)*(?:class|interface|enum|record|struct)\\s+$NAME\\b',
56
+ '^(\\s*)(?:(?:public|private|protected|internal|static|final|abstract|virtual|override|async|synchronized)\\s+)+[\\w<>\\[\\],.?\\s]+?\\s$NAME\\s*\\(',
57
+ ];
58
+ }
59
+ export function supportsOtherLanguage(filePath) {
60
+ return path.extname(filePath).toLowerCase() in LANGS;
61
+ }
62
+ const escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
63
+ /** Index of the first line at or after `from` whose text is not blank. */
64
+ function nextCodeLine(lines, from) {
65
+ let i = from;
66
+ while (i < lines.length && lines[i].trim() === '')
67
+ i++;
68
+ return i;
69
+ }
70
+ /**
71
+ * The source text of the named declaration, or null when it is absent or ambiguous.
72
+ * `Class.member` looks the member up inside the class's own block.
73
+ */
74
+ export function findOtherLanguageSymbol(filePath, source, name) {
75
+ const lang = LANGS[path.extname(filePath).toLowerCase()];
76
+ if (!lang)
77
+ return null;
78
+ const [owner, member] = name.split('.');
79
+ if (name.split('.').length > 2)
80
+ return null;
81
+ const lines = source.split(/\r?\n/);
82
+ const ownerBlock = locate(lang, lines, 0, lines.length, owner, true);
83
+ if (!ownerBlock)
84
+ return null;
85
+ if (!member)
86
+ return lines.slice(ownerBlock.start, ownerBlock.end).join('\n');
87
+ // The member must sit inside the owner's block; the owner line itself is not searched.
88
+ const inner = locate(lang, lines, ownerBlock.start + 1, ownerBlock.end, member, false);
89
+ return inner ? lines.slice(inner.start, inner.end).join('\n') : null;
90
+ }
91
+ function locate(lang, lines, from, to, name, topLevelOnly) {
92
+ const patterns = lang.decl.map((d) => new RegExp(d.replace(/\$NAME/g, escapeRe(name))));
93
+ const hits = [];
94
+ for (let i = from; i < to; i++) {
95
+ for (const re of patterns) {
96
+ const m = re.exec(lines[i]);
97
+ if (m) {
98
+ hits.push({ line: i, indent: m[1].length });
99
+ break;
100
+ }
101
+ }
102
+ }
103
+ // Ambiguous (an overload, a redefinition, a nested helper of the same name): do not guess.
104
+ // For a top-level lookup, only the least-indented hit counts, so a method with the same name
105
+ // as a function does not make the function unfindable.
106
+ const pool = topLevelOnly && hits.length > 1 ? hits.filter((h) => h.indent === Math.min(...hits.map((x) => x.indent))) : hits;
107
+ if (pool.length !== 1)
108
+ return null;
109
+ const { line, indent } = pool[0];
110
+ const end = blockEnd(lang, lines, line, indent, to);
111
+ if (end === null)
112
+ return null;
113
+ // A decorator or annotation directly above belongs to the declaration.
114
+ let start = line;
115
+ while (start > from && /^\s*(@\w|#\[)/.test(lines[start - 1]))
116
+ start--;
117
+ return { start, end };
118
+ }
119
+ function blockEnd(lang, lines, line, indent, limit) {
120
+ if (lang.style === 'indent') {
121
+ // The block is every following line indented deeper than the declaration (blank lines
122
+ // inside it included); a continuation of a multi-line signature is deeper too.
123
+ let end = line + 1;
124
+ for (let i = line + 1; i < limit; i++) {
125
+ if (lines[i].trim() === '')
126
+ continue;
127
+ const ind = lines[i].match(/^\s*/)[0].length;
128
+ if (ind <= indent)
129
+ break;
130
+ end = i + 1;
131
+ }
132
+ return end;
133
+ }
134
+ if (lang.style === 'ruby') {
135
+ for (let i = line + 1; i < limit; i++) {
136
+ if (new RegExp(`^\\s{${indent}}end\\b`).test(lines[i]))
137
+ return i + 1;
138
+ }
139
+ return null;
140
+ }
141
+ // Braces: from the declaration, count { and } outside strings and comments until balanced.
142
+ let depth = 0;
143
+ let opened = false;
144
+ let inBlock = false;
145
+ for (let i = line; i < limit; i++) {
146
+ const text = lines[i];
147
+ let pos = 0;
148
+ while (pos < text.length) {
149
+ if (inBlock) {
150
+ const close = text.indexOf(lang.blockComment[1], pos);
151
+ if (close < 0) {
152
+ pos = text.length;
153
+ break;
154
+ }
155
+ pos = close + lang.blockComment[1].length;
156
+ inBlock = false;
157
+ continue;
158
+ }
159
+ if (lang.blockComment && text.startsWith(lang.blockComment[0], pos)) {
160
+ inBlock = true;
161
+ pos += lang.blockComment[0].length;
162
+ continue;
163
+ }
164
+ if (lang.lineComment.some((c) => text.startsWith(c, pos)))
165
+ break;
166
+ const q = lang.quotes.find((c) => text.startsWith(c, pos));
167
+ if (q) {
168
+ pos = skipString(text, pos, q);
169
+ continue;
170
+ }
171
+ const ch = text[pos];
172
+ if (ch === '{') {
173
+ depth++;
174
+ opened = true;
175
+ }
176
+ else if (ch === '}') {
177
+ depth--;
178
+ if (opened && depth === 0)
179
+ return i + 1;
180
+ }
181
+ pos++;
182
+ }
183
+ // A declaration with no body (an interface method, an abstract one) ends at its semicolon.
184
+ if (!opened && /;\s*$/.test(text))
185
+ return i + 1;
186
+ }
187
+ return null;
188
+ }
189
+ /** Position after the string literal starting at `pos`; an unterminated one ends the line. */
190
+ function skipString(text, pos, quote) {
191
+ return scanString(text, pos, quote).end;
192
+ }
193
+ function scanString(text, pos, quote) {
194
+ let i = pos + quote.length;
195
+ while (i < text.length) {
196
+ if (text[i] === '\\' && quote !== '`') {
197
+ i += 2;
198
+ continue;
199
+ }
200
+ if (text.startsWith(quote, i))
201
+ return { end: i + quote.length, closed: true };
202
+ i++;
203
+ }
204
+ return { end: text.length, closed: false };
205
+ }
206
+ /**
207
+ * The declaration with comments dropped and whitespace collapsed, for the cosmetic-vs-real
208
+ * change test. Python keeps each line's indentation because it is syntax there; everything
209
+ * else collapses to one token stream. Anything the scanner is unsure about stays in, so the
210
+ * worst outcome is a cosmetic edit reported as a change, never a change reported as cosmetic.
211
+ */
212
+ export function normalizeOtherLanguage(filePath, source) {
213
+ const lang = LANGS[path.extname(filePath).toLowerCase()];
214
+ if (!lang)
215
+ return source;
216
+ const out = [];
217
+ let inBlock = false;
218
+ let openQuote = null; // a triple-quoted or backtick string spanning lines
219
+ for (const raw of source.split(/\r?\n/)) {
220
+ let kept = '';
221
+ let pos = 0;
222
+ if (openQuote) {
223
+ const close = raw.indexOf(openQuote);
224
+ if (close < 0) {
225
+ out.push(raw);
226
+ continue;
227
+ }
228
+ kept = raw.slice(0, close + openQuote.length);
229
+ pos = close + openQuote.length;
230
+ openQuote = null;
231
+ }
232
+ while (pos < raw.length) {
233
+ if (inBlock) {
234
+ const close = raw.indexOf(lang.blockComment[1], pos);
235
+ if (close < 0) {
236
+ pos = raw.length;
237
+ break;
238
+ }
239
+ pos = close + lang.blockComment[1].length;
240
+ inBlock = false;
241
+ continue;
242
+ }
243
+ if (lang.blockComment && raw.startsWith(lang.blockComment[0], pos)) {
244
+ inBlock = true;
245
+ pos += lang.blockComment[0].length;
246
+ continue;
247
+ }
248
+ if (lang.lineComment.some((c) => raw.startsWith(c, pos)))
249
+ break;
250
+ const q = lang.quotes.find((c) => raw.startsWith(c, pos));
251
+ if (q) {
252
+ const { end, closed } = scanString(raw, pos, q);
253
+ kept += raw.slice(pos, end);
254
+ pos = end;
255
+ if (!closed && (q.length === 3 || q === '`'))
256
+ openQuote = q;
257
+ continue;
258
+ }
259
+ kept += raw[pos++];
260
+ }
261
+ if (lang.style === 'indent') {
262
+ const indent = raw.match(/^\s*/)[0];
263
+ const body = kept.trim().replace(/[ \t]+/g, ' ');
264
+ if (body)
265
+ out.push(indent + body);
266
+ }
267
+ else {
268
+ const body = kept.trim().replace(/\s+/g, ' ');
269
+ if (body)
270
+ out.push(body);
271
+ }
272
+ }
273
+ return lang.style === 'indent' ? out.join('\n') : out.join(' ');
274
+ }
275
+ //# sourceMappingURL=OtherLanguageSymbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtherLanguageSymbols.js","sourceRoot":"","sources":["../../../src/utils/OtherLanguageSymbols.ts"],"names":[],"mappings":"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"}
@@ -62,6 +62,23 @@ export interface NetStats {
62
62
  /** tokensSaved / tokensSpent. Below 1.0 means Lemma is not paying for itself. */
63
63
  ratio: number;
64
64
  }
65
+ /** Tokens saved and spent on one local calendar day. */
66
+ export interface DayTotals {
67
+ saved: number;
68
+ spent: number;
69
+ }
70
+ /** Net position over the last `days` days — the trend the all-time totals hide. */
71
+ export interface RecentStats {
72
+ days: number;
73
+ /** First day of the window (YYYY-MM-DD, local time). */
74
+ since: string;
75
+ /** Days in the window that recorded anything. */
76
+ daysWithData: number;
77
+ tokensSaved: number;
78
+ tokensSpent: number;
79
+ netTokens: number;
80
+ netCost: number;
81
+ }
65
82
  export interface SavingsSnapshot {
66
83
  clipboard: SourceStats;
67
84
  contextSqueeze: SourceStats;
@@ -72,6 +89,12 @@ export interface SavingsSnapshot {
72
89
  costs: Record<CostSource, CostStats>;
73
90
  totalCost: CostStats;
74
91
  net: NetStats;
92
+ /**
93
+ * The last RECENT_WINDOW_DAYS days. The all-time totals mix every configuration Lemma ever
94
+ * ran with; this shows what it does now. Empty (daysWithData 0) for ledgers written before
95
+ * daily totals existed — those days were never recorded per day, and are not invented.
96
+ */
97
+ recent: RecentStats;
75
98
  sessionStartedAt: string;
76
99
  /**
77
100
  * AN-01 attribution: per-tool / per-host / per-origin rollups of toolResult.
@@ -95,6 +118,8 @@ declare class SavingsLedger {
95
118
  /** Per-origin rollup: "lemma" vs anything explicitly reported otherwise. */
96
119
  private costByOrigin;
97
120
  private readonly sessionStartedAt;
121
+ /** Local day (YYYY-MM-DD) -> tokens saved/spent that day. */
122
+ private daily;
98
123
  constructor();
99
124
  private load;
100
125
  private save;
@@ -105,6 +130,8 @@ declare class SavingsLedger {
105
130
  * @param charsAfter Resulting char count after compression/routing
106
131
  */
107
132
  record(source: SavingsSource, charsBefore: number, charsAfter: number): void;
133
+ /** Adds to today's totals and drops days past MAX_DAYS_KEPT. */
134
+ private bumpDay;
108
135
  /**
109
136
  * Record a savings event directly in tokens (for sources that already know their token count).
110
137
  */
@@ -1 +1 @@
1
- {"version":3,"file":"SavingsLedger.d.ts","sourceRoot":"","sources":["../../../src/utils/SavingsLedger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SavingsLedger.d.ts","sourceRoot":"","sources":["../../../src/utils/SavingsLedger.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,13 @@ import fs from 'fs';
10
10
  import path from 'path';
11
11
  /** Hard cap on tracked tool names so a hostile caller cannot grow ledger.json unbounded. */
12
12
  const MAX_ATTRIBUTED_TOOLS = 300;
13
+ /** Daily totals kept on disk: enough for any window the dashboard shows, bounded. */
14
+ const MAX_DAYS_KEPT = 90;
15
+ const RECENT_WINDOW_DAYS = 7;
16
+ function dayKey(d = new Date()) {
17
+ const pad = (n) => String(n).padStart(2, '0');
18
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
19
+ }
13
20
  /** Average blended cost per input token across GPT-4o / Claude Sonnet / Gemini Pro */
14
21
  export const AVG_COST_PER_TOKEN = 0.000008; // $0.008 per 1K tokens
15
22
  const HOME = process.env.HOME || process.env.USERPROFILE || '~';
@@ -40,6 +47,8 @@ function readRollup(raw) {
40
47
  }
41
48
  class SavingsLedger {
42
49
  constructor() {
50
+ /** Local day (YYYY-MM-DD) -> tokens saved/spent that day. */
51
+ this.daily = {};
43
52
  this.sessionStartedAt = new Date().toISOString();
44
53
  this.sources = {
45
54
  clipboard: { events: 0, tokensSaved: 0, costSaved: 0 },
@@ -96,6 +105,18 @@ class SavingsLedger {
96
105
  this.costByHost = readRollup(parsedCosts._byHost);
97
106
  this.costByOrigin = readRollup(parsedCosts._byOrigin);
98
107
  }
108
+ const parsedDaily = parsed._daily;
109
+ if (parsedDaily && typeof parsedDaily === 'object' && !Array.isArray(parsedDaily)) {
110
+ for (const [day, v] of Object.entries(parsedDaily)) {
111
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(day) || !v || typeof v !== 'object')
112
+ continue;
113
+ const saved = Number(v.saved);
114
+ const spent = Number(v.spent);
115
+ if (!Number.isFinite(saved) || !Number.isFinite(spent) || saved < 0 || spent < 0)
116
+ continue;
117
+ this.daily[day] = { saved: Math.floor(saved), spent: Math.floor(spent) };
118
+ }
119
+ }
99
120
  }
100
121
  }
101
122
  }
@@ -115,6 +136,7 @@ class SavingsLedger {
115
136
  const payload = {
116
137
  ...this.sources,
117
138
  _costs: { ...this.costs, _byTool: this.costByTool, _byHost: this.costByHost, _byOrigin: this.costByOrigin },
139
+ _daily: this.daily,
118
140
  // Stays 2: the rollups are additive keys a v2 reader already ignores, so no
119
141
  // format bump — and the existing round-trip contract pins this number.
120
142
  _version: 2,
@@ -140,8 +162,18 @@ class SavingsLedger {
140
162
  this.sources[source].events++;
141
163
  this.sources[source].tokensSaved += tokensSaved;
142
164
  this.sources[source].costSaved += costSaved;
165
+ this.bumpDay('saved', tokensSaved);
143
166
  this.save();
144
167
  }
168
+ /** Adds to today's totals and drops days past MAX_DAYS_KEPT. */
169
+ bumpDay(side, tokens) {
170
+ const today = dayKey();
171
+ const slot = this.daily[today] ?? (this.daily[today] = { saved: 0, spent: 0 });
172
+ slot[side] += tokens;
173
+ const days = Object.keys(this.daily).sort();
174
+ for (const old of days.slice(0, Math.max(0, days.length - MAX_DAYS_KEPT)))
175
+ delete this.daily[old];
176
+ }
145
177
  /**
146
178
  * Record a savings event directly in tokens (for sources that already know their token count).
147
179
  */
@@ -152,6 +184,7 @@ class SavingsLedger {
152
184
  this.sources[source].events++;
153
185
  this.sources[source].tokensSaved += tokensSaved;
154
186
  this.sources[source].costSaved += costSaved;
187
+ this.bumpDay('saved', tokensSaved);
155
188
  this.save();
156
189
  }
157
190
  /**
@@ -169,6 +202,7 @@ class SavingsLedger {
169
202
  this.costs[source].events++;
170
203
  this.costs[source].tokensSpent += tokensSpent;
171
204
  this.costs[source].costSpent += tokensSpent * AVG_COST_PER_TOKEN;
205
+ this.bumpDay('spent', tokensSpent);
172
206
  if (source === 'toolResult') {
173
207
  // byTool needs an explicit tool name; host/origin ALWAYS annotate (defaulting
174
208
  // to unknown/lemma) so the rollups sum to the bucket totals — a smoke test
@@ -226,12 +260,28 @@ class SavingsLedger {
226
260
  ? total.tokensSaved / totalCost.tokensSpent
227
261
  : (total.tokensSaved > 0 ? Infinity : 0),
228
262
  };
263
+ const start = new Date();
264
+ start.setDate(start.getDate() - (RECENT_WINDOW_DAYS - 1));
265
+ const since = dayKey(start);
266
+ const inWindow = Object.entries(this.daily).filter(([day]) => day >= since);
267
+ const recentSaved = inWindow.reduce((n, [, d]) => n + d.saved, 0);
268
+ const recentSpent = inWindow.reduce((n, [, d]) => n + d.spent, 0);
269
+ const recent = {
270
+ days: RECENT_WINDOW_DAYS,
271
+ since,
272
+ daysWithData: inWindow.length,
273
+ tokensSaved: recentSaved,
274
+ tokensSpent: recentSpent,
275
+ netTokens: recentSaved - recentSpent,
276
+ netCost: (recentSaved - recentSpent) * AVG_COST_PER_TOKEN,
277
+ };
229
278
  return {
230
279
  ...this.sources,
231
280
  total,
232
281
  costs: { ...this.costs },
233
282
  totalCost,
234
283
  net,
284
+ recent,
235
285
  sessionStartedAt: this.sessionStartedAt,
236
286
  costAttribution: {
237
287
  byTool: { ...this.costByTool },
@@ -295,6 +345,7 @@ class SavingsLedger {
295
345
  this.costByTool = {};
296
346
  this.costByHost = {};
297
347
  this.costByOrigin = {};
348
+ this.daily = {};
298
349
  this.save();
299
350
  }
300
351
  }