context-mode 1.0.168 → 2.0.0-next.5

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 (395) hide show
  1. package/.claude-plugin/marketplace.json +4 -22
  2. package/.claude-plugin/plugin.json +9 -24
  3. package/SHA256SUMS +31 -0
  4. package/claude-code/skills/ctx-doctor/SKILL.md +6 -0
  5. package/claude-code/skills/ctx-stats/SKILL.md +6 -0
  6. package/claude-code/skills/ctx-upgrade/SKILL.md +6 -0
  7. package/cli.mjs +6744 -0
  8. package/copilot/plugin.json +14 -0
  9. package/fixtures/hook-roundtrip.json +22 -0
  10. package/gemini-extension.json +14 -0
  11. package/hook.mjs +202 -0
  12. package/hooks/claude-code.json +50 -0
  13. package/hooks/codex.json +50 -0
  14. package/hooks/copilot-cli.json +33 -0
  15. package/hooks/hooks.json +16 -111
  16. package/hooks/kiro.json +69 -0
  17. package/hooks/qwen.json +50 -0
  18. package/hooks/vscode.json +40 -0
  19. package/hooks/zcode.json +53 -0
  20. package/opencode/plugin.js +22456 -0
  21. package/package.json +29 -114
  22. package/pi/index.js +50841 -0
  23. package/pi/skills/ctx-doctor/SKILL.md +6 -0
  24. package/pi/skills/ctx-stats/SKILL.md +6 -0
  25. package/pi/skills/ctx-upgrade/SKILL.md +6 -0
  26. package/qwen-extension.json +15 -0
  27. package/run.mjs +5633 -0
  28. package/search.mjs +5633 -0
  29. package/server.mjs +48198 -0
  30. package/skills/ctx-doctor/SKILL.md +3 -19
  31. package/skills/ctx-stats/SKILL.md +3 -23
  32. package/skills/ctx-upgrade/SKILL.md +3 -28
  33. package/.codex-plugin/hooks.json +0 -65
  34. package/.codex-plugin/mcp.json +0 -13
  35. package/.codex-plugin/plugin.json +0 -31
  36. package/.openclaw-plugin/index.ts +0 -12
  37. package/.openclaw-plugin/openclaw.plugin.json +0 -38
  38. package/.openclaw-plugin/package.json +0 -28
  39. package/LICENSE +0 -94
  40. package/README.md +0 -1619
  41. package/bin/statusline.mjs +0 -378
  42. package/build/adapters/antigravity/index.d.ts +0 -51
  43. package/build/adapters/antigravity/index.js +0 -169
  44. package/build/adapters/antigravity-cli/index.d.ts +0 -51
  45. package/build/adapters/antigravity-cli/index.js +0 -342
  46. package/build/adapters/base.d.ts +0 -92
  47. package/build/adapters/base.js +0 -135
  48. package/build/adapters/claude-code/config.d.ts +0 -8
  49. package/build/adapters/claude-code/config.js +0 -8
  50. package/build/adapters/claude-code/hooks.d.ts +0 -106
  51. package/build/adapters/claude-code/hooks.js +0 -183
  52. package/build/adapters/claude-code/index.d.ts +0 -80
  53. package/build/adapters/claude-code/index.js +0 -569
  54. package/build/adapters/claude-code-base.d.ts +0 -49
  55. package/build/adapters/claude-code-base.js +0 -113
  56. package/build/adapters/client-map.d.ts +0 -10
  57. package/build/adapters/client-map.js +0 -42
  58. package/build/adapters/codex/config.d.ts +0 -8
  59. package/build/adapters/codex/config.js +0 -8
  60. package/build/adapters/codex/hooks.d.ts +0 -55
  61. package/build/adapters/codex/hooks.js +0 -64
  62. package/build/adapters/codex/index.d.ts +0 -87
  63. package/build/adapters/codex/index.js +0 -992
  64. package/build/adapters/codex/paths.d.ts +0 -1
  65. package/build/adapters/codex/paths.js +0 -12
  66. package/build/adapters/codex/usage.d.ts +0 -107
  67. package/build/adapters/codex/usage.js +0 -227
  68. package/build/adapters/copilot-base.d.ts +0 -94
  69. package/build/adapters/copilot-base.js +0 -297
  70. package/build/adapters/copilot-cli/hooks.d.ts +0 -33
  71. package/build/adapters/copilot-cli/hooks.js +0 -64
  72. package/build/adapters/copilot-cli/index.d.ts +0 -48
  73. package/build/adapters/copilot-cli/index.js +0 -341
  74. package/build/adapters/cursor/config.d.ts +0 -4
  75. package/build/adapters/cursor/config.js +0 -4
  76. package/build/adapters/cursor/hooks.d.ts +0 -55
  77. package/build/adapters/cursor/hooks.js +0 -82
  78. package/build/adapters/cursor/index.d.ts +0 -64
  79. package/build/adapters/cursor/index.js +0 -517
  80. package/build/adapters/detect.d.ts +0 -136
  81. package/build/adapters/detect.js +0 -623
  82. package/build/adapters/gemini-cli/config.d.ts +0 -8
  83. package/build/adapters/gemini-cli/config.js +0 -8
  84. package/build/adapters/gemini-cli/hooks.d.ts +0 -83
  85. package/build/adapters/gemini-cli/hooks.js +0 -115
  86. package/build/adapters/gemini-cli/index.d.ts +0 -80
  87. package/build/adapters/gemini-cli/index.js +0 -483
  88. package/build/adapters/jetbrains-copilot/config.d.ts +0 -8
  89. package/build/adapters/jetbrains-copilot/config.js +0 -8
  90. package/build/adapters/jetbrains-copilot/hooks.d.ts +0 -59
  91. package/build/adapters/jetbrains-copilot/hooks.js +0 -87
  92. package/build/adapters/jetbrains-copilot/index.d.ts +0 -31
  93. package/build/adapters/jetbrains-copilot/index.js +0 -131
  94. package/build/adapters/kimi/config.d.ts +0 -8
  95. package/build/adapters/kimi/config.js +0 -8
  96. package/build/adapters/kimi/hooks.d.ts +0 -28
  97. package/build/adapters/kimi/hooks.js +0 -34
  98. package/build/adapters/kimi/index.d.ts +0 -66
  99. package/build/adapters/kimi/index.js +0 -537
  100. package/build/adapters/kimi/paths.d.ts +0 -21
  101. package/build/adapters/kimi/paths.js +0 -52
  102. package/build/adapters/kimi/usage.d.ts +0 -82
  103. package/build/adapters/kimi/usage.js +0 -217
  104. package/build/adapters/kiro/hooks.d.ts +0 -61
  105. package/build/adapters/kiro/hooks.js +0 -94
  106. package/build/adapters/kiro/index.d.ts +0 -61
  107. package/build/adapters/kiro/index.js +0 -301
  108. package/build/adapters/omp/index.d.ts +0 -65
  109. package/build/adapters/omp/index.js +0 -182
  110. package/build/adapters/omp/plugin.d.ts +0 -81
  111. package/build/adapters/omp/plugin.js +0 -331
  112. package/build/adapters/omp/usage.d.ts +0 -49
  113. package/build/adapters/omp/usage.js +0 -110
  114. package/build/adapters/openclaw/config.d.ts +0 -8
  115. package/build/adapters/openclaw/config.js +0 -8
  116. package/build/adapters/openclaw/hooks.d.ts +0 -50
  117. package/build/adapters/openclaw/hooks.js +0 -61
  118. package/build/adapters/openclaw/index.d.ts +0 -74
  119. package/build/adapters/openclaw/index.js +0 -439
  120. package/build/adapters/openclaw/mcp-tools.d.ts +0 -54
  121. package/build/adapters/openclaw/mcp-tools.js +0 -207
  122. package/build/adapters/openclaw/plugin.d.ts +0 -141
  123. package/build/adapters/openclaw/plugin.js +0 -818
  124. package/build/adapters/openclaw/session-db.d.ts +0 -55
  125. package/build/adapters/openclaw/session-db.js +0 -88
  126. package/build/adapters/openclaw/usage.d.ts +0 -34
  127. package/build/adapters/openclaw/usage.js +0 -52
  128. package/build/adapters/openclaw/workspace-router.d.ts +0 -29
  129. package/build/adapters/openclaw/workspace-router.js +0 -64
  130. package/build/adapters/opencode/config.d.ts +0 -8
  131. package/build/adapters/opencode/config.js +0 -8
  132. package/build/adapters/opencode/hooks.d.ts +0 -38
  133. package/build/adapters/opencode/hooks.js +0 -50
  134. package/build/adapters/opencode/index.d.ts +0 -67
  135. package/build/adapters/opencode/index.js +0 -463
  136. package/build/adapters/opencode/plugin.d.ts +0 -184
  137. package/build/adapters/opencode/plugin.js +0 -558
  138. package/build/adapters/opencode/zod3tov4.d.ts +0 -1
  139. package/build/adapters/opencode/zod3tov4.js +0 -132
  140. package/build/adapters/pi/extension.d.ts +0 -81
  141. package/build/adapters/pi/extension.js +0 -861
  142. package/build/adapters/pi/index.d.ts +0 -57
  143. package/build/adapters/pi/index.js +0 -173
  144. package/build/adapters/pi/mcp-bridge.d.ts +0 -268
  145. package/build/adapters/pi/mcp-bridge.js +0 -894
  146. package/build/adapters/qwen-code/hooks.d.ts +0 -26
  147. package/build/adapters/qwen-code/hooks.js +0 -29
  148. package/build/adapters/qwen-code/index.d.ts +0 -40
  149. package/build/adapters/qwen-code/index.js +0 -361
  150. package/build/adapters/qwen-code/usage.d.ts +0 -90
  151. package/build/adapters/qwen-code/usage.js +0 -222
  152. package/build/adapters/types.d.ts +0 -360
  153. package/build/adapters/types.js +0 -118
  154. package/build/adapters/vscode-copilot/config.d.ts +0 -8
  155. package/build/adapters/vscode-copilot/config.js +0 -8
  156. package/build/adapters/vscode-copilot/hooks.d.ts +0 -71
  157. package/build/adapters/vscode-copilot/hooks.js +0 -98
  158. package/build/adapters/vscode-copilot/index.d.ts +0 -32
  159. package/build/adapters/vscode-copilot/index.js +0 -222
  160. package/build/adapters/zed/index.d.ts +0 -40
  161. package/build/adapters/zed/index.js +0 -163
  162. package/build/cache-heal.d.ts +0 -48
  163. package/build/cache-heal.js +0 -150
  164. package/build/cli.d.ts +0 -34
  165. package/build/cli.js +0 -1827
  166. package/build/concurrency/runPool.d.ts +0 -36
  167. package/build/concurrency/runPool.js +0 -51
  168. package/build/db-base.d.ts +0 -179
  169. package/build/db-base.js +0 -569
  170. package/build/executor.d.ts +0 -72
  171. package/build/executor.js +0 -678
  172. package/build/exit-classify.d.ts +0 -19
  173. package/build/exit-classify.js +0 -12
  174. package/build/fetch-cache.d.ts +0 -13
  175. package/build/fetch-cache.js +0 -15
  176. package/build/lifecycle.d.ts +0 -124
  177. package/build/lifecycle.js +0 -278
  178. package/build/openclaw/mcp-tools.d.ts +0 -54
  179. package/build/openclaw/mcp-tools.js +0 -198
  180. package/build/openclaw/workspace-router.d.ts +0 -29
  181. package/build/openclaw/workspace-router.js +0 -64
  182. package/build/openclaw-plugin.d.ts +0 -130
  183. package/build/openclaw-plugin.js +0 -626
  184. package/build/opencode-plugin.d.ts +0 -122
  185. package/build/opencode-plugin.js +0 -375
  186. package/build/pi-extension.d.ts +0 -14
  187. package/build/pi-extension.js +0 -451
  188. package/build/routing-block.d.ts +0 -8
  189. package/build/routing-block.js +0 -86
  190. package/build/runPool.d.ts +0 -36
  191. package/build/runPool.js +0 -51
  192. package/build/runtime.d.ts +0 -71
  193. package/build/runtime.js +0 -659
  194. package/build/search/auto-memory.d.ts +0 -47
  195. package/build/search/auto-memory.js +0 -170
  196. package/build/search/ctx-search-schema.d.ts +0 -90
  197. package/build/search/ctx-search-schema.js +0 -135
  198. package/build/search/flood-guard.d.ts +0 -57
  199. package/build/search/flood-guard.js +0 -80
  200. package/build/search/unified.d.ts +0 -56
  201. package/build/search/unified.js +0 -104
  202. package/build/security.d.ts +0 -206
  203. package/build/security.js +0 -780
  204. package/build/server.d.ts +0 -184
  205. package/build/server.js +0 -4542
  206. package/build/session/analytics.d.ts +0 -745
  207. package/build/session/analytics.js +0 -2369
  208. package/build/session/db.d.ts +0 -468
  209. package/build/session/db.js +0 -1308
  210. package/build/session/error-classifier.d.ts +0 -87
  211. package/build/session/error-classifier.js +0 -303
  212. package/build/session/event-emit.d.ts +0 -48
  213. package/build/session/event-emit.js +0 -101
  214. package/build/session/extract.d.ts +0 -333
  215. package/build/session/extract.js +0 -2688
  216. package/build/session/model-prices.json +0 -429
  217. package/build/session/persist-tool-calls.d.ts +0 -54
  218. package/build/session/persist-tool-calls.js +0 -105
  219. package/build/session/pricing.d.ts +0 -64
  220. package/build/session/pricing.js +0 -151
  221. package/build/session/project-attribution.d.ts +0 -73
  222. package/build/session/project-attribution.js +0 -245
  223. package/build/session/purge.d.ts +0 -138
  224. package/build/session/purge.js +0 -240
  225. package/build/session/snapshot.d.ts +0 -46
  226. package/build/session/snapshot.js +0 -532
  227. package/build/store-directory.d.ts +0 -56
  228. package/build/store-directory.js +0 -254
  229. package/build/store.d.ts +0 -147
  230. package/build/store.js +0 -1714
  231. package/build/tool-naming.d.ts +0 -4
  232. package/build/tool-naming.js +0 -24
  233. package/build/truncate.d.ts +0 -57
  234. package/build/truncate.js +0 -142
  235. package/build/types.d.ts +0 -117
  236. package/build/types.js +0 -20
  237. package/build/util/claude-config.d.ts +0 -32
  238. package/build/util/claude-config.js +0 -84
  239. package/build/util/hook-config.d.ts +0 -27
  240. package/build/util/hook-config.js +0 -76
  241. package/build/util/jsonc.d.ts +0 -14
  242. package/build/util/jsonc.js +0 -104
  243. package/build/util/plugin-cache-integrity.d.ts +0 -51
  244. package/build/util/plugin-cache-integrity.js +0 -146
  245. package/build/util/project-dir.d.ts +0 -149
  246. package/build/util/project-dir.js +0 -340
  247. package/build/util/sibling-mcp.d.ts +0 -79
  248. package/build/util/sibling-mcp.js +0 -181
  249. package/cli.bundle.mjs +0 -1235
  250. package/configs/antigravity/GEMINI.md +0 -68
  251. package/configs/antigravity/mcp_config.json +0 -7
  252. package/configs/antigravity-cli/hooks/hooks.json +0 -37
  253. package/configs/antigravity-cli/hooks.json +0 -37
  254. package/configs/antigravity-cli/mcp_config.json +0 -10
  255. package/configs/antigravity-cli/plugin.json +0 -14
  256. package/configs/antigravity-cli/rules/context-mode.md +0 -77
  257. package/configs/antigravity-cli/skills/context-mode/SKILL.md +0 -77
  258. package/configs/claude-code/CLAUDE.md +0 -91
  259. package/configs/codex/AGENTS.md +0 -99
  260. package/configs/codex/config.toml +0 -8
  261. package/configs/codex/hooks.json +0 -47
  262. package/configs/copilot-cli/.github/plugin/plugin.json +0 -23
  263. package/configs/copilot-cli/.mcp.json +0 -12
  264. package/configs/copilot-cli/README.md +0 -47
  265. package/configs/copilot-cli/hooks.json +0 -41
  266. package/configs/copilot-cli/skills/context-mode/SKILL.md +0 -38
  267. package/configs/cursor/context-mode.mdc +0 -76
  268. package/configs/cursor/hooks.json +0 -21
  269. package/configs/cursor/mcp.json +0 -7
  270. package/configs/gemini-cli/GEMINI.md +0 -88
  271. package/configs/gemini-cli/mcp.json +0 -7
  272. package/configs/gemini-cli/settings.json +0 -60
  273. package/configs/jetbrains-copilot/copilot-instructions.md +0 -80
  274. package/configs/jetbrains-copilot/hooks.json +0 -16
  275. package/configs/jetbrains-copilot/mcp.json +0 -7
  276. package/configs/kilo/AGENTS.md +0 -84
  277. package/configs/kilo/kilo.json +0 -6
  278. package/configs/kimi/hooks.json +0 -54
  279. package/configs/kiro/KIRO.md +0 -84
  280. package/configs/kiro/agent.json +0 -18
  281. package/configs/kiro/mcp.json +0 -7
  282. package/configs/omp/SYSTEM.md +0 -85
  283. package/configs/omp/mcp.json +0 -7
  284. package/configs/openclaw/AGENTS.md +0 -87
  285. package/configs/openclaw/openclaw.json +0 -13
  286. package/configs/opencode/AGENTS.md +0 -84
  287. package/configs/opencode/opencode.json +0 -6
  288. package/configs/pi/AGENTS.md +0 -3
  289. package/configs/qwen-code/QWEN.md +0 -91
  290. package/configs/vscode-copilot/copilot-instructions.md +0 -80
  291. package/configs/vscode-copilot/hooks.json +0 -16
  292. package/configs/vscode-copilot/mcp.json +0 -7
  293. package/configs/zed/AGENTS.md +0 -68
  294. package/hooks/antigravity-cli/payload.mjs +0 -98
  295. package/hooks/antigravity-cli/posttooluse.mjs +0 -138
  296. package/hooks/antigravity-cli/pretooluse.mjs +0 -78
  297. package/hooks/antigravity-cli/stop.mjs +0 -58
  298. package/hooks/auto-injection.mjs +0 -102
  299. package/hooks/cache-heal-utils.mjs +0 -379
  300. package/hooks/codex/platform.mjs +0 -1
  301. package/hooks/codex/posttooluse.mjs +0 -66
  302. package/hooks/codex/precompact.mjs +0 -70
  303. package/hooks/codex/pretooluse.mjs +0 -42
  304. package/hooks/codex/sessionstart.mjs +0 -121
  305. package/hooks/codex/stop.mjs +0 -138
  306. package/hooks/codex/userpromptsubmit.mjs +0 -75
  307. package/hooks/copilot-cli/posttooluse.mjs +0 -79
  308. package/hooks/copilot-cli/precompact.mjs +0 -66
  309. package/hooks/copilot-cli/pretooluse.mjs +0 -41
  310. package/hooks/copilot-cli/sessionstart.mjs +0 -121
  311. package/hooks/copilot-cli/stop.mjs +0 -59
  312. package/hooks/copilot-cli/userpromptsubmit.mjs +0 -77
  313. package/hooks/core/codex-caps.mjs +0 -112
  314. package/hooks/core/formatters.mjs +0 -356
  315. package/hooks/core/mcp-ready.mjs +0 -109
  316. package/hooks/core/platform-detect.mjs +0 -49
  317. package/hooks/core/routing.mjs +0 -1017
  318. package/hooks/core/stdin.mjs +0 -90
  319. package/hooks/core/tool-naming.mjs +0 -57
  320. package/hooks/cursor/afteragentresponse.mjs +0 -74
  321. package/hooks/cursor/hooks.json +0 -31
  322. package/hooks/cursor/posttooluse.mjs +0 -72
  323. package/hooks/cursor/pretooluse.mjs +0 -26
  324. package/hooks/cursor/sessionstart.mjs +0 -97
  325. package/hooks/cursor/stop.mjs +0 -48
  326. package/hooks/ensure-deps.mjs +0 -254
  327. package/hooks/formatters/claude-code.mjs +0 -113
  328. package/hooks/formatters/cursor.mjs +0 -37
  329. package/hooks/formatters/gemini-cli.mjs +0 -55
  330. package/hooks/formatters/vscode-copilot.mjs +0 -55
  331. package/hooks/gemini-cli/aftermodel.mjs +0 -70
  332. package/hooks/gemini-cli/aftertool.mjs +0 -61
  333. package/hooks/gemini-cli/beforeagent.mjs +0 -99
  334. package/hooks/gemini-cli/beforetool.mjs +0 -27
  335. package/hooks/gemini-cli/precompress.mjs +0 -55
  336. package/hooks/gemini-cli/sessionstart.mjs +0 -137
  337. package/hooks/heal-partial-install.mjs +0 -712
  338. package/hooks/jetbrains-copilot/posttooluse.mjs +0 -61
  339. package/hooks/jetbrains-copilot/precompact.mjs +0 -55
  340. package/hooks/jetbrains-copilot/pretooluse.mjs +0 -27
  341. package/hooks/jetbrains-copilot/sessionstart.mjs +0 -124
  342. package/hooks/kimi/platform.mjs +0 -1
  343. package/hooks/kimi/posttooluse.mjs +0 -72
  344. package/hooks/kimi/precompact.mjs +0 -80
  345. package/hooks/kimi/pretooluse.mjs +0 -42
  346. package/hooks/kimi/sessionend.mjs +0 -61
  347. package/hooks/kimi/sessionstart.mjs +0 -113
  348. package/hooks/kimi/stop.mjs +0 -132
  349. package/hooks/kimi/userpromptsubmit.mjs +0 -90
  350. package/hooks/kiro/agentspawn.mjs +0 -97
  351. package/hooks/kiro/posttooluse.mjs +0 -51
  352. package/hooks/kiro/pretooluse.mjs +0 -64
  353. package/hooks/kiro/userpromptsubmit.mjs +0 -88
  354. package/hooks/normalize-hooks.mjs +0 -323
  355. package/hooks/platform-bridge.mjs +0 -340
  356. package/hooks/posttooluse.mjs +0 -187
  357. package/hooks/precompact.mjs +0 -100
  358. package/hooks/pretooluse.mjs +0 -227
  359. package/hooks/qwen-code/platform.mjs +0 -1
  360. package/hooks/qwen-code/stop.mjs +0 -168
  361. package/hooks/routing-block.mjs +0 -105
  362. package/hooks/run-hook.mjs +0 -95
  363. package/hooks/security.bundle.mjs +0 -2
  364. package/hooks/session-attribution.bundle.mjs +0 -1
  365. package/hooks/session-db.bundle.mjs +0 -144
  366. package/hooks/session-directive.mjs +0 -520
  367. package/hooks/session-extract.bundle.mjs +0 -3
  368. package/hooks/session-helpers.mjs +0 -428
  369. package/hooks/session-loaders.mjs +0 -448
  370. package/hooks/session-snapshot.bundle.mjs +0 -32
  371. package/hooks/sessionstart.mjs +0 -464
  372. package/hooks/stop.mjs +0 -82
  373. package/hooks/suppress-stderr.mjs +0 -25
  374. package/hooks/userpromptsubmit.mjs +0 -108
  375. package/hooks/vscode-copilot/posttooluse.mjs +0 -61
  376. package/hooks/vscode-copilot/precompact.mjs +0 -55
  377. package/hooks/vscode-copilot/pretooluse.mjs +0 -27
  378. package/hooks/vscode-copilot/sessionstart.mjs +0 -129
  379. package/openclaw.plugin.json +0 -38
  380. package/scripts/heal-better-sqlite3.mjs +0 -430
  381. package/scripts/heal-installed-plugins.mjs +0 -598
  382. package/scripts/plugin-cache-integrity.mjs +0 -248
  383. package/scripts/postinstall.mjs +0 -384
  384. package/server.bundle.mjs +0 -1161
  385. package/skills/.ignore +0 -7
  386. package/skills/context-mode/SKILL.md +0 -300
  387. package/skills/context-mode/references/anti-patterns.md +0 -283
  388. package/skills/context-mode/references/patterns-javascript.md +0 -298
  389. package/skills/context-mode/references/patterns-python.md +0 -304
  390. package/skills/context-mode/references/patterns-shell.md +0 -277
  391. package/skills/ctx-index/SKILL.md +0 -46
  392. package/skills/ctx-insight/SKILL.md +0 -24
  393. package/skills/ctx-purge/SKILL.md +0 -49
  394. package/skills/ctx-search/SKILL.md +0 -35
  395. package/start.mjs +0 -616
@@ -1,240 +0,0 @@
1
- /**
2
- * purgeSession — deep module that wipes ALL session-related on-disk artifacts
3
- * for a single project directory.
4
- *
5
- * Why a deep module instead of an inline handler:
6
- * - The previous inline ctx_purge handler was 100+ lines split across three
7
- * try/catch blocks. Only ONE of those blocks knew about the case-fold
8
- * migration's dual-hash legacy filenames, so a partial upgrade could
9
- * leak orphaned events.md / .cleanup files on macOS / Windows.
10
- * - Centralizing the logic here means: one canonical sidecar list, one
11
- * uniform dual-hash sweep, one place to add new file kinds.
12
- *
13
- * Worktree separation guarantee (carried over from the case-fold migration):
14
- * Every path this module touches is derived deterministically from the input
15
- * `projectDir`. There is NO `readdirSync` + glob-filter loop. Different
16
- * worktrees → different physical paths → different canonical hashes →
17
- * different file names → cannot collapse worktrees on disk.
18
- *
19
- * SQLite sidecar handling:
20
- * Each `.db` file may be accompanied by `-wal` (write-ahead log) and `-shm`
21
- * (shared memory index) sidecars. We unlink the triple unconditionally —
22
- * missing sidecars are not an error. This matches the canonical SQLite
23
- * sidecar naming used elsewhere (see refs/platforms/zed/crates/sqlez:
24
- * `[main, "{main}-wal", "{main}-shm"]`).
25
- *
26
- * Cross-platform notes:
27
- * - All paths are joined via `node:path.join` so Windows backslash
28
- * separators and POSIX forward slashes both work.
29
- * - On macOS / Windows (case-insensitive FS) we sweep BOTH the canonical
30
- * (lowercased) and legacy (raw-cased) project-dir hash variants for the
31
- * session-related kinds. On Linux the two hashes coincide, so the dual
32
- * sweep collapses into a single unique-path pass.
33
- */
34
- import { existsSync, unlinkSync } from "node:fs";
35
- import { join } from "node:path";
36
- import { loadDatabase } from "../db-base.js";
37
- import { getWorktreeSuffix, hashProjectDirCanonical, hashProjectDirLegacy, SessionDB, } from "./db.js";
38
- /** Canonical SQLite sidecar suffixes. The empty string is the main DB. */
39
- const SQLITE_SIDECARS = ["", "-wal", "-shm"];
40
- /** Try to unlink one path; report success without throwing on ENOENT etc. */
41
- function tryUnlink(p, wipedPaths) {
42
- try {
43
- unlinkSync(p);
44
- wipedPaths.push(p);
45
- return true;
46
- }
47
- catch {
48
- return false;
49
- }
50
- }
51
- /**
52
- * Unlink a SQLite db at `path` plus its `-wal` / `-shm` sidecars.
53
- * Returns true when the MAIN db file (not a sidecar) was removed.
54
- */
55
- function tryUnlinkSqliteTriple(path, wipedPaths) {
56
- let mainRemoved = false;
57
- for (const suffix of SQLITE_SIDECARS) {
58
- const removed = tryUnlink(`${path}${suffix}`, wipedPaths);
59
- if (removed && suffix === "")
60
- mainRemoved = true;
61
- }
62
- return mainRemoved;
63
- }
64
- /**
65
- * Wipe every session-related on-disk artifact for `projectDir`.
66
- *
67
- * This function never throws on missing files (a fresh install is a no-op).
68
- * It throws only when given an invalid argument (e.g. `legacyContentDir`
69
- * without `contentHash`), which is a programmer bug not a runtime concern.
70
- */
71
- export function purgeSession(opts) {
72
- const { projectDir, sessionsDir, storePath, contentDir, legacyContentDir, contentHash, sessionId, scope } = opts;
73
- const deleted = [];
74
- const wipedPaths = [];
75
- // Issue #520 — scope discipline.
76
- // Resolve effective scope: explicit `scope` wins; otherwise infer
77
- // "session" iff sessionId is given, else "project".
78
- const effectiveScope = scope ?? (sessionId ? "session" : "project");
79
- if (effectiveScope === "session" && !sessionId) {
80
- throw new TypeError("purgeSession: scope:'session' requires sessionId. " +
81
- "Pass scope:'project' for the legacy whole-project wipe.");
82
- }
83
- // ── Session-scoped path (issue #520). ─────────────────────────────────
84
- // Wipe ONLY this sessionId's rows from the project's SessionDB. The DB
85
- // file itself, the events.md sidecar, the FTS5 store, and the stats
86
- // file are all left intact — those are project-scoped concerns. The
87
- // label "session rows for <id>" appears once when at least one row was
88
- // removed, mirroring the project-scoped UI contract.
89
- if (effectiveScope === "session" && sessionId) {
90
- const worktreeSuffix = getWorktreeSuffix(projectDir);
91
- const canonicalHash = hashProjectDirCanonical(projectDir);
92
- const legacyHash = hashProjectDirLegacy(projectDir);
93
- const hashes = canonicalHash === legacyHash
94
- ? [canonicalHash]
95
- : [canonicalHash, legacyHash];
96
- let rowsRemoved = false;
97
- for (const h of hashes) {
98
- const dbPath = join(sessionsDir, `${h}${worktreeSuffix}.db`);
99
- if (!existsSync(dbPath))
100
- continue;
101
- let db = null;
102
- try {
103
- db = new SessionDB({ dbPath });
104
- const before = db.getEvents(sessionId).length;
105
- db.deleteSession(sessionId);
106
- if (before > 0)
107
- rowsRemoved = true;
108
- }
109
- catch {
110
- // Best-effort — corrupt DB is logged elsewhere; do not block purge.
111
- }
112
- finally {
113
- // close() releases the handle WITHOUT deleting the file —
114
- // this is what makes the scoped wipe non-destructive at the
115
- // file-system level. Using cleanup() here would erase the
116
- // entire DB (main + WAL + SHM), defeating per-session scope.
117
- try {
118
- db?.close();
119
- }
120
- catch { /* best effort */ }
121
- }
122
- }
123
- if (rowsRemoved)
124
- deleted.push(`session rows for ${sessionId}`);
125
- // Per-session FTS5 chunk wipe. The chunks table has a `session_id
126
- // UNINDEXED` column (src/store.ts schema). The public index() path
127
- // currently inserts NULL — but a future per-session-tagged path
128
- // (e.g. tool-call indexing keyed to a session) will populate it,
129
- // and the SQL contract here keeps that future correct from day one.
130
- // Today this is a safe no-op against existing data.
131
- //
132
- // Caller is responsible for closing any persistent ContentStore
133
- // handle BEFORE invoking purgeSession (Windows file lock). The
134
- // ctx_purge handler does this via _store?.cleanup() before delegating.
135
- const ftsTargets = [];
136
- if (storePath && existsSync(storePath))
137
- ftsTargets.push(storePath);
138
- if (contentDir) {
139
- const canonicalH = hashProjectDirCanonical(projectDir);
140
- const legacyH = hashProjectDirLegacy(projectDir);
141
- const hh = canonicalH === legacyH ? [canonicalH] : [canonicalH, legacyH];
142
- for (const h of hh) {
143
- const p = join(contentDir, `${h}.db`);
144
- if (existsSync(p) && !ftsTargets.includes(p))
145
- ftsTargets.push(p);
146
- }
147
- }
148
- let chunksRemoved = false;
149
- for (const path of ftsTargets) {
150
- try {
151
- const Database = loadDatabase();
152
- const fts = new Database(path, { timeout: 30000 });
153
- try {
154
- const before = fts.prepare("SELECT COUNT(*) AS c FROM chunks WHERE session_id = ?").get(sessionId).c;
155
- fts.prepare("DELETE FROM chunks WHERE session_id = ?").run(sessionId);
156
- fts.prepare("DELETE FROM chunks_trigram WHERE session_id = ?").run(sessionId);
157
- if (before > 0)
158
- chunksRemoved = true;
159
- }
160
- finally {
161
- try {
162
- fts.close();
163
- }
164
- catch { /* best effort */ }
165
- }
166
- }
167
- catch {
168
- // Best-effort — schema mismatch / corrupt DB / missing FTS5 must not
169
- // block the per-session SessionDB wipe that already succeeded.
170
- }
171
- }
172
- if (chunksRemoved)
173
- deleted.push(`FTS5 chunks for ${sessionId}`);
174
- return { deleted, wipedPaths };
175
- }
176
- // ── 1. Knowledge base FTS5 store (per-platform). ──────────────────────
177
- // Two input modes:
178
- // - `storePath`: single absolute path; pre-resolved by caller. Wipes
179
- // exactly that file plus -wal / -shm sidecars. Back-compat path.
180
- // - `contentDir`: directory; purgeSession derives BOTH canonical and
181
- // legacy raw-casing variants of the FTS5 store filename (matches
182
- // the case-fold migration pattern from `resolveContentStorePath`)
183
- // and sweeps each with sidecars. Recommended for new callers.
184
- // Both inputs may be supplied; paths are de-duped via the unlink-or-fail
185
- // semantics of `tryUnlinkSqliteTriple`. The "knowledge base (FTS5)"
186
- // label appears at most once.
187
- let storeFound = false;
188
- if (storePath && tryUnlinkSqliteTriple(storePath, wipedPaths))
189
- storeFound = true;
190
- if (contentDir) {
191
- const canonicalHash = hashProjectDirCanonical(projectDir);
192
- const legacyHash = hashProjectDirLegacy(projectDir);
193
- const storeHashes = canonicalHash === legacyHash
194
- ? [canonicalHash]
195
- : [canonicalHash, legacyHash];
196
- for (const h of storeHashes) {
197
- const path = join(contentDir, `${h}.db`);
198
- if (tryUnlinkSqliteTriple(path, wipedPaths))
199
- storeFound = true;
200
- }
201
- }
202
- if (storeFound)
203
- deleted.push("knowledge base (FTS5)");
204
- // ── 2. Legacy shared content DB at ~/.context-mode/content/<hash>.db.
205
- // Same reasoning as (1) — single hash, legacy code-path only.
206
- if (legacyContentDir) {
207
- if (!contentHash) {
208
- throw new TypeError("purgeSession: contentHash is required when legacyContentDir is provided");
209
- }
210
- const legacyPath = join(legacyContentDir, `${contentHash}.db`);
211
- tryUnlinkSqliteTriple(legacyPath, wipedPaths);
212
- // No user-facing label — this is a silent legacy cleanup.
213
- }
214
- // ── 3. Session-events kinds at BOTH canonical AND legacy hashes. ─────
215
- // This is the bug fix: the prior handler only dual-hashed the .db file
216
- // (after migration commit a32cc29). events.md and .cleanup were left
217
- // single-hash, so a casing-drift project on macOS/Windows could leak
218
- // orphan files past a purge. We now sweep all three uniformly.
219
- const worktreeSuffix = getWorktreeSuffix(projectDir);
220
- const canonicalHash = hashProjectDirCanonical(projectDir);
221
- const legacyHash = hashProjectDirLegacy(projectDir);
222
- const hashes = canonicalHash === legacyHash
223
- ? [canonicalHash]
224
- : [canonicalHash, legacyHash];
225
- let sessDbFound = false;
226
- let eventsFound = false;
227
- for (const h of hashes) {
228
- const base = join(sessionsDir, `${h}${worktreeSuffix}`);
229
- if (tryUnlinkSqliteTriple(`${base}.db`, wipedPaths))
230
- sessDbFound = true;
231
- if (tryUnlink(`${base}-events.md`, wipedPaths))
232
- eventsFound = true;
233
- tryUnlink(`${base}.cleanup`, wipedPaths); // no user-facing label
234
- }
235
- if (sessDbFound)
236
- deleted.push("session events DB");
237
- if (eventsFound)
238
- deleted.push("session events markdown");
239
- return { deleted, wipedPaths };
240
- }
@@ -1,46 +0,0 @@
1
- /**
2
- * Snapshot builder — converts stored SessionEvents into a reference-based
3
- * XML resume snapshot.
4
- *
5
- * Pure functions only. No database access, no file system, no side effects.
6
- *
7
- * The output XML is injected into the LLM's context after a compact event to
8
- * restore session awareness. Instead of truncated inline data, each section
9
- * contains a natural summary plus a runnable search tool call that retrieves
10
- * full details from the indexed knowledge base on demand.
11
- *
12
- * Zero truncation. Zero information loss. Full data lives in SessionDB;
13
- * the snapshot is a table of contents.
14
- */
15
- /** Stored event as read from SessionDB. */
16
- export interface StoredEvent {
17
- type: string;
18
- category: string;
19
- data: string;
20
- priority: number;
21
- created_at?: string;
22
- }
23
- export interface BuildSnapshotOpts {
24
- maxBytes?: number;
25
- compactCount?: number;
26
- searchTool?: string;
27
- }
28
- /**
29
- * Render <task_state> from task events.
30
- * Reconstructs the full task list from create/update events,
31
- * filters out completed tasks, and renders only pending/in-progress work.
32
- *
33
- * TaskCreate events have `{ subject }`, TaskUpdate events have `{ taskId, status }`.
34
- * Match by chronological order: creates[0] -> lowest taskId from updates.
35
- */
36
- export declare function renderTaskState(taskEvents: StoredEvent[]): string;
37
- /**
38
- * Build a reference-based resume snapshot XML string from stored session events.
39
- *
40
- * Algorithm:
41
- * 1. Group events by category
42
- * 2. For each non-empty category, build a summary section with a runnable
43
- * search tool call containing exact queries for full details
44
- * 3. Assemble ALL non-empty sections — no priority dropping, no byte budget
45
- */
46
- export declare function buildResumeSnapshot(events: StoredEvent[], opts?: BuildSnapshotOpts): string;