@nanonets/graft 0.15.0 → 0.18.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 (259) hide show
  1. package/README.md +17 -5
  2. package/dist/ai/crux.d.ts +14 -1
  3. package/dist/ai/crux.d.ts.map +1 -1
  4. package/dist/ai/crux.js +31 -1
  5. package/dist/ai/crux.js.map +1 -1
  6. package/dist/ai/failure.d.ts +13 -2
  7. package/dist/ai/failure.d.ts.map +1 -1
  8. package/dist/ai/failure.js +16 -4
  9. package/dist/ai/failure.js.map +1 -1
  10. package/dist/ai/llm/factory.d.ts +6 -1
  11. package/dist/ai/llm/factory.d.ts.map +1 -1
  12. package/dist/ai/llm/factory.js +8 -0
  13. package/dist/ai/llm/factory.js.map +1 -1
  14. package/dist/ai/llm/orcarouter.d.ts +34 -0
  15. package/dist/ai/llm/orcarouter.d.ts.map +1 -0
  16. package/dist/ai/llm/orcarouter.js +45 -0
  17. package/dist/ai/llm/orcarouter.js.map +1 -0
  18. package/dist/ai/providers.d.ts.map +1 -1
  19. package/dist/ai/providers.js +13 -3
  20. package/dist/ai/providers.js.map +1 -1
  21. package/dist/app/brain-build.d.ts +66 -0
  22. package/dist/app/brain-build.d.ts.map +1 -0
  23. package/dist/app/brain-build.js +169 -0
  24. package/dist/app/brain-build.js.map +1 -0
  25. package/dist/app/checkout.d.ts +53 -3
  26. package/dist/app/checkout.d.ts.map +1 -1
  27. package/dist/app/checkout.js +195 -27
  28. package/dist/app/checkout.js.map +1 -1
  29. package/dist/app/events.d.ts +7 -0
  30. package/dist/app/events.d.ts.map +1 -1
  31. package/dist/app/events.js +7 -2
  32. package/dist/app/events.js.map +1 -1
  33. package/dist/app/history.d.ts +128 -0
  34. package/dist/app/history.d.ts.map +1 -0
  35. package/dist/app/history.js +269 -0
  36. package/dist/app/history.js.map +1 -0
  37. package/dist/app/identity.d.ts +33 -0
  38. package/dist/app/identity.d.ts.map +1 -1
  39. package/dist/app/identity.js +72 -0
  40. package/dist/app/identity.js.map +1 -1
  41. package/dist/app/main.js +12 -0
  42. package/dist/app/main.js.map +1 -1
  43. package/dist/app/pages.d.ts +17 -0
  44. package/dist/app/pages.d.ts.map +1 -1
  45. package/dist/app/pages.js +112 -5
  46. package/dist/app/pages.js.map +1 -1
  47. package/dist/app/review-process.d.ts +66 -0
  48. package/dist/app/review-process.d.ts.map +1 -0
  49. package/dist/app/review-process.js +199 -0
  50. package/dist/app/review-process.js.map +1 -0
  51. package/dist/app/review-worker.d.ts +2 -0
  52. package/dist/app/review-worker.d.ts.map +1 -0
  53. package/dist/app/review-worker.js +108 -0
  54. package/dist/app/review-worker.js.map +1 -0
  55. package/dist/app/review.d.ts.map +1 -1
  56. package/dist/app/review.js +14 -1
  57. package/dist/app/review.js.map +1 -1
  58. package/dist/app/server.d.ts +22 -2
  59. package/dist/app/server.d.ts.map +1 -1
  60. package/dist/app/server.js +77 -3
  61. package/dist/app/server.js.map +1 -1
  62. package/dist/app/sources.d.ts +68 -0
  63. package/dist/app/sources.d.ts.map +1 -0
  64. package/dist/app/sources.js +341 -0
  65. package/dist/app/sources.js.map +1 -0
  66. package/dist/ask/ask.d.ts +6 -0
  67. package/dist/ask/ask.d.ts.map +1 -1
  68. package/dist/ask/ask.js +30 -2
  69. package/dist/ask/ask.js.map +1 -1
  70. package/dist/blast/blast-cli.d.ts.map +1 -1
  71. package/dist/blast/blast-cli.js +6 -30
  72. package/dist/blast/blast-cli.js.map +1 -1
  73. package/dist/blast/name.d.ts +13 -0
  74. package/dist/blast/name.d.ts.map +1 -1
  75. package/dist/blast/name.js +36 -0
  76. package/dist/blast/name.js.map +1 -1
  77. package/dist/brain/attach.d.ts +44 -0
  78. package/dist/brain/attach.d.ts.map +1 -0
  79. package/dist/brain/attach.js +63 -0
  80. package/dist/brain/attach.js.map +1 -0
  81. package/dist/brain/connect.d.ts +59 -0
  82. package/dist/brain/connect.d.ts.map +1 -0
  83. package/dist/brain/connect.js +80 -0
  84. package/dist/brain/connect.js.map +1 -0
  85. package/dist/brain/link.d.ts +82 -0
  86. package/dist/brain/link.d.ts.map +1 -0
  87. package/dist/brain/link.js +136 -0
  88. package/dist/brain/link.js.map +1 -0
  89. package/dist/brain/push.d.ts +72 -0
  90. package/dist/brain/push.d.ts.map +1 -0
  91. package/dist/brain/push.js +191 -0
  92. package/dist/brain/push.js.map +1 -0
  93. package/dist/brain/wire.d.ts +38 -0
  94. package/dist/brain/wire.d.ts.map +1 -0
  95. package/dist/brain/wire.js +133 -0
  96. package/dist/brain/wire.js.map +1 -0
  97. package/dist/claude/format.d.ts.map +1 -1
  98. package/dist/claude/format.js +10 -3
  99. package/dist/claude/format.js.map +1 -1
  100. package/dist/claude/hooks.d.ts.map +1 -1
  101. package/dist/claude/hooks.js +125 -24
  102. package/dist/claude/hooks.js.map +1 -1
  103. package/dist/claude/init.d.ts +6 -0
  104. package/dist/claude/init.d.ts.map +1 -1
  105. package/dist/claude/init.js +10 -2
  106. package/dist/claude/init.js.map +1 -1
  107. package/dist/claude/session-metrics.d.ts +73 -0
  108. package/dist/claude/session-metrics.d.ts.map +1 -0
  109. package/dist/claude/session-metrics.js +206 -0
  110. package/dist/claude/session-metrics.js.map +1 -0
  111. package/dist/claude/settings-merge.d.ts +25 -1
  112. package/dist/claude/settings-merge.d.ts.map +1 -1
  113. package/dist/claude/settings-merge.js +88 -25
  114. package/dist/claude/settings-merge.js.map +1 -1
  115. package/dist/claude/skill-template.d.ts.map +1 -1
  116. package/dist/claude/skill-template.js +6 -0
  117. package/dist/claude/skill-template.js.map +1 -1
  118. package/dist/claude/state.d.ts +26 -0
  119. package/dist/claude/state.d.ts.map +1 -1
  120. package/dist/claude/state.js +14 -1
  121. package/dist/claude/state.js.map +1 -1
  122. package/dist/claude/tally.d.ts +27 -0
  123. package/dist/claude/tally.d.ts.map +1 -1
  124. package/dist/claude/tally.js +74 -1
  125. package/dist/claude/tally.js.map +1 -1
  126. package/dist/cli.js +237 -4
  127. package/dist/cli.js.map +1 -1
  128. package/dist/context/build.d.ts +11 -0
  129. package/dist/context/build.d.ts.map +1 -1
  130. package/dist/context/build.js +27 -6
  131. package/dist/context/build.js.map +1 -1
  132. package/dist/context/check.d.ts.map +1 -1
  133. package/dist/context/check.js +5 -13
  134. package/dist/context/check.js.map +1 -1
  135. package/dist/context/node-file.d.ts +1 -1
  136. package/dist/context/node-file.d.ts.map +1 -1
  137. package/dist/context/node-file.js +38 -6
  138. package/dist/context/node-file.js.map +1 -1
  139. package/dist/context/price.d.ts +49 -0
  140. package/dist/context/price.d.ts.map +1 -0
  141. package/dist/context/price.js +83 -0
  142. package/dist/context/price.js.map +1 -0
  143. package/dist/context/savings.d.ts +20 -2
  144. package/dist/context/savings.d.ts.map +1 -1
  145. package/dist/context/savings.js +57 -4
  146. package/dist/context/savings.js.map +1 -1
  147. package/dist/engine.d.ts +2 -0
  148. package/dist/engine.d.ts.map +1 -1
  149. package/dist/engine.js +1 -0
  150. package/dist/engine.js.map +1 -1
  151. package/dist/graph/cards.d.ts +4 -3
  152. package/dist/graph/cards.d.ts.map +1 -1
  153. package/dist/graph/cards.js +34 -6
  154. package/dist/graph/cards.js.map +1 -1
  155. package/dist/graph/enrich.d.ts +4 -4
  156. package/dist/graph/enrich.d.ts.map +1 -1
  157. package/dist/graph/enrich.js +32 -6
  158. package/dist/graph/enrich.js.map +1 -1
  159. package/dist/graph/generic.d.ts +10 -0
  160. package/dist/graph/generic.d.ts.map +1 -1
  161. package/dist/graph/generic.js +20 -2
  162. package/dist/graph/generic.js.map +1 -1
  163. package/dist/graph/workspace.d.ts +2 -0
  164. package/dist/graph/workspace.d.ts.map +1 -1
  165. package/dist/graph/workspace.js +173 -6
  166. package/dist/graph/workspace.js.map +1 -1
  167. package/dist/hosts/antigravity.d.ts +2 -2
  168. package/dist/hosts/antigravity.d.ts.map +1 -1
  169. package/dist/hosts/claude-global.d.ts +33 -0
  170. package/dist/hosts/claude-global.d.ts.map +1 -0
  171. package/dist/hosts/claude-global.js +118 -0
  172. package/dist/hosts/claude-global.js.map +1 -0
  173. package/dist/hosts/codex-hooks.d.ts +2 -6
  174. package/dist/hosts/codex-hooks.d.ts.map +1 -1
  175. package/dist/hosts/codex-hooks.js +7 -30
  176. package/dist/hosts/codex-hooks.js.map +1 -1
  177. package/dist/hosts/config-write.d.ts +36 -0
  178. package/dist/hosts/config-write.d.ts.map +1 -0
  179. package/dist/hosts/config-write.js +63 -0
  180. package/dist/hosts/config-write.js.map +1 -0
  181. package/dist/hosts/cursor-hooks.d.ts +18 -0
  182. package/dist/hosts/cursor-hooks.d.ts.map +1 -0
  183. package/dist/hosts/cursor-hooks.js +100 -0
  184. package/dist/hosts/cursor-hooks.js.map +1 -0
  185. package/dist/hosts/init.d.ts +2 -2
  186. package/dist/hosts/init.d.ts.map +1 -1
  187. package/dist/hosts/init.js +8 -2
  188. package/dist/hosts/init.js.map +1 -1
  189. package/dist/hosts/mcp-config.d.ts +3 -5
  190. package/dist/hosts/mcp-config.d.ts.map +1 -1
  191. package/dist/hosts/mcp-config.js +5 -10
  192. package/dist/hosts/mcp-config.js.map +1 -1
  193. package/dist/hosts/plan.d.ts.map +1 -1
  194. package/dist/hosts/plan.js +7 -1
  195. package/dist/hosts/plan.js.map +1 -1
  196. package/dist/hosts/retract.d.ts.map +1 -1
  197. package/dist/hosts/retract.js +33 -13
  198. package/dist/hosts/retract.js.map +1 -1
  199. package/dist/hosts/sections.d.ts +23 -2
  200. package/dist/hosts/sections.d.ts.map +1 -1
  201. package/dist/hosts/sections.js +25 -9
  202. package/dist/hosts/sections.js.map +1 -1
  203. package/dist/index.d.ts +2 -0
  204. package/dist/index.d.ts.map +1 -1
  205. package/dist/index.js +2 -0
  206. package/dist/index.js.map +1 -1
  207. package/dist/ingest/fs.d.ts +20 -0
  208. package/dist/ingest/fs.d.ts.map +1 -1
  209. package/dist/ingest/fs.js +76 -3
  210. package/dist/ingest/fs.js.map +1 -1
  211. package/dist/mcp/server.d.ts.map +1 -1
  212. package/dist/mcp/server.js +33 -4
  213. package/dist/mcp/server.js.map +1 -1
  214. package/dist/mcp/tool-names.d.ts +20 -0
  215. package/dist/mcp/tool-names.d.ts.map +1 -0
  216. package/dist/mcp/tool-names.js +36 -0
  217. package/dist/mcp/tool-names.js.map +1 -0
  218. package/dist/mcp/tools.d.ts +11 -2
  219. package/dist/mcp/tools.d.ts.map +1 -1
  220. package/dist/mcp/tools.js +14 -22
  221. package/dist/mcp/tools.js.map +1 -1
  222. package/dist/telemetry/contract.d.ts.map +1 -1
  223. package/dist/telemetry/contract.js +10 -1
  224. package/dist/telemetry/contract.js.map +1 -1
  225. package/dist/telemetry/flush.d.ts.map +1 -1
  226. package/dist/telemetry/flush.js +1 -0
  227. package/dist/telemetry/flush.js.map +1 -1
  228. package/dist/telemetry/gate.d.ts +14 -0
  229. package/dist/telemetry/gate.d.ts.map +1 -1
  230. package/dist/telemetry/gate.js +18 -2
  231. package/dist/telemetry/gate.js.map +1 -1
  232. package/dist/telemetry/identity.d.ts +7 -0
  233. package/dist/telemetry/identity.d.ts.map +1 -1
  234. package/dist/telemetry/identity.js.map +1 -1
  235. package/dist/telemetry/index.d.ts +2 -2
  236. package/dist/telemetry/index.d.ts.map +1 -1
  237. package/dist/telemetry/index.js +2 -2
  238. package/dist/telemetry/index.js.map +1 -1
  239. package/dist/telemetry/sessions.d.ts +19 -2
  240. package/dist/telemetry/sessions.d.ts.map +1 -1
  241. package/dist/telemetry/sessions.js +57 -40
  242. package/dist/telemetry/sessions.js.map +1 -1
  243. package/dist/telemetry/track.d.ts +22 -3
  244. package/dist/telemetry/track.d.ts.map +1 -1
  245. package/dist/telemetry/track.js +34 -5
  246. package/dist/telemetry/track.js.map +1 -1
  247. package/dist/upkeep-run.d.ts.map +1 -1
  248. package/dist/upkeep-run.js +12 -2
  249. package/dist/upkeep-run.js.map +1 -1
  250. package/dist/upkeep.d.ts +25 -4
  251. package/dist/upkeep.d.ts.map +1 -1
  252. package/dist/upkeep.js +40 -1
  253. package/dist/upkeep.js.map +1 -1
  254. package/dist/util/state.d.ts +9 -0
  255. package/dist/util/state.d.ts.map +1 -1
  256. package/dist/util/state.js.map +1 -1
  257. package/package.json +2 -2
  258. package/scripts/postinstall.mjs +42 -3
  259. package/scripts/run-tests.mjs +14 -0
@@ -9,9 +9,10 @@ import { patchStats, readStats, acquireLock, readSession, writeSession, resolveC
9
9
  import { graftCliPath, claudeScriptPath } from './paths.js';
10
10
  import { runUpkeep } from '../upkeep-run.js';
11
11
  import { runningVersion } from '../upkeep.js';
12
- import { flushClosedSessions } from '../telemetry/sessions.js';
13
- import { hasSavingsTally, lastAssistantTurn } from './tally.js';
12
+ import { flushClosedSessions, summarizeSession } from '../telemetry/sessions.js';
13
+ import { hasSavingsTally, lastAssistantTurn, lastTurnBilling } from './tally.js';
14
14
  import { scopeOf, scopesOfGraph } from '../graph/scopes.js';
15
+ import { classifyToolUse, isMcpToolName, isGraftMcpTool, parseSavings, recordToolUse } from './session-metrics.js';
15
16
  /** Prompts shorter than this never trigger retrieval — they are almost always
16
17
  * conversational ("yes go ahead", "thanks") and the coverage gate can't judge
17
18
  * them reliably with so few terms. */
@@ -244,27 +245,110 @@ export function lastFileScopeHint(dir, lastFile) {
244
245
  return null;
245
246
  }
246
247
  }
247
- /** PostToolUse on a graft retrieval tool. Its rendered output carries one (or
248
- * more) `[graft] tokens saved ≈ N` footers — the same numbers the agent just
249
- * read. Sum them and add to the session's running total so the statusline's
250
- * `~N tok saved` reflects what graft saved this session, across CLI and MCP.
251
- * Pure parse of the payload the hook already received (no re-run), and a no-op
252
- * unless a footer is present — so it stays cheap on unrelated Bash calls. */
253
- function handleToolSavings(input, dir) {
254
- const blob = JSON.stringify(input?.tool_response ?? input ?? '');
255
- let total = 0;
256
- for (const m of blob.matchAll(/\[graft\] tokens saved ≈ ([\d,]+)/g))
257
- total += Number(m[1].replace(/,/g, '')) || 0;
258
- if (total <= 0)
248
+ /**
249
+ * PostToolUse on a retrieval tool. Two jobs, both a pure parse of the payload the
250
+ * hook already received (no re-run):
251
+ *
252
+ * 1. Score the usage mix: classify the tool as a graft retrieval or a source
253
+ * read (Read/Grep/Glob) and bump the session's `graftReads`/`sourceReads`.
254
+ * Until this ran, those counters were never incremented, so
255
+ * `session_summary` telemetry shipped 0/0 for every session.
256
+ * 2. Sum any `[graft] tokens saved ≈ N` footers in the output into the running
257
+ * `savedTokens` total, so the statusline's `~N tok saved` reflects the
258
+ * session across CLI and MCP.
259
+ *
260
+ * A `[graft]` footer is itself proof graft ran, so it also counts as a graft
261
+ * read even when the tool name alone (a bare `Bash`) couldn't say so. A graft use
262
+ * also flags the turn (`turnUsedGraft`) so the Stop hook's tally can resolve
263
+ * whether the reply told the user what it saved. Stays a no-op on the
264
+ * Write/Edit/unrelated-Bash majority: nothing to classify and no footer means
265
+ * nothing is written.
266
+ */
267
+ function handleToolUse(input, dir) {
268
+ recordToolUse(dir, input?.session_id || 'default', { ...classifyAndScore(input?.tool_name, input?.tool_input?.command, () => input?.tool_response ?? input), host: 'claude-code' });
269
+ }
270
+ /**
271
+ * Classify a tool use and, only when it could carry a graft footer, parse the
272
+ * savings out of its (lazily-serialised) output.
273
+ *
274
+ * Source reads (Read/Grep/Glob) never print a `[graft]` footer, and their output
275
+ * is a whole file or every match — serialising and regexing that on every read
276
+ * is the expensive, pointless case the widened PostToolUse matcher would
277
+ * otherwise hit. So skip `payload()` entirely for them. For anything else, a
278
+ * footer is itself proof graft ran (a bare `Bash graft …` the name couldn't
279
+ * classify), so its presence upgrades the kind to 'graft'.
280
+ */
281
+ function classifyAndScore(toolName, command, payload) {
282
+ let kind = classifyToolUse(toolName, command);
283
+ if (kind === 'source')
284
+ return { kind, savedTokens: 0 };
285
+ const savedTokens = parseSavings(JSON.stringify(payload() ?? ''));
286
+ if (savedTokens > 0)
287
+ kind = 'graft';
288
+ return { kind, savedTokens };
289
+ }
290
+ /**
291
+ * Cursor `postToolUse` (https://cursor.com/docs/hooks). Same job as
292
+ * {@link handleToolUse} but over Cursor's payload shape: `tool_output` holds the
293
+ * JSON-stringified result (a Shell `graft …` call's footer lives in its stdout),
294
+ * and the session key is `conversation_id`. MCP graft calls are skipped here —
295
+ * `afterMCPExecution` owns them, and counting both would double the graft tally.
296
+ * The skip covers both the prefixed (`MCP:graft_find_code`) and bare
297
+ * (`graft_find_code`) tool-name shapes, so the guard — not just the installed
298
+ * matcher — is what prevents the double count.
299
+ */
300
+ function handleCursorPostTool(input, dir) {
301
+ const toolName = String(input?.tool_name ?? '');
302
+ if (isMcpToolName(toolName) || isGraftMcpTool(toolName))
303
+ return; // handled by handleCursorMcp
304
+ const command = input?.tool_input?.command ?? input?.tool_input?.cmd;
305
+ recordToolUse(dir, cursorSessionId(input), { ...classifyAndScore(toolName, command, () => input?.tool_output ?? input?.tool_response ?? input), host: 'cursor' });
306
+ }
307
+ /**
308
+ * Cursor `afterMCPExecution`: fires only for MCP tools, so a graft tool is
309
+ * recognised by its name and its savings read out of `result_json`. This is the
310
+ * one place graft MCP calls are counted for Cursor.
311
+ */
312
+ function handleCursorMcp(input, dir) {
313
+ const toolName = String(input?.tool_name ?? '');
314
+ if (!isGraftMcpTool(toolName))
259
315
  return;
260
- const id = input?.session_id || 'default';
261
- const s = readSession(dir, id);
262
- s.savedTokens = (s.savedTokens ?? 0) + total;
263
- // This turn used graft, so it is owed a tally in the reply. countTallyTurn()
264
- // at Stop resolves whether it got one; a flag rather than a count because a
265
- // turn with four graft calls is still one reply to the user.
266
- s.turnUsedGraft = true;
267
- writeSession(dir, id, s);
316
+ const savedTokens = parseSavings(JSON.stringify(input?.result_json ?? input?.result ?? input ?? ''));
317
+ recordToolUse(dir, cursorSessionId(input), { kind: 'graft', savedTokens, host: 'cursor' });
318
+ }
319
+ /** Cursor keys a chat by `conversation_id` (its `session_id` equivalent). */
320
+ function cursorSessionId(input) {
321
+ return input?.conversation_id || input?.session_id || 'default';
322
+ }
323
+ /**
324
+ * At turn end: what did this turn's input tokens actually cost?
325
+ *
326
+ * Deliberately ungated, unlike {@link countTallyTurn}: the blended rate has to
327
+ * describe the session, and graft turns are not a fair sample of it — they are
328
+ * the long, tool-heavy, cache-warm ones. Sampling only those would report a
329
+ * cheaper token than the session really pays.
330
+ *
331
+ * Accumulates the pair, never the ratio, so the rate re-blends every turn. A
332
+ * turn already billed (a duplicate Stop, or a Stop racing the transcript write)
333
+ * is skipped on its uuid.
334
+ */
335
+ function sampleTurnCost(input, dir) {
336
+ try {
337
+ const id = input?.session_id || 'default';
338
+ const billing = lastTurnBilling(input?.transcript_path);
339
+ if (!billing)
340
+ return;
341
+ const s = readSession(dir, id);
342
+ if (billing.uuid === s.lastBillingUuid)
343
+ return;
344
+ s.inputCostMicros = (s.inputCostMicros ?? 0) + billing.costMicros;
345
+ s.inputTokensBilled = (s.inputTokensBilled ?? 0) + billing.tokens;
346
+ s.lastBillingUuid = billing.uuid;
347
+ writeSession(dir, id, s);
348
+ }
349
+ catch {
350
+ // A billing estimate is never worth failing the graph sync over.
351
+ }
268
352
  }
269
353
  /**
270
354
  * At turn end: did the reply the user just read say what graft saved?
@@ -301,6 +385,7 @@ function countTallyTurn(input, dir) {
301
385
  }
302
386
  }
303
387
  function handleStop(input, dir) {
388
+ sampleTurnCost(input, dir);
304
389
  countTallyTurn(input, dir);
305
390
  // sync-run.js ships next to this module inside the package, so it resolves in
306
391
  // any repo that installs graft (not just graft's own). Defensive existsSync:
@@ -313,7 +398,7 @@ function handleStop(input, dir) {
313
398
  const stats = readStats(dir);
314
399
  if (stats?.dirty && acquireLock(dir)) {
315
400
  patchStats(dir, { syncing: true });
316
- const child = spawn(process.execPath, [syncRun, dir], { detached: true, stdio: 'ignore' });
401
+ const child = spawn(process.execPath, [syncRun, dir], { detached: true, stdio: 'ignore', windowsHide: true });
317
402
  child.unref();
318
403
  }
319
404
  }
@@ -347,7 +432,23 @@ export async function main(event) {
347
432
  return;
348
433
  }
349
434
  if (event === 'tool-savings') {
350
- handleToolSavings(input, dir);
435
+ handleToolUse(input, dir);
436
+ return;
437
+ }
438
+ if (event === 'cursor-post-tool') {
439
+ handleCursorPostTool(input, dir);
440
+ return;
441
+ }
442
+ if (event === 'cursor-mcp') {
443
+ handleCursorMcp(input, dir);
444
+ return;
445
+ }
446
+ // Cursor closes a chat: force-close THIS conversation into a bucketed
447
+ // `session_summary` now (its file's mtime is fresh, so the idle sweep would
448
+ // skip it). Attributed to Cursor. The idle sweep stays on Claude's
449
+ // session-start, whose Stop fires per turn and so has no real end signal.
450
+ if (event === 'cursor-session-end') {
451
+ summarizeSession(dir, cursorSessionId(input), { host: 'cursor' });
351
452
  return;
352
453
  }
353
454
  if (event === 'stop') {
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/claude/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/claude/hooks.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type GlobalWrite } from '../hosts/claude-global.js';
1
2
  import { type McpWrite } from '../hosts/mcp-config.js';
2
3
  import type { PlannedWrite } from '../hosts/plan.js';
3
4
  /**
@@ -22,11 +23,16 @@ export interface InitResult {
22
23
  skill: string;
23
24
  /** the `.mcp.json` write registering the graft MCP server for Claude Code. */
24
25
  mcp: McpWrite;
26
+ /** the user-level writes under `~/.claude`, empty when `global: false`. */
27
+ global: GlobalWrite[];
25
28
  warnings: string[];
26
29
  built: boolean;
27
30
  }
28
31
  export declare function runInit(dir: string, opts?: {
29
32
  build?: boolean;
30
33
  cliPath?: string;
34
+ statusline?: boolean;
35
+ global?: boolean;
36
+ home?: string;
31
37
  }): InitResult;
32
38
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/claude/init.ts"],"names":[],"mappings":"AAOA,OAAO,EAA6B,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAWzD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAWrG;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,GAAG,EAAE,QAAQ,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,UAAU,CA+BjG"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/claude/init.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAKlF,OAAO,EAA6B,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAWzD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAWrG;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,GAAG,EAAE,QAAQ,CAAC;IACd,2EAA2E;IAC3E,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACtG,UAAU,CAsCZ"}
@@ -1,6 +1,8 @@
1
1
  import { mkdirSync, writeFileSync, readFileSync, chmodSync } from 'node:fs';
2
2
  import { join, dirname } from 'node:path';
3
+ import { homedir } from 'node:os';
3
4
  import { execFileSync } from 'node:child_process';
5
+ import { installClaudeGlobal } from '../hosts/claude-global.js';
4
6
  import { mergeGraftSettings } from './settings-merge.js';
5
7
  import { statuslineShim, hooksShim } from './shim-template.js';
6
8
  import { skillTemplate } from './skill-template.js';
@@ -53,7 +55,7 @@ export function runInit(dir, opts = {}) {
53
55
  existing = JSON.parse(readFileSync(settingsPath, 'utf8'));
54
56
  }
55
57
  catch { /* none/invalid → start fresh */ }
56
- const { merged, warnings } = mergeGraftSettings(existing);
58
+ const { merged, warnings } = mergeGraftSettings(existing, { statusline: opts.statusline });
57
59
  writeFileSync(settingsPath, `${JSON.stringify(merged, null, 2)}\n`);
58
60
  const sl = statusline;
59
61
  const hk = hooks;
@@ -71,7 +73,13 @@ export function runInit(dir, opts = {}) {
71
73
  // exposes graft_find_code/graft_trace_calls/etc. as tools — the same keyed merge the
72
74
  // other hosts use (existing servers preserved; unparseable files skipped).
73
75
  const mcp = mergeJsonKey('claude', mcpTarget, 'mcpServers', serverEntry());
76
+ // The same wiring again, one level up in `~/.claude`, because everything above
77
+ // this line can be erased by a `.gitignore` and lost to `git worktree add`. See
78
+ // hosts/claude-global.ts for the failure that motivates it. Gated on the same
79
+ // flag `registerMcpConfigs` uses, so `--no-global` still means "nothing outside
80
+ // this repo".
81
+ const global = opts.global === false ? [] : installClaudeGlobal(opts.home ?? homedir());
74
82
  const built = buildGraphIfMissing(dir, opts);
75
- return { settingsPath, shims: [sl, hk], skill: skillPath, mcp, warnings, built };
83
+ return { settingsPath, shims: [sl, hk], skill: skillPath, mcp, global, warnings, built };
76
84
  }
77
85
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/claude/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAiB,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,OAA6B,QAAQ,EAAgB,EAAE,CAC5F,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO;QACL,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,gCAAgC,CAAC;QAC1E,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,sBAAsB,CAAC,EAAE,iBAAiB,CAAC;QAC7E,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,CAAC,EAAE,YAAY,CAAC;QACnE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,aAAa,CAAC;QACrE,yEAAyE;QACzE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,kBAAkB,EAAE,KAAK,CAAC;KACrD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,IAA2C;IAC1F,2EAA2E;IAC3E,4EAA4E;IAC5E,oEAAoE;IACpE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9G,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAYD,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,OAA8C,EAAE;IACnF,6EAA6E;IAC7E,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE9F,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,MAAM,YAAY,GAAG,QAAQ,CAAC;IAC9B,IAAI,QAAQ,GAAwB,EAAE,CAAC;IACvC,IAAI,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,gCAAgC,CAAC,CAAC;IAC7G,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC1D,aAAa,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAEpE,MAAM,EAAE,GAAG,UAAU,CAAC;IACtB,MAAM,EAAE,GAAG,KAAK,CAAC;IACjB,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC,CAAC,kEAAkE;IACpG,aAAa,CAAC,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAClE,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAE7D,mFAAmF;IACnF,mFAAmF;IACnF,MAAM,SAAS,GAAG,KAAK,CAAC;IACxB,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;IAE1C,0EAA0E;IAC1E,qFAAqF;IACrF,2EAA2E;IAC3E,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;IAE3E,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7C,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACnF,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/claude/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { type SessionState } from './state.js';
2
+ import type { AgentHost } from '../telemetry/contract.js';
3
+ export type ToolKind = 'graft' | 'source';
4
+ /** An MCP-style tool name (server-prefixed), as opposed to a native Read/Shell.
5
+ * Used to hand graft MCP calls to the dedicated MCP hook so a host that fires
6
+ * BOTH a generic post-tool hook and an MCP hook can't double-count them. */
7
+ export declare function isMcpToolName(toolName: string): boolean;
8
+ /**
9
+ * Whether a tool name is one of graft's MCP tools, across every host prefix.
10
+ * Anchored on the real name list (`graft_find_code`, its legacy aliases, …), not
11
+ * a loose `includes('graft')`: a third-party MCP tool whose name merely contains
12
+ * "graft" (or a repo working on graft itself) must not count as a graft read —
13
+ * the same care `commandInvokesGraft` takes for the CLI side. Strips the host
14
+ * prefix first (`mcp__graft__graft_find_code`, `MCP:graft_find_code`) by taking
15
+ * the last delimited segment. */
16
+ export declare function isGraftMcpTool(toolName: string): boolean;
17
+ /** Whether a shell command line invokes the graft CLI (any of its install shapes). */
18
+ export declare function commandInvokesGraft(command: string): boolean;
19
+ /**
20
+ * Classify one tool use as a graft retrieval, a source read, or neither
21
+ * (an edit, a task spawn, an unrelated shell command — no retrieval signal).
22
+ * `command` is the shell command line when `toolName` is the host's shell tool.
23
+ */
24
+ export declare function classifyToolUse(toolName?: string, command?: string): ToolKind | null;
25
+ /** Sum every `[graft] tokens saved ≈ N` footer in a blob of tool output. Thin
26
+ * alias over {@link sumSavingsFooters}, which lives next to the code that writes
27
+ * the footer so the two can't drift. */
28
+ export declare function parseSavings(blob: string): number;
29
+ export interface ToolUse {
30
+ /** 'graft' → graftReads++, 'source' → sourceReads++, null/absent → neither. */
31
+ kind?: ToolKind | null;
32
+ /** Tokens the retrieval saved, parsed from its footer. Added to the running total. */
33
+ savedTokens?: number;
34
+ /** The host recording this use. Stamped on the session file (once) so the
35
+ * `session_summary` is attributed correctly no matter which host later flushes it. */
36
+ host?: AgentHost;
37
+ }
38
+ /**
39
+ * Fold one tool use into a session's counters. A no-op when there is nothing to
40
+ * record (kind null and no savings), so a host can call it unconditionally after
41
+ * every tool without first checking whether the tool was interesting — the
42
+ * no-write path is what keeps it cheap on the Write/Edit/Task majority.
43
+ *
44
+ * Best-effort read-modify-write, not locked — mirroring `patchStats` in
45
+ * util/state.ts. Two tool-use hooks racing on the same session file can lose a
46
+ * count; that is acceptable for an episodic usage estimate (worst case is an
47
+ * undercount by one, never corruption thanks to the atomic write), and a lock
48
+ * here would contend with the build lock these hooks also touch.
49
+ */
50
+ export declare function recordToolUse(dir: string, sessionId: string, use: ToolUse): void;
51
+ export interface SessionSummary extends SessionState {
52
+ id: string;
53
+ }
54
+ /** The most-recently-touched session file for a repo, or null when none exist —
55
+ * what `graft stats` shows by default: the session you were just in. */
56
+ export declare function latestSession(dir: string): SessionSummary | null;
57
+ /**
58
+ * A one-line-per-fact readout of a session's usage mix — Cursor has no
59
+ * statusline, so this is how you see the numbers the Claude Code bar would show.
60
+ * Reads local JSON only; sends nothing.
61
+ */
62
+ /**
63
+ * What this repo's most recent session has actually been paying per million
64
+ * input tokens, or null when no turn has been billed yet.
65
+ *
66
+ * `latestSession` rather than a session id because the callers are CLI and MCP
67
+ * processes answering one query: they know the repo, never the host's session
68
+ * id. The rate belongs to the repo's current session, which is the one whose
69
+ * reply the number is about to appear in.
70
+ */
71
+ export declare function sessionInputRate(dir: string): number | null;
72
+ export declare function formatSessionStats(s: SessionSummary | null): string;
73
+ //# sourceMappingURL=session-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-metrics.d.ts","sourceRoot":"","sources":["../../src/claude/session-metrics.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAyD,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACtG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAG1D,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAc1C;;6EAE6E;AAC7E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED;;;;;;;iCAOiC;AACjC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIxD;AAED,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAM5D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAOpF;AAED;;yCAEyC;AACzC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,MAAM,WAAW,OAAO;IACtB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;0FACsF;IACtF,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAehF;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;yEACyE;AACzE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAWhE;AAED;;;;GAIG;AACH;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO3D;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,GAAG,MAAM,CAwBnE"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Session usage accounting, shared across every host (Claude Code, Cursor, and
3
+ * plain MCP). It answers the one question the README rests on: when an agent had
4
+ * both graft and grep in front of it, which did it reach for, and how much did
5
+ * that save?
6
+ *
7
+ * The counters (`graftReads`, `sourceReads`, `savedTokens`) already live on
8
+ * {@link SessionState}; before this module nothing ever incremented the first
9
+ * two, so `session_summary` telemetry shipped 0/0 for every session. Everything
10
+ * here is a pure classify + read-modify-write over `graft/.cache/session/`, so a
11
+ * host adapter is a few lines: parse its payload, call {@link recordToolUse}.
12
+ *
13
+ * Two payload shapes feed it, confirmed against the vendor docs rather than
14
+ * guessed (the matcher depends on getting the names right):
15
+ *
16
+ * - Claude Code `PostToolUse` — `{ tool_name, tool_input: { command }, tool_response }`.
17
+ * A graft retrieval prints a `[graft] tokens saved ≈ N` footer into
18
+ * `tool_response`, which is itself proof graft ran.
19
+ * - Cursor `postToolUse` — `{ tool_name, tool_input, tool_output, conversation_id }`
20
+ * (https://cursor.com/docs/hooks). `tool_output` is the JSON-stringified
21
+ * result; a Shell `graft …` call carries the same footer inside its stdout.
22
+ * - Cursor `afterMCPExecution` — `{ tool_name, tool_input, result_json, duration }`.
23
+ * Fires only for MCP tools, so a graft tool is recognised by its name and
24
+ * its savings read out of `result_json`.
25
+ *
26
+ * MCP tool names arrive host-prefixed in different shapes (`graft_find_code`,
27
+ * `MCP:graft_find_code`, `mcp__graft__graft_find_code`). {@link isGraftMcpTool}
28
+ * strips the prefix to the last delimited segment and checks it against the real
29
+ * name list (`GRAFT_MCP_TOOL_NAMES`), so a graft tool is recognised across every
30
+ * host format while a third-party tool that merely contains "graft" is not.
31
+ */
32
+ import { statSync } from 'node:fs';
33
+ import { join } from 'node:path';
34
+ import { sumSavingsFooters } from '../context/savings.js';
35
+ import { dollarsSaved, formatDollars } from '../context/price.js';
36
+ import { readSession, writeSession, sessionDir, listSessionIds } from './state.js';
37
+ import { GRAFT_MCP_TOOL_NAMES } from '../mcp/tool-names.js';
38
+ /** Native tools that mean "the agent went to read source itself" — the grep/read
39
+ * path graft is meant to replace. These are the host tool NAMES (Claude Code and
40
+ * Cursor both use Read/Grep/Glob; Cursor adds Search); shell builtins like `ls`
41
+ * are commands, never tool names, so they belong to the Shell branch, not here.
42
+ * Compared lower-cased. */
43
+ const SOURCE_TOOLS = new Set(['read', 'grep', 'glob', 'search']);
44
+ /** The host's shell tool, whose `command` we then inspect for a graft invocation. */
45
+ function isShellTool(t) {
46
+ return t === 'bash' || t === 'shell';
47
+ }
48
+ /** An MCP-style tool name (server-prefixed), as opposed to a native Read/Shell.
49
+ * Used to hand graft MCP calls to the dedicated MCP hook so a host that fires
50
+ * BOTH a generic post-tool hook and an MCP hook can't double-count them. */
51
+ export function isMcpToolName(toolName) {
52
+ const t = toolName.toLowerCase();
53
+ return t.startsWith('mcp') || t.includes(':') || t.includes('__');
54
+ }
55
+ /**
56
+ * Whether a tool name is one of graft's MCP tools, across every host prefix.
57
+ * Anchored on the real name list (`graft_find_code`, its legacy aliases, …), not
58
+ * a loose `includes('graft')`: a third-party MCP tool whose name merely contains
59
+ * "graft" (or a repo working on graft itself) must not count as a graft read —
60
+ * the same care `commandInvokesGraft` takes for the CLI side. Strips the host
61
+ * prefix first (`mcp__graft__graft_find_code`, `MCP:graft_find_code`) by taking
62
+ * the last delimited segment. */
63
+ export function isGraftMcpTool(toolName) {
64
+ const t = toolName.toLowerCase();
65
+ const bare = t.split(/[:./]|__/).pop() ?? t;
66
+ return GRAFT_MCP_TOOL_NAMES.has(bare);
67
+ }
68
+ /** Whether a shell command line invokes the graft CLI (any of its install shapes). */
69
+ export function commandInvokesGraft(command) {
70
+ const c = command.trim();
71
+ if (/dist[/\\]cli\.js/.test(c))
72
+ return true; // running from a source checkout
73
+ // `graft …`, `graft-dev …`, `npx [-y] [@nanonets/]graft …`, at the start of the
74
+ // line or of a &&/;/| segment — not "mygraft" or a path that merely contains it.
75
+ return /(^|[|&;]\s*)(npx\s+(-y\s+)?(@nanonets\/)?)?graft(-dev)?\b/i.test(c);
76
+ }
77
+ /**
78
+ * Classify one tool use as a graft retrieval, a source read, or neither
79
+ * (an edit, a task spawn, an unrelated shell command — no retrieval signal).
80
+ * `command` is the shell command line when `toolName` is the host's shell tool.
81
+ */
82
+ export function classifyToolUse(toolName, command) {
83
+ const t = (toolName ?? '').toLowerCase();
84
+ if (!t)
85
+ return null;
86
+ if (isGraftMcpTool(t))
87
+ return 'graft';
88
+ if (SOURCE_TOOLS.has(t))
89
+ return 'source';
90
+ if (isShellTool(t) && command && commandInvokesGraft(command))
91
+ return 'graft';
92
+ return null;
93
+ }
94
+ /** Sum every `[graft] tokens saved ≈ N` footer in a blob of tool output. Thin
95
+ * alias over {@link sumSavingsFooters}, which lives next to the code that writes
96
+ * the footer so the two can't drift. */
97
+ export function parseSavings(blob) {
98
+ return sumSavingsFooters(blob);
99
+ }
100
+ /**
101
+ * Fold one tool use into a session's counters. A no-op when there is nothing to
102
+ * record (kind null and no savings), so a host can call it unconditionally after
103
+ * every tool without first checking whether the tool was interesting — the
104
+ * no-write path is what keeps it cheap on the Write/Edit/Task majority.
105
+ *
106
+ * Best-effort read-modify-write, not locked — mirroring `patchStats` in
107
+ * util/state.ts. Two tool-use hooks racing on the same session file can lose a
108
+ * count; that is acceptable for an episodic usage estimate (worst case is an
109
+ * undercount by one, never corruption thanks to the atomic write), and a lock
110
+ * here would contend with the build lock these hooks also touch.
111
+ */
112
+ export function recordToolUse(dir, sessionId, use) {
113
+ const saved = use.savedTokens ?? 0;
114
+ if (!use.kind && saved <= 0)
115
+ return;
116
+ const id = sessionId || 'default';
117
+ const s = readSession(dir, id);
118
+ if (use.kind === 'graft')
119
+ s.graftReads = (s.graftReads ?? 0) + 1;
120
+ else if (use.kind === 'source')
121
+ s.sourceReads = (s.sourceReads ?? 0) + 1;
122
+ if (saved > 0)
123
+ s.savedTokens = (s.savedTokens ?? 0) + saved;
124
+ // A graft use owes a tally in this turn's reply; the Stop hook (countTallyTurn)
125
+ // resolves whether it got one and clears the flag. A flag, not a count — a turn
126
+ // with several graft calls is still one reply to the user.
127
+ if (use.kind === 'graft')
128
+ s.turnUsedGraft = true;
129
+ // Stamp the host once; the first tool use that lands owns the attribution.
130
+ if (use.host && !s.host)
131
+ s.host = use.host;
132
+ writeSession(dir, id, s);
133
+ }
134
+ /** The most-recently-touched session file for a repo, or null when none exist —
135
+ * what `graft stats` shows by default: the session you were just in. */
136
+ export function latestSession(dir) {
137
+ const sdir = sessionDir(dir);
138
+ let bestId = null;
139
+ let bestMtime = -Infinity;
140
+ for (const id of listSessionIds(dir)) {
141
+ let mtime;
142
+ try {
143
+ mtime = statSync(join(sdir, `${id}.json`)).mtimeMs;
144
+ }
145
+ catch {
146
+ continue;
147
+ }
148
+ if (mtime > bestMtime) {
149
+ bestMtime = mtime;
150
+ bestId = id;
151
+ }
152
+ }
153
+ if (bestId === null)
154
+ return null;
155
+ return { id: bestId, ...readSession(dir, bestId) };
156
+ }
157
+ /**
158
+ * A one-line-per-fact readout of a session's usage mix — Cursor has no
159
+ * statusline, so this is how you see the numbers the Claude Code bar would show.
160
+ * Reads local JSON only; sends nothing.
161
+ */
162
+ /**
163
+ * What this repo's most recent session has actually been paying per million
164
+ * input tokens, or null when no turn has been billed yet.
165
+ *
166
+ * `latestSession` rather than a session id because the callers are CLI and MCP
167
+ * processes answering one query: they know the repo, never the host's session
168
+ * id. The rate belongs to the repo's current session, which is the one whose
169
+ * reply the number is about to appear in.
170
+ */
171
+ export function sessionInputRate(dir) {
172
+ const s = latestSession(dir);
173
+ if (!s?.inputCostMicros || !s?.inputTokensBilled)
174
+ return null;
175
+ // Micro-dollars per token and dollars per million tokens are the same number:
176
+ // both divide by 1e6 once. Returned as $/Mtok because that is the unit the
177
+ // price table is written in and the one a reader can sanity-check against it.
178
+ return s.inputCostMicros / s.inputTokensBilled;
179
+ }
180
+ export function formatSessionStats(s) {
181
+ if (s === null) {
182
+ return 'graft stats: no session recorded yet — use graft in an agent session, then look again.';
183
+ }
184
+ const graft = s.graftReads ?? 0;
185
+ const source = s.sourceReads ?? 0;
186
+ const saved = s.savedTokens ?? 0;
187
+ const total = graft + source;
188
+ const mix = total === 0 ? 'no retrieval yet' : `${Math.round((graft / total) * 100)}% graft`;
189
+ const lines = [
190
+ `graft stats — session ${s.id}`,
191
+ ` graft reads: ${graft}`,
192
+ ` source reads: ${source} (Read / Grep / Glob)`,
193
+ ` mix: ${mix}`,
194
+ ` tokens saved: ~${saved.toLocaleString()}`,
195
+ ];
196
+ // Omitted, not zeroed, when no turn has been billed yet: a host whose hooks
197
+ // name no transcript can't know what a token costs here, and a made-up rate
198
+ // would be worse than the silence.
199
+ const usd = dollarsSaved(saved, s.inputCostMicros, s.inputTokensBilled);
200
+ if (usd !== null)
201
+ lines.push(` value saved: ~${formatDollars(usd)}`);
202
+ if (s.lastQuery)
203
+ lines.push(` last query: ${s.lastQuery}`);
204
+ return lines.join('\n');
205
+ }
206
+ //# sourceMappingURL=session-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-metrics.js","sourceRoot":"","sources":["../../src/claude/session-metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAqB,MAAM,YAAY,CAAC;AAEtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAI5D;;;;4BAI4B;AAC5B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEjE,qFAAqF;AACrF,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,OAAO,CAAC;AACvC,CAAC;AAED;;6EAE6E;AAC7E,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;;iCAOiC;AACjC,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5C,OAAO,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,iCAAiC;IAC9E,gFAAgF;IAChF,iFAAiF;IACjF,OAAO,4DAA4D,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAiB,EAAE,OAAgB;IACjE,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,cAAc,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IACtC,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;yCAEyC;AACzC,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAYD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,SAAiB,EAAE,GAAY;IACxE,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO;IACpC,MAAM,EAAE,GAAG,SAAS,IAAI,SAAS,CAAC;IAClC,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;SAC5D,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;QAAE,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACzE,IAAI,KAAK,GAAG,CAAC;QAAE,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;IAC5D,gFAAgF;IAChF,gFAAgF;IAChF,2DAA2D;IAC3D,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QAAE,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC;IACjD,2EAA2E;IAC3E,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;QAAE,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IAC3C,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC;AAMD;yEACyE;AACzE,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,SAAS,GAAG,CAAC,QAAQ,CAAC;IAC1B,KAAK,MAAM,EAAE,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QAC/E,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;YAAC,SAAS,GAAG,KAAK,CAAC;YAAC,MAAM,GAAG,EAAE,CAAC;QAAC,CAAC;IAC5D,CAAC;IACD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,EAAE,eAAe,IAAI,CAAC,CAAC,EAAE,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAC9D,8EAA8E;IAC9E,2EAA2E;IAC3E,8EAA8E;IAC9E,OAAO,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,iBAAiB,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,CAAwB;IACzD,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACf,OAAO,wFAAwF,CAAC;IAClG,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7B,MAAM,GAAG,GACP,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC;IACnF,MAAM,KAAK,GAAG;QACZ,yBAAyB,CAAC,CAAC,EAAE,EAAE;QAC/B,oBAAoB,KAAK,EAAE;QAC3B,oBAAoB,MAAM,yBAAyB;QACnD,oBAAoB,GAAG,EAAE;QACzB,qBAAqB,KAAK,CAAC,cAAc,EAAE,EAAE;KAC9C,CAAC;IACF,4EAA4E;IAC5E,4EAA4E;IAC5E,mCAAmC;IACnC,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACxE,IAAI,GAAG,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}