@getrift/rift 0.0.0 → 0.1.0-beta.1

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 (651) hide show
  1. package/README.dev.md +110 -0
  2. package/dist/src/auth/keychain.d.ts +25 -0
  3. package/dist/src/auth/keychain.d.ts.map +1 -0
  4. package/dist/src/auth/keychain.js +113 -0
  5. package/dist/src/auth/keychain.js.map +1 -0
  6. package/dist/src/auth/middleware.d.ts +20 -0
  7. package/dist/src/auth/middleware.d.ts.map +1 -0
  8. package/dist/src/auth/middleware.js +49 -0
  9. package/dist/src/auth/middleware.js.map +1 -0
  10. package/dist/src/auth/rate-limit.d.ts +16 -0
  11. package/dist/src/auth/rate-limit.d.ts.map +1 -0
  12. package/dist/src/auth/rate-limit.js +38 -0
  13. package/dist/src/auth/rate-limit.js.map +1 -0
  14. package/dist/src/auth/rotation.d.ts +67 -0
  15. package/dist/src/auth/rotation.d.ts.map +1 -0
  16. package/dist/src/auth/rotation.js +190 -0
  17. package/dist/src/auth/rotation.js.map +1 -0
  18. package/dist/src/backfill/project-context-batch-constructor.d.ts +127 -0
  19. package/dist/src/backfill/project-context-batch-constructor.d.ts.map +1 -0
  20. package/dist/src/backfill/project-context-batch-constructor.js +210 -0
  21. package/dist/src/backfill/project-context-batch-constructor.js.map +1 -0
  22. package/dist/src/capture/auto-capture.d.ts +162 -0
  23. package/dist/src/capture/auto-capture.d.ts.map +1 -0
  24. package/dist/src/capture/auto-capture.js +601 -0
  25. package/dist/src/capture/auto-capture.js.map +1 -0
  26. package/dist/src/capture/batch-budget.d.ts +90 -0
  27. package/dist/src/capture/batch-budget.d.ts.map +1 -0
  28. package/dist/src/capture/batch-budget.js +148 -0
  29. package/dist/src/capture/batch-budget.js.map +1 -0
  30. package/dist/src/capture/codex-cli-triage-provider.d.ts +17 -0
  31. package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -0
  32. package/dist/src/capture/codex-cli-triage-provider.js +109 -0
  33. package/dist/src/capture/codex-cli-triage-provider.js.map +1 -0
  34. package/dist/src/capture/observability.d.ts +42 -0
  35. package/dist/src/capture/observability.d.ts.map +1 -0
  36. package/dist/src/capture/observability.js +87 -0
  37. package/dist/src/capture/observability.js.map +1 -0
  38. package/dist/src/capture/openai-triage-provider.d.ts +92 -0
  39. package/dist/src/capture/openai-triage-provider.d.ts.map +1 -0
  40. package/dist/src/capture/openai-triage-provider.js +267 -0
  41. package/dist/src/capture/openai-triage-provider.js.map +1 -0
  42. package/dist/src/capture/review-queue-index.d.ts +51 -0
  43. package/dist/src/capture/review-queue-index.d.ts.map +1 -0
  44. package/dist/src/capture/review-queue-index.js +204 -0
  45. package/dist/src/capture/review-queue-index.js.map +1 -0
  46. package/dist/src/capture/review-queue.d.ts +43 -0
  47. package/dist/src/capture/review-queue.d.ts.map +1 -0
  48. package/dist/src/capture/review-queue.js +116 -0
  49. package/dist/src/capture/review-queue.js.map +1 -0
  50. package/dist/src/capture/sources.d.ts +7 -0
  51. package/dist/src/capture/sources.d.ts.map +1 -0
  52. package/dist/src/capture/sources.js +3 -0
  53. package/dist/src/capture/sources.js.map +1 -0
  54. package/dist/src/capture/triage-lane.d.ts +39 -0
  55. package/dist/src/capture/triage-lane.d.ts.map +1 -0
  56. package/dist/src/capture/triage-lane.js +217 -0
  57. package/dist/src/capture/triage-lane.js.map +1 -0
  58. package/dist/src/capture/triage-provider.d.ts +75 -0
  59. package/dist/src/capture/triage-provider.d.ts.map +1 -0
  60. package/dist/src/capture/triage-provider.js +120 -0
  61. package/dist/src/capture/triage-provider.js.map +1 -0
  62. package/dist/src/capture/triage.d.ts +30 -0
  63. package/dist/src/capture/triage.d.ts.map +1 -0
  64. package/dist/src/capture/triage.js +48 -0
  65. package/dist/src/capture/triage.js.map +1 -0
  66. package/dist/src/cli/commands/backfill.d.ts +3 -0
  67. package/dist/src/cli/commands/backfill.d.ts.map +1 -0
  68. package/dist/src/cli/commands/backfill.js +1376 -0
  69. package/dist/src/cli/commands/backfill.js.map +1 -0
  70. package/dist/src/cli/commands/bulk-ingest.d.ts +3 -0
  71. package/dist/src/cli/commands/bulk-ingest.d.ts.map +1 -0
  72. package/dist/src/cli/commands/bulk-ingest.js +126 -0
  73. package/dist/src/cli/commands/bulk-ingest.js.map +1 -0
  74. package/dist/src/cli/commands/capture.d.ts +12 -0
  75. package/dist/src/cli/commands/capture.d.ts.map +1 -0
  76. package/dist/src/cli/commands/capture.js +123 -0
  77. package/dist/src/cli/commands/capture.js.map +1 -0
  78. package/dist/src/cli/commands/compact.d.ts +3 -0
  79. package/dist/src/cli/commands/compact.d.ts.map +1 -0
  80. package/dist/src/cli/commands/compact.js +70 -0
  81. package/dist/src/cli/commands/compact.js.map +1 -0
  82. package/dist/src/cli/commands/feedback.d.ts +22 -0
  83. package/dist/src/cli/commands/feedback.d.ts.map +1 -0
  84. package/dist/src/cli/commands/feedback.js +125 -0
  85. package/dist/src/cli/commands/feedback.js.map +1 -0
  86. package/dist/src/cli/commands/hooks-install.d.ts +19 -0
  87. package/dist/src/cli/commands/hooks-install.d.ts.map +1 -0
  88. package/dist/src/cli/commands/hooks-install.js +103 -0
  89. package/dist/src/cli/commands/hooks-install.js.map +1 -0
  90. package/dist/src/cli/commands/import.d.ts +19 -0
  91. package/dist/src/cli/commands/import.d.ts.map +1 -0
  92. package/dist/src/cli/commands/import.js +258 -0
  93. package/dist/src/cli/commands/import.js.map +1 -0
  94. package/dist/src/cli/commands/ingest.d.ts +3 -0
  95. package/dist/src/cli/commands/ingest.d.ts.map +1 -0
  96. package/dist/src/cli/commands/ingest.js +80 -0
  97. package/dist/src/cli/commands/ingest.js.map +1 -0
  98. package/dist/src/cli/commands/mcp-install.d.ts +25 -0
  99. package/dist/src/cli/commands/mcp-install.d.ts.map +1 -0
  100. package/dist/src/cli/commands/mcp-install.js +134 -0
  101. package/dist/src/cli/commands/mcp-install.js.map +1 -0
  102. package/dist/src/cli/commands/onboard.d.ts +98 -0
  103. package/dist/src/cli/commands/onboard.d.ts.map +1 -0
  104. package/dist/src/cli/commands/onboard.js +823 -0
  105. package/dist/src/cli/commands/onboard.js.map +1 -0
  106. package/dist/src/cli/commands/rebuild.d.ts +12 -0
  107. package/dist/src/cli/commands/rebuild.d.ts.map +1 -0
  108. package/dist/src/cli/commands/rebuild.js +164 -0
  109. package/dist/src/cli/commands/rebuild.js.map +1 -0
  110. package/dist/src/cli/commands/reconcile.d.ts +3 -0
  111. package/dist/src/cli/commands/reconcile.d.ts.map +1 -0
  112. package/dist/src/cli/commands/reconcile.js +56 -0
  113. package/dist/src/cli/commands/reconcile.js.map +1 -0
  114. package/dist/src/cli/commands/reindex.d.ts +3 -0
  115. package/dist/src/cli/commands/reindex.d.ts.map +1 -0
  116. package/dist/src/cli/commands/reindex.js +66 -0
  117. package/dist/src/cli/commands/reindex.js.map +1 -0
  118. package/dist/src/cli/commands/review.d.ts +13 -0
  119. package/dist/src/cli/commands/review.d.ts.map +1 -0
  120. package/dist/src/cli/commands/review.js +383 -0
  121. package/dist/src/cli/commands/review.js.map +1 -0
  122. package/dist/src/cli/commands/save.d.ts +3 -0
  123. package/dist/src/cli/commands/save.d.ts.map +1 -0
  124. package/dist/src/cli/commands/save.js +111 -0
  125. package/dist/src/cli/commands/save.js.map +1 -0
  126. package/dist/src/cli/commands/search.d.ts +35 -0
  127. package/dist/src/cli/commands/search.d.ts.map +1 -0
  128. package/dist/src/cli/commands/search.js +88 -0
  129. package/dist/src/cli/commands/search.js.map +1 -0
  130. package/dist/src/cli/commands/stats.d.ts +3 -0
  131. package/dist/src/cli/commands/stats.d.ts.map +1 -0
  132. package/dist/src/cli/commands/stats.js +42 -0
  133. package/dist/src/cli/commands/stats.js.map +1 -0
  134. package/dist/src/cli/commands/status.d.ts +15 -0
  135. package/dist/src/cli/commands/status.d.ts.map +1 -0
  136. package/dist/src/cli/commands/status.js +89 -0
  137. package/dist/src/cli/commands/status.js.map +1 -0
  138. package/dist/src/cli/commands/token-issue.d.ts +3 -0
  139. package/dist/src/cli/commands/token-issue.d.ts.map +1 -0
  140. package/dist/src/cli/commands/token-issue.js +25 -0
  141. package/dist/src/cli/commands/token-issue.js.map +1 -0
  142. package/dist/src/cli/commands/triage.d.ts +3 -0
  143. package/dist/src/cli/commands/triage.d.ts.map +1 -0
  144. package/dist/src/cli/commands/triage.js +125 -0
  145. package/dist/src/cli/commands/triage.js.map +1 -0
  146. package/dist/src/cli/commands/uninstall.d.ts +3 -0
  147. package/dist/src/cli/commands/uninstall.d.ts.map +1 -0
  148. package/dist/src/cli/commands/uninstall.js +238 -0
  149. package/dist/src/cli/commands/uninstall.js.map +1 -0
  150. package/dist/src/cli/feedback/feedback-config.d.ts +21 -0
  151. package/dist/src/cli/feedback/feedback-config.d.ts.map +1 -0
  152. package/dist/src/cli/feedback/feedback-config.js +43 -0
  153. package/dist/src/cli/feedback/feedback-config.js.map +1 -0
  154. package/dist/src/cli/feedback/feedback-history.d.ts +4 -0
  155. package/dist/src/cli/feedback/feedback-history.d.ts.map +1 -0
  156. package/dist/src/cli/feedback/feedback-history.js +115 -0
  157. package/dist/src/cli/feedback/feedback-history.js.map +1 -0
  158. package/dist/src/cli/feedback/feedback-payload.d.ts +53 -0
  159. package/dist/src/cli/feedback/feedback-payload.d.ts.map +1 -0
  160. package/dist/src/cli/feedback/feedback-payload.js +10 -0
  161. package/dist/src/cli/feedback/feedback-payload.js.map +1 -0
  162. package/dist/src/cli/feedback/feedback-relay.d.ts +15 -0
  163. package/dist/src/cli/feedback/feedback-relay.d.ts.map +1 -0
  164. package/dist/src/cli/feedback/feedback-relay.js +47 -0
  165. package/dist/src/cli/feedback/feedback-relay.js.map +1 -0
  166. package/dist/src/cli/feedback/feedback-status.d.ts +11 -0
  167. package/dist/src/cli/feedback/feedback-status.d.ts.map +1 -0
  168. package/dist/src/cli/feedback/feedback-status.js +122 -0
  169. package/dist/src/cli/feedback/feedback-status.js.map +1 -0
  170. package/dist/src/cli/hooks-writers/claude-code-policy-script.d.ts +25 -0
  171. package/dist/src/cli/hooks-writers/claude-code-policy-script.d.ts.map +1 -0
  172. package/dist/src/cli/hooks-writers/claude-code-policy-script.js +85 -0
  173. package/dist/src/cli/hooks-writers/claude-code-policy-script.js.map +1 -0
  174. package/dist/src/cli/hooks-writers/claude-code.d.ts +12 -0
  175. package/dist/src/cli/hooks-writers/claude-code.d.ts.map +1 -0
  176. package/dist/src/cli/hooks-writers/claude-code.js +228 -0
  177. package/dist/src/cli/hooks-writers/claude-code.js.map +1 -0
  178. package/dist/src/cli/hooks-writers/errors.d.ts +16 -0
  179. package/dist/src/cli/hooks-writers/errors.d.ts.map +1 -0
  180. package/dist/src/cli/hooks-writers/errors.js +24 -0
  181. package/dist/src/cli/hooks-writers/errors.js.map +1 -0
  182. package/dist/src/cli/hooks-writers/index.d.ts +13 -0
  183. package/dist/src/cli/hooks-writers/index.d.ts.map +1 -0
  184. package/dist/src/cli/hooks-writers/index.js +26 -0
  185. package/dist/src/cli/hooks-writers/index.js.map +1 -0
  186. package/dist/src/cli/hooks-writers/types.d.ts +27 -0
  187. package/dist/src/cli/hooks-writers/types.d.ts.map +1 -0
  188. package/dist/src/cli/hooks-writers/types.js +9 -0
  189. package/dist/src/cli/hooks-writers/types.js.map +1 -0
  190. package/dist/src/cli/http-client.d.ts +36 -0
  191. package/dist/src/cli/http-client.d.ts.map +1 -0
  192. package/dist/src/cli/http-client.js +153 -0
  193. package/dist/src/cli/http-client.js.map +1 -0
  194. package/dist/src/cli/index.d.ts +4 -0
  195. package/dist/src/cli/index.d.ts.map +1 -0
  196. package/dist/src/cli/index.js +68 -0
  197. package/dist/src/cli/index.js.map +1 -0
  198. package/dist/src/cli/job-poller.d.ts +13 -0
  199. package/dist/src/cli/job-poller.d.ts.map +1 -0
  200. package/dist/src/cli/job-poller.js +29 -0
  201. package/dist/src/cli/job-poller.js.map +1 -0
  202. package/dist/src/cli/mcp-config-writers/codex-toml.d.ts +10 -0
  203. package/dist/src/cli/mcp-config-writers/codex-toml.d.ts.map +1 -0
  204. package/dist/src/cli/mcp-config-writers/codex-toml.js +410 -0
  205. package/dist/src/cli/mcp-config-writers/codex-toml.js.map +1 -0
  206. package/dist/src/cli/mcp-config-writers/errors.d.ts +17 -0
  207. package/dist/src/cli/mcp-config-writers/errors.d.ts.map +1 -0
  208. package/dist/src/cli/mcp-config-writers/errors.js +13 -0
  209. package/dist/src/cli/mcp-config-writers/errors.js.map +1 -0
  210. package/dist/src/cli/mcp-config-writers/index.d.ts +18 -0
  211. package/dist/src/cli/mcp-config-writers/index.d.ts.map +1 -0
  212. package/dist/src/cli/mcp-config-writers/index.js +49 -0
  213. package/dist/src/cli/mcp-config-writers/index.js.map +1 -0
  214. package/dist/src/cli/mcp-config-writers/json-config.d.ts +12 -0
  215. package/dist/src/cli/mcp-config-writers/json-config.d.ts.map +1 -0
  216. package/dist/src/cli/mcp-config-writers/json-config.js +177 -0
  217. package/dist/src/cli/mcp-config-writers/json-config.js.map +1 -0
  218. package/dist/src/cli/mcp-config-writers/redact.d.ts +28 -0
  219. package/dist/src/cli/mcp-config-writers/redact.d.ts.map +1 -0
  220. package/dist/src/cli/mcp-config-writers/redact.js +48 -0
  221. package/dist/src/cli/mcp-config-writers/redact.js.map +1 -0
  222. package/dist/src/cli/mcp-config-writers/types.d.ts +32 -0
  223. package/dist/src/cli/mcp-config-writers/types.d.ts.map +1 -0
  224. package/dist/src/cli/mcp-config-writers/types.js +5 -0
  225. package/dist/src/cli/mcp-config-writers/types.js.map +1 -0
  226. package/dist/src/cli/output.d.ts +8 -0
  227. package/dist/src/cli/output.d.ts.map +1 -0
  228. package/dist/src/cli/output.js +34 -0
  229. package/dist/src/cli/output.js.map +1 -0
  230. package/dist/src/cli/status/friend-header.d.ts +33 -0
  231. package/dist/src/cli/status/friend-header.d.ts.map +1 -0
  232. package/dist/src/cli/status/friend-header.js +108 -0
  233. package/dist/src/cli/status/friend-header.js.map +1 -0
  234. package/dist/src/cli/status/local-signals.d.ts +14 -0
  235. package/dist/src/cli/status/local-signals.d.ts.map +1 -0
  236. package/dist/src/cli/status/local-signals.js +73 -0
  237. package/dist/src/cli/status/local-signals.js.map +1 -0
  238. package/dist/src/cli/token.d.ts +37 -0
  239. package/dist/src/cli/token.d.ts.map +1 -0
  240. package/dist/src/cli/token.js +105 -0
  241. package/dist/src/cli/token.js.map +1 -0
  242. package/dist/src/cli/uninstall/mcp-uninstall.d.ts +33 -0
  243. package/dist/src/cli/uninstall/mcp-uninstall.d.ts.map +1 -0
  244. package/dist/src/cli/uninstall/mcp-uninstall.js +181 -0
  245. package/dist/src/cli/uninstall/mcp-uninstall.js.map +1 -0
  246. package/dist/src/config/loader.d.ts +9 -0
  247. package/dist/src/config/loader.d.ts.map +1 -0
  248. package/dist/src/config/loader.js +73 -0
  249. package/dist/src/config/loader.js.map +1 -0
  250. package/dist/src/config/schema.d.ts +635 -0
  251. package/dist/src/config/schema.d.ts.map +1 -0
  252. package/dist/src/config/schema.js +208 -0
  253. package/dist/src/config/schema.js.map +1 -0
  254. package/dist/src/ingestion/bulk-ingest.d.ts +11 -0
  255. package/dist/src/ingestion/bulk-ingest.d.ts.map +1 -0
  256. package/dist/src/ingestion/bulk-ingest.js +11 -0
  257. package/dist/src/ingestion/bulk-ingest.js.map +1 -0
  258. package/dist/src/ingestion/extractor.d.ts +16 -0
  259. package/dist/src/ingestion/extractor.d.ts.map +1 -0
  260. package/dist/src/ingestion/extractor.js +85 -0
  261. package/dist/src/ingestion/extractor.js.map +1 -0
  262. package/dist/src/ingestion/extractors/docx.d.ts +3 -0
  263. package/dist/src/ingestion/extractors/docx.d.ts.map +1 -0
  264. package/dist/src/ingestion/extractors/docx.js +20 -0
  265. package/dist/src/ingestion/extractors/docx.js.map +1 -0
  266. package/dist/src/ingestion/extractors/pdf.d.ts +3 -0
  267. package/dist/src/ingestion/extractors/pdf.d.ts.map +1 -0
  268. package/dist/src/ingestion/extractors/pdf.js +32 -0
  269. package/dist/src/ingestion/extractors/pdf.js.map +1 -0
  270. package/dist/src/ingestion/historical-campaign.d.ts +340 -0
  271. package/dist/src/ingestion/historical-campaign.d.ts.map +1 -0
  272. package/dist/src/ingestion/historical-campaign.js +1010 -0
  273. package/dist/src/ingestion/historical-campaign.js.map +1 -0
  274. package/dist/src/ingestion/ignored-paths.d.ts +20 -0
  275. package/dist/src/ingestion/ignored-paths.d.ts.map +1 -0
  276. package/dist/src/ingestion/ignored-paths.js +45 -0
  277. package/dist/src/ingestion/ignored-paths.js.map +1 -0
  278. package/dist/src/ingestion/inbox-watcher.d.ts +12 -0
  279. package/dist/src/ingestion/inbox-watcher.d.ts.map +1 -0
  280. package/dist/src/ingestion/inbox-watcher.js +99 -0
  281. package/dist/src/ingestion/inbox-watcher.js.map +1 -0
  282. package/dist/src/ingestion/indexer.d.ts +32 -0
  283. package/dist/src/ingestion/indexer.d.ts.map +1 -0
  284. package/dist/src/ingestion/indexer.js +68 -0
  285. package/dist/src/ingestion/indexer.js.map +1 -0
  286. package/dist/src/ingestion/metadata-extraction.d.ts +53 -0
  287. package/dist/src/ingestion/metadata-extraction.d.ts.map +1 -0
  288. package/dist/src/ingestion/metadata-extraction.js +132 -0
  289. package/dist/src/ingestion/metadata-extraction.js.map +1 -0
  290. package/dist/src/ingestion/parsers/chatgpt-web.d.ts +29 -0
  291. package/dist/src/ingestion/parsers/chatgpt-web.d.ts.map +1 -0
  292. package/dist/src/ingestion/parsers/chatgpt-web.js +100 -0
  293. package/dist/src/ingestion/parsers/chatgpt-web.js.map +1 -0
  294. package/dist/src/ingestion/parsers/claude-code-jsonl.d.ts +16 -0
  295. package/dist/src/ingestion/parsers/claude-code-jsonl.d.ts.map +1 -0
  296. package/dist/src/ingestion/parsers/claude-code-jsonl.js +123 -0
  297. package/dist/src/ingestion/parsers/claude-code-jsonl.js.map +1 -0
  298. package/dist/src/ingestion/parsers/claude-web.d.ts +24 -0
  299. package/dist/src/ingestion/parsers/claude-web.d.ts.map +1 -0
  300. package/dist/src/ingestion/parsers/claude-web.js +78 -0
  301. package/dist/src/ingestion/parsers/claude-web.js.map +1 -0
  302. package/dist/src/ingestion/parsers/codex-jsonl.d.ts +18 -0
  303. package/dist/src/ingestion/parsers/codex-jsonl.d.ts.map +1 -0
  304. package/dist/src/ingestion/parsers/codex-jsonl.js +125 -0
  305. package/dist/src/ingestion/parsers/codex-jsonl.js.map +1 -0
  306. package/dist/src/ingestion/parsers/gemini-web.d.ts +16 -0
  307. package/dist/src/ingestion/parsers/gemini-web.d.ts.map +1 -0
  308. package/dist/src/ingestion/parsers/gemini-web.js +170 -0
  309. package/dist/src/ingestion/parsers/gemini-web.js.map +1 -0
  310. package/dist/src/ingestion/parsers/grok-web.d.ts +40 -0
  311. package/dist/src/ingestion/parsers/grok-web.d.ts.map +1 -0
  312. package/dist/src/ingestion/parsers/grok-web.js +67 -0
  313. package/dist/src/ingestion/parsers/grok-web.js.map +1 -0
  314. package/dist/src/ingestion/parsers/types.d.ts +34 -0
  315. package/dist/src/ingestion/parsers/types.d.ts.map +1 -0
  316. package/dist/src/ingestion/parsers/types.js +26 -0
  317. package/dist/src/ingestion/parsers/types.js.map +1 -0
  318. package/dist/src/ingestion/scanner.d.ts +48 -0
  319. package/dist/src/ingestion/scanner.d.ts.map +1 -0
  320. package/dist/src/ingestion/scanner.js +131 -0
  321. package/dist/src/ingestion/scanner.js.map +1 -0
  322. package/dist/src/ingestion/staging.d.ts +109 -0
  323. package/dist/src/ingestion/staging.d.ts.map +1 -0
  324. package/dist/src/ingestion/staging.js +411 -0
  325. package/dist/src/ingestion/staging.js.map +1 -0
  326. package/dist/src/ingestion/watcher.d.ts +65 -0
  327. package/dist/src/ingestion/watcher.d.ts.map +1 -0
  328. package/dist/src/ingestion/watcher.js +182 -0
  329. package/dist/src/ingestion/watcher.js.map +1 -0
  330. package/dist/src/jobs/codex-override-handler.d.ts +3 -0
  331. package/dist/src/jobs/codex-override-handler.d.ts.map +1 -0
  332. package/dist/src/jobs/codex-override-handler.js +16 -0
  333. package/dist/src/jobs/codex-override-handler.js.map +1 -0
  334. package/dist/src/jobs/handlers/compact.d.ts +30 -0
  335. package/dist/src/jobs/handlers/compact.d.ts.map +1 -0
  336. package/dist/src/jobs/handlers/compact.js +329 -0
  337. package/dist/src/jobs/handlers/compact.js.map +1 -0
  338. package/dist/src/jobs/handlers/ingest.d.ts +13 -0
  339. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -0
  340. package/dist/src/jobs/handlers/ingest.js +255 -0
  341. package/dist/src/jobs/handlers/ingest.js.map +1 -0
  342. package/dist/src/jobs/handlers/reconcile.d.ts +29 -0
  343. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -0
  344. package/dist/src/jobs/handlers/reconcile.js +476 -0
  345. package/dist/src/jobs/handlers/reconcile.js.map +1 -0
  346. package/dist/src/jobs/handlers/reindex.d.ts +38 -0
  347. package/dist/src/jobs/handlers/reindex.d.ts.map +1 -0
  348. package/dist/src/jobs/handlers/reindex.js +52 -0
  349. package/dist/src/jobs/handlers/reindex.js.map +1 -0
  350. package/dist/src/jobs/handlers/save.d.ts +10 -0
  351. package/dist/src/jobs/handlers/save.d.ts.map +1 -0
  352. package/dist/src/jobs/handlers/save.js +206 -0
  353. package/dist/src/jobs/handlers/save.js.map +1 -0
  354. package/dist/src/jobs/handlers/triage.d.ts +47 -0
  355. package/dist/src/jobs/handlers/triage.d.ts.map +1 -0
  356. package/dist/src/jobs/handlers/triage.js +95 -0
  357. package/dist/src/jobs/handlers/triage.js.map +1 -0
  358. package/dist/src/jobs/queue.d.ts +107 -0
  359. package/dist/src/jobs/queue.d.ts.map +1 -0
  360. package/dist/src/jobs/queue.js +319 -0
  361. package/dist/src/jobs/queue.js.map +1 -0
  362. package/dist/src/jobs/types.d.ts +39 -0
  363. package/dist/src/jobs/types.d.ts.map +1 -0
  364. package/dist/src/jobs/types.js +29 -0
  365. package/dist/src/jobs/types.js.map +1 -0
  366. package/dist/src/jobs/worker-entry.d.ts +10 -0
  367. package/dist/src/jobs/worker-entry.d.ts.map +1 -0
  368. package/dist/src/jobs/worker-entry.js +210 -0
  369. package/dist/src/jobs/worker-entry.js.map +1 -0
  370. package/dist/src/jobs/worker-process.d.ts +50 -0
  371. package/dist/src/jobs/worker-process.d.ts.map +1 -0
  372. package/dist/src/jobs/worker-process.js +186 -0
  373. package/dist/src/jobs/worker-process.js.map +1 -0
  374. package/dist/src/jobs/worker.d.ts +11 -0
  375. package/dist/src/jobs/worker.d.ts.map +1 -0
  376. package/dist/src/jobs/worker.js +14 -0
  377. package/dist/src/jobs/worker.js.map +1 -0
  378. package/dist/src/main.d.ts +2 -0
  379. package/dist/src/main.d.ts.map +1 -0
  380. package/dist/src/main.js +425 -0
  381. package/dist/src/main.js.map +1 -0
  382. package/dist/src/mcp/errors.d.ts +8 -0
  383. package/dist/src/mcp/errors.d.ts.map +1 -0
  384. package/dist/src/mcp/errors.js +50 -0
  385. package/dist/src/mcp/errors.js.map +1 -0
  386. package/dist/src/mcp/server.d.ts +10 -0
  387. package/dist/src/mcp/server.d.ts.map +1 -0
  388. package/dist/src/mcp/server.js +94 -0
  389. package/dist/src/mcp/server.js.map +1 -0
  390. package/dist/src/mcp/tools/context-pack.d.ts +35 -0
  391. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -0
  392. package/dist/src/mcp/tools/context-pack.js +97 -0
  393. package/dist/src/mcp/tools/context-pack.js.map +1 -0
  394. package/dist/src/mcp/tools/conversations-search.d.ts +38 -0
  395. package/dist/src/mcp/tools/conversations-search.d.ts.map +1 -0
  396. package/dist/src/mcp/tools/conversations-search.js +73 -0
  397. package/dist/src/mcp/tools/conversations-search.js.map +1 -0
  398. package/dist/src/mcp/tools/save.d.ts +32 -0
  399. package/dist/src/mcp/tools/save.d.ts.map +1 -0
  400. package/dist/src/mcp/tools/save.js +60 -0
  401. package/dist/src/mcp/tools/save.js.map +1 -0
  402. package/dist/src/mcp/tools/search.d.ts +33 -0
  403. package/dist/src/mcp/tools/search.d.ts.map +1 -0
  404. package/dist/src/mcp/tools/search.js +58 -0
  405. package/dist/src/mcp/tools/search.js.map +1 -0
  406. package/dist/src/mcp/tools/status.d.ts +17 -0
  407. package/dist/src/mcp/tools/status.d.ts.map +1 -0
  408. package/dist/src/mcp/tools/status.js +12 -0
  409. package/dist/src/mcp/tools/status.js.map +1 -0
  410. package/dist/src/observability/coverage.d.ts +100 -0
  411. package/dist/src/observability/coverage.d.ts.map +1 -0
  412. package/dist/src/observability/coverage.js +180 -0
  413. package/dist/src/observability/coverage.js.map +1 -0
  414. package/dist/src/observability/rift-context.d.ts +47 -0
  415. package/dist/src/observability/rift-context.d.ts.map +1 -0
  416. package/dist/src/observability/rift-context.js +118 -0
  417. package/dist/src/observability/rift-context.js.map +1 -0
  418. package/dist/src/observability/staleness.d.ts +43 -0
  419. package/dist/src/observability/staleness.d.ts.map +1 -0
  420. package/dist/src/observability/staleness.js +74 -0
  421. package/dist/src/observability/staleness.js.map +1 -0
  422. package/dist/src/observability/tool-usage-stats.d.ts +23 -0
  423. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -0
  424. package/dist/src/observability/tool-usage-stats.js +83 -0
  425. package/dist/src/observability/tool-usage-stats.js.map +1 -0
  426. package/dist/src/observability/tool-usage.d.ts +68 -0
  427. package/dist/src/observability/tool-usage.d.ts.map +1 -0
  428. package/dist/src/observability/tool-usage.js +207 -0
  429. package/dist/src/observability/tool-usage.js.map +1 -0
  430. package/dist/src/onboarding/daemon-control.d.ts +33 -0
  431. package/dist/src/onboarding/daemon-control.d.ts.map +1 -0
  432. package/dist/src/onboarding/daemon-control.js +92 -0
  433. package/dist/src/onboarding/daemon-control.js.map +1 -0
  434. package/dist/src/onboarding/env-file.d.ts +18 -0
  435. package/dist/src/onboarding/env-file.d.ts.map +1 -0
  436. package/dist/src/onboarding/env-file.js +89 -0
  437. package/dist/src/onboarding/env-file.js.map +1 -0
  438. package/dist/src/onboarding/voyage-validate.d.ts +16 -0
  439. package/dist/src/onboarding/voyage-validate.d.ts.map +1 -0
  440. package/dist/src/onboarding/voyage-validate.js +85 -0
  441. package/dist/src/onboarding/voyage-validate.js.map +1 -0
  442. package/dist/src/providers/anthropic-digest.d.ts +23 -0
  443. package/dist/src/providers/anthropic-digest.d.ts.map +1 -0
  444. package/dist/src/providers/anthropic-digest.js +91 -0
  445. package/dist/src/providers/anthropic-digest.js.map +1 -0
  446. package/dist/src/providers/codex-cli-digest.d.ts +12 -0
  447. package/dist/src/providers/codex-cli-digest.d.ts.map +1 -0
  448. package/dist/src/providers/codex-cli-digest.js +70 -0
  449. package/dist/src/providers/codex-cli-digest.js.map +1 -0
  450. package/dist/src/providers/codex-cli-metadata-extraction.d.ts +14 -0
  451. package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -0
  452. package/dist/src/providers/codex-cli-metadata-extraction.js +101 -0
  453. package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -0
  454. package/dist/src/providers/codex-cli-runner.d.ts +14 -0
  455. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -0
  456. package/dist/src/providers/codex-cli-runner.js +272 -0
  457. package/dist/src/providers/codex-cli-runner.js.map +1 -0
  458. package/dist/src/providers/conversation-generation.d.ts +10 -0
  459. package/dist/src/providers/conversation-generation.d.ts.map +1 -0
  460. package/dist/src/providers/conversation-generation.js +54 -0
  461. package/dist/src/providers/conversation-generation.js.map +1 -0
  462. package/dist/src/providers/ollama-embed.d.ts +22 -0
  463. package/dist/src/providers/ollama-embed.d.ts.map +1 -0
  464. package/dist/src/providers/ollama-embed.js +133 -0
  465. package/dist/src/providers/ollama-embed.js.map +1 -0
  466. package/dist/src/providers/ollama.d.ts +42 -0
  467. package/dist/src/providers/ollama.d.ts.map +1 -0
  468. package/dist/src/providers/ollama.js +169 -0
  469. package/dist/src/providers/ollama.js.map +1 -0
  470. package/dist/src/providers/openai-metadata-extraction.d.ts +73 -0
  471. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -0
  472. package/dist/src/providers/openai-metadata-extraction.js +161 -0
  473. package/dist/src/providers/openai-metadata-extraction.js.map +1 -0
  474. package/dist/src/providers/operator-overrides.d.ts +24 -0
  475. package/dist/src/providers/operator-overrides.d.ts.map +1 -0
  476. package/dist/src/providers/operator-overrides.js +84 -0
  477. package/dist/src/providers/operator-overrides.js.map +1 -0
  478. package/dist/src/providers/stub.d.ts +17 -0
  479. package/dist/src/providers/stub.d.ts.map +1 -0
  480. package/dist/src/providers/stub.js +72 -0
  481. package/dist/src/providers/stub.js.map +1 -0
  482. package/dist/src/providers/types.d.ts +82 -0
  483. package/dist/src/providers/types.d.ts.map +1 -0
  484. package/dist/src/providers/types.js +52 -0
  485. package/dist/src/providers/types.js.map +1 -0
  486. package/dist/src/providers/voyage.d.ts +23 -0
  487. package/dist/src/providers/voyage.d.ts.map +1 -0
  488. package/dist/src/providers/voyage.js +135 -0
  489. package/dist/src/providers/voyage.js.map +1 -0
  490. package/dist/src/retrieval/compact.d.ts +89 -0
  491. package/dist/src/retrieval/compact.d.ts.map +1 -0
  492. package/dist/src/retrieval/compact.js +348 -0
  493. package/dist/src/retrieval/compact.js.map +1 -0
  494. package/dist/src/retrieval/context-pack.d.ts +123 -0
  495. package/dist/src/retrieval/context-pack.d.ts.map +1 -0
  496. package/dist/src/retrieval/context-pack.js +553 -0
  497. package/dist/src/retrieval/context-pack.js.map +1 -0
  498. package/dist/src/retrieval/cwd.d.ts +25 -0
  499. package/dist/src/retrieval/cwd.d.ts.map +1 -0
  500. package/dist/src/retrieval/cwd.js +48 -0
  501. package/dist/src/retrieval/cwd.js.map +1 -0
  502. package/dist/src/retrieval/degraded.d.ts +20 -0
  503. package/dist/src/retrieval/degraded.d.ts.map +1 -0
  504. package/dist/src/retrieval/degraded.js +43 -0
  505. package/dist/src/retrieval/degraded.js.map +1 -0
  506. package/dist/src/retrieval/hybrid.d.ts +38 -0
  507. package/dist/src/retrieval/hybrid.d.ts.map +1 -0
  508. package/dist/src/retrieval/hybrid.js +82 -0
  509. package/dist/src/retrieval/hybrid.js.map +1 -0
  510. package/dist/src/retrieval/lexical.d.ts +28 -0
  511. package/dist/src/retrieval/lexical.d.ts.map +1 -0
  512. package/dist/src/retrieval/lexical.js +301 -0
  513. package/dist/src/retrieval/lexical.js.map +1 -0
  514. package/dist/src/retrieval/post-filter.d.ts +32 -0
  515. package/dist/src/retrieval/post-filter.d.ts.map +1 -0
  516. package/dist/src/retrieval/post-filter.js +57 -0
  517. package/dist/src/retrieval/post-filter.js.map +1 -0
  518. package/dist/src/retrieval/reranker.d.ts +72 -0
  519. package/dist/src/retrieval/reranker.d.ts.map +1 -0
  520. package/dist/src/retrieval/reranker.js +129 -0
  521. package/dist/src/retrieval/reranker.js.map +1 -0
  522. package/dist/src/retrieval/vector.d.ts +47 -0
  523. package/dist/src/retrieval/vector.d.ts.map +1 -0
  524. package/dist/src/retrieval/vector.js +112 -0
  525. package/dist/src/retrieval/vector.js.map +1 -0
  526. package/dist/src/runtime/legacy-migration.d.ts +27 -0
  527. package/dist/src/runtime/legacy-migration.d.ts.map +1 -0
  528. package/dist/src/runtime/legacy-migration.js +140 -0
  529. package/dist/src/runtime/legacy-migration.js.map +1 -0
  530. package/dist/src/runtime/legacy-name-guard.d.ts +35 -0
  531. package/dist/src/runtime/legacy-name-guard.d.ts.map +1 -0
  532. package/dist/src/runtime/legacy-name-guard.js +58 -0
  533. package/dist/src/runtime/legacy-name-guard.js.map +1 -0
  534. package/dist/src/runtime/rift-env.d.ts +14 -0
  535. package/dist/src/runtime/rift-env.d.ts.map +1 -0
  536. package/dist/src/runtime/rift-env.js +79 -0
  537. package/dist/src/runtime/rift-env.js.map +1 -0
  538. package/dist/src/runtime/watcher-startup.d.ts +2 -0
  539. package/dist/src/runtime/watcher-startup.d.ts.map +1 -0
  540. package/dist/src/runtime/watcher-startup.js +4 -0
  541. package/dist/src/runtime/watcher-startup.js.map +1 -0
  542. package/dist/src/security/archive.d.ts +23 -0
  543. package/dist/src/security/archive.d.ts.map +1 -0
  544. package/dist/src/security/archive.js +163 -0
  545. package/dist/src/security/archive.js.map +1 -0
  546. package/dist/src/security/paths.d.ts +21 -0
  547. package/dist/src/security/paths.d.ts.map +1 -0
  548. package/dist/src/security/paths.js +67 -0
  549. package/dist/src/security/paths.js.map +1 -0
  550. package/dist/src/server/app.d.ts +29 -0
  551. package/dist/src/server/app.d.ts.map +1 -0
  552. package/dist/src/server/app.js +226 -0
  553. package/dist/src/server/app.js.map +1 -0
  554. package/dist/src/server/build-info.d.ts +8 -0
  555. package/dist/src/server/build-info.d.ts.map +1 -0
  556. package/dist/src/server/build-info.js +61 -0
  557. package/dist/src/server/build-info.js.map +1 -0
  558. package/dist/src/server/lifecycle.d.ts +30 -0
  559. package/dist/src/server/lifecycle.d.ts.map +1 -0
  560. package/dist/src/server/lifecycle.js +59 -0
  561. package/dist/src/server/lifecycle.js.map +1 -0
  562. package/dist/src/server/middleware/multipart.d.ts +51 -0
  563. package/dist/src/server/middleware/multipart.d.ts.map +1 -0
  564. package/dist/src/server/middleware/multipart.js +86 -0
  565. package/dist/src/server/middleware/multipart.js.map +1 -0
  566. package/dist/src/server/routes/compact.d.ts +37 -0
  567. package/dist/src/server/routes/compact.d.ts.map +1 -0
  568. package/dist/src/server/routes/compact.js +77 -0
  569. package/dist/src/server/routes/compact.js.map +1 -0
  570. package/dist/src/server/routes/context.d.ts +5 -0
  571. package/dist/src/server/routes/context.d.ts.map +1 -0
  572. package/dist/src/server/routes/context.js +50 -0
  573. package/dist/src/server/routes/context.js.map +1 -0
  574. package/dist/src/server/routes/conversations-search.d.ts +4 -0
  575. package/dist/src/server/routes/conversations-search.d.ts.map +1 -0
  576. package/dist/src/server/routes/conversations-search.js +243 -0
  577. package/dist/src/server/routes/conversations-search.js.map +1 -0
  578. package/dist/src/server/routes/friend-status.d.ts +72 -0
  579. package/dist/src/server/routes/friend-status.d.ts.map +1 -0
  580. package/dist/src/server/routes/friend-status.js +71 -0
  581. package/dist/src/server/routes/friend-status.js.map +1 -0
  582. package/dist/src/server/routes/ingest.d.ts +15 -0
  583. package/dist/src/server/routes/ingest.d.ts.map +1 -0
  584. package/dist/src/server/routes/ingest.js +139 -0
  585. package/dist/src/server/routes/ingest.js.map +1 -0
  586. package/dist/src/server/routes/jobs.d.ts +10 -0
  587. package/dist/src/server/routes/jobs.d.ts.map +1 -0
  588. package/dist/src/server/routes/jobs.js +29 -0
  589. package/dist/src/server/routes/jobs.js.map +1 -0
  590. package/dist/src/server/routes/mcp-usage.d.ts +13 -0
  591. package/dist/src/server/routes/mcp-usage.d.ts.map +1 -0
  592. package/dist/src/server/routes/mcp-usage.js +17 -0
  593. package/dist/src/server/routes/mcp-usage.js.map +1 -0
  594. package/dist/src/server/routes/reconcile.d.ts +4 -0
  595. package/dist/src/server/routes/reconcile.d.ts.map +1 -0
  596. package/dist/src/server/routes/reconcile.js +43 -0
  597. package/dist/src/server/routes/reconcile.js.map +1 -0
  598. package/dist/src/server/routes/reindex.d.ts +4 -0
  599. package/dist/src/server/routes/reindex.d.ts.map +1 -0
  600. package/dist/src/server/routes/reindex.js +74 -0
  601. package/dist/src/server/routes/reindex.js.map +1 -0
  602. package/dist/src/server/routes/save.d.ts +40 -0
  603. package/dist/src/server/routes/save.d.ts.map +1 -0
  604. package/dist/src/server/routes/save.js +112 -0
  605. package/dist/src/server/routes/save.js.map +1 -0
  606. package/dist/src/server/routes/search.d.ts +5 -0
  607. package/dist/src/server/routes/search.d.ts.map +1 -0
  608. package/dist/src/server/routes/search.js +400 -0
  609. package/dist/src/server/routes/search.js.map +1 -0
  610. package/dist/src/server/routes/stats.d.ts +10 -0
  611. package/dist/src/server/routes/stats.d.ts.map +1 -0
  612. package/dist/src/server/routes/stats.js +15 -0
  613. package/dist/src/server/routes/stats.js.map +1 -0
  614. package/dist/src/server/routes/status.d.ts +20 -0
  615. package/dist/src/server/routes/status.d.ts.map +1 -0
  616. package/dist/src/server/routes/status.js +31 -0
  617. package/dist/src/server/routes/status.js.map +1 -0
  618. package/dist/src/server/routes/triage.d.ts +4 -0
  619. package/dist/src/server/routes/triage.d.ts.map +1 -0
  620. package/dist/src/server/routes/triage.js +94 -0
  621. package/dist/src/server/routes/triage.js.map +1 -0
  622. package/dist/src/server/save-quality.d.ts +21 -0
  623. package/dist/src/server/save-quality.d.ts.map +1 -0
  624. package/dist/src/server/save-quality.js +51 -0
  625. package/dist/src/server/save-quality.js.map +1 -0
  626. package/dist/src/storage/atomic.d.ts +8 -0
  627. package/dist/src/storage/atomic.d.ts.map +1 -0
  628. package/dist/src/storage/atomic.js +22 -0
  629. package/dist/src/storage/atomic.js.map +1 -0
  630. package/dist/src/storage/db.d.ts +15 -0
  631. package/dist/src/storage/db.d.ts.map +1 -0
  632. package/dist/src/storage/db.js +43 -0
  633. package/dist/src/storage/db.js.map +1 -0
  634. package/dist/src/storage/integrity.d.ts +11 -0
  635. package/dist/src/storage/integrity.d.ts.map +1 -0
  636. package/dist/src/storage/integrity.js +66 -0
  637. package/dist/src/storage/integrity.js.map +1 -0
  638. package/dist/src/storage/rebuild.d.ts +37 -0
  639. package/dist/src/storage/rebuild.d.ts.map +1 -0
  640. package/dist/src/storage/rebuild.js +353 -0
  641. package/dist/src/storage/rebuild.js.map +1 -0
  642. package/dist/src/storage/shadow-swap.d.ts +20 -0
  643. package/dist/src/storage/shadow-swap.d.ts.map +1 -0
  644. package/dist/src/storage/shadow-swap.js +163 -0
  645. package/dist/src/storage/shadow-swap.js.map +1 -0
  646. package/dist/src/storage/tables.d.ts +77 -0
  647. package/dist/src/storage/tables.d.ts.map +1 -0
  648. package/dist/src/storage/tables.js +196 -0
  649. package/dist/src/storage/tables.js.map +1 -0
  650. package/package.json +45 -14
  651. package/index.js +0 -3
@@ -0,0 +1,180 @@
1
+ import { getTable, TABLE_NAMES } from "../storage/tables.js";
2
+ import { isUnverifiedHealthy, isManualStale, isScanFreshnessMet, isWatcherHealthy, } from "./staleness.js";
3
+ // --- Table stats ---
4
+ export async function getTableStats() {
5
+ const countEntries = await Promise.all(TABLE_NAMES.map(async (name) => [name, await getTable(name).countRows()]));
6
+ const countMap = Object.fromEntries(countEntries);
7
+ const sdTable = getTable("structured_docs");
8
+ const sdRows = (await sdTable.query().toArray());
9
+ // Also check structured_docs_local for last_indexed
10
+ const sdLocalTable = getTable("structured_docs_local");
11
+ const sdLocalRows = (await sdLocalTable.query().toArray());
12
+ let lastIndexed = null;
13
+ for (const row of [...sdRows, ...sdLocalRows]) {
14
+ if (row.indexed_at && (!lastIndexed || row.indexed_at > lastIndexed)) {
15
+ lastIndexed = row.indexed_at;
16
+ }
17
+ }
18
+ const sdCount = (countMap["structured_docs"] ?? 0) + (countMap["structured_docs_local"] ?? 0);
19
+ const hotCount = countMap["conversations_hot"] ?? 0;
20
+ const coldCount = countMap["conversations_cold"] ?? 0;
21
+ const digestCount = countMap["digests"] ?? 0;
22
+ return {
23
+ structured_docs: { count: sdCount, last_indexed: lastIndexed },
24
+ conversations_hot: { count: hotCount },
25
+ conversations_cold: { count: coldCount },
26
+ digests: { count: digestCount },
27
+ conversation_artifacts_total: hotCount + coldCount + digestCount,
28
+ };
29
+ }
30
+ // --- Source coverage ---
31
+ const SAVE_SOURCES = ["claude_code", "gemini_cli", "codex_cli"];
32
+ const MANUAL_SOURCES = ["claude_web", "grok_web", "gemini_web"];
33
+ export async function getSourceCoverage(deps) {
34
+ const { config, scanner, watchers, capabilities } = deps;
35
+ const maintenanceState = deps.getMaintenanceState();
36
+ const effectiveNow = maintenanceState.active && maintenanceState.startedAt
37
+ ? maintenanceState.startedAt
38
+ : new Date();
39
+ // --- Verified: filesystem_watched ---
40
+ let watchedStatus;
41
+ if (!capabilities.watchEnabled) {
42
+ watchedStatus = { indexed_files: 0, healthy: true };
43
+ }
44
+ else {
45
+ const cloudRows = await getTable("structured_docs")
46
+ .query()
47
+ .where("source_type = 'filesystem_watched'")
48
+ .toArray();
49
+ const localRows = await getTable("structured_docs_local")
50
+ .query()
51
+ .where("source_type = 'filesystem_watched'")
52
+ .toArray();
53
+ watchedStatus = {
54
+ indexed_files: cloudRows.length + localRows.length,
55
+ healthy: isWatcherHealthy(watchers, maintenanceState.active),
56
+ };
57
+ }
58
+ // --- Verified: filesystem_scheduled_scan ---
59
+ let scanStatus;
60
+ if (!capabilities.scanEnabled) {
61
+ scanStatus = {
62
+ indexed_files: 0,
63
+ last_scan_at: null,
64
+ next_scan_at: null,
65
+ scan_schedule: "none",
66
+ freshness_slo_met: true,
67
+ };
68
+ }
69
+ else {
70
+ const cloudScanRows = await getTable("structured_docs")
71
+ .query()
72
+ .where("source_type = 'filesystem_scheduled_scan'")
73
+ .toArray();
74
+ const localScanRows = await getTable("structured_docs_local")
75
+ .query()
76
+ .where("source_type = 'filesystem_scheduled_scan'")
77
+ .toArray();
78
+ const rows = [...cloudScanRows, ...localScanRows];
79
+ const scanState = scanner?.scanState ?? {
80
+ last_scan_at: null,
81
+ next_scan_at: null,
82
+ };
83
+ scanStatus = {
84
+ indexed_files: rows.length,
85
+ last_scan_at: scanState.last_scan_at,
86
+ next_scan_at: scanState.next_scan_at,
87
+ scan_schedule: `every ${config.scan.interval_seconds}s`,
88
+ freshness_slo_met: isScanFreshnessMet(scanState.last_scan_at, config.scan.interval_seconds, effectiveNow),
89
+ };
90
+ }
91
+ // --- Conversation source timestamps ---
92
+ const hotRows = (await getTable("conversations_hot")
93
+ .query()
94
+ .toArray());
95
+ const coldRows = (await getTable("conversations_cold")
96
+ .query()
97
+ .toArray());
98
+ const allConvRows = [...hotRows, ...coldRows];
99
+ const lastTimestampBySource = new Map();
100
+ for (const row of allConvRows) {
101
+ const src = row.source;
102
+ const existing = lastTimestampBySource.get(src);
103
+ if (!existing || row.indexed_at > existing) {
104
+ lastTimestampBySource.set(src, row.indexed_at);
105
+ }
106
+ }
107
+ // --- Unverified sources ---
108
+ function buildUnverifiedStatus(source) {
109
+ if (!capabilities.supportedSources.has(source)) {
110
+ return { last_save: null, healthy: true };
111
+ }
112
+ const lastSave = lastTimestampBySource.get(source) ?? null;
113
+ const result = isUnverifiedHealthy(lastSave, effectiveNow);
114
+ return {
115
+ last_save: lastSave,
116
+ healthy: result.healthy,
117
+ ...(result.warning ? { warning: result.warning } : {}),
118
+ };
119
+ }
120
+ // --- Manual sources ---
121
+ function buildManualStatus(source) {
122
+ if (!capabilities.supportedSources.has(source)) {
123
+ return { last_ingest: null, stale: false };
124
+ }
125
+ const lastIngest = lastTimestampBySource.get(source) ?? null;
126
+ return {
127
+ last_ingest: lastIngest,
128
+ stale: isManualStale(lastIngest, effectiveNow),
129
+ };
130
+ }
131
+ // --- Inbox ---
132
+ let inboxStatus;
133
+ if (!capabilities.inboxEnabled) {
134
+ inboxStatus = { last_processed: null, healthy: true };
135
+ }
136
+ else {
137
+ const lastProcessed = lastTimestampBySource.get("inbox") ?? null;
138
+ const result = isUnverifiedHealthy(lastProcessed, effectiveNow);
139
+ inboxStatus = {
140
+ last_processed: lastProcessed,
141
+ healthy: result.healthy,
142
+ ...(result.warning
143
+ ? { warning: result.warning.replace("saves", "inbox activity") }
144
+ : {}),
145
+ };
146
+ }
147
+ return {
148
+ verified_autonomous: {
149
+ filesystem_watched: watchedStatus,
150
+ filesystem_scheduled_scan: scanStatus,
151
+ },
152
+ unverified_autonomous: {
153
+ claude_code: buildUnverifiedStatus("claude_code"),
154
+ gemini_cli: buildUnverifiedStatus("gemini_cli"),
155
+ codex_cli: buildUnverifiedStatus("codex_cli"),
156
+ inbox: inboxStatus,
157
+ },
158
+ manual: {
159
+ claude_web: buildManualStatus("claude_web"),
160
+ grok_web: buildManualStatus("grok_web"),
161
+ gemini_web: buildManualStatus("gemini_web"),
162
+ },
163
+ };
164
+ }
165
+ // --- Automation gate ---
166
+ export function computeAutomationGate(coverage) {
167
+ return {
168
+ verified_sources_healthy: coverage.verified_autonomous.filesystem_watched.healthy &&
169
+ coverage.verified_autonomous.filesystem_scheduled_scan.freshness_slo_met,
170
+ note: "Includes both filesystem_watched and filesystem_scheduled_scan types.",
171
+ };
172
+ }
173
+ // --- Full stats orchestrator ---
174
+ export async function buildFullStats(deps) {
175
+ const tables = await getTableStats();
176
+ const source_coverage = await getSourceCoverage(deps);
177
+ const automation_gate = computeAutomationGate(source_coverage);
178
+ return { tables, source_coverage, automation_gate };
179
+ }
180
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../../src/observability/coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export interface CapabilityCounts {
2
+ /** Total structured documents across cloud + local tables. */
3
+ structured_docs: number;
4
+ /** Hot tier conversation rows. */
5
+ conversations_hot: number;
6
+ /** Cold tier conversation rows. */
7
+ conversations_cold: number;
8
+ /** Digest summary rows. */
9
+ digests: number;
10
+ }
11
+ export interface CapabilityMapOptions {
12
+ maintenanceActive?: boolean;
13
+ }
14
+ /**
15
+ * Hard character cap enforced in tests. 2400 chars is a conservative
16
+ * ceiling for the plan's 600-token target at ~4 chars/token for
17
+ * English markdown. Keep the rendered output well below this.
18
+ */
19
+ export declare const CAPABILITY_MAP_MAX_CHARS = 2400;
20
+ /** Plan-level token target (see PLAN.MD "Capability Map Contract"). */
21
+ export declare const CAPABILITY_MAP_MAX_TOKENS = 600;
22
+ /**
23
+ * Rough token estimate. Not a tokenizer — uses chars/4 rounded up,
24
+ * a documented approximation suitable for a size guard. If a real
25
+ * tokenizer is later added to the repo, swap this implementation.
26
+ */
27
+ export declare function approxTokenCount(text: string): number;
28
+ /**
29
+ * Fetch the counts the capability map needs. Uses `countRows()` only
30
+ * (no full-table `.toArray()` walks). Callers get a small, cheap
31
+ * object; failures propagate so the route can decide how to respond.
32
+ */
33
+ export declare function getCapabilityCounts(): Promise<CapabilityCounts>;
34
+ /**
35
+ * Generate the capability-map markdown from cheap counts.
36
+ * Deterministic for identical input; regenerated on each request
37
+ * (no TTL cache in Phase 1).
38
+ */
39
+ export declare function generateCapabilityMap(counts: CapabilityCounts, opts?: CapabilityMapOptions): string;
40
+ /**
41
+ * Write the capability map to `{dataDir}/rift-context.md`.
42
+ * Best-effort — returns { written: false } on failure without throwing.
43
+ */
44
+ export declare function writeRiftContext(dataDir: string, capabilityMap: string): Promise<{
45
+ written: boolean;
46
+ }>;
47
+ //# sourceMappingURL=rift-context.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Generates the Zero-Prompt Awareness capability map served by
3
+ * GET /status, MCP rift_status, and CLI `status`, and writes the
4
+ * `rift-context.md` flat file as a side effect.
5
+ *
6
+ * Phase 1 contract (Slice 2):
7
+ * - introduces Rift as a capability, not a preloaded prompt
8
+ * - names the three available memory classes: conversations, digests,
9
+ * structured documents
10
+ * - names the three existing tools and when to use each
11
+ * - keeps infra metrics secondary (inline counts only)
12
+ *
13
+ * Size budget:
14
+ * PLAN.MD's Capability Map Contract targets `<= 600 tokens` for the
15
+ * markdown form. No tokenizer ships in-repo, so Phase 1 enforces a
16
+ * measurable char-based proxy plus a rough chars/4 token estimate.
17
+ * Both bounds are comfortably conservative relative to the plan's
18
+ * intent and are validated by the test suite.
19
+ *
20
+ * Data dependency:
21
+ * Generation needs only cheap per-table `countRows()` calls; it must
22
+ * not depend on full source-coverage scans (`.toArray()` walks). This
23
+ * keeps `/status` fast and keeps it working when secondary
24
+ * observability/source-health collection fails.
25
+ */
26
+ import { atomicWrite } from "../storage/atomic.js";
27
+ import { getTable } from "../storage/tables.js";
28
+ import path from "node:path";
29
+ /**
30
+ * Hard character cap enforced in tests. 2400 chars is a conservative
31
+ * ceiling for the plan's 600-token target at ~4 chars/token for
32
+ * English markdown. Keep the rendered output well below this.
33
+ */
34
+ export const CAPABILITY_MAP_MAX_CHARS = 2400;
35
+ /** Plan-level token target (see PLAN.MD "Capability Map Contract"). */
36
+ export const CAPABILITY_MAP_MAX_TOKENS = 600;
37
+ /**
38
+ * Rough token estimate. Not a tokenizer — uses chars/4 rounded up,
39
+ * a documented approximation suitable for a size guard. If a real
40
+ * tokenizer is later added to the repo, swap this implementation.
41
+ */
42
+ export function approxTokenCount(text) {
43
+ return Math.ceil(text.length / 4);
44
+ }
45
+ /**
46
+ * Fetch the counts the capability map needs. Uses `countRows()` only
47
+ * (no full-table `.toArray()` walks). Callers get a small, cheap
48
+ * object; failures propagate so the route can decide how to respond.
49
+ */
50
+ export async function getCapabilityCounts() {
51
+ const [sd, sdLocal, hot, cold, digests] = await Promise.all([
52
+ getTable("structured_docs").countRows(),
53
+ getTable("structured_docs_local").countRows(),
54
+ getTable("conversations_hot").countRows(),
55
+ getTable("conversations_cold").countRows(),
56
+ getTable("digests").countRows(),
57
+ ]);
58
+ return {
59
+ structured_docs: sd + sdLocal,
60
+ conversations_hot: hot,
61
+ conversations_cold: cold,
62
+ digests,
63
+ };
64
+ }
65
+ /**
66
+ * Generate the capability-map markdown from cheap counts.
67
+ * Deterministic for identical input; regenerated on each request
68
+ * (no TTL cache in Phase 1).
69
+ */
70
+ export function generateCapabilityMap(counts, opts) {
71
+ const conversationsTotal = counts.conversations_hot + counts.conversations_cold;
72
+ const lines = [];
73
+ lines.push("# Rift Capability Map");
74
+ lines.push("");
75
+ lines.push("Rift is a local memory service. Agents call it on demand to look up prior conversations, higher-level summaries of past activity, and indexed project or reference documents — not as a preloaded prompt blob. Use the tools below only when relevant context is likely to live in memory.");
76
+ lines.push("");
77
+ if (opts?.maintenanceActive) {
78
+ lines.push("> **Maintenance in progress** — an exclusive job is running. Some indexers are paused; results may be partial.");
79
+ lines.push("");
80
+ }
81
+ lines.push("## Available Memory");
82
+ lines.push(`- **conversations** — prior chat/session memory (hot + cold tiers). ${conversationsTotal} indexed.`);
83
+ lines.push(`- **digests** — higher-level summaries of past activity. ${counts.digests} indexed.`);
84
+ lines.push(`- **structured documents** — indexed project/client/reference files. ${counts.structured_docs} indexed.`);
85
+ lines.push("");
86
+ lines.push("## Which Tool To Use");
87
+ lines.push("- `rift_search` — broad search across all memory classes. Start here when you do not know which class holds the answer.");
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
+ 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_status` — system and capability overview (this map). Not for content retrieval.");
91
+ lines.push("");
92
+ lines.push("## Default Behavior");
93
+ lines.push("- Start compact. Issue one focused query before broadening.");
94
+ lines.push("- Read each compact hit (title, snippet, summary) first. Expand only the specific hit that justifies it.");
95
+ lines.push("- Do not pull raw history by default. Raw content is archive, not the default payload.");
96
+ lines.push("");
97
+ lines.push("## Escalation");
98
+ lines.push("- Need the full body of a hit? Follow the hit's `expand` pointer (typically `/search` with `detail=\"full\"`).");
99
+ lines.push("- Need conversation-specific filters (source, decisions, topics)? Switch to `rift_conversations_search`.");
100
+ lines.push("- Only broaden the query if the compact search returned no plausible candidate.");
101
+ lines.push("");
102
+ return lines.join("\n");
103
+ }
104
+ /**
105
+ * Write the capability map to `{dataDir}/rift-context.md`.
106
+ * Best-effort — returns { written: false } on failure without throwing.
107
+ */
108
+ export async function writeRiftContext(dataDir, capabilityMap) {
109
+ try {
110
+ await atomicWrite(path.join(dataDir, "rift-context.md"), capabilityMap);
111
+ return { written: true };
112
+ }
113
+ catch (err) {
114
+ process.stderr.write(`Failed to write rift-context.md: ${err instanceof Error ? err.message : String(err)}\n`);
115
+ return { written: false };
116
+ }
117
+ }
118
+ //# sourceMappingURL=rift-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rift-context.js","sourceRoot":"","sources":["../../../src/observability/rift-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Pure threshold logic for source health and freshness evaluation.
3
+ *
4
+ * All time-based functions accept an explicit `now` parameter so callers
5
+ * can freeze the clock during maintenance windows.
6
+ */
7
+ import type { Watcher } from "../ingestion/watcher.js";
8
+ /** Unverified-autonomous sources are unhealthy after this many days without a save. */
9
+ export declare const UNVERIFIED_STALENESS_DAYS = 15;
10
+ /** Manual sources are stale after this many days without an ingest. */
11
+ export declare const MANUAL_STALENESS_DAYS = 30;
12
+ /** Scheduled scan freshness SLO: last_scan_at must be within interval × this factor. */
13
+ export declare const SCAN_SLO_SLACK_FACTOR = 1.5;
14
+ /**
15
+ * Evaluate health of an unverified-autonomous source.
16
+ * Returns { healthy: true } if the source has a recent save,
17
+ * or { healthy: false, warning } if stale or no data.
18
+ */
19
+ export declare function isUnverifiedHealthy(lastSave: string | null, now: Date): {
20
+ healthy: boolean;
21
+ warning?: string;
22
+ };
23
+ /**
24
+ * Evaluate staleness of a manual source.
25
+ * Returns true if the source has no data or data older than the threshold.
26
+ */
27
+ export declare function isManualStale(lastIngest: string | null, now: Date): boolean;
28
+ /**
29
+ * Evaluate whether the scheduled scan freshness SLO is met.
30
+ * Met when `last_scan_at` is within `intervalSeconds × SCAN_SLO_SLACK_FACTOR` of `now`.
31
+ */
32
+ export declare function isScanFreshnessMet(lastScanAt: string | null, intervalSeconds: number, now: Date): boolean;
33
+ /**
34
+ * Evaluate watcher health.
35
+ * Healthy when maintenance is active (pause is expected) or when not all watchers are paused.
36
+ * An empty watchers array with no maintenance → true (nothing to be broken).
37
+ */
38
+ export declare function isWatcherHealthy(watchers: readonly Watcher[], maintenanceActive: boolean): boolean;
39
+ /**
40
+ * Format a human-readable staleness warning.
41
+ */
42
+ export declare function formatStalenessWarning(source: string, lastTimestamp: string | null, thresholdDays: number): string;
43
+ //# sourceMappingURL=staleness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness.d.ts","sourceRoot":"","sources":["../../../src/observability/staleness.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAIvD,uFAAuF;AACvF,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,wFAAwF;AACxF,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAWzC;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,GAAG,EAAE,IAAI,GACR;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAYxC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAG3E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,IAAI,GACR,OAAO,CAKT;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,iBAAiB,EAAE,OAAO,GACzB,OAAO,CAIT;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,aAAa,EAAE,MAAM,GACpB,MAAM,CAMR"}
@@ -0,0 +1,74 @@
1
+ // --- Thresholds ---
2
+ /** Unverified-autonomous sources are unhealthy after this many days without a save. */
3
+ export const UNVERIFIED_STALENESS_DAYS = 15;
4
+ /** Manual sources are stale after this many days without an ingest. */
5
+ export const MANUAL_STALENESS_DAYS = 30;
6
+ /** Scheduled scan freshness SLO: last_scan_at must be within interval × this factor. */
7
+ export const SCAN_SLO_SLACK_FACTOR = 1.5;
8
+ // --- Helpers ---
9
+ function daysSince(timestamp, now) {
10
+ const then = new Date(timestamp).getTime();
11
+ return (now.getTime() - then) / (1000 * 60 * 60 * 24);
12
+ }
13
+ // --- Evaluation functions ---
14
+ /**
15
+ * Evaluate health of an unverified-autonomous source.
16
+ * Returns { healthy: true } if the source has a recent save,
17
+ * or { healthy: false, warning } if stale or no data.
18
+ */
19
+ export function isUnverifiedHealthy(lastSave, now) {
20
+ if (lastSave === null) {
21
+ return { healthy: false, warning: "No saves recorded" };
22
+ }
23
+ const days = daysSince(lastSave, now);
24
+ if (days > UNVERIFIED_STALENESS_DAYS) {
25
+ return {
26
+ healthy: false,
27
+ warning: `No saves in ${Math.floor(days)} days`,
28
+ };
29
+ }
30
+ return { healthy: true };
31
+ }
32
+ /**
33
+ * Evaluate staleness of a manual source.
34
+ * Returns true if the source has no data or data older than the threshold.
35
+ */
36
+ export function isManualStale(lastIngest, now) {
37
+ if (lastIngest === null)
38
+ return true;
39
+ return daysSince(lastIngest, now) > MANUAL_STALENESS_DAYS;
40
+ }
41
+ /**
42
+ * Evaluate whether the scheduled scan freshness SLO is met.
43
+ * Met when `last_scan_at` is within `intervalSeconds × SCAN_SLO_SLACK_FACTOR` of `now`.
44
+ */
45
+ export function isScanFreshnessMet(lastScanAt, intervalSeconds, now) {
46
+ if (lastScanAt === null)
47
+ return false;
48
+ const thresholdMs = intervalSeconds * SCAN_SLO_SLACK_FACTOR * 1000;
49
+ const elapsed = now.getTime() - new Date(lastScanAt).getTime();
50
+ return elapsed <= thresholdMs;
51
+ }
52
+ /**
53
+ * Evaluate watcher health.
54
+ * Healthy when maintenance is active (pause is expected) or when not all watchers are paused.
55
+ * An empty watchers array with no maintenance → true (nothing to be broken).
56
+ */
57
+ export function isWatcherHealthy(watchers, maintenanceActive) {
58
+ if (maintenanceActive)
59
+ return true;
60
+ if (watchers.length === 0)
61
+ return true;
62
+ return !watchers.every((w) => w.isPaused);
63
+ }
64
+ /**
65
+ * Format a human-readable staleness warning.
66
+ */
67
+ export function formatStalenessWarning(source, lastTimestamp, thresholdDays) {
68
+ if (lastTimestamp === null) {
69
+ return `${source}: no activity recorded`;
70
+ }
71
+ const days = Math.floor(daysSince(lastTimestamp, new Date()));
72
+ return `${source}: no activity in ${days} days (threshold: ${thresholdDays}d)`;
73
+ }
74
+ //# sourceMappingURL=staleness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness.js","sourceRoot":"","sources":["../../../src/observability/staleness.ts"],"names":[],"mappings":"AAQA,qBAAqB;AAErB,uFAAuF;AACvF,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C,uEAAuE;AACvE,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC,wFAAwF;AACxF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,kBAAkB;AAElB,SAAS,SAAS,CAAC,SAAiB,EAAE,GAAS;IAC7C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,+BAA+B;AAE/B;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAuB,EACvB,GAAS;IAET,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC1D,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,IAAI,GAAG,yBAAyB,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,eAAe,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO;SAChD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,UAAyB,EAAE,GAAS;IAChE,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,qBAAqB,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAyB,EACzB,eAAuB,EACvB,GAAS;IAET,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,WAAW,GAAG,eAAe,GAAG,qBAAqB,GAAG,IAAI,CAAC;IACnE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/D,OAAO,OAAO,IAAI,WAAW,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAA4B,EAC5B,iBAA0B;IAE1B,IAAI,iBAAiB;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAc,EACd,aAA4B,EAC5B,aAAqB;IAErB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,GAAG,MAAM,wBAAwB,CAAC;IAC3C,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,GAAG,MAAM,oBAAoB,IAAI,qBAAqB,aAAa,IAAI,CAAC;AACjF,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Pure aggregation over MCP tool-usage entries.
3
+ *
4
+ * No filesystem reads, no parsing — callers pass an already-decoded
5
+ * `ToolUsageEntry[]` (typically via `readToolUsageEntriesTolerant`).
6
+ * Buckets calls into today/week/month/all-time and applies a fixed
7
+ * per-tool tokens-saved heuristic so historical entries (which were
8
+ * never instrumented for size) yield a usable estimate.
9
+ */
10
+ import type { ToolUsageEntry } from "./tool-usage.js";
11
+ export interface UsageWindow {
12
+ calls: number;
13
+ tokens_saved: number;
14
+ }
15
+ export interface UsageSummary {
16
+ today: UsageWindow;
17
+ week: UsageWindow;
18
+ month: UsageWindow;
19
+ all_time: UsageWindow;
20
+ by_tool: Record<string, number>;
21
+ }
22
+ export declare function aggregateUsage(entries: ToolUsageEntry[], now?: Date): UsageSummary;
23
+ //# sourceMappingURL=tool-usage-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-usage-stats.d.ts","sourceRoot":"","sources":["../../../src/observability/tool-usage-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAyCtD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;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;CACjC;AAkBD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EAAE,EACzB,GAAG,GAAE,IAAiB,GACrB,YAAY,CA4Cd"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Tokens-saved estimates per MCP tool call. The numbers are the
3
+ * approximate tokens an agent would have to spend stuffing equivalent
4
+ * context into a system prompt or doing the same query without the
5
+ * compact, bucketed retrieval the MCP server provides.
6
+ *
7
+ * Unknown tools fall back to `DEFAULT_TOKENS_SAVED` so future tools
8
+ * report a non-zero baseline.
9
+ */
10
+ const TOKENS_SAVED_PER_TOOL = {
11
+ rift_context_pack: 12_000,
12
+ rift_conversations_search: 8_000,
13
+ rift_search: 6_000,
14
+ rift_save: 2_000,
15
+ rift_status: 1_000,
16
+ };
17
+ const DEFAULT_TOKENS_SAVED = 1_000;
18
+ /**
19
+ * Map legacy tool names from JSONL rows written before the rename onto
20
+ * their canonical `rift_*` equivalents so SwiftBar tokens-saved counters
21
+ * stay continuous on a machine that upgrades. Hidden migration only —
22
+ * never surfaces in user-visible output.
23
+ */
24
+ const LEGACY_TOOL_RENAMES = {
25
+ life_save: "rift_save",
26
+ life_search: "rift_search",
27
+ life_conversations_search: "rift_conversations_search",
28
+ life_context_pack: "rift_context_pack",
29
+ life_status: "rift_status",
30
+ };
31
+ function canonicalToolName(tool) {
32
+ return LEGACY_TOOL_RENAMES[tool] ?? tool;
33
+ }
34
+ const DAY_MS = 24 * 60 * 60 * 1000;
35
+ function emptyWindow() {
36
+ return { calls: 0, tokens_saved: 0 };
37
+ }
38
+ function tokensSavedFor(tool) {
39
+ return TOKENS_SAVED_PER_TOOL[tool] ?? DEFAULT_TOKENS_SAVED;
40
+ }
41
+ function startOfUtcDay(date) {
42
+ return Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
43
+ }
44
+ export function aggregateUsage(entries, now = new Date()) {
45
+ const todayStartMs = startOfUtcDay(now);
46
+ const nowMs = now.getTime();
47
+ const weekStartMs = nowMs - 7 * DAY_MS;
48
+ const monthStartMs = nowMs - 30 * DAY_MS;
49
+ const summary = {
50
+ today: emptyWindow(),
51
+ week: emptyWindow(),
52
+ month: emptyWindow(),
53
+ all_time: emptyWindow(),
54
+ by_tool: {},
55
+ };
56
+ const todayEndMs = todayStartMs + DAY_MS;
57
+ for (const entry of entries) {
58
+ const ts = Date.parse(entry.timestamp);
59
+ if (Number.isNaN(ts))
60
+ continue;
61
+ const tool = canonicalToolName(entry.tool);
62
+ const tokens = entry.success ? tokensSavedFor(tool) : 0;
63
+ summary.all_time.calls += 1;
64
+ summary.all_time.tokens_saved += tokens;
65
+ summary.by_tool[tool] = (summary.by_tool[tool] ?? 0) + 1;
66
+ if (ts > nowMs)
67
+ continue;
68
+ if (ts >= monthStartMs) {
69
+ summary.month.calls += 1;
70
+ summary.month.tokens_saved += tokens;
71
+ }
72
+ if (ts >= weekStartMs) {
73
+ summary.week.calls += 1;
74
+ summary.week.tokens_saved += tokens;
75
+ }
76
+ if (ts >= todayStartMs && ts < todayEndMs) {
77
+ summary.today.calls += 1;
78
+ summary.today.tokens_saved += tokens;
79
+ }
80
+ }
81
+ return summary;
82
+ }
83
+ //# sourceMappingURL=tool-usage-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-usage-stats.js","sourceRoot":"","sources":["../../../src/observability/tool-usage-stats.ts"],"names":[],"mappings":"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"}