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
package/build/db-base.js DELETED
@@ -1,569 +0,0 @@
1
- /**
2
- * db-base — Reusable SQLite infrastructure for context-mode packages.
3
- *
4
- * Provides lazy-loading of better-sqlite3, WAL pragma setup, prepared
5
- * statement caching interface, and DB file cleanup helpers. Both
6
- * ContentStore and SessionDB build on top of these primitives.
7
- */
8
- import { createRequire } from "node:module";
9
- import { existsSync, unlinkSync, renameSync } from "node:fs";
10
- import { tmpdir } from "node:os";
11
- import { join } from "node:path";
12
- // ─────────────────────────────────────────────────────────
13
- // bun:sqlite adapter (#45)
14
- // ─────────────────────────────────────────────────────────
15
- /**
16
- * Wraps a bun:sqlite Database to provide better-sqlite3-compatible API.
17
- * Bridges: .pragma(), multi-statement .exec(), .get() null→undefined.
18
- */
19
- export class BunSQLiteAdapter {
20
- #raw;
21
- constructor(rawDb) {
22
- this.#raw = rawDb;
23
- }
24
- pragma(source) {
25
- const stmt = this.#raw.prepare(`PRAGMA ${source}`);
26
- const rows = stmt.all();
27
- if (!rows || rows.length === 0)
28
- return undefined;
29
- // Multi-row pragmas (table_xinfo, etc.) → return array
30
- if (rows.length > 1)
31
- return rows;
32
- // Single-row: extract scalar value (e.g. journal_mode = "wal")
33
- const values = Object.values(rows[0]);
34
- return values.length === 1 ? values[0] : rows[0];
35
- }
36
- exec(sql) {
37
- // bun:sqlite .exec() is single-statement only.
38
- // Split multi-statement SQL respecting string literals (don't split on ; inside quotes).
39
- let current = "";
40
- let inString = null;
41
- for (let i = 0; i < sql.length; i++) {
42
- const ch = sql[i];
43
- if (inString) {
44
- current += ch;
45
- if (ch === inString)
46
- inString = null;
47
- }
48
- else if (ch === "'" || ch === '"') {
49
- current += ch;
50
- inString = ch;
51
- }
52
- else if (ch === ";") {
53
- const trimmed = current.trim();
54
- if (trimmed)
55
- this.#raw.prepare(trimmed).run();
56
- current = "";
57
- }
58
- else {
59
- current += ch;
60
- }
61
- }
62
- const trimmed = current.trim();
63
- if (trimmed)
64
- this.#raw.prepare(trimmed).run();
65
- return this;
66
- }
67
- prepare(sql) {
68
- const stmt = this.#raw.prepare(sql);
69
- return {
70
- run: (...args) => stmt.run(...args),
71
- get: (...args) => {
72
- const r = stmt.get(...args);
73
- return r === null ? undefined : r;
74
- },
75
- all: (...args) => stmt.all(...args),
76
- iterate: (...args) => stmt.iterate(...args),
77
- };
78
- }
79
- transaction(fn) {
80
- return this.#raw.transaction(fn);
81
- }
82
- close() {
83
- this.#raw.close();
84
- }
85
- }
86
- // ─────────────────────────────────────────────────────────
87
- // node:sqlite adapter (#228)
88
- // ─────────────────────────────────────────────────────────
89
- /**
90
- * Wraps node:sqlite's DatabaseSync to provide better-sqlite3-compatible API.
91
- * Bridges: .pragma(), .transaction(). Everything else is passthrough.
92
- * Eliminates native addon SIGSEGV on Linux (nodejs/node#62515).
93
- */
94
- export class NodeSQLiteAdapter {
95
- #raw; // DatabaseSync instance
96
- constructor(rawDb) {
97
- this.#raw = rawDb;
98
- }
99
- pragma(source) {
100
- // "journal_mode = WAL" → PRAGMA journal_mode = WAL
101
- // "table_xinfo(session_events)" → PRAGMA table_xinfo(session_events)
102
- // "wal_checkpoint(TRUNCATE)" → PRAGMA wal_checkpoint(TRUNCATE)
103
- const stmt = this.#raw.prepare(`PRAGMA ${source}`);
104
- const rows = stmt.all();
105
- if (!rows || rows.length === 0)
106
- return undefined;
107
- if (rows.length > 1)
108
- return rows;
109
- const values = Object.values(rows[0]);
110
- return values.length === 1 ? values[0] : rows[0];
111
- }
112
- exec(sql) {
113
- // node:sqlite's exec() supports multi-statement natively
114
- this.#raw.exec(sql);
115
- return this;
116
- }
117
- prepare(sql) {
118
- const stmt = this.#raw.prepare(sql);
119
- return {
120
- run: (...args) => stmt.run(...args),
121
- get: (...args) => stmt.get(...args),
122
- all: (...args) => stmt.all(...args),
123
- iterate: (...args) => {
124
- // node:sqlite uses Symbol.iterator on StatementSync, not .iterate()
125
- // Check if iterate exists, otherwise use Symbol.iterator
126
- if (typeof stmt.iterate === 'function') {
127
- return stmt.iterate(...args);
128
- }
129
- // Fallback: use all() to create an iterator
130
- const rows = stmt.all(...args);
131
- return rows[Symbol.iterator]();
132
- },
133
- };
134
- }
135
- transaction(fn) {
136
- // node:sqlite has no transaction() method — manual BEGIN/COMMIT/ROLLBACK
137
- return (...args) => {
138
- this.#raw.exec("BEGIN");
139
- try {
140
- const result = fn(...args);
141
- this.#raw.exec("COMMIT");
142
- return result;
143
- }
144
- catch (err) {
145
- this.#raw.exec("ROLLBACK");
146
- throw err;
147
- }
148
- };
149
- }
150
- close() {
151
- this.#raw.close();
152
- }
153
- }
154
- // ─────────────────────────────────────────────────────────
155
- // Lazy loader
156
- // ─────────────────────────────────────────────────────────
157
- let _Database = null;
158
- /**
159
- * Probe whether the supplied node:sqlite DatabaseSync constructor links a
160
- * SQLite build that includes the FTS5 module. Some Node.js Linux builds
161
- * (e.g. v22.14.0 on Ubuntu) ship node:sqlite without FTS5 even though the
162
- * import succeeds, which silently breaks ctx_search/ctx_batch_execute and
163
- * the doctor's FTS5 check (issue #461).
164
- *
165
- * Returns true only when a `CREATE VIRTUAL TABLE … USING fts5(x)` statement
166
- * succeeds. Always returns false on any failure (constructor throw, missing
167
- * module, etc.) so the caller can fall through to better-sqlite3, whose
168
- * bundled SQLite always ships with FTS5.
169
- */
170
- export function nodeSqliteHasFts5(DatabaseSync) {
171
- let probe = null;
172
- try {
173
- probe = new DatabaseSync(":memory:");
174
- probe.exec("CREATE VIRTUAL TABLE __fts5_probe USING fts5(x)");
175
- return true;
176
- }
177
- catch {
178
- return false;
179
- }
180
- finally {
181
- try {
182
- probe?.close();
183
- }
184
- catch { /* probe never opened or already closed */ }
185
- }
186
- }
187
- /**
188
- * Returns true when the current runtime ships a built-in SQLite binding:
189
- * - Bun has `bun:sqlite` always
190
- * - Node has `node:sqlite` since 22.5 (no flag since 22.13)
191
- *
192
- * Mirrors the helper in hooks/ensure-deps.mjs:61. Exported so the platform
193
- * gate in loadDatabase() can be unit-tested without spawning a child
194
- * process. `versionsOverride` and `bunOverride` are injection points for
195
- * tests — production callers pass nothing.
196
- *
197
- * Widening the gate from `process.platform === "linux"` to this helper is
198
- * required for Node 26 on macOS arm64 (#551): Node 26 removed
199
- * `info.This()` from V8 PropertyCallbackInfo, breaking better-sqlite3
200
- * 12.9.0's native compile. Using node:sqlite sidesteps the native addon
201
- * entirely on every platform that has it.
202
- */
203
- export function hasModernSqlite(versionsOverride, bunOverride) {
204
- const bun = bunOverride !== undefined ? bunOverride : globalThis.Bun;
205
- if (typeof bun !== "undefined" && bun !== null)
206
- return true;
207
- const versions = versionsOverride ?? process.versions;
208
- const [majorStr, minorStr] = (versions.node ?? "0.0.0").split(".");
209
- const major = Number(majorStr);
210
- const minor = Number(minorStr);
211
- if (!Number.isFinite(major) || !Number.isFinite(minor))
212
- return false;
213
- return major > 22 || (major === 22 && minor >= 5);
214
- }
215
- /**
216
- * Lazy-load the SQLite driver for the current runtime.
217
- * Bun → bun:sqlite via BunSQLiteAdapter (issue #45).
218
- * Modern Node (>= 22.5) → node:sqlite via NodeSQLiteAdapter when it ships FTS5 (#228, #461, #551).
219
- * Other Node (or modern Node without FTS5) → better-sqlite3 (native addon).
220
- */
221
- export function loadDatabase() {
222
- if (!_Database) {
223
- const require = createRequire(import.meta.url);
224
- if (globalThis.Bun) {
225
- // Bun runtime — use bun:sqlite directly.
226
- // Array.join() prevents esbuild from resolving the specifier at bundle time.
227
- const BunDB = require(["bun", "sqlite"].join(":")).Database;
228
- _Database = function BunDatabaseFactory(path, opts) {
229
- const raw = new BunDB(path, {
230
- readonly: opts?.readonly,
231
- create: true,
232
- });
233
- const adapter = new BunSQLiteAdapter(raw);
234
- // Propagate busy_timeout — better-sqlite3 does this via constructor
235
- // option but bun:sqlite does not, so we set it via pragma (#243)
236
- if (opts?.timeout) {
237
- adapter.pragma(`busy_timeout = ${opts.timeout}`);
238
- }
239
- return adapter;
240
- };
241
- }
242
- else if (hasModernSqlite()) {
243
- // Any Node >= 22.5 — try node:sqlite to avoid the native addon path
244
- // entirely. Historically this was Linux-only (avoiding the Linux
245
- // SIGSEGV per nodejs/node#62515, #228), but Node 26 also broke
246
- // better-sqlite3's native compile on macOS arm64 by removing
247
- // V8 `info.This()` (#551). The built-in `node:sqlite` ships its
248
- // own SQLite, so it sidesteps both issues at once.
249
- //
250
- // Probe FTS5 support before committing — some Node builds ship
251
- // node:sqlite without FTS5, which would silently break ctx_search
252
- // (#461). The probe runs at most once per process (cached via
253
- // _Database below), so the cost of an in-memory DatabaseSync is
254
- // negligible.
255
- let DatabaseSync = null;
256
- try {
257
- // Array.join() prevents esbuild from resolving the specifier at bundle time
258
- // (mirrors the bun:sqlite branch above).
259
- ({ DatabaseSync } = require(["node", "sqlite"].join(":")));
260
- }
261
- catch {
262
- DatabaseSync = null;
263
- }
264
- if (DatabaseSync && nodeSqliteHasFts5(DatabaseSync)) {
265
- _Database = function NodeDatabaseFactory(path, opts) {
266
- const raw = new DatabaseSync(path, {
267
- readOnly: opts?.readonly ?? false,
268
- });
269
- const adapter = new NodeSQLiteAdapter(raw);
270
- // Propagate busy_timeout — node:sqlite's DatabaseSync constructor
271
- // silently ignores `{ timeout }` (unlike better-sqlite3's native
272
- // C++ constructor), so we set it via PRAGMA, mirroring the Bun
273
- // branch above. Without this, the default is 0 and the first
274
- // write contention surfaces as immediate `SQLITE_BUSY`/`database
275
- // is locked` — defeating the 30s grace `withRetry()` is built
276
- // around. See issue #642 and ADR-0001 (multi-writer contract).
277
- if (opts?.timeout) {
278
- adapter.pragma(`busy_timeout = ${opts.timeout}`);
279
- }
280
- return adapter;
281
- };
282
- }
283
- else {
284
- // node:sqlite missing or built without FTS5 — fall through to
285
- // better-sqlite3. Trade-off: on Node 26 + macOS this may now hit
286
- // the V8 ABI break (#551). A visible crash on the rare
287
- // unstable build is preferable to silent "no such module: fts5"
288
- // on every ctx_search call.
289
- _Database = require("better-sqlite3");
290
- }
291
- }
292
- else {
293
- // Old Node (< 22.5) without bun:sqlite — fall back to better-sqlite3.
294
- _Database = require("better-sqlite3");
295
- }
296
- }
297
- return _Database;
298
- }
299
- // ─────────────────────────────────────────────────────────
300
- // WAL setup
301
- // ─────────────────────────────────────────────────────────
302
- /**
303
- * Apply WAL mode and NORMAL synchronous pragma to a database instance.
304
- * Should be called immediately after opening a new database connection.
305
- *
306
- * WAL mode provides:
307
- * - Concurrent readers while a write is in progress
308
- * - Dramatically faster writes (no full-page sync on each commit)
309
- * NORMAL synchronous is safe under WAL and avoids an extra fsync per
310
- * transaction.
311
- */
312
- export function applyWALPragmas(db) {
313
- db.pragma("journal_mode = WAL");
314
- db.pragma("synchronous = NORMAL");
315
- // Memory-map the DB file for read-heavy FTS5 search workloads.
316
- // Eliminates read() syscalls — the kernel serves pages directly from
317
- // the page cache. 256MB is a safe upper bound (SQLite only maps up to
318
- // the actual file size). Falls back gracefully on platforms where mmap
319
- // is unavailable or restricted.
320
- try {
321
- db.pragma("mmap_size = 268435456");
322
- }
323
- catch { /* unsupported runtime */ }
324
- // NOTE: `locking_mode = EXCLUSIVE` is intentionally NOT applied here.
325
- // ALL DBs built on this helper — ContentStore (FTS5 shared knowledge
326
- // base) AND SessionDB (per-project events) — are multi-writer-safe by
327
- // contract. WAL + busy_timeout + the withRetry() wrapper below handle
328
- // SQLITE_BUSY natively. EXCLUSIVE locking is opt-out, never opt-in
329
- // from a base class shared by multi-writer consumers.
330
- // See docs/adr/0001-sessiondb-multi-writer.md for the v1.0.130 ADR.
331
- }
332
- // ─────────────────────────────────────────────────────────
333
- // DB file helpers
334
- // ─────────────────────────────────────────────────────────
335
- /**
336
- * Remove orphaned WAL/SHM files when the main DB file doesn't exist.
337
- * On Windows, stale -wal/-shm files from crashed processes cause
338
- * "file is not a database" errors when creating a fresh DB.
339
- */
340
- export function cleanOrphanedWALFiles(dbPath) {
341
- if (!existsSync(dbPath)) {
342
- for (const suffix of ["-wal", "-shm"]) {
343
- try {
344
- unlinkSync(dbPath + suffix);
345
- }
346
- catch { /* ignore */ }
347
- }
348
- }
349
- }
350
- /**
351
- * Delete all three SQLite files for a given db path (main, WAL, SHM).
352
- * Silently ignores individual deletion errors so a partial cleanup
353
- * does not abort the rest.
354
- */
355
- export function deleteDBFiles(dbPath) {
356
- for (const suffix of ["", "-wal", "-shm"]) {
357
- try {
358
- unlinkSync(dbPath + suffix);
359
- }
360
- catch {
361
- // ignore — file may not exist
362
- }
363
- }
364
- }
365
- /**
366
- * Safely close a database connection. Swallows errors so callers can
367
- * always call this in a finally/cleanup path without try/catch.
368
- */
369
- export function closeDB(db) {
370
- try {
371
- // Checkpoint WAL before close to prevent contention on restart (#103)
372
- db.pragma("wal_checkpoint(TRUNCATE)");
373
- }
374
- catch { /* WAL may not be active */ }
375
- try {
376
- db.close();
377
- }
378
- catch {
379
- // ignore
380
- }
381
- }
382
- // ─────────────────────────────────────────────────────────
383
- // Default path helper
384
- // ─────────────────────────────────────────────────────────
385
- /**
386
- * Return the default per-process DB path for context-mode databases.
387
- * Uses the OS temp directory and embeds the current PID so multiple
388
- * server instances never share a file.
389
- */
390
- export function defaultDBPath(prefix = "context-mode") {
391
- return join(tmpdir(), `${prefix}-${process.pid}.db`);
392
- }
393
- // ─────────────────────────────────────────────────────────
394
- // Retry helper
395
- // ─────────────────────────────────────────────────────────
396
- /**
397
- * Retry a DB operation with exponential backoff on SQLITE_BUSY errors.
398
- * Catches errors containing "SQLITE_BUSY" or "database is locked" and
399
- * retries up to 3 times with delays: 100ms, 500ms, 2000ms.
400
- * If all retries fail, throws a descriptive error.
401
- * Pass custom delays for testing (e.g., [0, 0, 0] to skip waits).
402
- */
403
- export function withRetry(fn, delays = [100, 500, 2000]) {
404
- let lastError;
405
- for (let attempt = 0; attempt <= delays.length; attempt++) {
406
- try {
407
- return fn();
408
- }
409
- catch (err) {
410
- const msg = err instanceof Error ? err.message : String(err);
411
- if (!msg.includes("SQLITE_BUSY") && !msg.includes("database is locked")) {
412
- throw err;
413
- }
414
- lastError = err instanceof Error ? err : new Error(msg);
415
- if (attempt < delays.length) {
416
- const delay = delays[attempt];
417
- const start = Date.now();
418
- while (Date.now() - start < delay) { /* busy-wait for sync retry */ }
419
- }
420
- }
421
- }
422
- throw new Error(`SQLITE_BUSY: database is locked after ${delays.length} retries. ` +
423
- `Original error: ${lastError?.message}`);
424
- }
425
- // ─────────────────────────────────────────────────────────
426
- // Corrupt DB recovery (#244)
427
- // ─────────────────────────────────────────────────────────
428
- /**
429
- * Detect SQLite corruption errors that warrant a rename-and-recreate.
430
- * Matches SQLITE_CORRUPT, SQLITE_NOTADB, and their human-readable equivalents.
431
- */
432
- export function isSQLiteCorruptionError(msg) {
433
- return (msg.includes("SQLITE_CORRUPT") ||
434
- msg.includes("SQLITE_NOTADB") ||
435
- msg.includes("database disk image is malformed") ||
436
- msg.includes("file is not a database"));
437
- }
438
- /**
439
- * Rename a corrupt DB and its WAL/SHM files so a fresh DB can be created.
440
- * Best-effort — individual rename failures are silently ignored.
441
- */
442
- export function renameCorruptDB(dbPath) {
443
- const ts = Date.now();
444
- for (const suffix of ["", "-wal", "-shm"]) {
445
- try {
446
- renameSync(dbPath + suffix, `${dbPath}${suffix}.corrupt-${ts}`);
447
- }
448
- catch { /* file may not exist */ }
449
- }
450
- }
451
- // ─────────────────────────────────────────────────────────
452
- // Base class
453
- // ─────────────────────────────────────────────────────────
454
- /**
455
- * SQLiteBase — minimal base class that handles open/close/cleanup lifecycle.
456
- *
457
- * Subclasses call `super(dbPath)` to open the database with WAL pragmas
458
- * applied, then implement `initSchema()` and `prepareStatements()`.
459
- *
460
- * The `db` getter exposes the raw `DatabaseInstance` to subclasses only.
461
- */
462
- /**
463
- * Track all live DatabaseInstance objects so we can close them on process exit.
464
- * Prevents better-sqlite3 segfaults caused by V8 garbage-collecting Database
465
- * objects after the native addon context is already torn down.
466
- *
467
- * Uses a global symbol so the set and exit handler survive vitest's module
468
- * re-imports within the same fork process (ESM isolate mode clears
469
- * module-level state but globalThis persists).
470
- */
471
- // v1.0.130 — symbol name bumped because the value type reverted from
472
- // Map<DatabaseInstance, string> (v1.0.128 lockfile pairing) back to
473
- // Set<DatabaseInstance>. A persistent global slot from a v1.0.128 or
474
- // v1.0.129 module would deserialize as the wrong shape and crash the
475
- // exit hook iteration.
476
- const _kLiveDBs = Symbol.for("__context_mode_live_dbs_v3__");
477
- const _liveDBs = (() => {
478
- const g = globalThis;
479
- if (!g[_kLiveDBs]) {
480
- g[_kLiveDBs] = new Set();
481
- process.on("exit", () => {
482
- for (const db of g[_kLiveDBs]) {
483
- closeDB(db);
484
- }
485
- g[_kLiveDBs].clear();
486
- });
487
- }
488
- return g[_kLiveDBs];
489
- })();
490
- export class SQLiteBase {
491
- #dbPath;
492
- #db;
493
- /**
494
- * Open (or create) a SQLite DB at `dbPath`.
495
- *
496
- * v1.0.130 — multi-writer is the contract. ALL SQLiteBase consumers
497
- * (SessionDB, ContentStore) may open the same on-disk dbPath from
498
- * multiple processes simultaneously — that is the legitimate multi-
499
- * window UX shape and the WAL handles it natively. SQLITE_BUSY on
500
- * write contention is absorbed by `withRetry()` below (busy_timeout
501
- * = 30000ms inside `new Database(...)`).
502
- *
503
- * v1.0.128 introduced a single-writer guard here as a defense against
504
- * #560. That defense was an over-correction — the actual root causes
505
- * of #560 were #559 (zombie MCP child accumulation) and #561 (Pi
506
- * misdetection writing to the wrong DB path), both fixed in v1.0.128
507
- * + v1.0.129. The single-writer guard broke legitimate multi-window
508
- * users; v1.0.130 rolls it out. See
509
- * docs/adr/0001-sessiondb-multi-writer.md and the v1.0.130 INVARIANT
510
- * block in tests/util/db-base-platform-gate.test.ts for the
511
- * regression-proof anchor (source-pin + behavioural).
512
- */
513
- constructor(dbPath) {
514
- const Database = loadDatabase();
515
- this.#dbPath = dbPath;
516
- cleanOrphanedWALFiles(dbPath);
517
- let db;
518
- try {
519
- db = new Database(dbPath, { timeout: 30000 });
520
- applyWALPragmas(db);
521
- }
522
- catch (err) {
523
- const msg = err instanceof Error ? err.message : String(err);
524
- if (isSQLiteCorruptionError(msg)) {
525
- renameCorruptDB(dbPath);
526
- cleanOrphanedWALFiles(dbPath);
527
- try {
528
- db = new Database(dbPath, { timeout: 30000 });
529
- applyWALPragmas(db);
530
- }
531
- catch (retryErr) {
532
- throw new Error(`Failed to create fresh DB after renaming corrupt file: ${retryErr instanceof Error ? retryErr.message : String(retryErr)}`);
533
- }
534
- }
535
- else {
536
- throw err;
537
- }
538
- }
539
- this.#db = db;
540
- _liveDBs.add(this.#db);
541
- this.initSchema();
542
- this.prepareStatements();
543
- }
544
- /** Raw database instance — available to subclasses only. */
545
- get db() {
546
- return this.#db;
547
- }
548
- /** The path this database was opened from. */
549
- get dbPath() {
550
- return this.#dbPath;
551
- }
552
- /** Close the database connection without deleting files. */
553
- close() {
554
- _liveDBs.delete(this.#db);
555
- closeDB(this.#db);
556
- }
557
- withRetry(fn) {
558
- return withRetry(fn);
559
- }
560
- /**
561
- * Close the connection and delete all associated DB files (main, WAL, SHM).
562
- * Call on process exit or at end of session lifecycle.
563
- */
564
- cleanup() {
565
- _liveDBs.delete(this.#db);
566
- closeDB(this.#db);
567
- deleteDBFiles(this.#dbPath);
568
- }
569
- }
@@ -1,72 +0,0 @@
1
- import { type RuntimeMap, type Language } from "./runtime.js";
2
- export type { ExecResult } from "./types.js";
3
- import type { ExecResult } from "./types.js";
4
- /** Pure helper — exported for unit testing. Returns "script" or "script.<ext>". */
5
- export declare function buildScriptFilename(language: Language, platform: NodeJS.Platform, shellPath?: string | null): string;
6
- /**
7
- * Pure helper — exported for unit testing. Adds `windowsHide: true` on Windows
8
- * to prevent the spawned shell from creating a visible console window that
9
- * intercepts stdout (issue #384).
10
- */
11
- export declare function buildSpawnOptions(platform: NodeJS.Platform): {
12
- windowsHide: boolean;
13
- };
14
- /** Pure helper — exported for unit testing. Restores parent PATH after shell startup. */
15
- export declare function buildShellScriptContent(code: string, inheritedPath: string | undefined, platform: NodeJS.Platform): string;
16
- export declare function buildPowerShellScriptContent(code: string): string;
17
- /**
18
- * Pure helper — exported for unit testing. Issue #782.
19
- *
20
- * On Windows, the sandbox shell runtime is Git Bash. A bare `mvn` invocation
21
- * runs Maven's POSIX shell script, which on the `mingw=true` branch (uname →
22
- * MINGW64_NT-*) fails to convert `CLASSWORLDS_JAR` from a POSIX path
23
- * (`/c/tools/maven/boot/plexus-classworlds-*.jar`) to a Windows path. Native
24
- * `java.exe` then can't resolve the bootstrap jar → ClassNotFoundException for
25
- * `org.codehaus.plexus.classworlds.launcher.Launcher`.
26
- *
27
- * The third-way fix (issue Option C): rewrite the bare `mvn` token to `mvn.cmd`,
28
- * the native Windows launcher that uses Windows-native paths and bypasses the
29
- * broken mingw shell branch entirely. This does NOT touch the global MSYS
30
- * path-conversion env (MSYS_NO_PATHCONV / MSYS2_ARG_CONV_EXCL), which #826/#791
31
- * deliberately leave unset so native git.exe launched from bash keeps its
32
- * /tmp→C:\ argument conversion. Re-enabling global suppression would re-break
33
- * native git; rewriting only the mvn token keeps both correct.
34
- *
35
- * Only a `mvn` that starts a command (start of string, or after a shell
36
- * separator `&& | ; ( newline`) is rewritten. `mvnw`, `mvnd`, `mymvn`,
37
- * paths like `./mvnw`, and an already-`mvn.cmd` token are left untouched
38
- * (the token must be exactly `mvn` followed by whitespace or end-of-string).
39
- */
40
- export declare function rewriteWindowsBuildTools(code: string, platform: NodeJS.Platform): string;
41
- interface ExecuteOptions {
42
- language: Language;
43
- code: string;
44
- timeout?: number;
45
- /** Keep process running after timeout instead of killing it. */
46
- background?: boolean;
47
- /**
48
- * Issue #45 — per-call cwd override for the shell language. When set,
49
- * the shell script runs in this directory instead of `#projectRoot`.
50
- * Non-shell languages keep their tmpDir sandbox cwd regardless (the
51
- * script file lives there). Used by Codex MCP handlers to pin shell
52
- * commands to a resolved project root when the spawning host inherited
53
- * a non-project cwd (e.g. $HOME).
54
- */
55
- cwd?: string;
56
- }
57
- interface ExecuteFileOptions extends ExecuteOptions {
58
- path: string;
59
- }
60
- export declare class PolyglotExecutor {
61
- #private;
62
- constructor(opts?: {
63
- hardCapBytes?: number;
64
- projectRoot?: string | (() => string);
65
- runtimes?: RuntimeMap;
66
- });
67
- get runtimes(): RuntimeMap;
68
- /** Kill all backgrounded processes to prevent zombie/port-conflict issues. */
69
- cleanupBackgrounded(): void;
70
- execute(opts: ExecuteOptions): Promise<ExecResult>;
71
- executeFile(opts: ExecuteFileOptions): Promise<ExecResult>;
72
- }