@nxuss/lemma 1.40.0 → 1.41.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 (231) hide show
  1. package/README.md +45 -14
  2. package/bin/brain-ingest.js +41 -0
  3. package/bin/init.js +92 -92
  4. package/bin/postinstall.js +58 -4
  5. package/dashboard/dist/assets/index-Ca05LJvs.js +453 -0
  6. package/dashboard/dist/assets/{index-DNTQXLER.css → index-DdEVyDRj.css} +1 -1
  7. package/dashboard/dist/index.html +2 -2
  8. package/dist/cjs/cli/hostHooks.d.ts +14 -1
  9. package/dist/cjs/cli/hostHooks.d.ts.map +1 -1
  10. package/dist/cjs/cli/hostHooks.js +53 -6
  11. package/dist/cjs/cli/hostHooks.js.map +1 -1
  12. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  13. package/dist/cjs/cli/lemma-proxy.js +29 -10
  14. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  15. package/dist/cjs/contracts/evidence.d.ts +8 -1
  16. package/dist/cjs/contracts/evidence.d.ts.map +1 -1
  17. package/dist/cjs/mcp/index.js +19 -0
  18. package/dist/cjs/mcp/index.js.map +1 -1
  19. package/dist/cjs/mcp/prompts.d.ts +1 -1
  20. package/dist/cjs/mcp/prompts.d.ts.map +1 -1
  21. package/dist/cjs/mcp/prompts.js +6 -16
  22. package/dist/cjs/mcp/prompts.js.map +1 -1
  23. package/dist/cjs/mcp/tool-profiles.d.ts.map +1 -1
  24. package/dist/cjs/mcp/tool-profiles.js +8 -4
  25. package/dist/cjs/mcp/tool-profiles.js.map +1 -1
  26. package/dist/cjs/mcp/tools/context-tools.d.ts.map +1 -1
  27. package/dist/cjs/mcp/tools/context-tools.js +21 -17
  28. package/dist/cjs/mcp/tools/context-tools.js.map +1 -1
  29. package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
  30. package/dist/cjs/mcp/tools/memory.js +25 -4
  31. package/dist/cjs/mcp/tools/memory.js.map +1 -1
  32. package/dist/cjs/mcp/tools/workspace.d.ts.map +1 -1
  33. package/dist/cjs/mcp/tools/workspace.js +97 -54
  34. package/dist/cjs/mcp/tools/workspace.js.map +1 -1
  35. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  36. package/dist/cjs/mcp/tools.js +95 -34
  37. package/dist/cjs/mcp/tools.js.map +1 -1
  38. package/dist/cjs/mcp/utils.d.ts.map +1 -1
  39. package/dist/cjs/mcp/utils.js +6 -1
  40. package/dist/cjs/mcp/utils.js.map +1 -1
  41. package/dist/cjs/mcp/workspaceShared.d.ts.map +1 -1
  42. package/dist/cjs/mcp/workspaceShared.js +14 -9
  43. package/dist/cjs/mcp/workspaceShared.js.map +1 -1
  44. package/dist/cjs/proxy/KeyManager.d.ts +10 -0
  45. package/dist/cjs/proxy/KeyManager.d.ts.map +1 -1
  46. package/dist/cjs/proxy/KeyManager.js +45 -8
  47. package/dist/cjs/proxy/KeyManager.js.map +1 -1
  48. package/dist/cjs/security/SemanticScrubber.d.ts.map +1 -1
  49. package/dist/cjs/security/SemanticScrubber.js +19 -1
  50. package/dist/cjs/security/SemanticScrubber.js.map +1 -1
  51. package/dist/cjs/subconscious/HostRecall.d.ts +7 -5
  52. package/dist/cjs/subconscious/HostRecall.d.ts.map +1 -1
  53. package/dist/cjs/subconscious/HostRecall.js +115 -13
  54. package/dist/cjs/subconscious/HostRecall.js.map +1 -1
  55. package/dist/cjs/subconscious/TheBrainV2.d.ts +6 -1
  56. package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
  57. package/dist/cjs/subconscious/TheBrainV2.js +21 -9
  58. package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
  59. package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts +3 -0
  60. package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
  61. package/dist/cjs/subconscious/freshness/LocalFsResolver.js +32 -14
  62. package/dist/cjs/subconscious/freshness/LocalFsResolver.js.map +1 -1
  63. package/dist/cjs/utils/CommandOutputDistiller.d.ts +10 -0
  64. package/dist/cjs/utils/CommandOutputDistiller.d.ts.map +1 -1
  65. package/dist/cjs/utils/CommandOutputDistiller.js +40 -2
  66. package/dist/cjs/utils/CommandOutputDistiller.js.map +1 -1
  67. package/dist/cjs/utils/ContextSqueezer.d.ts +13 -1
  68. package/dist/cjs/utils/ContextSqueezer.d.ts.map +1 -1
  69. package/dist/cjs/utils/ContextSqueezer.js +176 -3
  70. package/dist/cjs/utils/ContextSqueezer.js.map +1 -1
  71. package/dist/cjs/utils/FixCapture.d.ts.map +1 -1
  72. package/dist/cjs/utils/FixCapture.js +56 -0
  73. package/dist/cjs/utils/FixCapture.js.map +1 -1
  74. package/dist/cjs/utils/LineNumberMap.d.ts.map +1 -1
  75. package/dist/cjs/utils/LineNumberMap.js +27 -0
  76. package/dist/cjs/utils/LineNumberMap.js.map +1 -1
  77. package/dist/cjs/utils/PatchMatcher.d.ts.map +1 -1
  78. package/dist/cjs/utils/PatchMatcher.js +26 -0
  79. package/dist/cjs/utils/PatchMatcher.js.map +1 -1
  80. package/dist/cjs/utils/ProLicense.d.ts +2 -0
  81. package/dist/cjs/utils/ProLicense.d.ts.map +1 -0
  82. package/dist/cjs/utils/ProLicense.js +31 -0
  83. package/dist/cjs/utils/ProLicense.js.map +1 -0
  84. package/dist/cjs/utils/RevivalThrottle.d.ts +9 -0
  85. package/dist/cjs/utils/RevivalThrottle.d.ts.map +1 -0
  86. package/dist/cjs/utils/RevivalThrottle.js +25 -0
  87. package/dist/cjs/utils/RevivalThrottle.js.map +1 -0
  88. package/dist/cjs/utils/SavingsLedger.d.ts +58 -18
  89. package/dist/cjs/utils/SavingsLedger.d.ts.map +1 -1
  90. package/dist/cjs/utils/SavingsLedger.js +332 -179
  91. package/dist/cjs/utils/SavingsLedger.js.map +1 -1
  92. package/dist/cjs/utils/SearchCache.d.ts +2 -2
  93. package/dist/cjs/utils/SearchCache.d.ts.map +1 -1
  94. package/dist/cjs/utils/SearchCache.js +8 -6
  95. package/dist/cjs/utils/SearchCache.js.map +1 -1
  96. package/dist/cjs/utils/SessionCapture.d.ts +65 -0
  97. package/dist/cjs/utils/SessionCapture.d.ts.map +1 -0
  98. package/dist/cjs/utils/SessionCapture.js +339 -0
  99. package/dist/cjs/utils/SessionCapture.js.map +1 -0
  100. package/dist/cjs/utils/StaleDelta.d.ts +2 -0
  101. package/dist/cjs/utils/StaleDelta.d.ts.map +1 -0
  102. package/dist/cjs/utils/StaleDelta.js +60 -0
  103. package/dist/cjs/utils/StaleDelta.js.map +1 -0
  104. package/dist/cjs/utils/TokenBudgetedReader.d.ts.map +1 -1
  105. package/dist/cjs/utils/TokenBudgetedReader.js +56 -15
  106. package/dist/cjs/utils/TokenBudgetedReader.js.map +1 -1
  107. package/dist/cjs/utils/WorkspaceSearch.d.ts +8 -1
  108. package/dist/cjs/utils/WorkspaceSearch.d.ts.map +1 -1
  109. package/dist/cjs/utils/WorkspaceSearch.js +75 -5
  110. package/dist/cjs/utils/WorkspaceSearch.js.map +1 -1
  111. package/dist/cjs/utils/reportSavings.d.ts +3 -0
  112. package/dist/cjs/utils/reportSavings.d.ts.map +1 -1
  113. package/dist/cjs/utils/reportSavings.js +44 -5
  114. package/dist/cjs/utils/reportSavings.js.map +1 -1
  115. package/dist/esm/cli/hostHooks.d.ts +14 -1
  116. package/dist/esm/cli/hostHooks.d.ts.map +1 -1
  117. package/dist/esm/cli/hostHooks.js +52 -5
  118. package/dist/esm/cli/hostHooks.js.map +1 -1
  119. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  120. package/dist/esm/cli/lemma-proxy.js +30 -11
  121. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  122. package/dist/esm/contracts/evidence.d.ts +8 -1
  123. package/dist/esm/contracts/evidence.d.ts.map +1 -1
  124. package/dist/esm/mcp/index.js +20 -1
  125. package/dist/esm/mcp/index.js.map +1 -1
  126. package/dist/esm/mcp/prompts.d.ts +1 -1
  127. package/dist/esm/mcp/prompts.d.ts.map +1 -1
  128. package/dist/esm/mcp/prompts.js +6 -16
  129. package/dist/esm/mcp/prompts.js.map +1 -1
  130. package/dist/esm/mcp/tool-profiles.d.ts.map +1 -1
  131. package/dist/esm/mcp/tool-profiles.js +8 -4
  132. package/dist/esm/mcp/tool-profiles.js.map +1 -1
  133. package/dist/esm/mcp/tools/context-tools.d.ts.map +1 -1
  134. package/dist/esm/mcp/tools/context-tools.js +21 -17
  135. package/dist/esm/mcp/tools/context-tools.js.map +1 -1
  136. package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
  137. package/dist/esm/mcp/tools/memory.js +26 -5
  138. package/dist/esm/mcp/tools/memory.js.map +1 -1
  139. package/dist/esm/mcp/tools/workspace.d.ts.map +1 -1
  140. package/dist/esm/mcp/tools/workspace.js +98 -55
  141. package/dist/esm/mcp/tools/workspace.js.map +1 -1
  142. package/dist/esm/mcp/tools.d.ts.map +1 -1
  143. package/dist/esm/mcp/tools.js +94 -33
  144. package/dist/esm/mcp/tools.js.map +1 -1
  145. package/dist/esm/mcp/utils.d.ts.map +1 -1
  146. package/dist/esm/mcp/utils.js +6 -1
  147. package/dist/esm/mcp/utils.js.map +1 -1
  148. package/dist/esm/mcp/workspaceShared.d.ts.map +1 -1
  149. package/dist/esm/mcp/workspaceShared.js +14 -9
  150. package/dist/esm/mcp/workspaceShared.js.map +1 -1
  151. package/dist/esm/proxy/KeyManager.d.ts +10 -0
  152. package/dist/esm/proxy/KeyManager.d.ts.map +1 -1
  153. package/dist/esm/proxy/KeyManager.js +43 -6
  154. package/dist/esm/proxy/KeyManager.js.map +1 -1
  155. package/dist/esm/security/SemanticScrubber.d.ts.map +1 -1
  156. package/dist/esm/security/SemanticScrubber.js +19 -1
  157. package/dist/esm/security/SemanticScrubber.js.map +1 -1
  158. package/dist/esm/subconscious/HostRecall.d.ts +7 -5
  159. package/dist/esm/subconscious/HostRecall.d.ts.map +1 -1
  160. package/dist/esm/subconscious/HostRecall.js +115 -14
  161. package/dist/esm/subconscious/HostRecall.js.map +1 -1
  162. package/dist/esm/subconscious/TheBrainV2.d.ts +6 -1
  163. package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
  164. package/dist/esm/subconscious/TheBrainV2.js +21 -9
  165. package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
  166. package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts +3 -0
  167. package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
  168. package/dist/esm/subconscious/freshness/LocalFsResolver.js +32 -14
  169. package/dist/esm/subconscious/freshness/LocalFsResolver.js.map +1 -1
  170. package/dist/esm/utils/CommandOutputDistiller.d.ts +10 -0
  171. package/dist/esm/utils/CommandOutputDistiller.d.ts.map +1 -1
  172. package/dist/esm/utils/CommandOutputDistiller.js +39 -2
  173. package/dist/esm/utils/CommandOutputDistiller.js.map +1 -1
  174. package/dist/esm/utils/ContextSqueezer.d.ts +13 -1
  175. package/dist/esm/utils/ContextSqueezer.d.ts.map +1 -1
  176. package/dist/esm/utils/ContextSqueezer.js +175 -3
  177. package/dist/esm/utils/ContextSqueezer.js.map +1 -1
  178. package/dist/esm/utils/FixCapture.d.ts.map +1 -1
  179. package/dist/esm/utils/FixCapture.js +56 -0
  180. package/dist/esm/utils/FixCapture.js.map +1 -1
  181. package/dist/esm/utils/LineNumberMap.d.ts.map +1 -1
  182. package/dist/esm/utils/LineNumberMap.js +27 -0
  183. package/dist/esm/utils/LineNumberMap.js.map +1 -1
  184. package/dist/esm/utils/PatchMatcher.d.ts.map +1 -1
  185. package/dist/esm/utils/PatchMatcher.js +26 -0
  186. package/dist/esm/utils/PatchMatcher.js.map +1 -1
  187. package/dist/esm/utils/ProLicense.d.ts +2 -0
  188. package/dist/esm/utils/ProLicense.d.ts.map +1 -0
  189. package/dist/esm/utils/ProLicense.js +25 -0
  190. package/dist/esm/utils/ProLicense.js.map +1 -0
  191. package/dist/esm/utils/RevivalThrottle.d.ts +9 -0
  192. package/dist/esm/utils/RevivalThrottle.d.ts.map +1 -0
  193. package/dist/esm/utils/RevivalThrottle.js +22 -0
  194. package/dist/esm/utils/RevivalThrottle.js.map +1 -0
  195. package/dist/esm/utils/SavingsLedger.d.ts +58 -18
  196. package/dist/esm/utils/SavingsLedger.d.ts.map +1 -1
  197. package/dist/esm/utils/SavingsLedger.js +332 -179
  198. package/dist/esm/utils/SavingsLedger.js.map +1 -1
  199. package/dist/esm/utils/SearchCache.d.ts +2 -2
  200. package/dist/esm/utils/SearchCache.d.ts.map +1 -1
  201. package/dist/esm/utils/SearchCache.js +8 -6
  202. package/dist/esm/utils/SearchCache.js.map +1 -1
  203. package/dist/esm/utils/SessionCapture.d.ts +65 -0
  204. package/dist/esm/utils/SessionCapture.d.ts.map +1 -0
  205. package/dist/esm/utils/SessionCapture.js +328 -0
  206. package/dist/esm/utils/SessionCapture.js.map +1 -0
  207. package/dist/esm/utils/StaleDelta.d.ts +2 -0
  208. package/dist/esm/utils/StaleDelta.d.ts.map +1 -0
  209. package/dist/esm/utils/StaleDelta.js +54 -0
  210. package/dist/esm/utils/StaleDelta.js.map +1 -0
  211. package/dist/esm/utils/TokenBudgetedReader.d.ts.map +1 -1
  212. package/dist/esm/utils/TokenBudgetedReader.js +56 -15
  213. package/dist/esm/utils/TokenBudgetedReader.js.map +1 -1
  214. package/dist/esm/utils/WorkspaceSearch.d.ts +8 -1
  215. package/dist/esm/utils/WorkspaceSearch.d.ts.map +1 -1
  216. package/dist/esm/utils/WorkspaceSearch.js +74 -5
  217. package/dist/esm/utils/WorkspaceSearch.js.map +1 -1
  218. package/dist/esm/utils/reportSavings.d.ts +3 -0
  219. package/dist/esm/utils/reportSavings.d.ts.map +1 -1
  220. package/dist/esm/utils/reportSavings.js +42 -5
  221. package/dist/esm/utils/reportSavings.js.map +1 -1
  222. package/package.json +4 -4
  223. package/dashboard/dist/assets/index-DzL_Zu3m.js +0 -452
  224. package/dist/cjs/examples/basic-usage.d.ts +0 -12
  225. package/dist/cjs/examples/basic-usage.d.ts.map +0 -1
  226. package/dist/cjs/examples/basic-usage.js +0 -128
  227. package/dist/cjs/examples/basic-usage.js.map +0 -1
  228. package/dist/esm/examples/basic-usage.d.ts +0 -12
  229. package/dist/esm/examples/basic-usage.d.ts.map +0 -1
  230. package/dist/esm/examples/basic-usage.js +0 -126
  231. package/dist/esm/examples/basic-usage.js.map +0 -1
@@ -11,6 +11,8 @@ import path from 'path';
11
11
  import { writeFileAtomic, quarantineCorrupt } from './AtomicFile.js';
12
12
  /** Hard cap on tracked tool names so a hostile caller cannot grow ledger.json unbounded. */
13
13
  const MAX_ATTRIBUTED_TOOLS = 300;
14
+ /** tool x host pairs: ~90 tools times a handful of hosts, so room for the product but still bounded. */
15
+ const MAX_ATTRIBUTED_PAIRS = 1000;
14
16
  /** Daily totals kept on disk: enough for any window the dashboard shows, bounded. */
15
17
  const MAX_DAYS_KEPT = 90;
16
18
  const RECENT_WINDOW_DAYS = 7;
@@ -31,7 +33,7 @@ function readRollup(raw) {
31
33
  if (!raw || typeof raw !== 'object' || Array.isArray(raw))
32
34
  return out;
33
35
  for (const [key, value] of Object.entries(raw)) {
34
- if (typeof key !== 'string' || key.length === 0 || key.length > 128)
36
+ if (typeof key !== 'string' || key.length === 0 || key.length > 192)
35
37
  continue;
36
38
  if (!value || typeof value !== 'object')
37
39
  continue;
@@ -46,186 +48,122 @@ function readRollup(raw) {
46
48
  }
47
49
  return out;
48
50
  }
49
- class SavingsLedger {
50
- constructor() {
51
+ const GLOBAL_CAPS = { tools: MAX_ATTRIBUTED_TOOLS, pairs: MAX_ATTRIBUTED_PAIRS };
52
+ /** A project's slice is a second, smaller copy of the ledger, and there can be many of them. */
53
+ const PROJECT_CAPS = { tools: 120, pairs: 300 };
54
+ /** Hard cap on tracked projects; later ones merge into PROJECT_OVERFLOW, like tools do. */
55
+ const MAX_PROJECTS = 200;
56
+ const PROJECT_OVERFLOW = '__other';
57
+ const MAX_PROJECT_KEY = 512;
58
+ /** A workspace path as a stable key: trimmed, no trailing separator. Empty -> no project. */
59
+ function projectKey(raw) {
60
+ if (typeof raw !== 'string')
61
+ return null;
62
+ const trimmed = raw.trim().replace(/[\\/]+$/, '').slice(0, MAX_PROJECT_KEY);
63
+ return trimmed.length > 0 ? trimmed : null;
64
+ }
65
+ function emptySources() {
66
+ return {
67
+ clipboard: { events: 0, tokensSaved: 0, costSaved: 0 },
68
+ contextSqueeze: { events: 0, tokensSaved: 0, costSaved: 0 },
69
+ historyPrune: { events: 0, tokensSaved: 0, costSaved: 0 },
70
+ complexityRouting: { events: 0, tokensSaved: 0, costSaved: 0 },
71
+ cache: { events: 0, tokensSaved: 0, costSaved: 0 },
72
+ };
73
+ }
74
+ function emptyCosts() {
75
+ return {
76
+ mcpInstructions: { events: 0, tokensSpent: 0, costSpent: 0 },
77
+ toolResult: { events: 0, tokensSpent: 0, costSpent: 0 },
78
+ cacheMiss: { events: 0, tokensSpent: 0, costSpent: 0 },
79
+ };
80
+ }
81
+ /**
82
+ * Everything the ledger counts, for one scope. The daemon keeps one of these for the whole
83
+ * daemon and one per project, so a user who works in several repos at once can see the sum or
84
+ * any single repo through the same snapshot shape. No I/O here: SavingsLedger owns the file.
85
+ */
86
+ class LedgerState {
87
+ constructor(caps) {
88
+ this.caps = caps;
89
+ this.sources = emptySources();
90
+ this.costs = emptyCosts();
91
+ /** Savings by "<source>:<tool>"; events without a tool name are counted in the source totals only. */
92
+ this.savedByTool = {};
93
+ /** Per-tool rollup of toolResult spend: tool name -> { events, tokensSpent }. */
94
+ this.costByTool = {};
95
+ /** Per-host rollup (hosts are a handful of known values — no cap needed). */
96
+ this.costByHost = {};
97
+ /** Per-origin rollup: "lemma" vs anything explicitly reported otherwise. */
98
+ this.costByOrigin = {};
99
+ /** "<tool>|<host>" -> cost: who called which tool. */
100
+ this.costByToolHost = {};
51
101
  /** Local day (YYYY-MM-DD) -> tokens saved/spent that day. */
52
102
  this.daily = {};
53
- this.sessionStartedAt = new Date().toISOString();
54
- this.sources = {
55
- clipboard: { events: 0, tokensSaved: 0, costSaved: 0 },
56
- contextSqueeze: { events: 0, tokensSaved: 0, costSaved: 0 },
57
- historyPrune: { events: 0, tokensSaved: 0, costSaved: 0 },
58
- complexityRouting: { events: 0, tokensSaved: 0, costSaved: 0 },
59
- cache: { events: 0, tokensSaved: 0, costSaved: 0 },
60
- };
61
- this.costs = {
62
- mcpInstructions: { events: 0, tokensSpent: 0, costSpent: 0 },
63
- toolResult: { events: 0, tokensSpent: 0, costSpent: 0 },
64
- cacheMiss: { events: 0, tokensSpent: 0, costSpent: 0 },
65
- };
103
+ }
104
+ clear() {
105
+ this.sources = emptySources();
106
+ this.costs = emptyCosts();
107
+ this.savedByTool = {};
66
108
  this.costByTool = {};
67
109
  this.costByHost = {};
68
110
  this.costByOrigin = {};
69
- this.load();
70
- }
71
- load() {
72
- try {
73
- const dir = path.dirname(LEDGER_FILE);
74
- if (!fs.existsSync(dir)) {
75
- fs.mkdirSync(dir, { recursive: true });
76
- }
77
- if (fs.existsSync(LEDGER_FILE)) {
78
- const content = fs.readFileSync(LEDGER_FILE, 'utf8');
79
- const parsed = JSON.parse(content);
80
- if (parsed && typeof parsed === 'object') {
81
- for (const key of Object.keys(this.sources)) {
82
- if (parsed[key]) {
83
- this.sources[key] = {
84
- events: Number(parsed[key].events || 0),
85
- tokensSaved: Number(parsed[key].tokensSaved || 0),
86
- costSaved: Number(parsed[key].costSaved || 0),
87
- };
88
- }
89
- }
90
- // v2 adds the cost side under `_costs`. Ledgers written before v2 simply
91
- // have no cost history — they load with zeroes rather than failing.
92
- const parsedCosts = parsed._costs;
93
- if (parsedCosts && typeof parsedCosts === 'object') {
94
- for (const key of Object.keys(this.costs)) {
95
- if (parsedCosts[key]) {
96
- this.costs[key] = {
97
- events: Number(parsedCosts[key].events || 0),
98
- tokensSpent: Number(parsedCosts[key].tokensSpent || 0),
99
- costSpent: Number(parsedCosts[key].costSpent || 0),
100
- };
101
- }
102
- }
103
- // Attribution rollups (additive under _costs): absent on older ledgers -> empty.
104
- // Validated entry-by-entry — a corrupt _byTool must not poison the totals.
105
- this.costByTool = readRollup(parsedCosts._byTool);
106
- this.costByHost = readRollup(parsedCosts._byHost);
107
- this.costByOrigin = readRollup(parsedCosts._byOrigin);
108
- }
109
- const parsedDaily = parsed._daily;
110
- if (parsedDaily && typeof parsedDaily === 'object' && !Array.isArray(parsedDaily)) {
111
- for (const [day, v] of Object.entries(parsedDaily)) {
112
- if (!/^\d{4}-\d{2}-\d{2}$/.test(day) || !v || typeof v !== 'object')
113
- continue;
114
- const saved = Number(v.saved);
115
- const spent = Number(v.spent);
116
- if (!Number.isFinite(saved) || !Number.isFinite(spent) || saved < 0 || spent < 0)
117
- continue;
118
- this.daily[day] = { saved: Math.floor(saved), spent: Math.floor(spent) };
119
- }
120
- }
121
- }
122
- }
123
- }
124
- catch (err) {
125
- // An unreadable ledger is set aside rather than overwritten by the next save.
126
- if (err instanceof SyntaxError)
127
- quarantineCorrupt(LEDGER_FILE);
128
- }
129
- }
130
- save() {
131
- try {
132
- const dir = path.dirname(LEDGER_FILE);
133
- if (!fs.existsSync(dir)) {
134
- fs.mkdirSync(dir, { recursive: true });
135
- }
136
- // Savings stay at the top level so pre-v2 readers keep working; costs are
137
- // additive under `_costs`. Attribution rollups ride along under `_costs` so a
138
- // v2 reader sees exactly the shape it expects plus three ignorable extra keys.
139
- const payload = {
140
- ...this.sources,
141
- _costs: { ...this.costs, _byTool: this.costByTool, _byHost: this.costByHost, _byOrigin: this.costByOrigin },
142
- _daily: this.daily,
143
- // Stays 2: the rollups are additive keys a v2 reader already ignores, so no
144
- // format bump — and the existing round-trip contract pins this number.
145
- _version: 2,
146
- };
147
- writeFileAtomic(LEDGER_FILE, JSON.stringify(payload, null, 2));
148
- }
149
- catch (err) {
150
- // Fail silently
151
- }
152
- }
153
- /**
154
- * Record a savings event by char counts (automatically converts to token estimate).
155
- * @param source Which module recorded the savings
156
- * @param charsBefore Original char count before compression/routing
157
- * @param charsAfter Resulting char count after compression/routing
158
- */
159
- record(source, charsBefore, charsAfter) {
160
- const charsSaved = Math.max(0, charsBefore - charsAfter);
161
- if (charsSaved === 0)
162
- return;
163
- const tokensSaved = Math.floor(charsSaved / 4);
164
- const costSaved = tokensSaved * AVG_COST_PER_TOKEN;
165
- this.sources[source].events++;
166
- this.sources[source].tokensSaved += tokensSaved;
167
- this.sources[source].costSaved += costSaved;
168
- this.bumpDay('saved', tokensSaved);
169
- this.save();
170
- }
171
- /** Adds to today's totals and drops days past MAX_DAYS_KEPT. */
172
- bumpDay(side, tokens) {
173
- const today = dayKey();
174
- const slot = this.daily[today] ?? (this.daily[today] = { saved: 0, spent: 0 });
175
- slot[side] += tokens;
176
- const days = Object.keys(this.daily).sort();
177
- for (const old of days.slice(0, Math.max(0, days.length - MAX_DAYS_KEPT)))
178
- delete this.daily[old];
111
+ this.costByToolHost = {};
112
+ this.daily = {};
179
113
  }
180
- /**
181
- * Record a savings event directly in tokens (for sources that already know their token count).
182
- */
183
- recordTokens(source, tokensSaved) {
184
- if (tokensSaved <= 0)
185
- return;
186
- const costSaved = tokensSaved * AVG_COST_PER_TOKEN;
114
+ addSaved(source, tokensSaved, attribution) {
187
115
  this.sources[source].events++;
188
116
  this.sources[source].tokensSaved += tokensSaved;
189
- this.sources[source].costSaved += costSaved;
117
+ this.sources[source].costSaved += tokensSaved * AVG_COST_PER_TOKEN;
190
118
  this.bumpDay('saved', tokensSaved);
191
- this.save();
119
+ this.bumpSaved(source, attribution, tokensSaved);
192
120
  }
193
- /**
194
- * Record tokens Lemma *spent*. Counterpart to record()/recordTokens() — without
195
- * this the ledger can only ever grow, which is not evidence of anything.
196
- *
197
- * `attribution` is what makes the totals auditable (AN-01): every toolResult
198
- * recorded in-process carries its tool name, the connected host, and origin
199
- * "lemma". Rollups stay consistent with totals by construction — they are only
200
- * ever incremented alongside the bucket they annotate.
201
- */
202
- recordCost(source, tokensSpent, attribution) {
203
- if (tokensSpent <= 0)
204
- return;
121
+ addCost(source, tokensSpent, attribution) {
205
122
  this.costs[source].events++;
206
123
  this.costs[source].tokensSpent += tokensSpent;
207
124
  this.costs[source].costSpent += tokensSpent * AVG_COST_PER_TOKEN;
208
125
  this.bumpDay('spent', tokensSpent);
209
- if (source === 'toolResult') {
210
- // byTool needs an explicit tool name; host/origin ALWAYS annotate (defaulting
211
- // to unknown/lemma) so the rollups sum to the bucket totals — a smoke test
212
- // caught unattributed events vanishing from byHost, which would have made the
213
- // breakdown unfalsifiable in exactly the way the audit complained about.
214
- if (attribution?.tool)
215
- this.bumpRollup(this.costByTool, attribution.tool, tokensSpent, true);
216
- const host = attribution?.host && attribution.host.trim() ? attribution.host.trim().slice(0, 64) : 'unknown';
217
- this.bumpRollup(this.costByHost, host, tokensSpent, false);
218
- const origin = attribution?.origin && attribution.origin.trim() ? attribution.origin.trim().slice(0, 64) : 'lemma';
219
- this.bumpRollup(this.costByOrigin, origin, tokensSpent, false);
126
+ if (source !== 'toolResult')
127
+ return;
128
+ // byTool needs an explicit tool name; host/origin ALWAYS annotate (defaulting
129
+ // to unknown/lemma) so the rollups sum to the bucket totals — a smoke test
130
+ // caught unattributed events vanishing from byHost, which would have made the
131
+ // breakdown unfalsifiable in exactly the way the audit complained about.
132
+ if (attribution?.tool)
133
+ this.bumpRollup(this.costByTool, attribution.tool, tokensSpent, this.caps.tools);
134
+ const host = attribution?.host && attribution.host.trim() ? attribution.host.trim().slice(0, 64) : 'unknown';
135
+ this.bumpRollup(this.costByHost, host, tokensSpent);
136
+ // Tool x host: byTool and byHost alone cannot say whether 2,000 token_budget calls came from
137
+ // an agent or from a script. Only events that name a tool, same as byTool.
138
+ if (attribution?.tool)
139
+ this.bumpRollup(this.costByToolHost, `${attribution.tool}|${host}`, tokensSpent, this.caps.pairs);
140
+ const origin = attribution?.origin && attribution.origin.trim() ? attribution.origin.trim().slice(0, 64) : 'lemma';
141
+ this.bumpRollup(this.costByOrigin, origin, tokensSpent);
142
+ }
143
+ /** One attributed saving into the by-tool rollup (capped; overflow merges into "__other"). */
144
+ bumpSaved(source, attribution, tokensSaved) {
145
+ const tool = attribution?.tool?.trim();
146
+ if (!tool)
147
+ return;
148
+ const key = `${source}:${tool}`.slice(0, 160);
149
+ let slot = this.savedByTool[key];
150
+ if (!slot) {
151
+ if (Object.keys(this.savedByTool).length >= this.caps.tools) {
152
+ slot = this.savedByTool.__other ?? (this.savedByTool.__other = { events: 0, tokensSaved: 0 });
153
+ }
154
+ else {
155
+ slot = this.savedByTool[key] = { events: 0, tokensSaved: 0 };
156
+ }
220
157
  }
221
- this.save();
158
+ slot.events++;
159
+ slot.tokensSaved += tokensSaved;
222
160
  }
223
- /** One attributed event into a rollup map. byTool is capped; host/origin are naturally small. */
224
- bumpRollup(map, key, tokensSpent, capped) {
225
- const clean = key.slice(0, 128);
161
+ /** One attributed event into a rollup map. Capped maps merge overflow into "__other". */
162
+ bumpRollup(map, key, tokensSpent, cap) {
163
+ const clean = key.slice(0, 192);
226
164
  let slot = map[clean];
227
165
  if (!slot) {
228
- if (capped && Object.keys(map).length >= MAX_ATTRIBUTED_TOOLS) {
166
+ if (cap !== undefined && Object.keys(map).length >= cap) {
229
167
  // Bounded memory over perfect recall: merge into an overflow bucket rather
230
168
  // than growing ledger.json without limit or dropping the event from totals
231
169
  // (totals above already counted it — rollups must never contradict them).
@@ -238,12 +176,102 @@ class SavingsLedger {
238
176
  slot.events++;
239
177
  slot.tokensSpent += tokensSpent;
240
178
  }
241
- /** Record a cost event by char count (converts with the same chars/4 heuristic). */
242
- recordCostChars(source, chars, attribution) {
243
- this.recordCost(source, Math.floor(Math.max(0, chars) / 4), attribution);
179
+ /** Adds to today's totals and drops days past MAX_DAYS_KEPT. */
180
+ bumpDay(side, tokens) {
181
+ const today = dayKey();
182
+ const slot = this.daily[today] ?? (this.daily[today] = { saved: 0, spent: 0 });
183
+ slot[side] += tokens;
184
+ const days = Object.keys(this.daily).sort();
185
+ for (const old of days.slice(0, Math.max(0, days.length - MAX_DAYS_KEPT)))
186
+ delete this.daily[old];
187
+ }
188
+ totals() {
189
+ let tokensSaved = 0;
190
+ let tokensSpent = 0;
191
+ for (const src of Object.values(this.sources))
192
+ tokensSaved += src.tokensSaved;
193
+ for (const c of Object.values(this.costs))
194
+ tokensSpent += c.tokensSpent;
195
+ return { tokensSaved, tokensSpent, netTokens: tokensSaved - tokensSpent };
196
+ }
197
+ /** The v2 on-disk shape: savings at the top level, costs and rollups additive under `_costs`. */
198
+ toJSON() {
199
+ return {
200
+ ...this.sources,
201
+ _costs: {
202
+ ...this.costs,
203
+ _byTool: this.costByTool,
204
+ _byHost: this.costByHost,
205
+ _byOrigin: this.costByOrigin,
206
+ _byToolHost: this.costByToolHost,
207
+ },
208
+ _daily: this.daily,
209
+ _savedByTool: this.savedByTool,
210
+ // Stays 2: the rollups are additive keys a v2 reader already ignores, so no
211
+ // format bump — and the existing round-trip contract pins this number.
212
+ _version: 2,
213
+ };
214
+ }
215
+ /** Reads one slice off disk. Every part is validated on its own: a corrupt rollup must not poison totals. */
216
+ loadFrom(parsed) {
217
+ if (!parsed || typeof parsed !== 'object')
218
+ return;
219
+ for (const key of Object.keys(this.sources)) {
220
+ if (parsed[key]) {
221
+ this.sources[key] = {
222
+ events: Number(parsed[key].events || 0),
223
+ tokensSaved: Number(parsed[key].tokensSaved || 0),
224
+ costSaved: Number(parsed[key].costSaved || 0),
225
+ };
226
+ }
227
+ }
228
+ // v2 adds the cost side under `_costs`. Ledgers written before v2 simply
229
+ // have no cost history — they load with zeroes rather than failing.
230
+ const parsedCosts = parsed._costs;
231
+ if (parsedCosts && typeof parsedCosts === 'object') {
232
+ for (const key of Object.keys(this.costs)) {
233
+ if (parsedCosts[key]) {
234
+ this.costs[key] = {
235
+ events: Number(parsedCosts[key].events || 0),
236
+ tokensSpent: Number(parsedCosts[key].tokensSpent || 0),
237
+ costSpent: Number(parsedCosts[key].costSpent || 0),
238
+ };
239
+ }
240
+ }
241
+ // Attribution rollups (additive under _costs): absent on older ledgers -> empty.
242
+ this.costByTool = readRollup(parsedCosts._byTool);
243
+ this.costByHost = readRollup(parsedCosts._byHost);
244
+ this.costByOrigin = readRollup(parsedCosts._byOrigin);
245
+ this.costByToolHost = readRollup(parsedCosts._byToolHost);
246
+ }
247
+ // Savings attribution (additive, top level, underscore-prefixed like _daily): absent on
248
+ // older ledgers -> empty. Entry-by-entry, so a corrupt map cannot poison the totals.
249
+ const parsedSaved = parsed._savedByTool;
250
+ if (parsedSaved && typeof parsedSaved === 'object' && !Array.isArray(parsedSaved)) {
251
+ for (const [key, v] of Object.entries(parsedSaved)) {
252
+ if (typeof key !== 'string' || key.length === 0 || key.length > 160 || !v || typeof v !== 'object')
253
+ continue;
254
+ const events = Number(v.events);
255
+ const tokensSaved = Number(v.tokensSaved);
256
+ if (!Number.isFinite(events) || !Number.isFinite(tokensSaved) || events < 0 || tokensSaved < 0)
257
+ continue;
258
+ this.savedByTool[key] = { events: Math.floor(events), tokensSaved: Math.floor(tokensSaved) };
259
+ }
260
+ }
261
+ const parsedDaily = parsed._daily;
262
+ if (parsedDaily && typeof parsedDaily === 'object' && !Array.isArray(parsedDaily)) {
263
+ for (const [day, v] of Object.entries(parsedDaily)) {
264
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(day) || !v || typeof v !== 'object')
265
+ continue;
266
+ const saved = Number(v.saved);
267
+ const spent = Number(v.spent);
268
+ if (!Number.isFinite(saved) || !Number.isFinite(spent) || saved < 0 || spent < 0)
269
+ continue;
270
+ this.daily[day] = { saved: Math.floor(saved), spent: Math.floor(spent) };
271
+ }
272
+ }
244
273
  }
245
- /** Returns a full snapshot including computed totals, costs and net position */
246
- getSnapshot() {
274
+ snapshot(sessionStartedAt, project, projectTotals) {
247
275
  const total = { events: 0, tokensSaved: 0, costSaved: 0 };
248
276
  for (const src of Object.values(this.sources)) {
249
277
  total.events += src.events;
@@ -285,14 +313,147 @@ class SavingsLedger {
285
313
  totalCost,
286
314
  net,
287
315
  recent,
288
- sessionStartedAt: this.sessionStartedAt,
316
+ sessionStartedAt,
289
317
  costAttribution: {
290
318
  byTool: { ...this.costByTool },
291
319
  byHost: { ...this.costByHost },
292
320
  byOrigin: { ...this.costByOrigin },
321
+ byToolHost: { ...this.costByToolHost },
293
322
  },
323
+ savingsAttribution: { byTool: { ...this.savedByTool } },
324
+ project,
325
+ projectTotals,
294
326
  };
295
327
  }
328
+ }
329
+ class SavingsLedger {
330
+ constructor() {
331
+ /** The whole daemon: every event, with or without a project. */
332
+ this.all = new LedgerState(GLOBAL_CAPS);
333
+ /** One slice per workspace path, fed only by events that said which project they came from. */
334
+ this.projects = {};
335
+ this.sessionStartedAt = new Date().toISOString();
336
+ this.load();
337
+ }
338
+ load() {
339
+ try {
340
+ const dir = path.dirname(LEDGER_FILE);
341
+ if (!fs.existsSync(dir)) {
342
+ fs.mkdirSync(dir, { recursive: true });
343
+ }
344
+ if (fs.existsSync(LEDGER_FILE)) {
345
+ const content = fs.readFileSync(LEDGER_FILE, 'utf8');
346
+ const parsed = JSON.parse(content);
347
+ if (parsed && typeof parsed === 'object') {
348
+ this.all.loadFrom(parsed);
349
+ // Per-project slices (additive, top level): absent on older ledgers -> none.
350
+ const parsedProjects = parsed._projects;
351
+ if (parsedProjects && typeof parsedProjects === 'object' && !Array.isArray(parsedProjects)) {
352
+ for (const [rawKey, v] of Object.entries(parsedProjects)) {
353
+ const key = projectKey(rawKey) ?? undefined;
354
+ if (!key || Object.keys(this.projects).length >= MAX_PROJECTS + 1)
355
+ continue;
356
+ const state = new LedgerState(PROJECT_CAPS);
357
+ state.loadFrom(v);
358
+ this.projects[key] = state;
359
+ }
360
+ }
361
+ }
362
+ }
363
+ }
364
+ catch (err) {
365
+ // An unreadable ledger is set aside rather than overwritten by the next save.
366
+ if (err instanceof SyntaxError)
367
+ quarantineCorrupt(LEDGER_FILE);
368
+ }
369
+ }
370
+ save() {
371
+ try {
372
+ const dir = path.dirname(LEDGER_FILE);
373
+ if (!fs.existsSync(dir)) {
374
+ fs.mkdirSync(dir, { recursive: true });
375
+ }
376
+ const projects = {};
377
+ for (const [key, state] of Object.entries(this.projects))
378
+ projects[key] = state.toJSON();
379
+ writeFileAtomic(LEDGER_FILE, JSON.stringify({ ...this.all.toJSON(), _projects: projects }, null, 2));
380
+ }
381
+ catch (err) {
382
+ // Fail silently
383
+ }
384
+ }
385
+ /** The slice an event belongs to, created on first sight; past MAX_PROJECTS they share one overflow slice. */
386
+ projectState(raw) {
387
+ const key = projectKey(raw);
388
+ if (!key)
389
+ return undefined;
390
+ const existing = this.projects[key];
391
+ if (existing)
392
+ return existing;
393
+ const slot = Object.keys(this.projects).length >= MAX_PROJECTS ? PROJECT_OVERFLOW : key;
394
+ return this.projects[slot] ?? (this.projects[slot] = new LedgerState(PROJECT_CAPS));
395
+ }
396
+ applySaved(source, tokensSaved, attribution) {
397
+ this.all.addSaved(source, tokensSaved, attribution);
398
+ this.projectState(attribution?.project)?.addSaved(source, tokensSaved, attribution);
399
+ this.save();
400
+ }
401
+ /**
402
+ * Record a savings event by char counts (automatically converts to token estimate).
403
+ * @param source Which module recorded the savings
404
+ * @param charsBefore Original char count before compression/routing
405
+ * @param charsAfter Resulting char count after compression/routing
406
+ */
407
+ record(source, charsBefore, charsAfter, attribution) {
408
+ const charsSaved = Math.max(0, charsBefore - charsAfter);
409
+ if (charsSaved === 0)
410
+ return;
411
+ this.applySaved(source, Math.floor(charsSaved / 4), attribution);
412
+ }
413
+ /**
414
+ * Record a savings event directly in tokens (for sources that already know their token count).
415
+ */
416
+ recordTokens(source, tokensSaved, attribution) {
417
+ if (tokensSaved <= 0)
418
+ return;
419
+ this.applySaved(source, tokensSaved, attribution);
420
+ }
421
+ /**
422
+ * Record tokens Lemma *spent*. Counterpart to record()/recordTokens() — without
423
+ * this the ledger can only ever grow, which is not evidence of anything.
424
+ *
425
+ * `attribution` is what makes the totals auditable (AN-01): every toolResult
426
+ * recorded in-process carries its tool name, the connected host, and origin
427
+ * "lemma". Rollups stay consistent with totals by construction — they are only
428
+ * ever incremented alongside the bucket they annotate.
429
+ */
430
+ recordCost(source, tokensSpent, attribution) {
431
+ if (tokensSpent <= 0)
432
+ return;
433
+ this.all.addCost(source, tokensSpent, attribution);
434
+ this.projectState(attribution?.project)?.addCost(source, tokensSpent, attribution);
435
+ this.save();
436
+ }
437
+ /** Record a cost event by char count (converts with the same chars/4 heuristic). */
438
+ recordCostChars(source, chars, attribution) {
439
+ this.recordCost(source, Math.floor(Math.max(0, chars) / 4), attribution);
440
+ }
441
+ projectTotals() {
442
+ const out = {};
443
+ for (const [key, state] of Object.entries(this.projects))
444
+ out[key] = state.totals();
445
+ return out;
446
+ }
447
+ /**
448
+ * A full snapshot: totals, costs and net position. With `project`, the same shape scoped to that
449
+ * workspace (zeros when nothing was attributed to it yet — never the daemon's totals, which would
450
+ * read as that project's own).
451
+ */
452
+ getSnapshot(project) {
453
+ const key = projectKey(project);
454
+ const state = key ? (this.projects[key] ?? new LedgerState(PROJECT_CAPS)) : this.all;
455
+ return state.snapshot(this.sessionStartedAt, key, this.projectTotals());
456
+ }
296
457
  /** Returns a pretty terminal summary block */
297
458
  getTerminalSummary() {
298
459
  const snap = this.getSnapshot();
@@ -339,16 +500,8 @@ class SavingsLedger {
339
500
  }
340
501
  /** Reset all counters (e.g., on cache clear) */
341
502
  reset() {
342
- for (const key of Object.keys(this.sources)) {
343
- this.sources[key] = { events: 0, tokensSaved: 0, costSaved: 0 };
344
- }
345
- for (const key of Object.keys(this.costs)) {
346
- this.costs[key] = { events: 0, tokensSpent: 0, costSpent: 0 };
347
- }
348
- this.costByTool = {};
349
- this.costByHost = {};
350
- this.costByOrigin = {};
351
- this.daily = {};
503
+ this.all.clear();
504
+ this.projects = {};
352
505
  this.save();
353
506
  }
354
507
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SavingsLedger.js","sourceRoot":"","sources":["../../../src/utils/SavingsLedger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SavingsLedger.js","sourceRoot":"","sources":["../../../src/utils/SavingsLedger.ts"],"names":[],"mappings":"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"}