@getrift/rift 0.1.0-beta.21 → 0.1.0-beta.23

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 (320) hide show
  1. package/README.md +7 -3
  2. package/dist/src/capture/auto-capture.d.ts +105 -4
  3. package/dist/src/capture/auto-capture.d.ts.map +1 -1
  4. package/dist/src/capture/auto-capture.js +313 -34
  5. package/dist/src/capture/auto-capture.js.map +1 -1
  6. package/dist/src/capture/claude-cli-triage-provider.d.ts +28 -0
  7. package/dist/src/capture/claude-cli-triage-provider.d.ts.map +1 -0
  8. package/dist/src/capture/claude-cli-triage-provider.js +88 -0
  9. package/dist/src/capture/claude-cli-triage-provider.js.map +1 -0
  10. package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -1
  11. package/dist/src/capture/codex-cli-triage-provider.js +1 -33
  12. package/dist/src/capture/codex-cli-triage-provider.js.map +1 -1
  13. package/dist/src/capture/cursor-capture.d.ts +89 -0
  14. package/dist/src/capture/cursor-capture.d.ts.map +1 -0
  15. package/dist/src/capture/cursor-capture.js +121 -0
  16. package/dist/src/capture/cursor-capture.js.map +1 -0
  17. package/dist/src/capture/observability.d.ts +30 -0
  18. package/dist/src/capture/observability.d.ts.map +1 -1
  19. package/dist/src/capture/observability.js +29 -0
  20. package/dist/src/capture/observability.js.map +1 -1
  21. package/dist/src/capture/recover-quarantine.d.ts +4 -4
  22. package/dist/src/capture/sources.d.ts +41 -3
  23. package/dist/src/capture/sources.d.ts.map +1 -1
  24. package/dist/src/capture/sources.js +43 -1
  25. package/dist/src/capture/sources.js.map +1 -1
  26. package/dist/src/capture/triage-classification.d.ts +69 -0
  27. package/dist/src/capture/triage-classification.d.ts.map +1 -0
  28. package/dist/src/capture/triage-classification.js +62 -0
  29. package/dist/src/capture/triage-classification.js.map +1 -0
  30. package/dist/src/capture/triage-provider-factory.d.ts +36 -0
  31. package/dist/src/capture/triage-provider-factory.d.ts.map +1 -0
  32. package/dist/src/capture/triage-provider-factory.js +55 -0
  33. package/dist/src/capture/triage-provider-factory.js.map +1 -0
  34. package/dist/src/capture/triage.d.ts +1 -1
  35. package/dist/src/capture/triage.d.ts.map +1 -1
  36. package/dist/src/capture/triage.js +8 -6
  37. package/dist/src/capture/triage.js.map +1 -1
  38. package/dist/src/cli/commands/capture.d.ts.map +1 -1
  39. package/dist/src/cli/commands/capture.js +79 -17
  40. package/dist/src/cli/commands/capture.js.map +1 -1
  41. package/dist/src/cli/commands/chunk-backfill.d.ts +13 -0
  42. package/dist/src/cli/commands/chunk-backfill.d.ts.map +1 -0
  43. package/dist/src/cli/commands/chunk-backfill.js +157 -0
  44. package/dist/src/cli/commands/chunk-backfill.js.map +1 -0
  45. package/dist/src/cli/commands/cursor-probe.d.ts +20 -0
  46. package/dist/src/cli/commands/cursor-probe.d.ts.map +1 -0
  47. package/dist/src/cli/commands/cursor-probe.js +162 -0
  48. package/dist/src/cli/commands/cursor-probe.js.map +1 -0
  49. package/dist/src/cli/commands/menubar.d.ts +3 -1
  50. package/dist/src/cli/commands/menubar.d.ts.map +1 -1
  51. package/dist/src/cli/commands/menubar.js +36 -12
  52. package/dist/src/cli/commands/menubar.js.map +1 -1
  53. package/dist/src/cli/commands/onboard.d.ts +22 -2
  54. package/dist/src/cli/commands/onboard.d.ts.map +1 -1
  55. package/dist/src/cli/commands/onboard.js +160 -32
  56. package/dist/src/cli/commands/onboard.js.map +1 -1
  57. package/dist/src/cli/commands/status.d.ts.map +1 -1
  58. package/dist/src/cli/commands/status.js +12 -0
  59. package/dist/src/cli/commands/status.js.map +1 -1
  60. package/dist/src/cli/commands/update.d.ts +34 -1
  61. package/dist/src/cli/commands/update.d.ts.map +1 -1
  62. package/dist/src/cli/commands/update.js +166 -1
  63. package/dist/src/cli/commands/update.js.map +1 -1
  64. package/dist/src/cli/index.d.ts.map +1 -1
  65. package/dist/src/cli/index.js +4 -0
  66. package/dist/src/cli/index.js.map +1 -1
  67. package/dist/src/cli/postinstall-menubar.d.ts +20 -13
  68. package/dist/src/cli/postinstall-menubar.d.ts.map +1 -1
  69. package/dist/src/cli/postinstall-menubar.js +56 -1
  70. package/dist/src/cli/postinstall-menubar.js.map +1 -1
  71. package/dist/src/cli/status/friend-header.d.ts +16 -3
  72. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  73. package/dist/src/cli/status/friend-header.js +186 -10
  74. package/dist/src/cli/status/friend-header.js.map +1 -1
  75. package/dist/src/cli/status/local-signals.d.ts +42 -4
  76. package/dist/src/cli/status/local-signals.d.ts.map +1 -1
  77. package/dist/src/cli/status/local-signals.js +52 -1
  78. package/dist/src/cli/status/local-signals.js.map +1 -1
  79. package/dist/src/config/schema.d.ts +220 -14
  80. package/dist/src/config/schema.d.ts.map +1 -1
  81. package/dist/src/config/schema.js +82 -7
  82. package/dist/src/config/schema.js.map +1 -1
  83. package/dist/src/diagnostics/claude-preflight.d.ts +35 -0
  84. package/dist/src/diagnostics/claude-preflight.d.ts.map +1 -0
  85. package/dist/src/diagnostics/claude-preflight.js +90 -0
  86. package/dist/src/diagnostics/claude-preflight.js.map +1 -0
  87. package/dist/src/diagnostics/codex-preflight.d.ts +1 -1
  88. package/dist/src/diagnostics/codex-preflight.d.ts.map +1 -1
  89. package/dist/src/diagnostics/codex-preflight.js +24 -0
  90. package/dist/src/diagnostics/codex-preflight.js.map +1 -1
  91. package/dist/src/diagnostics/doctor.d.ts +7 -4
  92. package/dist/src/diagnostics/doctor.d.ts.map +1 -1
  93. package/dist/src/diagnostics/doctor.js +70 -11
  94. package/dist/src/diagnostics/doctor.js.map +1 -1
  95. package/dist/src/diagnostics/memory-coverage.d.ts +54 -0
  96. package/dist/src/diagnostics/memory-coverage.d.ts.map +1 -0
  97. package/dist/src/diagnostics/memory-coverage.js +272 -0
  98. package/dist/src/diagnostics/memory-coverage.js.map +1 -0
  99. package/dist/src/diagnostics/notify.d.ts +20 -3
  100. package/dist/src/diagnostics/notify.d.ts.map +1 -1
  101. package/dist/src/diagnostics/notify.js +54 -14
  102. package/dist/src/diagnostics/notify.js.map +1 -1
  103. package/dist/src/ingestion/chunk-meta.d.ts +85 -0
  104. package/dist/src/ingestion/chunk-meta.d.ts.map +1 -0
  105. package/dist/src/ingestion/chunk-meta.js +167 -0
  106. package/dist/src/ingestion/chunk-meta.js.map +1 -0
  107. package/dist/src/ingestion/chunk-text.d.ts +39 -0
  108. package/dist/src/ingestion/chunk-text.d.ts.map +1 -0
  109. package/dist/src/ingestion/chunk-text.js +114 -0
  110. package/dist/src/ingestion/chunk-text.js.map +1 -0
  111. package/dist/src/ingestion/cursor/cursor-store.d.ts +177 -0
  112. package/dist/src/ingestion/cursor/cursor-store.d.ts.map +1 -0
  113. package/dist/src/ingestion/cursor/cursor-store.js +243 -0
  114. package/dist/src/ingestion/cursor/cursor-store.js.map +1 -0
  115. package/dist/src/ingestion/cursor/enrich-roots.d.ts +16 -0
  116. package/dist/src/ingestion/cursor/enrich-roots.d.ts.map +1 -0
  117. package/dist/src/ingestion/cursor/enrich-roots.js +22 -0
  118. package/dist/src/ingestion/cursor/enrich-roots.js.map +1 -0
  119. package/dist/src/ingestion/cursor/vscdb-reader.d.ts +32 -0
  120. package/dist/src/ingestion/cursor/vscdb-reader.d.ts.map +1 -0
  121. package/dist/src/ingestion/cursor/vscdb-reader.js +113 -0
  122. package/dist/src/ingestion/cursor/vscdb-reader.js.map +1 -0
  123. package/dist/src/ingestion/cursor/workspace-root.d.ts +96 -0
  124. package/dist/src/ingestion/cursor/workspace-root.d.ts.map +1 -0
  125. package/dist/src/ingestion/cursor/workspace-root.js +187 -0
  126. package/dist/src/ingestion/cursor/workspace-root.js.map +1 -0
  127. package/dist/src/ingestion/indexer.d.ts.map +1 -1
  128. package/dist/src/ingestion/indexer.js +41 -32
  129. package/dist/src/ingestion/indexer.js.map +1 -1
  130. package/dist/src/jobs/handlers/compact.d.ts.map +1 -1
  131. package/dist/src/jobs/handlers/compact.js +9 -4
  132. package/dist/src/jobs/handlers/compact.js.map +1 -1
  133. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
  134. package/dist/src/jobs/handlers/ingest.js +60 -30
  135. package/dist/src/jobs/handlers/ingest.js.map +1 -1
  136. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -1
  137. package/dist/src/jobs/handlers/reconcile.js +128 -45
  138. package/dist/src/jobs/handlers/reconcile.js.map +1 -1
  139. package/dist/src/jobs/handlers/save.d.ts.map +1 -1
  140. package/dist/src/jobs/handlers/save.js +122 -72
  141. package/dist/src/jobs/handlers/save.js.map +1 -1
  142. package/dist/src/jobs/types.d.ts +1 -1
  143. package/dist/src/main.js +27 -16
  144. package/dist/src/main.js.map +1 -1
  145. package/dist/src/mcp/capture-diagnostics.d.ts +51 -0
  146. package/dist/src/mcp/capture-diagnostics.d.ts.map +1 -0
  147. package/dist/src/mcp/capture-diagnostics.js +127 -0
  148. package/dist/src/mcp/capture-diagnostics.js.map +1 -0
  149. package/dist/src/mcp/memory-diagnostics.d.ts +6 -0
  150. package/dist/src/mcp/memory-diagnostics.d.ts.map +1 -0
  151. package/dist/src/mcp/memory-diagnostics.js +51 -0
  152. package/dist/src/mcp/memory-diagnostics.js.map +1 -0
  153. package/dist/src/mcp/server.d.ts.map +1 -1
  154. package/dist/src/mcp/server.js +10 -3
  155. package/dist/src/mcp/server.js.map +1 -1
  156. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -1
  157. package/dist/src/mcp/tools/context-pack.js +7 -1
  158. package/dist/src/mcp/tools/context-pack.js.map +1 -1
  159. package/dist/src/mcp/tools/conversations-search.d.ts +1 -1
  160. package/dist/src/mcp/tools/conversations-search.d.ts.map +1 -1
  161. package/dist/src/mcp/tools/conversations-search.js +7 -1
  162. package/dist/src/mcp/tools/conversations-search.js.map +1 -1
  163. package/dist/src/mcp/tools/evidence-feedback.d.ts +60 -0
  164. package/dist/src/mcp/tools/evidence-feedback.d.ts.map +1 -0
  165. package/dist/src/mcp/tools/evidence-feedback.js +62 -0
  166. package/dist/src/mcp/tools/evidence-feedback.js.map +1 -0
  167. package/dist/src/mcp/tools/log-outcome.d.ts +72 -0
  168. package/dist/src/mcp/tools/log-outcome.d.ts.map +1 -0
  169. package/dist/src/mcp/tools/log-outcome.js +59 -0
  170. package/dist/src/mcp/tools/log-outcome.js.map +1 -0
  171. package/dist/src/mcp/tools/open-evidence.d.ts +37 -0
  172. package/dist/src/mcp/tools/open-evidence.d.ts.map +1 -0
  173. package/dist/src/mcp/tools/open-evidence.js +72 -0
  174. package/dist/src/mcp/tools/open-evidence.js.map +1 -0
  175. package/dist/src/mcp/tools/save.d.ts +7 -2
  176. package/dist/src/mcp/tools/save.d.ts.map +1 -1
  177. package/dist/src/mcp/tools/save.js +7 -2
  178. package/dist/src/mcp/tools/save.js.map +1 -1
  179. package/dist/src/mcp/tools/search.d.ts.map +1 -1
  180. package/dist/src/mcp/tools/search.js +7 -1
  181. package/dist/src/mcp/tools/search.js.map +1 -1
  182. package/dist/src/mcp/tools/status.d.ts +15 -1
  183. package/dist/src/mcp/tools/status.d.ts.map +1 -1
  184. package/dist/src/mcp/tools/status.js +53 -2
  185. package/dist/src/mcp/tools/status.js.map +1 -1
  186. package/dist/src/observability/retrieval-feedback.d.ts +82 -0
  187. package/dist/src/observability/retrieval-feedback.d.ts.map +1 -0
  188. package/dist/src/observability/retrieval-feedback.js +231 -0
  189. package/dist/src/observability/retrieval-feedback.js.map +1 -0
  190. package/dist/src/observability/rift-context.d.ts.map +1 -1
  191. package/dist/src/observability/rift-context.js +3 -0
  192. package/dist/src/observability/rift-context.js.map +1 -1
  193. package/dist/src/observability/tool-usage-stats.d.ts +13 -0
  194. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
  195. package/dist/src/observability/tool-usage-stats.js +15 -0
  196. package/dist/src/observability/tool-usage-stats.js.map +1 -1
  197. package/dist/src/observability/tool-usage.d.ts +56 -0
  198. package/dist/src/observability/tool-usage.d.ts.map +1 -1
  199. package/dist/src/observability/tool-usage.js +86 -0
  200. package/dist/src/observability/tool-usage.js.map +1 -1
  201. package/dist/src/providers/claude-cli-metadata-extraction.d.ts +47 -0
  202. package/dist/src/providers/claude-cli-metadata-extraction.d.ts.map +1 -0
  203. package/dist/src/providers/claude-cli-metadata-extraction.js +120 -0
  204. package/dist/src/providers/claude-cli-metadata-extraction.js.map +1 -0
  205. package/dist/src/providers/claude-cli-runner.d.ts +92 -0
  206. package/dist/src/providers/claude-cli-runner.d.ts.map +1 -0
  207. package/dist/src/providers/claude-cli-runner.js +598 -0
  208. package/dist/src/providers/claude-cli-runner.js.map +1 -0
  209. package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -1
  210. package/dist/src/providers/codex-cli-metadata-extraction.js +1 -40
  211. package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -1
  212. package/dist/src/providers/codex-cli-runner.d.ts +7 -0
  213. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -1
  214. package/dist/src/providers/codex-cli-runner.js +131 -5
  215. package/dist/src/providers/codex-cli-runner.js.map +1 -1
  216. package/dist/src/providers/conversation-generation.d.ts +10 -0
  217. package/dist/src/providers/conversation-generation.d.ts.map +1 -1
  218. package/dist/src/providers/conversation-generation.js +54 -13
  219. package/dist/src/providers/conversation-generation.js.map +1 -1
  220. package/dist/src/providers/openai-metadata-extraction.d.ts +48 -1
  221. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -1
  222. package/dist/src/providers/openai-metadata-extraction.js +51 -2
  223. package/dist/src/providers/openai-metadata-extraction.js.map +1 -1
  224. package/dist/src/providers/types.d.ts +1 -1
  225. package/dist/src/providers/types.d.ts.map +1 -1
  226. package/dist/src/providers/types.js +4 -0
  227. package/dist/src/providers/types.js.map +1 -1
  228. package/dist/src/retrieval/canonical-files.d.ts +48 -0
  229. package/dist/src/retrieval/canonical-files.d.ts.map +1 -0
  230. package/dist/src/retrieval/canonical-files.js +210 -0
  231. package/dist/src/retrieval/canonical-files.js.map +1 -0
  232. package/dist/src/retrieval/compact.d.ts +95 -0
  233. package/dist/src/retrieval/compact.d.ts.map +1 -1
  234. package/dist/src/retrieval/compact.js +254 -8
  235. package/dist/src/retrieval/compact.js.map +1 -1
  236. package/dist/src/retrieval/context-pack.d.ts.map +1 -1
  237. package/dist/src/retrieval/context-pack.js +65 -15
  238. package/dist/src/retrieval/context-pack.js.map +1 -1
  239. package/dist/src/retrieval/conversation-dedup.d.ts +40 -0
  240. package/dist/src/retrieval/conversation-dedup.d.ts.map +1 -0
  241. package/dist/src/retrieval/conversation-dedup.js +141 -0
  242. package/dist/src/retrieval/conversation-dedup.js.map +1 -0
  243. package/dist/src/retrieval/evidence-key.d.ts +48 -0
  244. package/dist/src/retrieval/evidence-key.d.ts.map +1 -0
  245. package/dist/src/retrieval/evidence-key.js +131 -0
  246. package/dist/src/retrieval/evidence-key.js.map +1 -0
  247. package/dist/src/retrieval/feedback-ranking.d.ts +49 -0
  248. package/dist/src/retrieval/feedback-ranking.d.ts.map +1 -0
  249. package/dist/src/retrieval/feedback-ranking.js +138 -0
  250. package/dist/src/retrieval/feedback-ranking.js.map +1 -0
  251. package/dist/src/retrieval/git-state.d.ts +9 -0
  252. package/dist/src/retrieval/git-state.d.ts.map +1 -1
  253. package/dist/src/retrieval/git-state.js +18 -0
  254. package/dist/src/retrieval/git-state.js.map +1 -1
  255. package/dist/src/retrieval/group-by-parent.d.ts +38 -0
  256. package/dist/src/retrieval/group-by-parent.d.ts.map +1 -0
  257. package/dist/src/retrieval/group-by-parent.js +40 -0
  258. package/dist/src/retrieval/group-by-parent.js.map +1 -0
  259. package/dist/src/retrieval/lexical.d.ts.map +1 -1
  260. package/dist/src/retrieval/lexical.js +1 -3
  261. package/dist/src/retrieval/lexical.js.map +1 -1
  262. package/dist/src/retrieval/receipt.d.ts +57 -0
  263. package/dist/src/retrieval/receipt.d.ts.map +1 -0
  264. package/dist/src/retrieval/receipt.js +119 -0
  265. package/dist/src/retrieval/receipt.js.map +1 -0
  266. package/dist/src/retrieval/reranker.d.ts +49 -2
  267. package/dist/src/retrieval/reranker.d.ts.map +1 -1
  268. package/dist/src/retrieval/reranker.js +64 -4
  269. package/dist/src/retrieval/reranker.js.map +1 -1
  270. package/dist/src/retrieval/stitch-chunks.d.ts +73 -0
  271. package/dist/src/retrieval/stitch-chunks.d.ts.map +1 -0
  272. package/dist/src/retrieval/stitch-chunks.js +106 -0
  273. package/dist/src/retrieval/stitch-chunks.js.map +1 -0
  274. package/dist/src/server/app.d.ts +1 -1
  275. package/dist/src/server/app.d.ts.map +1 -1
  276. package/dist/src/server/app.js +20 -3
  277. package/dist/src/server/app.js.map +1 -1
  278. package/dist/src/server/routes/conversations-search.d.ts.map +1 -1
  279. package/dist/src/server/routes/conversations-search.js +22 -3
  280. package/dist/src/server/routes/conversations-search.js.map +1 -1
  281. package/dist/src/server/routes/friend-status.d.ts +64 -6
  282. package/dist/src/server/routes/friend-status.d.ts.map +1 -1
  283. package/dist/src/server/routes/friend-status.js +114 -18
  284. package/dist/src/server/routes/friend-status.js.map +1 -1
  285. package/dist/src/server/routes/mcp-usage.d.ts +9 -6
  286. package/dist/src/server/routes/mcp-usage.d.ts.map +1 -1
  287. package/dist/src/server/routes/mcp-usage.js.map +1 -1
  288. package/dist/src/server/routes/retrieval-feedback.d.ts +3 -0
  289. package/dist/src/server/routes/retrieval-feedback.d.ts.map +1 -0
  290. package/dist/src/server/routes/retrieval-feedback.js +290 -0
  291. package/dist/src/server/routes/retrieval-feedback.js.map +1 -0
  292. package/dist/src/server/routes/save.d.ts +3 -3
  293. package/dist/src/server/routes/save.d.ts.map +1 -1
  294. package/dist/src/server/routes/save.js +6 -2
  295. package/dist/src/server/routes/save.js.map +1 -1
  296. package/dist/src/server/routes/search.d.ts +1 -1
  297. package/dist/src/server/routes/search.d.ts.map +1 -1
  298. package/dist/src/server/routes/search.js +55 -8
  299. package/dist/src/server/routes/search.js.map +1 -1
  300. package/dist/src/server/serving-marker.d.ts +85 -0
  301. package/dist/src/server/serving-marker.d.ts.map +1 -0
  302. package/dist/src/server/serving-marker.js +226 -0
  303. package/dist/src/server/serving-marker.js.map +1 -0
  304. package/dist/src/storage/chunk-backfill.d.ts +39 -0
  305. package/dist/src/storage/chunk-backfill.d.ts.map +1 -0
  306. package/dist/src/storage/chunk-backfill.js +295 -0
  307. package/dist/src/storage/chunk-backfill.js.map +1 -0
  308. package/dist/src/storage/filter.d.ts +42 -0
  309. package/dist/src/storage/filter.d.ts.map +1 -0
  310. package/dist/src/storage/filter.js +70 -0
  311. package/dist/src/storage/filter.js.map +1 -0
  312. package/dist/src/storage/rebuild.d.ts.map +1 -1
  313. package/dist/src/storage/rebuild.js +44 -27
  314. package/dist/src/storage/rebuild.js.map +1 -1
  315. package/dist/src/storage/tables.d.ts +41 -0
  316. package/dist/src/storage/tables.d.ts.map +1 -1
  317. package/dist/src/storage/tables.js +64 -1
  318. package/dist/src/storage/tables.js.map +1 -1
  319. package/operator/swiftbar/render-menu.py +60 -18
  320. package/package.json +6 -4
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Retrieval feedback ledger.
3
+ *
4
+ * This is append-only JSONL by design. v0 records positive signals only:
5
+ * evidence opened via `rift_open_evidence` and evidence cited via
6
+ * `rift_log_outcome`. Returned-but-not-opened hits are not credit; they are
7
+ * only the denominator/rank context that lets us discount position bias.
8
+ */
9
+ import fs from "node:fs";
10
+ import path from "node:path";
11
+ import crypto from "node:crypto";
12
+ import { FRESH_HALF_LIFE_DAYS } from "../retrieval/reranker.js";
13
+ export const RETRIEVAL_FEEDBACK_FILE = "retrieval-feedback.jsonl";
14
+ export const B_FEED_NEUTRAL = 1.0;
15
+ export const B_FEED_MAX = 1.25;
16
+ const BOOST_SATURATION_CREDIT = 4;
17
+ export function retrievalFeedbackPath(dataDir) {
18
+ return path.join(dataDir, "observability", RETRIEVAL_FEEDBACK_FILE);
19
+ }
20
+ export function appendRetrievalFeedbackEvent(dataDir, input) {
21
+ const timestamp = (input.now ?? new Date()).toISOString();
22
+ const event = {
23
+ timestamp,
24
+ type: input.type,
25
+ stable_evidence_key: input.identity.stable_evidence_key,
26
+ evidence_kind: input.identity.evidence_kind,
27
+ source_table: input.identity.source_table,
28
+ source_id: input.identity.source_id,
29
+ ...(input.identity.source_path ? { source_path: input.identity.source_path } : {}),
30
+ ...(input.identity.parent_id ? { parent_id: input.identity.parent_id } : {}),
31
+ ...(input.identity.digest_id ? { digest_id: input.identity.digest_id } : {}),
32
+ ...(input.session_id ? { session_id: input.session_id } : {}),
33
+ ...(input.tool_call_id ? { tool_call_id: input.tool_call_id } : {}),
34
+ ...(input.outcome_id ? { outcome_id: input.outcome_id } : {}),
35
+ ...(input.project ? { project: input.project } : {}),
36
+ ...(input.intent ? { intent: input.intent } : {}),
37
+ ...(input.query ? { query: input.query } : {}),
38
+ ...(input.task ? { task: input.task } : {}),
39
+ ...(input.rank_at_retrieval !== undefined
40
+ ? { rank_at_retrieval: input.rank_at_retrieval }
41
+ : {}),
42
+ ...(input.result_count !== undefined ? { result_count: input.result_count } : {}),
43
+ ...(input.context_pack_bucket ? { context_pack_bucket: input.context_pack_bucket } : {}),
44
+ ...(input.position_in_bucket !== undefined
45
+ ? { position_in_bucket: input.position_in_bucket }
46
+ : {}),
47
+ ...(input.reason ? { reason: input.reason } : {}),
48
+ };
49
+ const dedupe = input.dedupe_key ?? defaultDedupeKey(event);
50
+ if (dedupe)
51
+ event.dedupe_key = dedupe;
52
+ if (event.type !== "feedback_reset" && dedupe) {
53
+ // v0 is single-user and append-only: read the small local ledger to dedupe
54
+ // repeated tool calls. Replace with an indexed/locked projection before
55
+ // high-volume or multi-writer use.
56
+ const existing = readRetrievalFeedbackEvents(dataDir).find((e) => e.dedupe_key === dedupe);
57
+ if (existing)
58
+ return { event: existing, written: false, duplicate: true };
59
+ }
60
+ const file = retrievalFeedbackPath(dataDir);
61
+ fs.mkdirSync(path.dirname(file), { recursive: true });
62
+ fs.appendFileSync(file, JSON.stringify(event) + "\n", "utf-8");
63
+ return { event, written: true, duplicate: false };
64
+ }
65
+ export function appendFeedbackReset(dataDir, input) {
66
+ return appendRetrievalFeedbackEvent(dataDir, {
67
+ type: "feedback_reset",
68
+ identity: input.identity,
69
+ ...(input.session_id ? { session_id: input.session_id } : {}),
70
+ ...(input.project ? { project: input.project } : {}),
71
+ ...(input.intent ? { intent: input.intent } : {}),
72
+ ...(input.reason ? { reason: input.reason } : {}),
73
+ ...(input.now ? { now: input.now } : {}),
74
+ dedupe_key: `reset:${input.identity.stable_evidence_key}:${input.now?.toISOString() ?? crypto.randomUUID()}`,
75
+ });
76
+ }
77
+ export function readRetrievalFeedbackEvents(dataDir) {
78
+ let raw;
79
+ try {
80
+ raw = fs.readFileSync(retrievalFeedbackPath(dataDir), "utf-8");
81
+ }
82
+ catch {
83
+ return [];
84
+ }
85
+ const out = [];
86
+ for (const line of raw.split("\n")) {
87
+ if (!line.trim())
88
+ continue;
89
+ try {
90
+ const parsed = JSON.parse(line);
91
+ if (typeof parsed["timestamp"] === "string" &&
92
+ typeof parsed["type"] === "string" &&
93
+ typeof parsed["stable_evidence_key"] === "string") {
94
+ out.push(parsed);
95
+ }
96
+ }
97
+ catch {
98
+ // Tolerate corrupt lines; one bad append must not erase the ledger.
99
+ }
100
+ }
101
+ return out;
102
+ }
103
+ export function computeFeedbackBoosts(events, stableEvidenceKeys, scope = {}) {
104
+ const nowMs = (scope.now ?? new Date()).getTime();
105
+ const out = new Map();
106
+ for (const key of stableEvidenceKeys) {
107
+ const scopedEvents = events.filter((e) => e.stable_evidence_key === key);
108
+ // Only events that have actually occurred (parseable, not future-dated)
109
+ // count. A future-dated reset must not suppress real past feedback, and a
110
+ // future-dated positive must not earn (undecayed) credit before its time.
111
+ const resets = scopedEvents.filter((e) => e.type === "feedback_reset" &&
112
+ scopeMatches(e, scope) &&
113
+ hasOccurred(eventTimeMs(e), nowMs));
114
+ const positives = scopedEvents.filter((e) => isPositiveEvent(e) &&
115
+ scopeMatches(e, scope) &&
116
+ hasOccurred(eventTimeMs(e), nowMs) &&
117
+ !isResetBy(e, resets));
118
+ const credit = positives.reduce((sum, e) => sum + eventCredit(e, nowMs), 0);
119
+ const positiveCount = positives.length;
120
+ const B_feed = credit <= 0
121
+ ? B_FEED_NEUTRAL
122
+ : B_FEED_NEUTRAL +
123
+ (B_FEED_MAX - B_FEED_NEUTRAL) *
124
+ (1 - Math.exp(-credit / BOOST_SATURATION_CREDIT));
125
+ out.set(key, {
126
+ stable_evidence_key: key,
127
+ B_feed,
128
+ weighted_credit: credit,
129
+ positive_event_count: positiveCount,
130
+ reset_count: resets.length,
131
+ applied: false,
132
+ });
133
+ }
134
+ return out;
135
+ }
136
+ export function explainFeedback(dataDir, stableEvidenceKey, scope = {}) {
137
+ const events = readRetrievalFeedbackEvents(dataDir);
138
+ const boost = computeFeedbackBoosts(events, [stableEvidenceKey], scope).get(stableEvidenceKey) ?? {
139
+ stable_evidence_key: stableEvidenceKey,
140
+ B_feed: B_FEED_NEUTRAL,
141
+ weighted_credit: 0,
142
+ positive_event_count: 0,
143
+ reset_count: 0,
144
+ applied: false,
145
+ };
146
+ return {
147
+ ...boost,
148
+ events: events
149
+ .filter((e) => e.stable_evidence_key === stableEvidenceKey)
150
+ .filter((e) => scopeMatches(e, scope)),
151
+ };
152
+ }
153
+ function defaultDedupeKey(event) {
154
+ if (event.type === "feedback_reset")
155
+ return undefined;
156
+ const session = event.session_id ?? event.tool_call_id;
157
+ if (!session)
158
+ return undefined;
159
+ // Dedupe is scope-aware: the same evidence opened/cited in the same session
160
+ // but under a different (project, intent) is a distinct positive signal for
161
+ // that scope, not a duplicate. Keying only on type:session:key would silently
162
+ // drop the second scope's credit and make scoped why/reset lie.
163
+ const project = event.project ?? "";
164
+ const intent = event.intent ?? "";
165
+ return `${event.type}:${session}:${project}:${intent}:${event.stable_evidence_key}`;
166
+ }
167
+ function isPositiveEvent(e) {
168
+ return e.type === "evidence_opened" || e.type === "evidence_cited";
169
+ }
170
+ function scopeMatches(e, scope) {
171
+ if (scope.project !== undefined && e.project !== scope.project)
172
+ return false;
173
+ if (!intentMatches(e.intent, scope.intent))
174
+ return false;
175
+ return true;
176
+ }
177
+ function intentMatches(eventIntent, scopeIntent) {
178
+ if (scopeIntent === undefined)
179
+ return true;
180
+ if (scopeIntent === "blended")
181
+ return eventIntent !== undefined;
182
+ return eventIntent === scopeIntent || eventIntent === "blended";
183
+ }
184
+ function isResetBy(event, resets) {
185
+ const eventMs = new Date(event.timestamp).getTime();
186
+ return resets.some((reset) => {
187
+ const resetMs = new Date(reset.timestamp).getTime();
188
+ if (Number.isNaN(resetMs) || Number.isNaN(eventMs))
189
+ return false;
190
+ if (resetMs < eventMs)
191
+ return false;
192
+ if (reset.project !== undefined && event.project !== reset.project)
193
+ return false;
194
+ if (!intentMatches(event.intent, reset.intent))
195
+ return false;
196
+ return true;
197
+ });
198
+ }
199
+ function eventTimeMs(event) {
200
+ return new Date(event.timestamp).getTime();
201
+ }
202
+ /**
203
+ * Whether an event has actually occurred relative to the evaluation time.
204
+ * False for unparseable (NaN) timestamps and for future-dated rows — neither
205
+ * should earn credit, and a future-dated reset must not retroactively suppress
206
+ * real past feedback up to its timestamp.
207
+ */
208
+ function hasOccurred(eventMs, nowMs) {
209
+ return !Number.isNaN(eventMs) && eventMs <= nowMs;
210
+ }
211
+ function eventCredit(event, nowMs) {
212
+ const eventMs = new Date(event.timestamp).getTime();
213
+ // A corrupt/unparseable timestamp earns no credit. Returning 0 (rather than
214
+ // treating it as days=0 → full undecayed credit) keeps a malformed row from
215
+ // silently inflating B_feed, and mirrors how isResetBy() skips NaN resets.
216
+ if (Number.isNaN(eventMs))
217
+ return 0;
218
+ const days = Math.max(0, (nowMs - eventMs) / 86_400_000);
219
+ const decay = Math.exp(-days / FRESH_HALF_LIFE_DAYS);
220
+ const typeWeight = event.type === "evidence_cited" ? 1.5 : 1.0;
221
+ return typeWeight * positionBiasWeight(event) * decay;
222
+ }
223
+ export function positionBiasWeight(event) {
224
+ const position = event.context_pack_bucket && typeof event.position_in_bucket === "number"
225
+ ? event.position_in_bucket
226
+ : event.rank_at_retrieval;
227
+ if (typeof position !== "number" || position < 1)
228
+ return 1.0;
229
+ return Math.min(3, Math.sqrt(position));
230
+ }
231
+ //# sourceMappingURL=retrieval-feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrieval-feedback.js","sourceRoot":"","sources":["../../../src/observability/retrieval-feedback.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rift-context.d.ts","sourceRoot":"","sources":["../../../src/observability/rift-context.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,uEAAuE;AACvE,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAcrE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,gBAAgB,EACxB,IAAI,CAAC,EAAE,oBAAoB,GAC1B,MAAM,CAqER;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAU/B"}
1
+ {"version":3,"file":"rift-context.d.ts","sourceRoot":"","sources":["../../../src/observability/rift-context.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,uEAAuE;AACvE,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAcrE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,gBAAgB,EACxB,IAAI,CAAC,EAAE,oBAAoB,GAC1B,MAAM,CA8ER;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAU/B"}
@@ -87,6 +87,9 @@ export function generateCapabilityMap(counts, opts) {
87
87
  lines.push("- `rift_search` — broad search across all memory classes. Start here when you do not know which class holds the answer.");
88
88
  lines.push("- `rift_conversations_search` — conversation-specific search with structured filters (source, domain, intent, decisions, topics). Use when the question is clearly about prior chats.");
89
89
  lines.push("- `rift_context_pack` — compact bucketed context for an active task (decisions / constraints / examples / rules). Byte-bounded; never returns raw transcripts. Use to steer an agent, not to fetch a ranked hit list.");
90
+ lines.push("- `rift_open_evidence` — open one exact compact hit when it is worth inspecting; records a shadow-only feedback event after a successful open.");
91
+ lines.push("- `rift_log_outcome` — after substantive work, log what happened and cite only evidence actually used; this records shadow feedback without counting returned-but-unused hits.");
92
+ lines.push("- `rift_why_evidence` / `rift_forget_evidence_feedback` — inspect or reset learned retrieval feedback for a source.");
90
93
  lines.push("- `rift_status` — system and capability overview (this map). Not for content retrieval.");
91
94
  lines.push("");
92
95
  lines.push("## Default Behavior");
@@ -1 +1 @@
1
- {"version":3,"file":"rift-context.js","sourceRoot":"","sources":["../../../src/observability/rift-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rift-context.js","sourceRoot":"","sources":["../../../src/observability/rift-context.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,19 @@ export interface UsageWindow {
35
35
  * (no fabricated number) and naturally age out as fresh rows accumulate.
36
36
  */
37
37
  context_tokens_delivered_estimate: number;
38
+ /**
39
+ * The honest "reading saved" figure: summed `max(0, source − delivered)`
40
+ * over context hits, where `source` is the full token size of the rows a
41
+ * recall was drawn from (`source_tokens_estimate`) and `delivered` is the
42
+ * compact slice Rift actually returned. This is the menu's headline value
43
+ * number — it grows with the haystack a recall searched, not with how much
44
+ * text Rift handed back, so precise retrieval reads as strength rather than
45
+ * a suspiciously small count. Self-zeroes on `detail=full` pulls (the agent
46
+ * asked for the whole row, so nothing was saved) and on legacy rows lacking
47
+ * `source_tokens_estimate` (contributes 0, ages in as fresh rows land — no
48
+ * fabricated number).
49
+ */
50
+ context_tokens_saved_estimate: number;
38
51
  }
39
52
  /**
40
53
  * Precise-lookup health: aggregates over rift_search calls whose
@@ -1 +1 @@
1
- {"version":3,"file":"tool-usage-stats.d.ts","sourceRoot":"","sources":["../../../src/observability/tool-usage-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAsBtD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,4BAA4B,EAAE,MAAM,CAAC;IACrC;;;;;;;OAOG;IACH,iCAAiC,EAAE,MAAM,CAAC;CAC3C;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC;;;;;OAKG;IACH,SAAS,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C;;;;;;OAMG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,2BAA2B,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,cAAc,EAAE,kBAAkB,CAAC;CACpC;AA8ED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EAAE,EACzB,GAAG,GAAE,IAAiB,GACrB,YAAY,CA2Fd"}
1
+ {"version":3,"file":"tool-usage-stats.d.ts","sourceRoot":"","sources":["../../../src/observability/tool-usage-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAsBtD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,4BAA4B,EAAE,MAAM,CAAC;IACrC;;;;;;;OAOG;IACH,iCAAiC,EAAE,MAAM,CAAC;IAC1C;;;;;;;;;;;OAWG;IACH,6BAA6B,EAAE,MAAM,CAAC;CACvC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC;;;;;OAKG;IACH,SAAS,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C;;;;;;OAMG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,2BAA2B,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,cAAc,EAAE,kBAAkB,CAAC;CACpC;AA+ED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EAAE,EACzB,GAAG,GAAE,IAAiB,GACrB,YAAY,CA0Gd"}
@@ -21,6 +21,7 @@ function emptyWindow() {
21
21
  context_hits: 0,
22
22
  context_tokens_measured_hits: 0,
23
23
  context_tokens_delivered_estimate: 0,
24
+ context_tokens_saved_estimate: 0,
24
25
  };
25
26
  }
26
27
  /**
@@ -112,8 +113,19 @@ export function aggregateUsage(entries, now = new Date()) {
112
113
  ? tokensFromBytes(entry.response_text_bytes)
113
114
  : 0;
114
115
  const measuredHit = hit && typeof entry.response_text_bytes === "number" ? 1 : 0;
116
+ // Reading saved = full source size of the recalled rows minus the slice
117
+ // Rift delivered. Needs BOTH the source advisory and the delivered bytes;
118
+ // missing either (legacy rows, shapes without per-hit size) contributes 0.
119
+ // Clamped at 0 so a `detail=full` pull (delivered ≈ source) never reads as
120
+ // negative savings.
121
+ const saved = hit &&
122
+ typeof entry.source_tokens_estimate === "number" &&
123
+ typeof entry.response_text_bytes === "number"
124
+ ? Math.max(0, entry.source_tokens_estimate - delivered)
125
+ : 0;
115
126
  summary.all_time.calls += 1;
116
127
  summary.all_time.context_tokens_delivered_estimate += delivered;
128
+ summary.all_time.context_tokens_saved_estimate += saved;
117
129
  summary.all_time.context_tokens_measured_hits += measuredHit;
118
130
  summary.all_time.context_hits += hit;
119
131
  summary.by_tool[tool] = (summary.by_tool[tool] ?? 0) + 1;
@@ -142,18 +154,21 @@ export function aggregateUsage(entries, now = new Date()) {
142
154
  if (ts >= monthStartMs) {
143
155
  summary.month.calls += 1;
144
156
  summary.month.context_tokens_delivered_estimate += delivered;
157
+ summary.month.context_tokens_saved_estimate += saved;
145
158
  summary.month.context_tokens_measured_hits += measuredHit;
146
159
  summary.month.context_hits += hit;
147
160
  }
148
161
  if (ts >= weekStartMs) {
149
162
  summary.week.calls += 1;
150
163
  summary.week.context_tokens_delivered_estimate += delivered;
164
+ summary.week.context_tokens_saved_estimate += saved;
151
165
  summary.week.context_tokens_measured_hits += measuredHit;
152
166
  summary.week.context_hits += hit;
153
167
  }
154
168
  if (ts >= todayStartMs && ts < todayEndMs) {
155
169
  summary.today.calls += 1;
156
170
  summary.today.context_tokens_delivered_estimate += delivered;
171
+ summary.today.context_tokens_saved_estimate += saved;
157
172
  summary.today.context_tokens_measured_hits += measuredHit;
158
173
  summary.today.context_hits += hit;
159
174
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-usage-stats.js","sourceRoot":"","sources":["../../../src/observability/tool-usage-stats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-usage-stats.js","sourceRoot":"","sources":["../../../src/observability/tool-usage-stats.ts"],"names":[],"mappings":"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"}
@@ -59,8 +59,35 @@ export interface ToolUsageEntry {
59
59
  * duplicates the same data) so the resulting tokens-delivered estimate
60
60
  * isn't double-counted. Recorded on every successful call so it can
61
61
  * survive retrieval-tool / non-retrieval-tool reclassifications later.
62
+ *
63
+ * NOTE (Slice 1, point-of-use receipt): when `RIFT_RECEIPT` is on, the
64
+ * retrieval handlers prepend a short `_Rift recalled …_` line to this text
65
+ * BEFORE the logger runs, so those bytes are included here and thus in
66
+ * `delivered`. This is intentional — Rift genuinely sent that text to the
67
+ * model — and only makes the "reading saved" figure slightly more
68
+ * conservative (delivered grows, saved shrinks). It does mean toggling
69
+ * `RIFT_RECEIPT` perturbs delivered/saved by ~the receipt's size; that is
70
+ * accepted rather than special-cased, because this field is defined as the
71
+ * literal model-visible text and must not under-report what was sent.
62
72
  */
63
73
  response_text_bytes?: number;
74
+ /**
75
+ * Retrieval tools only: summed full-parent `content_tokens_estimate`
76
+ * behind every returned hit (search/conversations: `results[]`;
77
+ * context_pack: `examples[]` + `rules[]`), preferring the
78
+ * `expand.params` size advisory so stitched chunked `detail="middle"`
79
+ * hits count the full parent rather than the returned window. This is the
80
+ * haystack a compact recall was drawn from — the reading the agent would
81
+ * have faced to find the same answer by hand. Paired with
82
+ * `response_text_bytes` it yields the honest "reading saved" figure
83
+ * (`source − delivered`), which self-zeroes on `detail=full` pulls (where
84
+ * the agent asked for the whole row, so nothing was saved). Computed with
85
+ * the same `ceil(bytes/4)` estimator as delivered tokens, so the two are
86
+ * directly comparable. Absent on legacy rows and on tools/shapes that
87
+ * carry no per-hit size advisory (contributes 0, never a fabricated
88
+ * number).
89
+ */
90
+ source_tokens_estimate?: number;
64
91
  }
65
92
  export declare function sanitizeArgs(raw: Record<string, unknown>): Record<string, unknown>;
66
93
  /**
@@ -119,6 +146,35 @@ export declare function extractSearchResultMeta(mcpResult: {
119
146
  has_truncated_content?: boolean;
120
147
  max_content_tokens_estimate?: number;
121
148
  };
149
+ /**
150
+ * Sum the full-source-row token estimate across every returned hit, for any
151
+ * retrieval tool. Search and conversations-search expose hits on
152
+ * `structuredContent.results[]`; context_pack carries its sized rows on
153
+ * `examples[]` and `rules[]` (decisions/constraints/evidence are inline
154
+ * snippets with no backing-row size, so they contribute nothing). The size
155
+ * advisory (`content_tokens_estimate`) is already computed per hit by the
156
+ * compact DTO builder, so this is a cheap walk.
157
+ *
158
+ * Per hit we take the FULL-PARENT size advisory: `expand.params
159
+ * .content_tokens_estimate` when present, else the top-level
160
+ * `content_tokens_estimate`. They are equal for ordinary single-row hits, but
161
+ * for a stitched chunked `detail="middle"` hit the top-level value is only the
162
+ * returned window while `expand.params` advertises the full parent body the
163
+ * recall was drawn from (see compact.ts buildStitched*). Using the parent size
164
+ * keeps "reading saved" honest — it's the haystack a recall searched, not the
165
+ * slice it happened to return.
166
+ *
167
+ * Returns `undefined` — not `0` — for non-retrieval tools and for response
168
+ * shapes that carry no per-hit size at all, so the caller can omit the field
169
+ * rather than log a fabricated zero (mirroring how legacy rows stay absent).
170
+ */
171
+ export declare function extractSourceTokens(tool: string, mcpResult: {
172
+ content: Array<{
173
+ type: string;
174
+ text: string;
175
+ }>;
176
+ structuredContent?: Record<string, unknown>;
177
+ }): number | undefined;
122
178
  /**
123
179
  * Try to parse the typed error code (`id_not_found`, `ambiguous_id`, …)
124
180
  * out of a failure response's text channel. `formatError` formats typed
@@ -1 +1 @@
1
- {"version":3,"file":"tool-usage.d.ts","sourceRoot":"","sources":["../../../src/observability/tool-usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-usage.d.ts","sourceRoot":"","sources":["../../../src/observability/tool-usage.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,7 @@ const RETRIEVAL_TOOLS = new Set([
49
49
  "rift_search",
50
50
  "rift_conversations_search",
51
51
  "rift_context_pack",
52
+ "rift_open_evidence",
52
53
  ]);
53
54
  /**
54
55
  * Per-tool extractor for `(result_count, degraded)` derived from the MCP
@@ -89,6 +90,12 @@ function extractRetrievalSignal(tool, mcpResult) {
89
90
  out.degraded = sc["degraded"];
90
91
  return out;
91
92
  }
93
+ if (tool === "rift_open_evidence") {
94
+ if (!sc)
95
+ return {};
96
+ const count = sc["result"] && typeof sc["result"] === "object" ? 1 : 0;
97
+ return { count };
98
+ }
92
99
  // Search tools: prefer structuredContent, fall back to JSON-on-text for
93
100
  // backwards compatibility with the pre-Slice-1 response shape.
94
101
  const fromStructured = sc?.["results"];
@@ -185,6 +192,81 @@ export function extractSearchResultMeta(mcpResult) {
185
192
  out.max_content_tokens_estimate = maxTokens;
186
193
  return out;
187
194
  }
195
+ /**
196
+ * Sum the full-source-row token estimate across every returned hit, for any
197
+ * retrieval tool. Search and conversations-search expose hits on
198
+ * `structuredContent.results[]`; context_pack carries its sized rows on
199
+ * `examples[]` and `rules[]` (decisions/constraints/evidence are inline
200
+ * snippets with no backing-row size, so they contribute nothing). The size
201
+ * advisory (`content_tokens_estimate`) is already computed per hit by the
202
+ * compact DTO builder, so this is a cheap walk.
203
+ *
204
+ * Per hit we take the FULL-PARENT size advisory: `expand.params
205
+ * .content_tokens_estimate` when present, else the top-level
206
+ * `content_tokens_estimate`. They are equal for ordinary single-row hits, but
207
+ * for a stitched chunked `detail="middle"` hit the top-level value is only the
208
+ * returned window while `expand.params` advertises the full parent body the
209
+ * recall was drawn from (see compact.ts buildStitched*). Using the parent size
210
+ * keeps "reading saved" honest — it's the haystack a recall searched, not the
211
+ * slice it happened to return.
212
+ *
213
+ * Returns `undefined` — not `0` — for non-retrieval tools and for response
214
+ * shapes that carry no per-hit size at all, so the caller can omit the field
215
+ * rather than log a fabricated zero (mirroring how legacy rows stay absent).
216
+ */
217
+ export function extractSourceTokens(tool, mcpResult) {
218
+ if (!RETRIEVAL_TOOLS.has(tool))
219
+ return undefined;
220
+ const sc = mcpResult.structuredContent;
221
+ if (!sc)
222
+ return undefined;
223
+ let total = 0;
224
+ let found = false;
225
+ const hitSourceTokens = (hit) => {
226
+ const expand = hit["expand"];
227
+ const params = expand && typeof expand === "object"
228
+ ? expand["params"]
229
+ : undefined;
230
+ const fromExpand = params && typeof params === "object"
231
+ ? params["content_tokens_estimate"]
232
+ : undefined;
233
+ if (typeof fromExpand === "number")
234
+ return fromExpand;
235
+ const topLevel = hit["content_tokens_estimate"];
236
+ return typeof topLevel === "number" ? topLevel : undefined;
237
+ };
238
+ const addFrom = (arr) => {
239
+ if (!Array.isArray(arr))
240
+ return;
241
+ for (const item of arr) {
242
+ if (!item || typeof item !== "object")
243
+ continue;
244
+ const tokens = hitSourceTokens(item);
245
+ if (typeof tokens === "number") {
246
+ total += tokens;
247
+ found = true;
248
+ }
249
+ }
250
+ };
251
+ if (tool === "rift_context_pack") {
252
+ addFrom(sc["examples"]);
253
+ addFrom(sc["rules"]);
254
+ }
255
+ else if (tool === "rift_open_evidence") {
256
+ const result = sc["result"];
257
+ if (result && typeof result === "object") {
258
+ const tokens = hitSourceTokens(result);
259
+ if (typeof tokens === "number") {
260
+ total += tokens;
261
+ found = true;
262
+ }
263
+ }
264
+ }
265
+ else {
266
+ addFrom(sc["results"]);
267
+ }
268
+ return found ? total : undefined;
269
+ }
188
270
  /**
189
271
  * Try to parse the typed error code (`id_not_found`, `ambiguous_id`, …)
190
272
  * out of a failure response's text channel. `formatError` formats typed
@@ -262,6 +344,10 @@ export class ToolUsageLogger {
262
344
  }
263
345
  }
264
346
  entry.response_text_bytes = textBytes;
347
+ const sourceTokens = extractSourceTokens(tool, result);
348
+ if (sourceTokens !== undefined) {
349
+ entry.source_tokens_estimate = sourceTokens;
350
+ }
265
351
  }
266
352
  if (tool === "rift_search") {
267
353
  const meta = deriveSearchModeMeta(args);