@mxalbert/context-mode 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/.claude-plugin/marketplace.json +33 -0
  2. package/.claude-plugin/plugin.json +31 -0
  3. package/.codex-plugin/hooks.json +65 -0
  4. package/.codex-plugin/mcp.json +13 -0
  5. package/.codex-plugin/plugin.json +31 -0
  6. package/.openclaw-plugin/index.ts +12 -0
  7. package/.openclaw-plugin/openclaw.plugin.json +38 -0
  8. package/.openclaw-plugin/package.json +28 -0
  9. package/LICENSE +94 -0
  10. package/README.md +1619 -0
  11. package/bin/statusline.mjs +378 -0
  12. package/build/adapters/antigravity/index.d.ts +51 -0
  13. package/build/adapters/antigravity/index.js +169 -0
  14. package/build/adapters/antigravity-cli/index.d.ts +51 -0
  15. package/build/adapters/antigravity-cli/index.js +342 -0
  16. package/build/adapters/base.d.ts +92 -0
  17. package/build/adapters/base.js +135 -0
  18. package/build/adapters/claude-code/config.d.ts +8 -0
  19. package/build/adapters/claude-code/config.js +8 -0
  20. package/build/adapters/claude-code/hooks.d.ts +106 -0
  21. package/build/adapters/claude-code/hooks.js +183 -0
  22. package/build/adapters/claude-code/index.d.ts +80 -0
  23. package/build/adapters/claude-code/index.js +569 -0
  24. package/build/adapters/claude-code-base.d.ts +49 -0
  25. package/build/adapters/claude-code-base.js +113 -0
  26. package/build/adapters/client-map.d.ts +10 -0
  27. package/build/adapters/client-map.js +42 -0
  28. package/build/adapters/codex/config.d.ts +8 -0
  29. package/build/adapters/codex/config.js +8 -0
  30. package/build/adapters/codex/hooks.d.ts +55 -0
  31. package/build/adapters/codex/hooks.js +64 -0
  32. package/build/adapters/codex/index.d.ts +87 -0
  33. package/build/adapters/codex/index.js +995 -0
  34. package/build/adapters/codex/paths.d.ts +1 -0
  35. package/build/adapters/codex/paths.js +12 -0
  36. package/build/adapters/codex/usage.d.ts +107 -0
  37. package/build/adapters/codex/usage.js +227 -0
  38. package/build/adapters/copilot-base.d.ts +94 -0
  39. package/build/adapters/copilot-base.js +297 -0
  40. package/build/adapters/copilot-cli/hooks.d.ts +33 -0
  41. package/build/adapters/copilot-cli/hooks.js +64 -0
  42. package/build/adapters/copilot-cli/index.d.ts +48 -0
  43. package/build/adapters/copilot-cli/index.js +341 -0
  44. package/build/adapters/cursor/config.d.ts +4 -0
  45. package/build/adapters/cursor/config.js +4 -0
  46. package/build/adapters/cursor/hooks.d.ts +55 -0
  47. package/build/adapters/cursor/hooks.js +82 -0
  48. package/build/adapters/cursor/index.d.ts +64 -0
  49. package/build/adapters/cursor/index.js +517 -0
  50. package/build/adapters/detect.d.ts +136 -0
  51. package/build/adapters/detect.js +623 -0
  52. package/build/adapters/gemini-cli/config.d.ts +8 -0
  53. package/build/adapters/gemini-cli/config.js +8 -0
  54. package/build/adapters/gemini-cli/hooks.d.ts +83 -0
  55. package/build/adapters/gemini-cli/hooks.js +115 -0
  56. package/build/adapters/gemini-cli/index.d.ts +80 -0
  57. package/build/adapters/gemini-cli/index.js +483 -0
  58. package/build/adapters/jetbrains-copilot/config.d.ts +8 -0
  59. package/build/adapters/jetbrains-copilot/config.js +8 -0
  60. package/build/adapters/jetbrains-copilot/hooks.d.ts +59 -0
  61. package/build/adapters/jetbrains-copilot/hooks.js +87 -0
  62. package/build/adapters/jetbrains-copilot/index.d.ts +31 -0
  63. package/build/adapters/jetbrains-copilot/index.js +131 -0
  64. package/build/adapters/kimi/config.d.ts +8 -0
  65. package/build/adapters/kimi/config.js +8 -0
  66. package/build/adapters/kimi/hooks.d.ts +28 -0
  67. package/build/adapters/kimi/hooks.js +34 -0
  68. package/build/adapters/kimi/index.d.ts +66 -0
  69. package/build/adapters/kimi/index.js +537 -0
  70. package/build/adapters/kimi/paths.d.ts +21 -0
  71. package/build/adapters/kimi/paths.js +52 -0
  72. package/build/adapters/kimi/usage.d.ts +82 -0
  73. package/build/adapters/kimi/usage.js +217 -0
  74. package/build/adapters/kiro/hooks.d.ts +61 -0
  75. package/build/adapters/kiro/hooks.js +94 -0
  76. package/build/adapters/kiro/index.d.ts +61 -0
  77. package/build/adapters/kiro/index.js +301 -0
  78. package/build/adapters/omp/index.d.ts +65 -0
  79. package/build/adapters/omp/index.js +182 -0
  80. package/build/adapters/omp/plugin.d.ts +81 -0
  81. package/build/adapters/omp/plugin.js +331 -0
  82. package/build/adapters/omp/usage.d.ts +49 -0
  83. package/build/adapters/omp/usage.js +110 -0
  84. package/build/adapters/openclaw/config.d.ts +8 -0
  85. package/build/adapters/openclaw/config.js +8 -0
  86. package/build/adapters/openclaw/hooks.d.ts +50 -0
  87. package/build/adapters/openclaw/hooks.js +61 -0
  88. package/build/adapters/openclaw/index.d.ts +74 -0
  89. package/build/adapters/openclaw/index.js +439 -0
  90. package/build/adapters/openclaw/mcp-tools.d.ts +54 -0
  91. package/build/adapters/openclaw/mcp-tools.js +207 -0
  92. package/build/adapters/openclaw/plugin.d.ts +141 -0
  93. package/build/adapters/openclaw/plugin.js +818 -0
  94. package/build/adapters/openclaw/session-db.d.ts +55 -0
  95. package/build/adapters/openclaw/session-db.js +88 -0
  96. package/build/adapters/openclaw/usage.d.ts +34 -0
  97. package/build/adapters/openclaw/usage.js +52 -0
  98. package/build/adapters/openclaw/workspace-router.d.ts +29 -0
  99. package/build/adapters/openclaw/workspace-router.js +64 -0
  100. package/build/adapters/opencode/config.d.ts +8 -0
  101. package/build/adapters/opencode/config.js +8 -0
  102. package/build/adapters/opencode/hooks.d.ts +38 -0
  103. package/build/adapters/opencode/hooks.js +50 -0
  104. package/build/adapters/opencode/index.d.ts +144 -0
  105. package/build/adapters/opencode/index.js +638 -0
  106. package/build/adapters/opencode/plugin.d.ts +249 -0
  107. package/build/adapters/opencode/plugin.js +1536 -0
  108. package/build/adapters/opencode/v2.d.ts +117 -0
  109. package/build/adapters/opencode/v2.js +224 -0
  110. package/build/adapters/opencode/zod3tov4.d.ts +1 -0
  111. package/build/adapters/opencode/zod3tov4.js +132 -0
  112. package/build/adapters/pi/extension.d.ts +81 -0
  113. package/build/adapters/pi/extension.js +861 -0
  114. package/build/adapters/pi/index.d.ts +57 -0
  115. package/build/adapters/pi/index.js +173 -0
  116. package/build/adapters/pi/mcp-bridge.d.ts +268 -0
  117. package/build/adapters/pi/mcp-bridge.js +894 -0
  118. package/build/adapters/qwen-code/hooks.d.ts +26 -0
  119. package/build/adapters/qwen-code/hooks.js +29 -0
  120. package/build/adapters/qwen-code/index.d.ts +40 -0
  121. package/build/adapters/qwen-code/index.js +361 -0
  122. package/build/adapters/qwen-code/usage.d.ts +90 -0
  123. package/build/adapters/qwen-code/usage.js +222 -0
  124. package/build/adapters/types.d.ts +360 -0
  125. package/build/adapters/types.js +118 -0
  126. package/build/adapters/vscode-copilot/config.d.ts +8 -0
  127. package/build/adapters/vscode-copilot/config.js +8 -0
  128. package/build/adapters/vscode-copilot/hooks.d.ts +71 -0
  129. package/build/adapters/vscode-copilot/hooks.js +98 -0
  130. package/build/adapters/vscode-copilot/index.d.ts +32 -0
  131. package/build/adapters/vscode-copilot/index.js +222 -0
  132. package/build/adapters/zed/index.d.ts +40 -0
  133. package/build/adapters/zed/index.js +163 -0
  134. package/build/cli.d.ts +34 -0
  135. package/build/cli.js +1828 -0
  136. package/build/db-base.d.ts +250 -0
  137. package/build/db-base.js +756 -0
  138. package/build/executor.d.ts +72 -0
  139. package/build/executor.js +678 -0
  140. package/build/exit-classify.d.ts +19 -0
  141. package/build/exit-classify.js +12 -0
  142. package/build/fetch/blocks.d.ts +145 -0
  143. package/build/fetch/blocks.js +244 -0
  144. package/build/fetch/extract.d.ts +68 -0
  145. package/build/fetch/extract.js +123 -0
  146. package/build/fetch/page-store.d.ts +66 -0
  147. package/build/fetch/page-store.js +174 -0
  148. package/build/fetch-cache.d.ts +13 -0
  149. package/build/fetch-cache.js +15 -0
  150. package/build/lifecycle.d.ts +124 -0
  151. package/build/lifecycle.js +278 -0
  152. package/build/package-identity.d.ts +26 -0
  153. package/build/package-identity.js +28 -0
  154. package/build/runPool.d.ts +36 -0
  155. package/build/runPool.js +51 -0
  156. package/build/runtime.d.ts +71 -0
  157. package/build/runtime.js +659 -0
  158. package/build/search/auto-memory.d.ts +47 -0
  159. package/build/search/auto-memory.js +170 -0
  160. package/build/search/ctx-search-schema.d.ts +90 -0
  161. package/build/search/ctx-search-schema.js +135 -0
  162. package/build/search/flood-guard.d.ts +57 -0
  163. package/build/search/flood-guard.js +80 -0
  164. package/build/search/unified.d.ts +56 -0
  165. package/build/search/unified.js +104 -0
  166. package/build/security.d.ts +206 -0
  167. package/build/security.js +780 -0
  168. package/build/server.d.ts +240 -0
  169. package/build/server.js +5034 -0
  170. package/build/session/analytics.d.ts +773 -0
  171. package/build/session/analytics.js +2420 -0
  172. package/build/session/db.d.ts +468 -0
  173. package/build/session/db.js +1330 -0
  174. package/build/session/error-classifier.d.ts +87 -0
  175. package/build/session/error-classifier.js +303 -0
  176. package/build/session/event-emit.d.ts +48 -0
  177. package/build/session/event-emit.js +101 -0
  178. package/build/session/extract.d.ts +333 -0
  179. package/build/session/extract.js +2688 -0
  180. package/build/session/model-prices.json +429 -0
  181. package/build/session/persist-tool-calls.d.ts +54 -0
  182. package/build/session/persist-tool-calls.js +105 -0
  183. package/build/session/pricing.d.ts +64 -0
  184. package/build/session/pricing.js +151 -0
  185. package/build/session/project-attribution.d.ts +73 -0
  186. package/build/session/project-attribution.js +245 -0
  187. package/build/session/purge.d.ts +138 -0
  188. package/build/session/purge.js +240 -0
  189. package/build/session/retrieval-marker.d.ts +39 -0
  190. package/build/session/retrieval-marker.js +65 -0
  191. package/build/session/snapshot.d.ts +46 -0
  192. package/build/session/snapshot.js +532 -0
  193. package/build/store-directory.d.ts +56 -0
  194. package/build/store-directory.js +254 -0
  195. package/build/store.d.ts +147 -0
  196. package/build/store.js +1714 -0
  197. package/build/truncate.d.ts +57 -0
  198. package/build/truncate.js +142 -0
  199. package/build/types.d.ts +117 -0
  200. package/build/types.js +20 -0
  201. package/build/util/claude-config.d.ts +32 -0
  202. package/build/util/claude-config.js +84 -0
  203. package/build/util/hook-config.d.ts +27 -0
  204. package/build/util/hook-config.js +76 -0
  205. package/build/util/jsonc.d.ts +14 -0
  206. package/build/util/jsonc.js +104 -0
  207. package/build/util/plugin-cache-integrity.d.ts +51 -0
  208. package/build/util/plugin-cache-integrity.js +146 -0
  209. package/build/util/project-dir.d.ts +149 -0
  210. package/build/util/project-dir.js +340 -0
  211. package/build/util/sibling-mcp.d.ts +79 -0
  212. package/build/util/sibling-mcp.js +181 -0
  213. package/cli.bundle.mjs +1495 -0
  214. package/configs/antigravity/GEMINI.md +68 -0
  215. package/configs/antigravity/mcp_config.json +7 -0
  216. package/configs/antigravity-cli/hooks/hooks.json +37 -0
  217. package/configs/antigravity-cli/hooks.json +37 -0
  218. package/configs/antigravity-cli/mcp_config.json +10 -0
  219. package/configs/antigravity-cli/plugin.json +14 -0
  220. package/configs/antigravity-cli/rules/context-mode.md +77 -0
  221. package/configs/antigravity-cli/skills/context-mode/SKILL.md +77 -0
  222. package/configs/claude-code/CLAUDE.md +91 -0
  223. package/configs/codex/AGENTS.md +99 -0
  224. package/configs/codex/config.toml +8 -0
  225. package/configs/codex/hooks.json +47 -0
  226. package/configs/copilot-cli/.github/plugin/plugin.json +23 -0
  227. package/configs/copilot-cli/.mcp.json +12 -0
  228. package/configs/copilot-cli/README.md +47 -0
  229. package/configs/copilot-cli/hooks.json +41 -0
  230. package/configs/copilot-cli/skills/context-mode/SKILL.md +38 -0
  231. package/configs/cursor/context-mode.mdc +76 -0
  232. package/configs/cursor/hooks.json +21 -0
  233. package/configs/cursor/mcp.json +7 -0
  234. package/configs/gemini-cli/GEMINI.md +88 -0
  235. package/configs/gemini-cli/mcp.json +7 -0
  236. package/configs/gemini-cli/settings.json +60 -0
  237. package/configs/jetbrains-copilot/copilot-instructions.md +80 -0
  238. package/configs/jetbrains-copilot/hooks.json +16 -0
  239. package/configs/jetbrains-copilot/mcp.json +7 -0
  240. package/configs/kilo/AGENTS.md +84 -0
  241. package/configs/kilo/kilo.json +6 -0
  242. package/configs/kimi/hooks.json +54 -0
  243. package/configs/kiro/KIRO.md +84 -0
  244. package/configs/kiro/agent.json +18 -0
  245. package/configs/kiro/mcp.json +7 -0
  246. package/configs/omp/SYSTEM.md +85 -0
  247. package/configs/omp/mcp.json +7 -0
  248. package/configs/openclaw/AGENTS.md +87 -0
  249. package/configs/openclaw/openclaw.json +13 -0
  250. package/configs/opencode/AGENTS.md +84 -0
  251. package/configs/opencode/opencode.json +6 -0
  252. package/configs/pi/AGENTS.md +3 -0
  253. package/configs/qwen-code/QWEN.md +91 -0
  254. package/configs/vscode-copilot/copilot-instructions.md +80 -0
  255. package/configs/vscode-copilot/hooks.json +16 -0
  256. package/configs/vscode-copilot/mcp.json +7 -0
  257. package/configs/zed/AGENTS.md +68 -0
  258. package/hooks/antigravity-cli/payload.mjs +98 -0
  259. package/hooks/antigravity-cli/posttooluse.mjs +138 -0
  260. package/hooks/antigravity-cli/pretooluse.mjs +78 -0
  261. package/hooks/antigravity-cli/stop.mjs +58 -0
  262. package/hooks/auto-injection.mjs +102 -0
  263. package/hooks/cache-heal-utils.mjs +379 -0
  264. package/hooks/codex/platform.mjs +1 -0
  265. package/hooks/codex/posttooluse.mjs +66 -0
  266. package/hooks/codex/precompact.mjs +70 -0
  267. package/hooks/codex/pretooluse.mjs +42 -0
  268. package/hooks/codex/sessionstart.mjs +121 -0
  269. package/hooks/codex/stop.mjs +138 -0
  270. package/hooks/codex/userpromptsubmit.mjs +75 -0
  271. package/hooks/copilot-cli/posttooluse.mjs +79 -0
  272. package/hooks/copilot-cli/precompact.mjs +66 -0
  273. package/hooks/copilot-cli/pretooluse.mjs +41 -0
  274. package/hooks/copilot-cli/sessionstart.mjs +121 -0
  275. package/hooks/copilot-cli/stop.mjs +59 -0
  276. package/hooks/copilot-cli/userpromptsubmit.mjs +77 -0
  277. package/hooks/core/codex-caps.mjs +112 -0
  278. package/hooks/core/formatters.mjs +356 -0
  279. package/hooks/core/mcp-ready.mjs +109 -0
  280. package/hooks/core/platform-detect.mjs +49 -0
  281. package/hooks/core/routing.mjs +1050 -0
  282. package/hooks/core/stdin.mjs +90 -0
  283. package/hooks/core/tool-naming.mjs +57 -0
  284. package/hooks/cursor/afteragentresponse.mjs +74 -0
  285. package/hooks/cursor/hooks.json +31 -0
  286. package/hooks/cursor/posttooluse.mjs +72 -0
  287. package/hooks/cursor/pretooluse.mjs +26 -0
  288. package/hooks/cursor/sessionstart.mjs +97 -0
  289. package/hooks/cursor/stop.mjs +48 -0
  290. package/hooks/ensure-deps.mjs +254 -0
  291. package/hooks/formatters/claude-code.mjs +113 -0
  292. package/hooks/formatters/cursor.mjs +37 -0
  293. package/hooks/formatters/gemini-cli.mjs +55 -0
  294. package/hooks/formatters/vscode-copilot.mjs +55 -0
  295. package/hooks/gemini-cli/aftermodel.mjs +70 -0
  296. package/hooks/gemini-cli/aftertool.mjs +61 -0
  297. package/hooks/gemini-cli/beforeagent.mjs +99 -0
  298. package/hooks/gemini-cli/beforetool.mjs +27 -0
  299. package/hooks/gemini-cli/precompress.mjs +55 -0
  300. package/hooks/gemini-cli/sessionstart.mjs +137 -0
  301. package/hooks/heal-partial-install.mjs +712 -0
  302. package/hooks/hooks.json +143 -0
  303. package/hooks/jetbrains-copilot/posttooluse.mjs +61 -0
  304. package/hooks/jetbrains-copilot/precompact.mjs +55 -0
  305. package/hooks/jetbrains-copilot/pretooluse.mjs +27 -0
  306. package/hooks/jetbrains-copilot/sessionstart.mjs +124 -0
  307. package/hooks/kimi/platform.mjs +1 -0
  308. package/hooks/kimi/posttooluse.mjs +72 -0
  309. package/hooks/kimi/precompact.mjs +80 -0
  310. package/hooks/kimi/pretooluse.mjs +42 -0
  311. package/hooks/kimi/sessionend.mjs +61 -0
  312. package/hooks/kimi/sessionstart.mjs +113 -0
  313. package/hooks/kimi/stop.mjs +132 -0
  314. package/hooks/kimi/userpromptsubmit.mjs +90 -0
  315. package/hooks/kiro/agentspawn.mjs +97 -0
  316. package/hooks/kiro/posttooluse.mjs +51 -0
  317. package/hooks/kiro/pretooluse.mjs +64 -0
  318. package/hooks/kiro/userpromptsubmit.mjs +88 -0
  319. package/hooks/normalize-hooks.mjs +323 -0
  320. package/hooks/platform-bridge.mjs +340 -0
  321. package/hooks/posttooluse.mjs +225 -0
  322. package/hooks/precompact.mjs +100 -0
  323. package/hooks/pretooluse.mjs +227 -0
  324. package/hooks/qwen-code/platform.mjs +1 -0
  325. package/hooks/qwen-code/stop.mjs +168 -0
  326. package/hooks/routing-block.mjs +105 -0
  327. package/hooks/run-hook.mjs +95 -0
  328. package/hooks/security.bundle.mjs +2 -0
  329. package/hooks/session-attribution.bundle.mjs +1 -0
  330. package/hooks/session-db.bundle.mjs +145 -0
  331. package/hooks/session-directive.mjs +520 -0
  332. package/hooks/session-extract.bundle.mjs +3 -0
  333. package/hooks/session-helpers.mjs +428 -0
  334. package/hooks/session-loaders.mjs +448 -0
  335. package/hooks/session-snapshot.bundle.mjs +32 -0
  336. package/hooks/sessionstart.mjs +464 -0
  337. package/hooks/stop.mjs +82 -0
  338. package/hooks/suppress-stderr.mjs +25 -0
  339. package/hooks/userpromptsubmit.mjs +108 -0
  340. package/hooks/vscode-copilot/posttooluse.mjs +61 -0
  341. package/hooks/vscode-copilot/precompact.mjs +55 -0
  342. package/hooks/vscode-copilot/pretooluse.mjs +27 -0
  343. package/hooks/vscode-copilot/sessionstart.mjs +129 -0
  344. package/openclaw.plugin.json +38 -0
  345. package/package.json +132 -0
  346. package/scripts/heal-better-sqlite3.mjs +430 -0
  347. package/scripts/heal-installed-plugins.mjs +635 -0
  348. package/scripts/plugin-cache-integrity.mjs +248 -0
  349. package/scripts/postinstall.mjs +397 -0
  350. package/server.bundle.mjs +1421 -0
  351. package/server.js +5 -0
  352. package/skills/.ignore +7 -0
  353. package/skills/context-mode/SKILL.md +300 -0
  354. package/skills/context-mode/references/anti-patterns.md +283 -0
  355. package/skills/context-mode/references/patterns-javascript.md +298 -0
  356. package/skills/context-mode/references/patterns-python.md +304 -0
  357. package/skills/context-mode/references/patterns-shell.md +277 -0
  358. package/skills/ctx-doctor/SKILL.md +22 -0
  359. package/skills/ctx-index/SKILL.md +46 -0
  360. package/skills/ctx-insight/SKILL.md +24 -0
  361. package/skills/ctx-purge/SKILL.md +49 -0
  362. package/skills/ctx-search/SKILL.md +35 -0
  363. package/skills/ctx-stats/SKILL.md +26 -0
  364. package/skills/ctx-upgrade/SKILL.md +31 -0
  365. package/start.mjs +616 -0
@@ -0,0 +1,468 @@
1
+ /**
2
+ * SessionDB — Persistent per-project SQLite database for session events.
3
+ *
4
+ * Stores raw events captured by hooks during a Claude Code session,
5
+ * session metadata, and resume snapshots. Extends SQLiteBase from
6
+ * the shared package.
7
+ */
8
+ import { SQLiteBase } from "../db-base.js";
9
+ import type { SessionEvent } from "../types.js";
10
+ import type { ProjectAttribution } from "./project-attribution.js";
11
+ declare const STORAGE_ROOT_ENV: "CONTEXT_MODE_DIR";
12
+ export type StorageDirectoryKind = "session" | "content" | "stats";
13
+ export type StorageOverrideEnvVar = typeof STORAGE_ROOT_ENV;
14
+ export type StorageDirectorySource = "default" | "override";
15
+ export type IgnoredStorageOverrideReason = "empty";
16
+ export interface ResolvedStorageDir {
17
+ kind: StorageDirectoryKind;
18
+ path: string;
19
+ envVar: StorageOverrideEnvVar | null;
20
+ source: StorageDirectorySource;
21
+ ignoredEnvVar?: StorageOverrideEnvVar;
22
+ ignoredReason?: IgnoredStorageOverrideReason;
23
+ }
24
+ export declare class StorageDirectoryError extends Error {
25
+ readonly kind: StorageDirectoryKind;
26
+ readonly path: string;
27
+ readonly overrideEnvVar: StorageOverrideEnvVar;
28
+ readonly ignoredEnvVar?: StorageOverrideEnvVar;
29
+ readonly ignoredReason?: IgnoredStorageOverrideReason;
30
+ constructor(kind: StorageDirectoryKind, path: string, overrideEnvVar?: StorageOverrideEnvVar, cause?: unknown, message?: string, metadata?: Pick<ResolvedStorageDir, "ignoredEnvVar" | "ignoredReason">);
31
+ }
32
+ export interface DefaultSessionDirOptions {
33
+ configDir: string;
34
+ configDirEnv?: string;
35
+ legacySessionDirEnv?: string;
36
+ onLegacySessionDir?: (envVar: string, dir: string) => void;
37
+ env?: NodeJS.ProcessEnv;
38
+ }
39
+ export declare function resolveDefaultSessionDir(opts: DefaultSessionDirOptions): string;
40
+ export declare function resolveSessionStorageDir(getDefaultDir: () => string): ResolvedStorageDir;
41
+ export declare function resolveContentStorageDir(getSessionDir: () => string): ResolvedStorageDir;
42
+ export declare function resolveStatsStorageDir(getDefaultSessionDir: () => string): ResolvedStorageDir;
43
+ export declare function formatStorageDirectoryError(err: StorageDirectoryError): string;
44
+ export declare function describeStorageDirectorySource(dir: ResolvedStorageDir): string;
45
+ export declare function clearStorageDirectoryCheckCacheForTests(): void;
46
+ export declare function ensureWritableStorageDir(dir: ResolvedStorageDir): string;
47
+ export declare function normalizeWorktreePath(path: string): string;
48
+ export declare function getWorktreeSuffix(projectDir?: string): string;
49
+ export declare function _resetWorktreeSuffixCacheForTests(): void;
50
+ /**
51
+ * Hash a project directory the way the deployed code (≤ v1.0.111) did:
52
+ * normalize slashes only, preserve raw casing. Kept exported so the
53
+ * migration helper can locate pre-fix DB files for one-shot rename.
54
+ *
55
+ * Do NOT call this for new code paths — use {@link hashProjectDirCanonical}.
56
+ */
57
+ export declare function hashProjectDirLegacy(projectDir: string): string;
58
+ /**
59
+ * Hash a project directory case-stably. On case-insensitive filesystems
60
+ * (macOS HFS+/APFS, Windows NTFS) the path is lowercased so that
61
+ * `/Users/Mert/proj` and `/users/mert/proj` resolve to the same DB file.
62
+ * On Linux (case-sensitive) casing is preserved.
63
+ *
64
+ * Used as the base half of the SessionDB filename:
65
+ * <baseHash><worktreeSuffix>.db
66
+ */
67
+ export declare function hashProjectDirCanonical(projectDir: string): string;
68
+ /**
69
+ * Resolve the per-project FTS5 content store DB path, performing a one-shot
70
+ * migration from a legacy raw-casing filename to the canonical one when only
71
+ * the legacy file (with optional `-wal` / `-shm` SQLite sidecars) exists.
72
+ *
73
+ * Same dual-hash safety contract as {@link resolveSessionDbPath}:
74
+ * - Linux: canonical hash equals legacy hash → no migration attempted.
75
+ * - Mac/Win: rename legacy → canonical when canonical missing.
76
+ * - Both exist: leave legacy alone (data-loss safety). Caller picks
77
+ * canonical; reconciliation is a manual operation.
78
+ *
79
+ * Differs from `resolveSessionDbPath` in two ways:
80
+ * 1. No worktree suffix — the FTS5 store is per-project, not per-worktree.
81
+ * 2. The `-wal` / `-shm` sidecars travel with the main `.db` during
82
+ * migration so an active SQLite WAL checkpoint is not stranded behind.
83
+ */
84
+ export declare function resolveContentStorePath(opts: {
85
+ projectDir: string;
86
+ contentDir: string;
87
+ }): string;
88
+ /**
89
+ * Resolve the SessionDB file path for a project, performing a one-shot
90
+ * migration from legacy raw-casing filenames to canonical ones when only
91
+ * the legacy file exists.
92
+ *
93
+ * Migration rules:
94
+ * - Linux: `legacyHash === canonicalHash` so the resolver short-circuits;
95
+ * no migration ever runs (case-sensitive FS, never any drift).
96
+ * - macOS / Windows: if the canonical path does not exist but a legacy
97
+ * path does, rename in place. This preserves the user's session
98
+ * history across the casing-fix upgrade.
99
+ * - When BOTH paths exist (rare — usually only if the user previously
100
+ * ran two terminals with different casing) the legacy file is left
101
+ * UNTOUCHED. The canonical path wins; manual reconciliation needed.
102
+ * Avoiding the rename here is the data-loss safety guarantee.
103
+ *
104
+ * Worktree separation is preserved: each call only ever migrates the ONE
105
+ * legacy file matching THIS projectDir's hash. Different worktrees have
106
+ * different physical paths → different hashes → different DB files; the
107
+ * migration cannot collapse worktrees.
108
+ */
109
+ export declare function resolveSessionDbPath(opts: {
110
+ projectDir: string;
111
+ sessionsDir: string;
112
+ }): string;
113
+ /**
114
+ * Generalized resolver: same case-fold + one-shot legacy-rename semantics
115
+ * as {@link resolveSessionDbPath}, parameterised on the file extension so
116
+ * the SAME logic powers `.db`, `-events.md`, and `.cleanup` paths.
117
+ *
118
+ * Source of truth for hooks: `hooks/session-helpers.mjs` imports this
119
+ * function from the bundled output (`hooks/session-db.bundle.mjs`) so the
120
+ * JS hooks and the TS server can never drift again on hash, suffix, or
121
+ * migration policy.
122
+ *
123
+ * Optional `suffix` lets the hook layer inject its cross-process cached
124
+ * worktree suffix (the marker-file optimisation that amortises the
125
+ * `git worktree list` cost across hook forks). When omitted, falls back
126
+ * to {@link getWorktreeSuffix} which uses an in-process cache only.
127
+ */
128
+ export declare function resolveSessionPath(opts: {
129
+ projectDir: string;
130
+ sessionsDir: string;
131
+ ext: string;
132
+ suffix?: string;
133
+ }): string;
134
+ /** A stored event row from the session_events table. */
135
+ export interface StoredEvent {
136
+ id: number;
137
+ session_id: string;
138
+ type: string;
139
+ category: string;
140
+ priority: number;
141
+ data: string;
142
+ project_dir: string;
143
+ attribution_source: string;
144
+ attribution_confidence: number;
145
+ bytes_avoided: number;
146
+ bytes_returned: number;
147
+ source_hook: string;
148
+ created_at: string;
149
+ data_hash: string;
150
+ }
151
+ /** Optional per-event byte accounting passed to {@link SessionDB.insertEvent}. */
152
+ export interface EventBytes {
153
+ /** Bytes context-mode prevented from entering the model context window. */
154
+ bytesAvoided?: number;
155
+ /** Bytes context-mode actually returned to the model. */
156
+ bytesReturned?: number;
157
+ }
158
+ /** Session metadata row from the session_meta table. */
159
+ export interface SessionMeta {
160
+ session_id: string;
161
+ project_dir: string;
162
+ started_at: string;
163
+ last_event_at: string | null;
164
+ event_count: number;
165
+ compact_count: number;
166
+ }
167
+ /**
168
+ * Session rollup snapshot (seed-parity aggregate).
169
+ *
170
+ * 12 fields that mirror the platform's `session_summary` + `session_metadata`
171
+ * stamps from src/routes/seed.ts. Each outgoing canonical event carries
172
+ * this snapshot computed at the moment of forward so the analytics engine
173
+ * can run its SUM/AVG/MAX rollups across per-event rows.
174
+ */
175
+ export interface SessionRollup {
176
+ tool_calls: number;
177
+ errors: number;
178
+ unique_tools: number;
179
+ unique_files: number;
180
+ max_file_edits: number;
181
+ has_commit: 0 | 1;
182
+ commit_message: string;
183
+ edit_test_cycles: number;
184
+ duration_min: number;
185
+ compact_count: number;
186
+ sources_indexed: number;
187
+ total_chunks: number;
188
+ search_queries: number;
189
+ }
190
+ /** Resume snapshot row from the session_resume table. */
191
+ export interface ResumeRow {
192
+ snapshot: string;
193
+ event_count: number;
194
+ consumed: number;
195
+ }
196
+ /** Aggregated tool-call stats for a single session. */
197
+ export interface ToolCallStats {
198
+ totalCalls: number;
199
+ totalBytesReturned: number;
200
+ byTool: Record<string, {
201
+ calls: number;
202
+ bytesReturned: number;
203
+ }>;
204
+ }
205
+ /**
206
+ * Apply any missing post-v1.0.130 `session_events` columns to an already-
207
+ * open writable database handle. Idempotent — each ALTER is guarded by a
208
+ * PRAGMA table_xinfo check, and the project_dir index is created only
209
+ * when a migration actually ran. Returns true if any column was added.
210
+ *
211
+ * Used by both the SessionDB constructor (for the active DB) and the
212
+ * analytics aggregator (for the 100+ historical DBs that never get
213
+ * opened through SessionDB). ADR-0001 compatible: no EXCLUSIVE pragma,
214
+ * no acquireDbLock — relies on the SQLite busy_timeout + WAL semantics
215
+ * already provided by SQLiteBase.
216
+ */
217
+ export declare function applyMissingSessionEventsColumns(db: {
218
+ pragma: (q: string) => Array<{
219
+ name: string;
220
+ }>;
221
+ exec: (sql: string) => void;
222
+ }): boolean;
223
+ /**
224
+ * Open a session DB file briefly, run any missing schema migrations,
225
+ * and close. Best-effort: missing tables, file-locks, corrupt files,
226
+ * and any DatabaseCtor error are swallowed silently — the caller
227
+ * (analytics aggregator) handles the readonly query that follows and
228
+ * will skip the DB if it remains unreadable.
229
+ *
230
+ * Lazy migration entry point for the analytics aggregator, which would
231
+ * otherwise read 100+ historical DBs with the old (pre-v1.0.130) schema
232
+ * and lose every signal (not just bytes_avoided) because the SELECT
233
+ * statement references columns that don't exist on legacy schemas.
234
+ *
235
+ * Two open/close cycles in the worst case (one readonly probe to detect
236
+ * legacy schema, one writable to migrate). For already-migrated DBs
237
+ * (the common case after first read), this opens writable once and
238
+ * exits without writing — cheaper than always-writable.
239
+ */
240
+ export declare function ensureSessionEventsSchema(dbPath: string, DatabaseCtor: new (path: string, opts?: {
241
+ readonly?: boolean;
242
+ }) => {
243
+ pragma: (q: string) => Array<{
244
+ name: string;
245
+ }>;
246
+ exec: (sql: string) => void;
247
+ close: () => void;
248
+ }): void;
249
+ export declare class SessionDB extends SQLiteBase {
250
+ /**
251
+ * Cached prepared statements. Stored in a Map to avoid the JS private-field
252
+ * inheritance issue where `#field` declarations in a subclass are not
253
+ * accessible during base-class constructor calls.
254
+ *
255
+ * `declare` ensures TypeScript does NOT emit a field initializer at runtime.
256
+ * Without `declare`, even `stmts!: Map<...>` emits `this.stmts = undefined`
257
+ * after super() returns, wiping what prepareStatements() stored. The Map
258
+ * is created inside prepareStatements() instead.
259
+ */
260
+ private stmts;
261
+ constructor(opts?: {
262
+ dbPath?: string;
263
+ });
264
+ /** Shorthand to retrieve a cached statement. */
265
+ private stmt;
266
+ protected initSchema(): void;
267
+ protected prepareStatements(): void;
268
+ /**
269
+ * Insert a session event with deduplication and FIFO eviction.
270
+ *
271
+ * Deduplication: skips if the same type + data_hash appears in the
272
+ * last DEDUP_WINDOW events for this session.
273
+ *
274
+ * Eviction: if session exceeds MAX_EVENTS_PER_SESSION, evicts the
275
+ * lowest-priority (then oldest) event.
276
+ */
277
+ insertEvent(sessionId: string, event: Omit<SessionEvent, "data_hash"> & {
278
+ data_hash?: string;
279
+ }, sourceHook?: string, attribution?: Partial<ProjectAttribution>, bytes?: EventBytes): void;
280
+ /**
281
+ * Bulk-insert N events in a SINGLE transaction.
282
+ *
283
+ * PostToolUse hooks emit 5–15 events per tool call. Calling insertEvent()
284
+ * in a loop runs N transactions = N WAL commits = N fsync candidates,
285
+ * which is painful on Windows NTFS where commit latency dominates.
286
+ * One transaction = one commit, dedup/evict checks reuse cached statements.
287
+ *
288
+ * Cross-platform: uses the same WAL-mode transaction primitive as
289
+ * insertEvent — behavior identical on macOS / Linux / Windows.
290
+ */
291
+ bulkInsertEvents(sessionId: string, events: SessionEvent[], sourceHook?: string, attributions?: Array<Partial<ProjectAttribution> | undefined>, bytesList?: Array<EventBytes | undefined>): void;
292
+ /**
293
+ * Retrieve events for a session with optional filtering.
294
+ */
295
+ getEvents(sessionId: string, opts?: {
296
+ type?: string;
297
+ minPriority?: number;
298
+ limit?: number;
299
+ }): StoredEvent[];
300
+ /**
301
+ * Get the total event count for a session.
302
+ */
303
+ getEventCount(sessionId: string): number;
304
+ /**
305
+ * Aggregate per-event byte accounting for a session.
306
+ *
307
+ * Returns the total bytes context-mode kept OUT of the model context
308
+ * window (`bytesAvoided`) and the total it actually returned to the
309
+ * model (`bytesReturned`). Both default to 0 for unknown sessions.
310
+ *
311
+ * Used by the Insight dashboard to render the "saved vs returned"
312
+ * panel without scanning every event row in JS.
313
+ */
314
+ getEventBytesSummary(sessionId: string): {
315
+ bytesAvoided: number;
316
+ bytesReturned: number;
317
+ };
318
+ /**
319
+ * Return the most recently attributed project dir for a session.
320
+ */
321
+ getLatestAttributedProjectDir(sessionId: string): string | null;
322
+ /**
323
+ * Look up the project_dir from session_meta as a last-resort fallback
324
+ * for event attribution. Prevents project_dir='' orphans when the caller
325
+ * (e.g. pi adapter) omits the attribution parameter.
326
+ */
327
+ _getSessionProjectDir(sessionId: string): string;
328
+ /**
329
+ * Search events by text query scoped to a project directory.
330
+ *
331
+ * Performs a case-insensitive LIKE search across the `data` and `category`
332
+ * columns. An optional `source` parameter filters by exact category match.
333
+ * Returns results ordered by monotonic id (chronological).
334
+ *
335
+ * Best-effort: returns empty array on any error.
336
+ */
337
+ searchEvents(query: string, limit: number, projectDir: string, source?: string): Array<{
338
+ id: number;
339
+ session_id: string;
340
+ category: string;
341
+ type: string;
342
+ data: string;
343
+ created_at: string;
344
+ }>;
345
+ /**
346
+ * Return the distinct list of session ids whose events were attributed
347
+ * to a given `project_dir`. Powers the ctx_search `project:` filter
348
+ * (#737) via the 2-step IN-clause strategy — ATTACH DATABASE is avoided
349
+ * because SQLite's WAL + ATTACH combination has known correctness
350
+ * trade-offs flagged in the upstream docs.
351
+ *
352
+ * Backed by the `idx_session_events_project(session_id, project_dir)`
353
+ * composite index, so 1000-session lookups complete in single-digit
354
+ * milliseconds. Best-effort: returns `[]` on any error.
355
+ */
356
+ getSessionIdsForProject(projectDir: string): string[];
357
+ /**
358
+ * Ensure a session metadata entry exists. Idempotent (INSERT OR IGNORE).
359
+ * `projectDir` is the session origin directory, not per-event attribution.
360
+ */
361
+ ensureSession(sessionId: string, projectDir: string): void;
362
+ /**
363
+ * Get session statistics/metadata.
364
+ */
365
+ getSessionStats(sessionId: string): SessionMeta | null;
366
+ /**
367
+ * Session rollup snapshot — 12 aggregate fields the analytics platform
368
+ * stamps onto every outgoing event row (seed.ts shape parity).
369
+ *
370
+ * Called from session-loaders BEFORE `maybeForward`; the snapshot is
371
+ * computed against the LOCAL SessionDB and threaded into the canonical
372
+ * event so the platform-side Zod schema receives the rich shape without
373
+ * the bridge ever hand-mapping fields (PRD §5.4 ABI passthrough).
374
+ *
375
+ * Returns zeroed defaults for unknown sessions — callers MUST tolerate
376
+ * a snapshot from an empty session (first event into a fresh DB).
377
+ */
378
+ getSessionRollup(sessionId: string): SessionRollup;
379
+ /**
380
+ * Increment the compact_count for a session (tracks snapshot rebuilds).
381
+ */
382
+ incrementCompactCount(sessionId: string): void;
383
+ /**
384
+ * Read the per-session usage high-water cursor — the uuid of the last
385
+ * assistant turn already emitted by the Stop hook's main-turn capture.
386
+ * Returns null when unset (first Stop) or the session row is absent.
387
+ */
388
+ getUsageCursor(sessionId: string): string | null;
389
+ /**
390
+ * Advance the per-session usage high-water cursor to `uuid`. No-op when the
391
+ * session_meta row does not exist yet (callers ensureSession first).
392
+ */
393
+ setUsageCursor(sessionId: string, uuid: string): void;
394
+ /**
395
+ * Upsert a resume snapshot for a session. Resets consumed flag on update.
396
+ */
397
+ upsertResume(sessionId: string, snapshot: string, eventCount?: number): void;
398
+ /**
399
+ * Retrieve the resume snapshot for a session.
400
+ */
401
+ getResume(sessionId: string): ResumeRow | null;
402
+ /**
403
+ * Mark the resume snapshot as consumed (already injected into conversation).
404
+ */
405
+ markResumeConsumed(sessionId: string): void;
406
+ /**
407
+ * Atomically claim the most recent unconsumed resume snapshot in this DB,
408
+ * EXCLUDING any row that belongs to `currentSessionId`.
409
+ *
410
+ * `SessionDB` is sharded per project (see `resolveSessionDbPath` — SHA-256
411
+ * of canonical project dir), so "this DB" already implies "this project".
412
+ * The atomic
413
+ * `UPDATE … RETURNING` ensures concurrent processes for the same project
414
+ * cannot both inject the same snapshot (Mickey / PR #376 race).
415
+ *
416
+ * The `currentSessionId` parameter prevents self-injection: when a session
417
+ * compacts mid-flight and produces its own row, that session's next chat
418
+ * turn must NOT claim that row back (wasted tokens AND it would consume
419
+ * the snapshot meant for the next fresh session).
420
+ *
421
+ * Pass an empty string to allow self-claim (legacy behaviour, only useful
422
+ * in tests or one-off harnesses).
423
+ *
424
+ * Returns null when no unconsumed snapshot exists for any other session.
425
+ */
426
+ claimLatestUnconsumedResume(currentSessionId: string): {
427
+ sessionId: string;
428
+ snapshot: string;
429
+ } | null;
430
+ /**
431
+ * Return the most recent session_id from session_meta, or null if none.
432
+ * Used by the runtime to attach persistent counters to the right session
433
+ * after a process restart.
434
+ */
435
+ getLatestSessionId(): string | null;
436
+ /**
437
+ * Increment the persistent tool-call counter for `tool` in `sessionId`.
438
+ * Adds `bytesReturned` to the cumulative total. Idempotent across
439
+ * SessionDB instances — counters survive process restart.
440
+ */
441
+ incrementToolCall(sessionId: string, tool: string, bytesReturned?: number): void;
442
+ /**
443
+ * Get aggregated tool-call stats for `sessionId`. Returns zero-stats
444
+ * when the session has no recorded calls.
445
+ */
446
+ getToolCallStats(sessionId: string): ToolCallStats;
447
+ /**
448
+ * Delete all data for a session (events, meta, resume).
449
+ */
450
+ deleteSession(sessionId: string): void;
451
+ /**
452
+ * Remove sessions older than maxAgeDays. Returns the count of deleted sessions.
453
+ */
454
+ cleanupOldSessions(maxAgeDays?: number): number;
455
+ /**
456
+ * Delete event rows whose session_id has no matching session_meta row.
457
+ *
458
+ * Orphaned events accumulate when meta rows were aged out by an older
459
+ * version of `cleanupOldSessions` but the matching events were left
460
+ * behind (or when callers wrote events without a meta upsert). The Kimi
461
+ * Code sessionstart hook calls this on every startup as a self-healing
462
+ * step; surfacing it as a SessionDB method keeps the SQL definition in
463
+ * one place instead of letting hook scripts reach through to
464
+ * `db.db.exec(...)` and re-encode schema knowledge in mjs files.
465
+ */
466
+ pruneOrphanedEvents(): number;
467
+ }
468
+ export {};