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,4 +0,0 @@
1
- export declare function getToolName(platform: string, bareTool: string): string;
2
- export type ToolNamer = (bareTool: string) => string;
3
- export declare function createToolNamer(platform: string): ToolNamer;
4
- export declare const KNOWN_PLATFORMS: string[];
@@ -1,24 +0,0 @@
1
- const TOOL_PREFIXES = {
2
- "claude-code": (tool) => `mcp__plugin_context-mode_context-mode__${tool}`,
3
- "gemini-cli": (tool) => `mcp__context-mode__${tool}`,
4
- "antigravity": (tool) => `mcp__context-mode__${tool}`,
5
- "opencode": (tool) => `context-mode_${tool}`,
6
- "kilo": (tool) => `context-mode_${tool}`,
7
- "vscode-copilot": (tool) => `context-mode_${tool}`,
8
- "jetbrains-copilot": (tool) => `context-mode_${tool}`,
9
- "kiro": (tool) => `@context-mode/${tool}`,
10
- "zed": (tool) => `mcp:context-mode:${tool}`,
11
- "cursor": (tool) => tool,
12
- "codex": (tool) => tool,
13
- "openclaw": (tool) => tool,
14
- "pi": (tool) => tool,
15
- "qwen-code": (tool) => `mcp__context-mode__${tool}`,
16
- };
17
- export function getToolName(platform, bareTool) {
18
- const fn = TOOL_PREFIXES[platform] || TOOL_PREFIXES["claude-code"];
19
- return fn(bareTool);
20
- }
21
- export function createToolNamer(platform) {
22
- return (bareTool) => getToolName(platform, bareTool);
23
- }
24
- export const KNOWN_PLATFORMS = Object.keys(TOOL_PREFIXES);
@@ -1,57 +0,0 @@
1
- /**
2
- * truncate — Pure string truncation and escaping utilities for context-mode.
3
- *
4
- * These helpers are used by the core ContentStore (chunking) and
5
- * SessionDB (snapshot building). They are extracted here so any
6
- * consumer can import them without pulling in the full store or executor.
7
- */
8
- /**
9
- * Return a prefix of `str` no longer than `maxChars` UTF-16 code units, with
10
- * the cut backed off by one unit if it would split a surrogate pair. Mirrors
11
- * the surrogate-safety semantics of the internal `byteSafePrefix`, but uses
12
- * a character budget rather than a byte budget.
13
- *
14
- * Use this instead of bare `str.slice(0, n)` whenever the result is later
15
- * JSON-encoded for an RFC 8259-strict consumer (e.g. tool_result payloads
16
- * sent back to the host LLM API). `JSON.stringify` will emit a lone high
17
- * surrogate as a literal `\uD8xx` escape, which is invalid JSON.
18
- *
19
- * @param str - Input string.
20
- * @param maxChars - Hard cap in UTF-16 code units.
21
- */
22
- export declare function charSafePrefix(str: string, maxChars: number): string;
23
- /**
24
- * Serialize a value to JSON, then truncate the result to `maxBytes` bytes.
25
- * If truncation occurs, the string is cut at a UTF-8-safe boundary and
26
- * "... [truncated]" is appended. The result is NOT guaranteed to be valid
27
- * JSON after truncation — it is suitable only for display/logging.
28
- *
29
- * The returned string is always <= `maxBytes` bytes. When `maxBytes` is
30
- * smaller than the marker, the marker itself is byte-safely truncated.
31
- *
32
- * @param value - Any JSON-serializable value.
33
- * @param maxBytes - Maximum byte length of the returned string.
34
- * @param indent - JSON indentation spaces (default 2). Pass 0 for compact.
35
- */
36
- export declare function truncateJSON(value: unknown, maxBytes: number, indent?: number): string;
37
- /**
38
- * Escape a string for safe embedding in an XML or HTML attribute or text node.
39
- * Replaces the five XML-reserved characters: `&`, `<`, `>`, `"`, `'`.
40
- *
41
- * Used by the resume snapshot template builder to embed user content in
42
- * `<tool_response>` and `<user_message>` XML tags without breaking the
43
- * structured prompt format.
44
- */
45
- export declare function escapeXML(str: string): string;
46
- /**
47
- * Return `str` unchanged if it fits within `maxBytes`, otherwise return a
48
- * byte-safe slice with an ellipsis appended. Useful for single-value fields
49
- * (e.g., tool response strings) where head+tail splitting is not needed.
50
- *
51
- * The returned string is always <= `maxBytes` bytes. When `maxBytes` is
52
- * smaller than the ellipsis marker, the marker itself is byte-safely truncated.
53
- *
54
- * @param str - Input string.
55
- * @param maxBytes - Hard byte cap.
56
- */
57
- export declare function capBytes(str: string, maxBytes: number): string;
package/build/truncate.js DELETED
@@ -1,142 +0,0 @@
1
- /**
2
- * truncate — Pure string truncation and escaping utilities for context-mode.
3
- *
4
- * These helpers are used by the core ContentStore (chunking) and
5
- * SessionDB (snapshot building). They are extracted here so any
6
- * consumer can import them without pulling in the full store or executor.
7
- */
8
- // ─────────────────────────────────────────────────────────
9
- // Internal: byte-safe prefix
10
- // ─────────────────────────────────────────────────────────
11
- /**
12
- * Return the longest character-prefix of `str` whose UTF-8 encoding is at
13
- * most `maxBytes` bytes. Uses binary search to avoid O(n²) scanning. Returns
14
- * "" when `maxBytes` is <= 0 so callers never exceed their budget.
15
- *
16
- * Guards against splitting a UTF-16 surrogate pair: if the prefix would end
17
- * on a lone high surrogate, back off one code unit so the result round-trips
18
- * through UTF-8 without producing a U+FFFD replacement character.
19
- */
20
- function byteSafePrefix(str, maxBytes) {
21
- if (maxBytes <= 0)
22
- return "";
23
- if (Buffer.byteLength(str) <= maxBytes)
24
- return str;
25
- let lo = 0;
26
- let hi = str.length;
27
- while (lo < hi) {
28
- const mid = (lo + hi + 1) >> 1;
29
- if (Buffer.byteLength(str.slice(0, mid)) <= maxBytes) {
30
- lo = mid;
31
- }
32
- else {
33
- hi = mid - 1;
34
- }
35
- }
36
- // If we landed between a high and low surrogate, back off so the prefix
37
- // ends on a valid code point boundary.
38
- if (lo > 0) {
39
- const code = str.charCodeAt(lo - 1);
40
- if (code >= 0xd800 && code <= 0xdbff)
41
- lo -= 1;
42
- }
43
- return str.slice(0, lo);
44
- }
45
- // ─────────────────────────────────────────────────────────
46
- // Char-count prefix (UTF-16 surrogate-safe)
47
- // ─────────────────────────────────────────────────────────
48
- /**
49
- * Return a prefix of `str` no longer than `maxChars` UTF-16 code units, with
50
- * the cut backed off by one unit if it would split a surrogate pair. Mirrors
51
- * the surrogate-safety semantics of the internal `byteSafePrefix`, but uses
52
- * a character budget rather than a byte budget.
53
- *
54
- * Use this instead of bare `str.slice(0, n)` whenever the result is later
55
- * JSON-encoded for an RFC 8259-strict consumer (e.g. tool_result payloads
56
- * sent back to the host LLM API). `JSON.stringify` will emit a lone high
57
- * surrogate as a literal `\uD8xx` escape, which is invalid JSON.
58
- *
59
- * @param str - Input string.
60
- * @param maxChars - Hard cap in UTF-16 code units.
61
- */
62
- export function charSafePrefix(str, maxChars) {
63
- if (maxChars <= 0)
64
- return "";
65
- if (str.length <= maxChars)
66
- return str;
67
- let end = maxChars;
68
- const code = str.charCodeAt(end - 1);
69
- if (code >= 0xd800 && code <= 0xdbff)
70
- end -= 1;
71
- return str.slice(0, end);
72
- }
73
- // ─────────────────────────────────────────────────────────
74
- // JSON truncation
75
- // ─────────────────────────────────────────────────────────
76
- /**
77
- * Serialize a value to JSON, then truncate the result to `maxBytes` bytes.
78
- * If truncation occurs, the string is cut at a UTF-8-safe boundary and
79
- * "... [truncated]" is appended. The result is NOT guaranteed to be valid
80
- * JSON after truncation — it is suitable only for display/logging.
81
- *
82
- * The returned string is always <= `maxBytes` bytes. When `maxBytes` is
83
- * smaller than the marker, the marker itself is byte-safely truncated.
84
- *
85
- * @param value - Any JSON-serializable value.
86
- * @param maxBytes - Maximum byte length of the returned string.
87
- * @param indent - JSON indentation spaces (default 2). Pass 0 for compact.
88
- */
89
- export function truncateJSON(value, maxBytes, indent = 2) {
90
- const serialized = JSON.stringify(value, null, indent) ?? "null";
91
- if (Buffer.byteLength(serialized) <= maxBytes)
92
- return serialized;
93
- const marker = "... [truncated]";
94
- const markerBytes = Buffer.byteLength(marker);
95
- // Degenerate budget: can't fit serialized content + marker. Fit as much of
96
- // the marker as we can so the return still honors `maxBytes`.
97
- if (maxBytes <= markerBytes)
98
- return byteSafePrefix(marker, maxBytes);
99
- return byteSafePrefix(serialized, maxBytes - markerBytes) + marker;
100
- }
101
- // ─────────────────────────────────────────────────────────
102
- // XML / HTML escaping
103
- // ─────────────────────────────────────────────────────────
104
- /**
105
- * Escape a string for safe embedding in an XML or HTML attribute or text node.
106
- * Replaces the five XML-reserved characters: `&`, `<`, `>`, `"`, `'`.
107
- *
108
- * Used by the resume snapshot template builder to embed user content in
109
- * `<tool_response>` and `<user_message>` XML tags without breaking the
110
- * structured prompt format.
111
- */
112
- export function escapeXML(str) {
113
- return str
114
- .replace(/&/g, "&amp;")
115
- .replace(/</g, "&lt;")
116
- .replace(/>/g, "&gt;")
117
- .replace(/"/g, "&quot;")
118
- .replace(/'/g, "&apos;");
119
- }
120
- // ─────────────────────────────────────────────────────────
121
- // maxBytes guard
122
- // ─────────────────────────────────────────────────────────
123
- /**
124
- * Return `str` unchanged if it fits within `maxBytes`, otherwise return a
125
- * byte-safe slice with an ellipsis appended. Useful for single-value fields
126
- * (e.g., tool response strings) where head+tail splitting is not needed.
127
- *
128
- * The returned string is always <= `maxBytes` bytes. When `maxBytes` is
129
- * smaller than the ellipsis marker, the marker itself is byte-safely truncated.
130
- *
131
- * @param str - Input string.
132
- * @param maxBytes - Hard byte cap.
133
- */
134
- export function capBytes(str, maxBytes) {
135
- if (Buffer.byteLength(str) <= maxBytes)
136
- return str;
137
- const marker = "...";
138
- const markerBytes = Buffer.byteLength(marker);
139
- if (maxBytes <= markerBytes)
140
- return byteSafePrefix(marker, maxBytes);
141
- return byteSafePrefix(str, maxBytes - markerBytes) + marker;
142
- }
package/build/types.d.ts DELETED
@@ -1,117 +0,0 @@
1
- /**
2
- * types — Shared type definitions for context-mode packages.
3
- *
4
- * Contains interfaces that are genuinely shared between the core (ContentStore,
5
- * PolyglotExecutor) and the session domain (SessionDB, event extraction).
6
- * Import from "./types.js".
7
- */
8
- /** Tool call representation used during event extraction from Claude messages. */
9
- export interface ToolCall {
10
- toolName: string;
11
- toolInput: Record<string, unknown>;
12
- toolResponse?: string;
13
- isError?: boolean;
14
- }
15
- /** User message representation used during event extraction. */
16
- export interface UserMessage {
17
- content: string;
18
- timestamp?: string;
19
- }
20
- /**
21
- * Session event as stored in SessionDB.
22
- * Each event captures a discrete unit of session activity (tool use, user
23
- * message, assistant response summary, etc.) for later resume-snapshot
24
- * reconstruction.
25
- */
26
- export interface SessionEvent {
27
- type: string;
28
- category: string;
29
- data: string;
30
- priority: number;
31
- data_hash: string;
32
- /**
33
- * Best-effort project attribution for this event.
34
- * Empty string means unattributed/unknown.
35
- */
36
- project_dir?: string;
37
- attribution_source?: string;
38
- /** 0..1 confidence score for project attribution. */
39
- attribution_confidence?: number;
40
- }
41
- /**
42
- * Result returned by PolyglotExecutor after running a code snippet.
43
- * Shared here so SessionDB can record execution outcomes without importing
44
- * the full executor module.
45
- */
46
- export interface ExecResult {
47
- stdout: string;
48
- stderr: string;
49
- exitCode: number;
50
- timedOut: boolean;
51
- /** Process was detached and continues running in the background. */
52
- backgrounded?: boolean;
53
- }
54
- /**
55
- * Result returned after indexing content into the knowledge base.
56
- * Shared so session tooling can record what was indexed without importing
57
- * ContentStore.
58
- */
59
- export interface IndexResult {
60
- sourceId: number;
61
- label: string;
62
- totalChunks: number;
63
- codeChunks: number;
64
- }
65
- /**
66
- * A single search result returned from FTS5 BM25-ranked lookup.
67
- * Shared for consumers that display or log results outside of ContentStore.
68
- */
69
- export interface SearchResult {
70
- title: string;
71
- content: string;
72
- source: string;
73
- rank: number;
74
- contentType: "code" | "prose";
75
- matchLayer?: "porter" | "trigram" | "fuzzy" | "rrf" | "rrf-fuzzy";
76
- highlighted?: string;
77
- timestamp?: string;
78
- /**
79
- * Session-id attribution copied from the `chunks.session_id` column
80
- * (legacy unattributed chunks carry an empty string). Used by the
81
- * `ctx_search` per-project filter (#737) to scope shared-DB results
82
- * to the current project via the 2-step IN-clause strategy.
83
- */
84
- sessionId?: string;
85
- }
86
- /**
87
- * Aggregate statistics for a ContentStore instance.
88
- */
89
- export interface StoreStats {
90
- sources: number;
91
- chunks: number;
92
- codeChunks: number;
93
- }
94
- /**
95
- * Structured representation of a session resume snapshot, suitable for
96
- * injecting into a new conversation as context. Generated from stored
97
- * SessionEvents by the snapshot builder.
98
- */
99
- export interface ResumeSnapshot {
100
- /** ISO-8601 timestamp of when the snapshot was generated. */
101
- generatedAt: string;
102
- /** Human-readable summary of the session to this point. */
103
- summary: string;
104
- /** Ordered list of events selected for the snapshot (priority-filtered). */
105
- events: SessionEvent[];
106
- }
107
- /**
108
- * Priority levels for SessionEvent records. Higher numbers are more important
109
- * and are retained when the snapshot budget is tight.
110
- */
111
- export declare const EventPriority: {
112
- readonly LOW: 1;
113
- readonly NORMAL: 2;
114
- readonly HIGH: 3;
115
- readonly CRITICAL: 4;
116
- };
117
- export type EventPriorityLevel = (typeof EventPriority)[keyof typeof EventPriority];
package/build/types.js DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * types — Shared type definitions for context-mode packages.
3
- *
4
- * Contains interfaces that are genuinely shared between the core (ContentStore,
5
- * PolyglotExecutor) and the session domain (SessionDB, event extraction).
6
- * Import from "./types.js".
7
- */
8
- // ─────────────────────────────────────────────────────────
9
- // Priority constants
10
- // ─────────────────────────────────────────────────────────
11
- /**
12
- * Priority levels for SessionEvent records. Higher numbers are more important
13
- * and are retained when the snapshot budget is tight.
14
- */
15
- export const EventPriority = {
16
- LOW: 1,
17
- NORMAL: 2,
18
- HIGH: 3,
19
- CRITICAL: 4,
20
- };
@@ -1,32 +0,0 @@
1
- export declare function resolveClaudeConfigDir(env?: NodeJS.ProcessEnv): string;
2
- /** Resolve the global settings.json path, honoring CLAUDE_CONFIG_DIR. */
3
- export declare function resolveClaudeGlobalSettingsPath(env?: NodeJS.ProcessEnv): string;
4
- /**
5
- * Issue #451 round-3: cross-adapter deny-policy parity.
6
- *
7
- * `resolveClaudeGlobalSettingsPath` hardcodes the `.claude` segment, so
8
- * non-Claude adapters (cursor, codex, qwen-code, gemini-cli, jetbrains-copilot,
9
- * vscode-copilot, etc.) never had their global settings consulted by the
10
- * security policy reader. This helper returns the union of:
11
- *
12
- * 1. The currently-detected adapter's home-rooted settings.json (when the
13
- * adapter is non-claude — claude is already covered by entry 2).
14
- * 2. The claude global settings.json (always — defense in depth).
15
- *
16
- * Static import of `../adapters/detect.js` is safe — detect.ts only imports
17
- * `node:` builtins, `./types.js` (type-only), and `./client-map.js` (pure
18
- * data). It does NOT import claude-config back, so no cycle.
19
- *
20
- * History: this used `createRequire(import.meta.url).resolve(...)` to lazy-
21
- * load detect at call time. That pattern requires `require(esm)`, which is
22
- * flag-gated on Node 22.x before 22.12 (`--experimental-require-module`).
23
- * CI run 25877550371 on Node 22.5 silently failed every detect.* call —
24
- * the catch block ate the error and every cross-adapter deny-policy test
25
- * returned an empty policy list. Static import sidesteps the require(esm)
26
- * gate entirely, so the same code works on every supported Node version
27
- * (20.x, 22.5, 22.12+, 24+) without needing the experimental flag.
28
- *
29
- * The returned array is deduplicated and order-stable: adapter-specific path
30
- * first (most specific), claude global second (fallback).
31
- */
32
- export declare function resolveAdapterGlobalSettingsPaths(env?: NodeJS.ProcessEnv): string[];
@@ -1,84 +0,0 @@
1
- /**
2
- * Claude Code config directory resolver — single source of truth.
3
- *
4
- * Issue #460 follow-up: every Claude-aware reader (adapters, security policy
5
- * loader, hook helpers) MUST agree on where global settings live. Hardcoding
6
- * `~/.claude` in any one reader silently breaks `CLAUDE_CONFIG_DIR` for that
7
- * code path, producing policy drift that is invisible until a user sets the
8
- * env var and watches their settings get ignored.
9
- *
10
- * Mirrors the contract of `hooks/session-helpers.mjs::resolveConfigDir` and
11
- * `ClaudeCodeAdapter.getConfigDir`:
12
- * - env unset, empty string, or whitespace-only → ~/.claude
13
- * - env starts with `~`, `~/`, or `~\` → expanded against homedir()
14
- * - otherwise → resolved to absolute (relative paths anchor to cwd)
15
- *
16
- * Whitespace guard: shells that quote-pad the env value (`CLAUDE_CONFIG_DIR=" "`)
17
- * would otherwise resolve to `cwd/<spaces>` — silently writing settings into
18
- * the project tree. Trim before the truthy check so quote-padding falls back
19
- * to `~/.claude` like a sane default.
20
- *
21
- * Cross-platform note: tilde regex strips a single leading `/` OR `\` so
22
- * `~\Users\foo` works on Windows. `path.resolve` handles drive-letter joining.
23
- */
24
- import { resolve } from "node:path";
25
- import { homedir } from "node:os";
26
- import { detectPlatform, getSessionDirSegments } from "../adapters/detect.js";
27
- export function resolveClaudeConfigDir(env = process.env) {
28
- const envVal = env.CLAUDE_CONFIG_DIR;
29
- if (envVal && envVal.trim() !== "") {
30
- if (envVal.startsWith("~")) {
31
- return resolve(homedir(), envVal.replace(/^~[/\\]?/, ""));
32
- }
33
- return resolve(envVal);
34
- }
35
- return resolve(homedir(), ".claude");
36
- }
37
- /** Resolve the global settings.json path, honoring CLAUDE_CONFIG_DIR. */
38
- export function resolveClaudeGlobalSettingsPath(env = process.env) {
39
- return resolve(resolveClaudeConfigDir(env), "settings.json");
40
- }
41
- /**
42
- * Issue #451 round-3: cross-adapter deny-policy parity.
43
- *
44
- * `resolveClaudeGlobalSettingsPath` hardcodes the `.claude` segment, so
45
- * non-Claude adapters (cursor, codex, qwen-code, gemini-cli, jetbrains-copilot,
46
- * vscode-copilot, etc.) never had their global settings consulted by the
47
- * security policy reader. This helper returns the union of:
48
- *
49
- * 1. The currently-detected adapter's home-rooted settings.json (when the
50
- * adapter is non-claude — claude is already covered by entry 2).
51
- * 2. The claude global settings.json (always — defense in depth).
52
- *
53
- * Static import of `../adapters/detect.js` is safe — detect.ts only imports
54
- * `node:` builtins, `./types.js` (type-only), and `./client-map.js` (pure
55
- * data). It does NOT import claude-config back, so no cycle.
56
- *
57
- * History: this used `createRequire(import.meta.url).resolve(...)` to lazy-
58
- * load detect at call time. That pattern requires `require(esm)`, which is
59
- * flag-gated on Node 22.x before 22.12 (`--experimental-require-module`).
60
- * CI run 25877550371 on Node 22.5 silently failed every detect.* call —
61
- * the catch block ate the error and every cross-adapter deny-policy test
62
- * returned an empty policy list. Static import sidesteps the require(esm)
63
- * gate entirely, so the same code works on every supported Node version
64
- * (20.x, 22.5, 22.12+, 24+) without needing the experimental flag.
65
- *
66
- * The returned array is deduplicated and order-stable: adapter-specific path
67
- * first (most specific), claude global second (fallback).
68
- */
69
- export function resolveAdapterGlobalSettingsPaths(env = process.env) {
70
- const paths = [];
71
- const detected = detectPlatform();
72
- if (detected.platform !== "claude-code") {
73
- const segments = getSessionDirSegments(detected.platform);
74
- if (segments && segments.length > 0) {
75
- paths.push(resolve(homedir(), ...segments, "settings.json"));
76
- }
77
- }
78
- // Always include claude global as fallback (defense in depth).
79
- const claudePath = resolveClaudeGlobalSettingsPath(env);
80
- if (!paths.includes(claudePath)) {
81
- paths.push(claudePath);
82
- }
83
- return paths;
84
- }
@@ -1,27 +0,0 @@
1
- import { type HookAdapter } from "../adapters/types.js";
2
- export declare function getCommandsFromHookEntry(entry: unknown): string[];
3
- /**
4
- * Extract the hook script path from a hook command string.
5
- *
6
- * Post Algo-D2 this is a thin wrapper around `parseNodeCommand` with a
7
- * single legacy fallback retained for stale-entry cleanup
8
- * (`configureAllHooks` walks pre-v1.0.124 settings.json shapes that
9
- * predate `buildNodeCommand`). The legacy branches are deliberately
10
- * narrow:
11
- *
12
- * 1) Canonical: `"<nodePath>" "<scriptPath>.mjs"` — `parseNodeCommand`
13
- * handles this; round-trips with `buildNodeCommand`.
14
- * 2) Legacy quoted: `node "<scriptPath>.mjs"` — emitted by claude-code
15
- * pre-D3. The script segment is fully quoted, no whitespace
16
- * ambiguity.
17
- * 3) Legacy unquoted: `node <scriptPath>.mjs` — only when the entire
18
- * command is whitespace-safe (exactly two whitespace-separated
19
- * tokens). The #548 wire shape — `node C:/Users/High Ground …` —
20
- * contains internal whitespace so this branch refuses it. Returns
21
- * `null` instead of grabbing the tail after the last whitespace.
22
- *
23
- * Anything else returns `null`, letting the doctor (Algo-D1) fall
24
- * through to direct `existsSync` instead of trusting the regex.
25
- */
26
- export declare function extractHookScriptPath(command: string): string | null;
27
- export declare function getHookScriptPaths(adapter: HookAdapter, pluginRoot: string): string[];
@@ -1,76 +0,0 @@
1
- import { parseNodeCommand } from "../adapters/types.js";
2
- export function getCommandsFromHookEntry(entry) {
3
- const commands = [];
4
- if (entry && typeof entry === "object") {
5
- const command = entry.command;
6
- if (typeof command === "string")
7
- commands.push(command);
8
- const hooks = entry.hooks;
9
- if (Array.isArray(hooks)) {
10
- for (const hook of hooks) {
11
- if (hook && typeof hook === "object") {
12
- const nestedCommand = hook.command;
13
- if (typeof nestedCommand === "string")
14
- commands.push(nestedCommand);
15
- }
16
- }
17
- }
18
- }
19
- return commands;
20
- }
21
- /**
22
- * Extract the hook script path from a hook command string.
23
- *
24
- * Post Algo-D2 this is a thin wrapper around `parseNodeCommand` with a
25
- * single legacy fallback retained for stale-entry cleanup
26
- * (`configureAllHooks` walks pre-v1.0.124 settings.json shapes that
27
- * predate `buildNodeCommand`). The legacy branches are deliberately
28
- * narrow:
29
- *
30
- * 1) Canonical: `"<nodePath>" "<scriptPath>.mjs"` — `parseNodeCommand`
31
- * handles this; round-trips with `buildNodeCommand`.
32
- * 2) Legacy quoted: `node "<scriptPath>.mjs"` — emitted by claude-code
33
- * pre-D3. The script segment is fully quoted, no whitespace
34
- * ambiguity.
35
- * 3) Legacy unquoted: `node <scriptPath>.mjs` — only when the entire
36
- * command is whitespace-safe (exactly two whitespace-separated
37
- * tokens). The #548 wire shape — `node C:/Users/High Ground …` —
38
- * contains internal whitespace so this branch refuses it. Returns
39
- * `null` instead of grabbing the tail after the last whitespace.
40
- *
41
- * Anything else returns `null`, letting the doctor (Algo-D1) fall
42
- * through to direct `existsSync` instead of trusting the regex.
43
- */
44
- export function extractHookScriptPath(command) {
45
- const parsed = parseNodeCommand(command);
46
- if (parsed) {
47
- return parsed.scriptPath.endsWith(".mjs") ? parsed.scriptPath : null;
48
- }
49
- // Legacy quoted: `node "/path/with spaces/x.mjs"` (pre-D3 claude-code emit).
50
- const legacyQuoted = command.match(/^\s*node\s+"([^"]+\.mjs)"\s*$/);
51
- if (legacyQuoted)
52
- return legacyQuoted[1];
53
- // Legacy unquoted: `node /path/x.mjs` — refuses internal whitespace
54
- // by anchoring both tokens. The #548 ambiguous shape has 3+ tokens
55
- // (spaces in the path) and falls through to `null`.
56
- const legacyBare = command.match(/^\s*node\s+(\S+\.mjs)\s*$/);
57
- if (legacyBare)
58
- return legacyBare[1];
59
- return null;
60
- }
61
- export function getHookScriptPaths(adapter, pluginRoot) {
62
- const paths = new Set();
63
- const hookConfig = adapter.generateHookConfig(pluginRoot);
64
- for (const entries of Object.values(hookConfig)) {
65
- if (!Array.isArray(entries))
66
- continue;
67
- for (const entry of entries) {
68
- for (const command of getCommandsFromHookEntry(entry)) {
69
- const scriptPath = extractHookScriptPath(command);
70
- if (scriptPath)
71
- paths.add(scriptPath);
72
- }
73
- }
74
- }
75
- return [...paths];
76
- }
@@ -1,14 +0,0 @@
1
- /**
2
- * util/jsonc — string-aware JSONC comment + trailing-comma stripping and a
3
- * tolerant parse. Several agent CLIs ship config files as JSONC (VS Code
4
- * `mcp.json`, Zed `settings.json`), so a strict `JSON.parse` false-fails on a
5
- * perfectly valid commented file. Use `parseJsonc` whenever reading a
6
- * platform config we did not write ourselves.
7
- */
8
- /** Strip `//` line + `/* *​/` block comments and trailing commas, string-aware. */
9
- export declare function stripJsonComments(str: string): string;
10
- /**
11
- * Parse JSON or JSONC. Tries strict `JSON.parse` first (fast, exact), then a
12
- * comment/trailing-comma-stripped parse. Returns `undefined` when both fail.
13
- */
14
- export declare function parseJsonc<T = unknown>(raw: string): T | undefined;