@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,4CAAoB;AACpB,gDAAwB;AACxB,oDAA4B;AAC5B,6EAAoG;AAKpG,MAAa,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,cAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAI,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,YAAE,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,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAE,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,IAAA,gDAAwB,EAAC,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,cAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;YACxF,OAAO;gBACL,GAAG,EAAE,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACzE,UAAU,EAAE,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAA,6CAAqB,EAAC,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;AAhDD,0CAgDC;AAED,kBAAe,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"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DIGEST_MAX = void 0;
4
+ exports.recallableHits = recallableHits;
4
5
  exports.rankFileHits = rankFileHits;
5
6
  exports.digestFileHits = digestFileHits;
6
7
  exports.formatFileDigest = formatFileDigest;
@@ -22,6 +23,17 @@ function headline(query) {
22
23
  const q = query.replace(/\s+/g, ' ').trim();
23
24
  return q.length > HEADLINE_MAX ? `${q.slice(0, HEADLINE_MAX - 1)}…` : q;
24
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
+ function recallableHits(brain, hits) {
32
+ return hits.filter((h) => {
33
+ const entry = brain.getEntry(h.id);
34
+ return !entry || (0, TheBrainV2_1.entrySource)(entry) !== 'auto-git';
35
+ });
36
+ }
25
37
  /**
26
38
  * Relevance without a query to rank against: a failed approach first (repeating it is the
27
39
  * costliest mistake), then memories someone wrote on purpose over commit-log ingests (a hub
@@ -65,7 +77,7 @@ function digestFileHits(brain, hits, max = exports.DIGEST_MAX) {
65
77
  const failed = h.outcome === 'failed' ? ', FAILED approach' : '';
66
78
  return ` • ${h.id} (${verdict}, ${age}${failed}): ${headline(h.query)}`;
67
79
  });
68
- return { total: hits.length, lines, failedCount: hits.filter((h) => h.outcome === 'failed').length };
80
+ return { total: hits.length, lines, ids: top.map((h) => h.id), failedCount: hits.filter((h) => h.outcome === 'failed').length };
69
81
  }
70
82
  /** The full note: header, the digest lines, and what to do with them. */
71
83
  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,283 @@
1
+ "use strict";
2
+ /**
3
+ * Symbol lookup for languages the TypeScript compiler cannot parse.
4
+ *
5
+ * Freshness tracks the symbols a memory names instead of the whole file, so an edit elsewhere
6
+ * in the file does not make the memory STALE. That only worked for .ts/.js: in a Python, Go or
7
+ * Java project every memory tracked a whole file and went STALE on any edit to it, which is
8
+ * exactly the noise symbol tracking exists to remove.
9
+ *
10
+ * This is a declaration locator, not a parser. It finds where a named function/class/method
11
+ * starts and where its block ends (indentation for Python and Ruby, brace depth for the rest).
12
+ * It is deliberately conservative in both directions the Brain cares about:
13
+ * - a name it cannot find, or finds in more than one place, returns null — the caller then
14
+ * tracks the whole file, which can only be too sensitive, never blind;
15
+ * - comments are stripped only where a scanner that tracks string literals is sure they are
16
+ * comments, so a `#` or `//` inside a string is never mistaken for one. Treating a code
17
+ * change as cosmetic would stamp "fresh" on a memory whose subject changed.
18
+ */
19
+ var __importDefault = (this && this.__importDefault) || function (mod) {
20
+ return (mod && mod.__esModule) ? mod : { "default": mod };
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.supportsOtherLanguage = supportsOtherLanguage;
24
+ exports.findOtherLanguageSymbol = findOtherLanguageSymbol;
25
+ exports.normalizeOtherLanguage = normalizeOtherLanguage;
26
+ const path_1 = __importDefault(require("path"));
27
+ const C_LIKE_COMMENTS = { lineComment: ['//'], blockComment: ['/*', '*/'] };
28
+ const LANGS = {
29
+ '.py': {
30
+ style: 'indent',
31
+ decl: ['^(\\s*)(?:async\\s+)?(?:def|class)\\s+$NAME\\b'],
32
+ lineComment: ['#'],
33
+ quotes: ['"""', "'''", '"', "'"],
34
+ },
35
+ '.rb': {
36
+ style: 'ruby',
37
+ decl: ['^(\\s*)(?:def|class|module)\\s+(?:self\\.)?$NAME\\b'],
38
+ lineComment: ['#'],
39
+ quotes: ['"', "'"],
40
+ },
41
+ '.go': {
42
+ style: 'braces',
43
+ decl: ['^(\\s*)func\\s+(?:\\([^)]*\\)\\s*)?$NAME\\s*[(\\[]', '^(\\s*)type\\s+$NAME\\b'],
44
+ ...C_LIKE_COMMENTS,
45
+ quotes: ['`', '"', "'"],
46
+ },
47
+ '.rs': {
48
+ style: 'braces',
49
+ decl: ['^(\\s*)(?:pub(?:\\([^)]*\\))?\\s+)?(?:async\\s+)?(?:unsafe\\s+)?(?:fn|struct|enum|trait)\\s+$NAME\\b'],
50
+ ...C_LIKE_COMMENTS,
51
+ quotes: ['"', "'"],
52
+ },
53
+ // Java/Kotlin/C#/PHP/Swift: a method or class declaration — modifiers and a return type, then
54
+ // the name and an opening paren or brace. A call such as `foo(x);` has no brace and no type.
55
+ '.java': { style: 'braces', decl: braceDecl(), ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
56
+ '.kt': { style: 'braces', decl: ['^(\\s*)(?:[\\w@]+\\s+)*(?:fun|class|object|interface)\\s+(?:<[^>]*>\\s*)?$NAME\\b'], ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
57
+ '.cs': { style: 'braces', decl: braceDecl(), ...C_LIKE_COMMENTS, quotes: ['"', "'"] },
58
+ '.php': { style: 'braces', decl: ['^(\\s*)(?:(?:public|private|protected|static|abstract|final)\\s+)*(?:function|class|interface|trait)\\s+&?$NAME\\b'], ...C_LIKE_COMMENTS, lineComment: ['//', '#'], quotes: ['"', "'"] },
59
+ '.swift': { style: 'braces', decl: ['^(\\s*)(?:[\\w@]+\\s+)*(?:func|class|struct|enum|protocol)\\s+$NAME\\b'], ...C_LIKE_COMMENTS, quotes: ['"""', '"', "'"] },
60
+ };
61
+ function braceDecl() {
62
+ return [
63
+ '^(\\s*)(?:(?:public|private|protected|internal|static|final|abstract|virtual|override|async|sealed|partial)\\s+)*(?:class|interface|enum|record|struct)\\s+$NAME\\b',
64
+ '^(\\s*)(?:(?:public|private|protected|internal|static|final|abstract|virtual|override|async|synchronized)\\s+)+[\\w<>\\[\\],.?\\s]+?\\s$NAME\\s*\\(',
65
+ ];
66
+ }
67
+ function supportsOtherLanguage(filePath) {
68
+ return path_1.default.extname(filePath).toLowerCase() in LANGS;
69
+ }
70
+ const escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
71
+ /** Index of the first line at or after `from` whose text is not blank. */
72
+ function nextCodeLine(lines, from) {
73
+ let i = from;
74
+ while (i < lines.length && lines[i].trim() === '')
75
+ i++;
76
+ return i;
77
+ }
78
+ /**
79
+ * The source text of the named declaration, or null when it is absent or ambiguous.
80
+ * `Class.member` looks the member up inside the class's own block.
81
+ */
82
+ function findOtherLanguageSymbol(filePath, source, name) {
83
+ const lang = LANGS[path_1.default.extname(filePath).toLowerCase()];
84
+ if (!lang)
85
+ return null;
86
+ const [owner, member] = name.split('.');
87
+ if (name.split('.').length > 2)
88
+ return null;
89
+ const lines = source.split(/\r?\n/);
90
+ const ownerBlock = locate(lang, lines, 0, lines.length, owner, true);
91
+ if (!ownerBlock)
92
+ return null;
93
+ if (!member)
94
+ return lines.slice(ownerBlock.start, ownerBlock.end).join('\n');
95
+ // The member must sit inside the owner's block; the owner line itself is not searched.
96
+ const inner = locate(lang, lines, ownerBlock.start + 1, ownerBlock.end, member, false);
97
+ return inner ? lines.slice(inner.start, inner.end).join('\n') : null;
98
+ }
99
+ function locate(lang, lines, from, to, name, topLevelOnly) {
100
+ const patterns = lang.decl.map((d) => new RegExp(d.replace(/\$NAME/g, escapeRe(name))));
101
+ const hits = [];
102
+ for (let i = from; i < to; i++) {
103
+ for (const re of patterns) {
104
+ const m = re.exec(lines[i]);
105
+ if (m) {
106
+ hits.push({ line: i, indent: m[1].length });
107
+ break;
108
+ }
109
+ }
110
+ }
111
+ // Ambiguous (an overload, a redefinition, a nested helper of the same name): do not guess.
112
+ // For a top-level lookup, only the least-indented hit counts, so a method with the same name
113
+ // as a function does not make the function unfindable.
114
+ const pool = topLevelOnly && hits.length > 1 ? hits.filter((h) => h.indent === Math.min(...hits.map((x) => x.indent))) : hits;
115
+ if (pool.length !== 1)
116
+ return null;
117
+ const { line, indent } = pool[0];
118
+ const end = blockEnd(lang, lines, line, indent, to);
119
+ if (end === null)
120
+ return null;
121
+ // A decorator or annotation directly above belongs to the declaration.
122
+ let start = line;
123
+ while (start > from && /^\s*(@\w|#\[)/.test(lines[start - 1]))
124
+ start--;
125
+ return { start, end };
126
+ }
127
+ function blockEnd(lang, lines, line, indent, limit) {
128
+ if (lang.style === 'indent') {
129
+ // The block is every following line indented deeper than the declaration (blank lines
130
+ // inside it included); a continuation of a multi-line signature is deeper too.
131
+ let end = line + 1;
132
+ for (let i = line + 1; i < limit; i++) {
133
+ if (lines[i].trim() === '')
134
+ continue;
135
+ const ind = lines[i].match(/^\s*/)[0].length;
136
+ if (ind <= indent)
137
+ break;
138
+ end = i + 1;
139
+ }
140
+ return end;
141
+ }
142
+ if (lang.style === 'ruby') {
143
+ for (let i = line + 1; i < limit; i++) {
144
+ if (new RegExp(`^\\s{${indent}}end\\b`).test(lines[i]))
145
+ return i + 1;
146
+ }
147
+ return null;
148
+ }
149
+ // Braces: from the declaration, count { and } outside strings and comments until balanced.
150
+ let depth = 0;
151
+ let opened = false;
152
+ let inBlock = false;
153
+ for (let i = line; i < limit; i++) {
154
+ const text = lines[i];
155
+ let pos = 0;
156
+ while (pos < text.length) {
157
+ if (inBlock) {
158
+ const close = text.indexOf(lang.blockComment[1], pos);
159
+ if (close < 0) {
160
+ pos = text.length;
161
+ break;
162
+ }
163
+ pos = close + lang.blockComment[1].length;
164
+ inBlock = false;
165
+ continue;
166
+ }
167
+ if (lang.blockComment && text.startsWith(lang.blockComment[0], pos)) {
168
+ inBlock = true;
169
+ pos += lang.blockComment[0].length;
170
+ continue;
171
+ }
172
+ if (lang.lineComment.some((c) => text.startsWith(c, pos)))
173
+ break;
174
+ const q = lang.quotes.find((c) => text.startsWith(c, pos));
175
+ if (q) {
176
+ pos = skipString(text, pos, q);
177
+ continue;
178
+ }
179
+ const ch = text[pos];
180
+ if (ch === '{') {
181
+ depth++;
182
+ opened = true;
183
+ }
184
+ else if (ch === '}') {
185
+ depth--;
186
+ if (opened && depth === 0)
187
+ return i + 1;
188
+ }
189
+ pos++;
190
+ }
191
+ // A declaration with no body (an interface method, an abstract one) ends at its semicolon.
192
+ if (!opened && /;\s*$/.test(text))
193
+ return i + 1;
194
+ }
195
+ return null;
196
+ }
197
+ /** Position after the string literal starting at `pos`; an unterminated one ends the line. */
198
+ function skipString(text, pos, quote) {
199
+ return scanString(text, pos, quote).end;
200
+ }
201
+ function scanString(text, pos, quote) {
202
+ let i = pos + quote.length;
203
+ while (i < text.length) {
204
+ if (text[i] === '\\' && quote !== '`') {
205
+ i += 2;
206
+ continue;
207
+ }
208
+ if (text.startsWith(quote, i))
209
+ return { end: i + quote.length, closed: true };
210
+ i++;
211
+ }
212
+ return { end: text.length, closed: false };
213
+ }
214
+ /**
215
+ * The declaration with comments dropped and whitespace collapsed, for the cosmetic-vs-real
216
+ * change test. Python keeps each line's indentation because it is syntax there; everything
217
+ * else collapses to one token stream. Anything the scanner is unsure about stays in, so the
218
+ * worst outcome is a cosmetic edit reported as a change, never a change reported as cosmetic.
219
+ */
220
+ function normalizeOtherLanguage(filePath, source) {
221
+ const lang = LANGS[path_1.default.extname(filePath).toLowerCase()];
222
+ if (!lang)
223
+ return source;
224
+ const out = [];
225
+ let inBlock = false;
226
+ let openQuote = null; // a triple-quoted or backtick string spanning lines
227
+ for (const raw of source.split(/\r?\n/)) {
228
+ let kept = '';
229
+ let pos = 0;
230
+ if (openQuote) {
231
+ const close = raw.indexOf(openQuote);
232
+ if (close < 0) {
233
+ out.push(raw);
234
+ continue;
235
+ }
236
+ kept = raw.slice(0, close + openQuote.length);
237
+ pos = close + openQuote.length;
238
+ openQuote = null;
239
+ }
240
+ while (pos < raw.length) {
241
+ if (inBlock) {
242
+ const close = raw.indexOf(lang.blockComment[1], pos);
243
+ if (close < 0) {
244
+ pos = raw.length;
245
+ break;
246
+ }
247
+ pos = close + lang.blockComment[1].length;
248
+ inBlock = false;
249
+ continue;
250
+ }
251
+ if (lang.blockComment && raw.startsWith(lang.blockComment[0], pos)) {
252
+ inBlock = true;
253
+ pos += lang.blockComment[0].length;
254
+ continue;
255
+ }
256
+ if (lang.lineComment.some((c) => raw.startsWith(c, pos)))
257
+ break;
258
+ const q = lang.quotes.find((c) => raw.startsWith(c, pos));
259
+ if (q) {
260
+ const { end, closed } = scanString(raw, pos, q);
261
+ kept += raw.slice(pos, end);
262
+ pos = end;
263
+ if (!closed && (q.length === 3 || q === '`'))
264
+ openQuote = q;
265
+ continue;
266
+ }
267
+ kept += raw[pos++];
268
+ }
269
+ if (lang.style === 'indent') {
270
+ const indent = raw.match(/^\s*/)[0];
271
+ const body = kept.trim().replace(/[ \t]+/g, ' ');
272
+ if (body)
273
+ out.push(indent + body);
274
+ }
275
+ else {
276
+ const body = kept.trim().replace(/\s+/g, ' ');
277
+ if (body)
278
+ out.push(body);
279
+ }
280
+ }
281
+ return lang.style === 'indent' ? out.join('\n') : out.join(' ');
282
+ }
283
+ //# 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":"AAAA;;;;;;;GAOG;AAKH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,gBAAgB,GAAG,cAAc,GAAG,mBAAmB,GAAG,OAAO,CAAC;AAE5G;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,WAAW,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oGAAoG;IACpG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,MAAM,WAAW,QAAQ;IACvB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,WAAW,CAAC;IACvB,cAAc,EAAE,WAAW,CAAC;IAC5B,YAAY,EAAE,WAAW,CAAC;IAC1B,iBAAiB,EAAE,WAAW,CAAC;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,EAAE,QAAQ,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,eAAe,EAAE;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACtC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;KACzC,CAAC;CACH;AAED,sFAAsF;AACtF,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAyB3C,cAAM,aAAa;IACjB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,KAAK,CAAgC;IAC7C,iFAAiF;IACjF,OAAO,CAAC,UAAU,CAAgC;IAClD,6EAA6E;IAC7E,OAAO,CAAC,UAAU,CAAgC;IAClD,4EAA4E;IAC5E,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;;IAsB1C,OAAO,CAAC,IAAI;IA6CZ,OAAO,CAAC,IAAI;IAsBZ;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAa5E;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAS9D;;;;;;;;OAQG;IACH,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI;IAmBxF,iGAAiG;IACjG,OAAO,CAAC,UAAU;IAiBlB,oFAAoF;IACpF,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI;IAIvF,gFAAgF;IAChF,WAAW,IAAI,eAAe;IAuC9B,8CAA8C;IAC9C,kBAAkB,IAAI,MAAM;IAoD5B,gDAAgD;IAChD,KAAK,IAAI,IAAI;CAYd;AAED,gDAAgD;AAChD,eAAO,MAAM,aAAa,eAAsB,CAAC;AACjD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"SavingsLedger.d.ts","sourceRoot":"","sources":["../../../src/utils/SavingsLedger.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,13 @@ const fs_1 = __importDefault(require("fs"));
16
16
  const path_1 = __importDefault(require("path"));
17
17
  /** Hard cap on tracked tool names so a hostile caller cannot grow ledger.json unbounded. */
18
18
  const MAX_ATTRIBUTED_TOOLS = 300;
19
+ /** Daily totals kept on disk: enough for any window the dashboard shows, bounded. */
20
+ const MAX_DAYS_KEPT = 90;
21
+ const RECENT_WINDOW_DAYS = 7;
22
+ function dayKey(d = new Date()) {
23
+ const pad = (n) => String(n).padStart(2, '0');
24
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
25
+ }
19
26
  /** Average blended cost per input token across GPT-4o / Claude Sonnet / Gemini Pro */
20
27
  exports.AVG_COST_PER_TOKEN = 0.000008; // $0.008 per 1K tokens
21
28
  const HOME = process.env.HOME || process.env.USERPROFILE || '~';
@@ -46,6 +53,8 @@ function readRollup(raw) {
46
53
  }
47
54
  class SavingsLedger {
48
55
  constructor() {
56
+ /** Local day (YYYY-MM-DD) -> tokens saved/spent that day. */
57
+ this.daily = {};
49
58
  this.sessionStartedAt = new Date().toISOString();
50
59
  this.sources = {
51
60
  clipboard: { events: 0, tokensSaved: 0, costSaved: 0 },
@@ -102,6 +111,18 @@ class SavingsLedger {
102
111
  this.costByHost = readRollup(parsedCosts._byHost);
103
112
  this.costByOrigin = readRollup(parsedCosts._byOrigin);
104
113
  }
114
+ const parsedDaily = parsed._daily;
115
+ if (parsedDaily && typeof parsedDaily === 'object' && !Array.isArray(parsedDaily)) {
116
+ for (const [day, v] of Object.entries(parsedDaily)) {
117
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(day) || !v || typeof v !== 'object')
118
+ continue;
119
+ const saved = Number(v.saved);
120
+ const spent = Number(v.spent);
121
+ if (!Number.isFinite(saved) || !Number.isFinite(spent) || saved < 0 || spent < 0)
122
+ continue;
123
+ this.daily[day] = { saved: Math.floor(saved), spent: Math.floor(spent) };
124
+ }
125
+ }
105
126
  }
106
127
  }
107
128
  }
@@ -121,6 +142,7 @@ class SavingsLedger {
121
142
  const payload = {
122
143
  ...this.sources,
123
144
  _costs: { ...this.costs, _byTool: this.costByTool, _byHost: this.costByHost, _byOrigin: this.costByOrigin },
145
+ _daily: this.daily,
124
146
  // Stays 2: the rollups are additive keys a v2 reader already ignores, so no
125
147
  // format bump — and the existing round-trip contract pins this number.
126
148
  _version: 2,
@@ -146,8 +168,18 @@ class SavingsLedger {
146
168
  this.sources[source].events++;
147
169
  this.sources[source].tokensSaved += tokensSaved;
148
170
  this.sources[source].costSaved += costSaved;
171
+ this.bumpDay('saved', tokensSaved);
149
172
  this.save();
150
173
  }
174
+ /** Adds to today's totals and drops days past MAX_DAYS_KEPT. */
175
+ bumpDay(side, tokens) {
176
+ const today = dayKey();
177
+ const slot = this.daily[today] ?? (this.daily[today] = { saved: 0, spent: 0 });
178
+ slot[side] += tokens;
179
+ const days = Object.keys(this.daily).sort();
180
+ for (const old of days.slice(0, Math.max(0, days.length - MAX_DAYS_KEPT)))
181
+ delete this.daily[old];
182
+ }
151
183
  /**
152
184
  * Record a savings event directly in tokens (for sources that already know their token count).
153
185
  */
@@ -158,6 +190,7 @@ class SavingsLedger {
158
190
  this.sources[source].events++;
159
191
  this.sources[source].tokensSaved += tokensSaved;
160
192
  this.sources[source].costSaved += costSaved;
193
+ this.bumpDay('saved', tokensSaved);
161
194
  this.save();
162
195
  }
163
196
  /**
@@ -175,6 +208,7 @@ class SavingsLedger {
175
208
  this.costs[source].events++;
176
209
  this.costs[source].tokensSpent += tokensSpent;
177
210
  this.costs[source].costSpent += tokensSpent * exports.AVG_COST_PER_TOKEN;
211
+ this.bumpDay('spent', tokensSpent);
178
212
  if (source === 'toolResult') {
179
213
  // byTool needs an explicit tool name; host/origin ALWAYS annotate (defaulting
180
214
  // to unknown/lemma) so the rollups sum to the bucket totals — a smoke test
@@ -232,12 +266,28 @@ class SavingsLedger {
232
266
  ? total.tokensSaved / totalCost.tokensSpent
233
267
  : (total.tokensSaved > 0 ? Infinity : 0),
234
268
  };
269
+ const start = new Date();
270
+ start.setDate(start.getDate() - (RECENT_WINDOW_DAYS - 1));
271
+ const since = dayKey(start);
272
+ const inWindow = Object.entries(this.daily).filter(([day]) => day >= since);
273
+ const recentSaved = inWindow.reduce((n, [, d]) => n + d.saved, 0);
274
+ const recentSpent = inWindow.reduce((n, [, d]) => n + d.spent, 0);
275
+ const recent = {
276
+ days: RECENT_WINDOW_DAYS,
277
+ since,
278
+ daysWithData: inWindow.length,
279
+ tokensSaved: recentSaved,
280
+ tokensSpent: recentSpent,
281
+ netTokens: recentSaved - recentSpent,
282
+ netCost: (recentSaved - recentSpent) * exports.AVG_COST_PER_TOKEN,
283
+ };
235
284
  return {
236
285
  ...this.sources,
237
286
  total,
238
287
  costs: { ...this.costs },
239
288
  totalCost,
240
289
  net,
290
+ recent,
241
291
  sessionStartedAt: this.sessionStartedAt,
242
292
  costAttribution: {
243
293
  byTool: { ...this.costByTool },
@@ -301,6 +351,7 @@ class SavingsLedger {
301
351
  this.costByTool = {};
302
352
  this.costByHost = {};
303
353
  this.costByOrigin = {};
354
+ this.daily = {};
304
355
  this.save();
305
356
  }
306
357
  }