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,57 +0,0 @@
1
- /**
2
- * adapters/pi — Pi coding agent platform adapter.
3
- *
4
- * Implements HookAdapter for Pi's MCP-only paradigm at the adapter layer.
5
- *
6
- * Pi hook specifics:
7
- * - NO JSON-stdio hooks. Pi exposes a JS-callback runtime API
8
- * (`pi.on("session_start", fn)`, `pi.on("tool_call", fn)`, …) which is
9
- * wired DIRECTLY by `src/adapters/pi/extension.ts`. The HookAdapter
10
- * contract here intentionally reports `mcp-only` and all-false
11
- * capabilities so harness paths that walk the JSON-stdio matrix do not
12
- * try to register stdio hooks for Pi.
13
- * - Config root: ~/.pi/
14
- * - Settings: ~/.pi/settings.json (kept lightweight — Pi does not
15
- * prescribe a canonical settings file, but several internal tools
16
- * write one; using settings.json keeps parity with Claude Code).
17
- * - Session dir: ~/.pi/context-mode/sessions/ (parallel to ~/.claude/,
18
- * ~/.omp/) — this is the data-isolation contract from issue #473.
19
- * - Instruction file: AGENTS.md (per configs/pi/AGENTS.md).
20
- *
21
- * Why a dedicated adapter is mandatory:
22
- * Before this adapter existed, `getAdapter("pi")` fell through to the
23
- * `default` arm of the switch in `src/adapters/detect.ts` and returned a
24
- * ClaudeCodeAdapter. Pi sessions therefore wrote DBs and event logs into
25
- * `~/.claude/context-mode/sessions/`, contaminating Claude Code state and
26
- * silently leaking Pi user data into the wrong storage root (issue #473
27
- * follow-up). The OMP adapter fixed the same class of bug for OMP; this
28
- * adapter closes the gap for Pi.
29
- */
30
- import { BaseAdapter } from "../base.js";
31
- import type { HookAdapter, HookParadigm, PlatformCapabilities, DiagnosticResult, PreToolUseEvent, PostToolUseEvent, PreCompactEvent, SessionStartEvent, PreToolUseResponse, PostToolUseResponse, PreCompactResponse, SessionStartResponse, HookRegistration } from "../types.js";
32
- export declare class PiAdapter extends BaseAdapter implements HookAdapter {
33
- constructor();
34
- readonly name = "Pi";
35
- readonly paradigm: HookParadigm;
36
- readonly capabilities: PlatformCapabilities;
37
- parsePreToolUseInput(_raw: unknown): PreToolUseEvent;
38
- parsePostToolUseInput(_raw: unknown): PostToolUseEvent;
39
- parsePreCompactInput(_raw: unknown): PreCompactEvent;
40
- parseSessionStartInput(_raw: unknown): SessionStartEvent;
41
- formatPreToolUseResponse(_response: PreToolUseResponse): unknown;
42
- formatPostToolUseResponse(_response: PostToolUseResponse): unknown;
43
- formatPreCompactResponse(_response: PreCompactResponse): unknown;
44
- formatSessionStartResponse(_response: SessionStartResponse): unknown;
45
- getSettingsPath(): string;
46
- getInstructionFiles(): string[];
47
- generateHookConfig(_pluginRoot: string): HookRegistration;
48
- readSettings(): Record<string, unknown> | null;
49
- writeSettings(settings: Record<string, unknown>): void;
50
- validateHooks(_pluginRoot: string): DiagnosticResult[];
51
- checkPluginRegistration(): DiagnosticResult;
52
- getInstalledVersion(): string;
53
- configureAllHooks(_pluginRoot: string): string[];
54
- setHookPermissions(_pluginRoot: string): string[];
55
- updatePluginRegistry(_pluginRoot: string, _version: string): void;
56
- getRoutingInstructions(): string;
57
- }
@@ -1,173 +0,0 @@
1
- /**
2
- * adapters/pi — Pi coding agent platform adapter.
3
- *
4
- * Implements HookAdapter for Pi's MCP-only paradigm at the adapter layer.
5
- *
6
- * Pi hook specifics:
7
- * - NO JSON-stdio hooks. Pi exposes a JS-callback runtime API
8
- * (`pi.on("session_start", fn)`, `pi.on("tool_call", fn)`, …) which is
9
- * wired DIRECTLY by `src/adapters/pi/extension.ts`. The HookAdapter
10
- * contract here intentionally reports `mcp-only` and all-false
11
- * capabilities so harness paths that walk the JSON-stdio matrix do not
12
- * try to register stdio hooks for Pi.
13
- * - Config root: ~/.pi/
14
- * - Settings: ~/.pi/settings.json (kept lightweight — Pi does not
15
- * prescribe a canonical settings file, but several internal tools
16
- * write one; using settings.json keeps parity with Claude Code).
17
- * - Session dir: ~/.pi/context-mode/sessions/ (parallel to ~/.claude/,
18
- * ~/.omp/) — this is the data-isolation contract from issue #473.
19
- * - Instruction file: AGENTS.md (per configs/pi/AGENTS.md).
20
- *
21
- * Why a dedicated adapter is mandatory:
22
- * Before this adapter existed, `getAdapter("pi")` fell through to the
23
- * `default` arm of the switch in `src/adapters/detect.ts` and returned a
24
- * ClaudeCodeAdapter. Pi sessions therefore wrote DBs and event logs into
25
- * `~/.claude/context-mode/sessions/`, contaminating Claude Code state and
26
- * silently leaking Pi user data into the wrong storage root (issue #473
27
- * follow-up). The OMP adapter fixed the same class of bug for OMP; this
28
- * adapter closes the gap for Pi.
29
- */
30
- import { readFileSync, writeFileSync, mkdirSync, } from "node:fs";
31
- import { resolve, dirname } from "node:path";
32
- import { homedir } from "node:os";
33
- import { BaseAdapter } from "../base.js";
34
- // ─────────────────────────────────────────────────────────
35
- // Adapter implementation
36
- // ─────────────────────────────────────────────────────────
37
- export class PiAdapter extends BaseAdapter {
38
- constructor() {
39
- super([".pi"]);
40
- }
41
- name = "Pi";
42
- paradigm = "mcp-only";
43
- capabilities = {
44
- preToolUse: false,
45
- postToolUse: false,
46
- preCompact: false,
47
- sessionStart: false,
48
- canModifyArgs: false,
49
- canModifyOutput: false,
50
- canInjectSessionContext: false,
51
- };
52
- // ── Input parsing ──────────────────────────────────────
53
- // Pi does not feed the adapter via JSON-stdio. These methods exist to
54
- // satisfy the HookAdapter contract and throw if the harness mistakenly
55
- // routes a JSON-stdio event through the adapter.
56
- parsePreToolUseInput(_raw) {
57
- throw new Error("Pi does not support JSON-stdio hooks (wired via extension.ts)");
58
- }
59
- parsePostToolUseInput(_raw) {
60
- throw new Error("Pi does not support JSON-stdio hooks (wired via extension.ts)");
61
- }
62
- parsePreCompactInput(_raw) {
63
- throw new Error("Pi does not support JSON-stdio hooks (wired via extension.ts)");
64
- }
65
- parseSessionStartInput(_raw) {
66
- throw new Error("Pi does not support JSON-stdio hooks (wired via extension.ts)");
67
- }
68
- // ── Response formatting ────────────────────────────────
69
- // No JSON-stdio path — return undefined to satisfy the contract.
70
- formatPreToolUseResponse(_response) {
71
- return undefined;
72
- }
73
- formatPostToolUseResponse(_response) {
74
- return undefined;
75
- }
76
- formatPreCompactResponse(_response) {
77
- return undefined;
78
- }
79
- formatSessionStartResponse(_response) {
80
- return undefined;
81
- }
82
- // ── Configuration ──────────────────────────────────────
83
- getSettingsPath() {
84
- return resolve(homedir(), ".pi", "settings.json");
85
- }
86
- getInstructionFiles() {
87
- return ["AGENTS.md"];
88
- }
89
- generateHookConfig(_pluginRoot) {
90
- return {};
91
- }
92
- readSettings() {
93
- try {
94
- const raw = readFileSync(this.getSettingsPath(), "utf-8");
95
- return JSON.parse(raw);
96
- }
97
- catch {
98
- return null;
99
- }
100
- }
101
- writeSettings(settings) {
102
- const settingsPath = this.getSettingsPath();
103
- mkdirSync(dirname(settingsPath), { recursive: true });
104
- writeFileSync(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
105
- }
106
- // ── Diagnostics (doctor) ─────────────────────────────────
107
- validateHooks(_pluginRoot) {
108
- return [
109
- {
110
- check: "Hook support",
111
- status: "pass",
112
- message: "Pi hooks are wired via the context-mode Pi extension " +
113
- "(~/.pi/extensions/context-mode/), not via JSON-stdio.",
114
- },
115
- ];
116
- }
117
- checkPluginRegistration() {
118
- // Pi registers extensions by directory presence; the version-sync
119
- // script writes ~/.pi/extensions/context-mode/package.json. We treat
120
- // that file as the registration signal.
121
- const pkgPath = resolve(homedir(), ".pi", "extensions", "context-mode", "package.json");
122
- try {
123
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
124
- if (pkg?.name === "context-mode") {
125
- return {
126
- check: "Pi extension registration",
127
- status: "pass",
128
- message: `context-mode extension installed at ${pkgPath}`,
129
- };
130
- }
131
- return {
132
- check: "Pi extension registration",
133
- status: "warn",
134
- message: `Unexpected package at ${pkgPath}`,
135
- };
136
- }
137
- catch {
138
- return {
139
- check: "Pi extension registration",
140
- status: "fail",
141
- message: `context-mode not found at ${pkgPath}`,
142
- fix: "Run: context-mode upgrade",
143
- };
144
- }
145
- }
146
- getInstalledVersion() {
147
- try {
148
- const pkgPath = resolve(homedir(), ".pi", "extensions", "context-mode", "package.json");
149
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
150
- return pkg.version ?? "unknown";
151
- }
152
- catch {
153
- return "not installed";
154
- }
155
- }
156
- // ── Upgrade ────────────────────────────────────────────
157
- // Pi does NOT use settings.json hook entries. The extension is the
158
- // integration point — there is nothing for the harness to register
159
- // beyond copying the extension into ~/.pi/extensions/context-mode/.
160
- configureAllHooks(_pluginRoot) {
161
- return [];
162
- }
163
- setHookPermissions(_pluginRoot) {
164
- return [];
165
- }
166
- updatePluginRegistry(_pluginRoot, _version) {
167
- // Pi extension version is managed by scripts/version-sync.mjs writing
168
- // to ~/.pi/extensions/context-mode/package.json. No-op here.
169
- }
170
- getRoutingInstructions() {
171
- return "# context-mode\n\nUse context-mode MCP tools (ctx_execute, ctx_execute_file, ctx_batch_execute, ctx_fetch_and_index, ctx_search) instead of inline shell/HTTP calls for data-heavy operations.";
172
- }
173
- }
@@ -1,268 +0,0 @@
1
- /**
2
- * MCP-stdio bridge for the Pi Coding Agent extension.
3
- *
4
- * Pi 0.73.x has no native MCP support — its README is explicit:
5
- * > "No MCP. Build CLI tools with READMEs (see Skills), or build an
6
- * > extension that adds MCP support."
7
- *
8
- * Without this bridge, the routing block tells the LLM to call
9
- * `ctx_execute`, `ctx_search`, etc. — but those tools never enter Pi's
10
- * tool list, so the LLM cannot reach them. context-mode then becomes a
11
- * pure cost on Pi (~2.5K tokens of system-prompt overhead with 0
12
- * actual ctx_* calls). Reported in mksglu/context-mode#426.
13
- *
14
- * The bridge spawns `server.bundle.mjs` as a long-lived child via stdio
15
- * JSON-RPC, performs the MCP handshake, calls `tools/list` once, and
16
- * registers each returned tool through `pi.registerTool({ … })`. Each
17
- * tool's `execute()` forwards into the child via `tools/call` — same
18
- * code path Claude Code, Gemini CLI, and the other adapters use, so
19
- * Pi behavior matches the rest of the platform suite.
20
- *
21
- * No external dependencies — pure node:child_process + JSON line frames.
22
- */
23
- export interface ResolveDeps {
24
- detect?: () => {
25
- javascript: string | null;
26
- };
27
- which?: (cmd: string) => string | null;
28
- execPath?: string;
29
- }
30
- /**
31
- * Resolve a JS runtime safe to spawn the MCP server with.
32
- *
33
- * Returns `null` when no real runtime is reachable (caller must skip
34
- * the bridge gracefully — see bootstrapMCPTools). Pi-named binaries are
35
- * explicitly rejected at every step to prevent the #516 fork bomb.
36
- */
37
- export declare function resolveJsRuntimeForBridge(deps?: ResolveDeps): string | null;
38
- export interface MCPTool {
39
- name: string;
40
- description?: string;
41
- inputSchema?: Record<string, unknown>;
42
- }
43
- export interface MCPCallResult {
44
- content?: Array<{
45
- type?: string;
46
- text?: string;
47
- }>;
48
- isError?: boolean;
49
- }
50
- export declare class PiTextComponent {
51
- private text;
52
- constructor(text?: string);
53
- setText(text: string): void;
54
- invalidate(): void;
55
- render(width: number): string[];
56
- }
57
- export declare function truncateAnsiLine(line: string, maxWidth: number): string;
58
- interface PiRenderTheme {
59
- bold(text: string): string;
60
- fg(color: string, text: string): string;
61
- }
62
- interface PiRenderContext {
63
- lastComponent?: unknown;
64
- }
65
- /**
66
- * Minimal stdio JSON-RPC client targeting the context-mode MCP server.
67
- *
68
- * Implementation notes:
69
- * - One outstanding ID per request; results matched by `id` from the
70
- * returned envelope. Notifications (no id) are sent fire-and-forget.
71
- * - Buffer is split on `\n` because the MCP server writes one
72
- * newline-delimited JSON message per `console.log` / `stdout.write`
73
- * invocation — this is the standard MCP stdio transport framing.
74
- * - On child exit / error, every in-flight request is rejected so
75
- * callers do not hang forever.
76
- */
77
- export declare class MCPStdioClient {
78
- private readonly serverScript;
79
- private readonly env;
80
- private readonly runtimeOverride;
81
- /**
82
- * TUI-safe sink for the child's forwarded stderr (#868). Defaults to a
83
- * no-op so direct callers (skippedBridge, tests) never leak to the
84
- * terminal; bootstrapMCPTools wires this to the Pi host's file logger.
85
- */
86
- private readonly diag;
87
- private child;
88
- private requestId;
89
- private readonly pending;
90
- private buffer;
91
- private initialized;
92
- private exited;
93
- /**
94
- * In-flight respawn promise — set while {@link respawn} runs so
95
- * concurrent callers awaiting `request()` after an idle exit observe
96
- * the SAME respawn, not N parallel ones. Without this guard, two
97
- * simultaneous `callTool` calls would each see `this.exited === true`,
98
- * each fire their own `respawn()`, and the loser leaks an orphaned
99
- * child process the GC cannot reach (no `.kill()` reference).
100
- */
101
- private respawnPromise;
102
- /**
103
- * Live env passed to the spawned child — exposed (read-only intent)
104
- * so tests can pin the fork-bomb-prevention env counter (#516)
105
- * without needing to attach a process-tree probe.
106
- */
107
- _spawnEnv: NodeJS.ProcessEnv | null;
108
- constructor(serverScript: string, env?: NodeJS.ProcessEnv, runtimeOverride?: string | null,
109
- /**
110
- * TUI-safe sink for the child's forwarded stderr (#868). Defaults to a
111
- * no-op so direct callers (skippedBridge, tests) never leak to the
112
- * terminal; bootstrapMCPTools wires this to the Pi host's file logger.
113
- */
114
- diag?: BridgeDiag);
115
- /** Spawn the MCP child. Idempotent. */
116
- start(): void;
117
- private onExit;
118
- private onData;
119
- request<T = unknown>(method: string, params: unknown, timeoutMs?: number): Promise<T>;
120
- private writeFrame;
121
- notify(method: string, params: unknown): void;
122
- initialize(): Promise<void>;
123
- listTools(): Promise<MCPTool[]>;
124
- callTool(name: string, args: unknown): Promise<MCPCallResult>;
125
- /**
126
- * Respawn the MCP child after an exit (clean shutdown or crash).
127
- * Resets state so a fresh `start()` + `initialize()` cycle runs, then
128
- * the caller's pending request flows through the new child.
129
- *
130
- * Single-flight — concurrent callers share one in-flight respawn via
131
- * {@link respawnPromise}. Internal — only entered via {@link request}.
132
- *
133
- * Sequencing pinned (do not reorder without updating the regression
134
- * test in tests/adapters/pi-mcp-bridge.test.ts):
135
- * 1. `this.child = null` — drop stale handle
136
- * 2. `this.buffer = ""` — discard leftover bytes from old child
137
- * 3. `this.exited = false` — must precede `start()` + `initialize()`,
138
- * because `request("initialize", …)`
139
- * inside `initialize()` re-checks this
140
- * flag and would otherwise re-enter
141
- * respawn in an infinite loop
142
- * 4. `this.initialized = false`
143
- * 5. `this.start()`
144
- * 6. `await this.initialize()` — flows through `request()` recursively
145
- */
146
- private respawn;
147
- shutdown(): void;
148
- }
149
- /**
150
- * Subset of the Pi ExtensionAPI we touch. Typed structurally so we don't
151
- * pull `@earendil-works/pi-coding-agent` as a build dependency — keeps
152
- * the bundle size unchanged and matches the existing pi-extension.ts
153
- * style (which also types `pi` as `any`).
154
- */
155
- export interface PiToolRegistration {
156
- name: string;
157
- label: string;
158
- description: string;
159
- parameters: unknown;
160
- renderCall?: (args: unknown, theme: PiRenderTheme, context: PiRenderContext) => unknown;
161
- renderResult?: (result: MCPCallResult, options: {
162
- expanded: boolean;
163
- isPartial: boolean;
164
- }, theme: PiRenderTheme, context: PiRenderContext) => unknown;
165
- execute: (toolCallId: string, params: Record<string, unknown>) => Promise<{
166
- content: Array<{
167
- type: "text";
168
- text: string;
169
- }>;
170
- details: Record<string, unknown>;
171
- isError?: boolean;
172
- }>;
173
- }
174
- export interface PiLikeAPI {
175
- registerTool: (tool: PiToolRegistration) => void;
176
- /**
177
- * Pi's rotating file logger (`~/.omp/logs/`). Pi runs a raw-mode TUI that
178
- * owns the terminal, so an in-process extension MUST NOT write to
179
- * process.stdout/stderr — any console write is rendered straight into the
180
- * editor input box and blocks typing (#868, confirmed against
181
- * oh-my-pi tui/terminal.ts raw-mode + docs/skills/authoring-extensions.md:
182
- * "nothing is written to the console, which would corrupt the TUI"). All
183
- * bridge diagnostics route here instead. Optional: absent in tests / minimal
184
- * hosts, in which case diagnostics are dropped — we NEVER fall back to the
185
- * terminal.
186
- */
187
- logger?: {
188
- debug?: (message: string, context?: Record<string, unknown>) => void;
189
- info?: (message: string, context?: Record<string, unknown>) => void;
190
- warn?: (message: string, context?: Record<string, unknown>) => void;
191
- error?: (message: string, context?: Record<string, unknown>) => void;
192
- };
193
- }
194
- /** TUI-safe diagnostics sink: routes to Pi's file logger, never the terminal. */
195
- export type BridgeDiag = (line: string, level?: "warn" | "debug") => void;
196
- /**
197
- * Build a {@link BridgeDiag} bound to a Pi host's file logger (#868). Writing to
198
- * process.stderr from inside Pi's raw-mode TUI corrupts the editor, so every
199
- * bridge diagnostic — the forwarded MCP child stderr included — goes to
200
- * `pi.logger` instead. When no logger is reachable (tests, non-Pi hosts) the
201
- * line is dropped; we never touch the terminal as a fallback.
202
- */
203
- export declare function makeBridgeDiag(pi: PiLikeAPI | null | undefined): BridgeDiag;
204
- /**
205
- * Split a chunk of forwarded child output into lines without a regex (the repo
206
- * forbids regex in source). Trailing `\r` is stripped so CRLF traces stay clean
207
- * in the log; the final partial line (no trailing newline) is preserved.
208
- */
209
- export declare function splitDiagLines(text: string): string[];
210
- /**
211
- * #868: is this the FOREGROUND interactive Pi session (vs a subagent / print /
212
- * RPC session)? Pi passes an ExtensionContext as the 2nd arg to
213
- * `before_agent_start`; `ctx.hasUI === true` only for the interactive session
214
- * with a real UI attached (refs oh-my-pi runner.ts:330-331), while subagents
215
- * are provably `hasUI: false` (refs executor.ts:2052). Fail-safe: treat anything
216
- * that is NOT an explicit `hasUI === false` as foreground, so an
217
- * ambiguous/absent ctx keeps the session's bridge ALIVE rather than risking the
218
- * #868 idle-drop. Mis-classifying an abandoned non-interactive child as
219
- * foreground only costs one lingering child until parent-death/ session_shutdown
220
- * reaps it; the opposite error re-drops the user's tools mid-session.
221
- */
222
- export declare function isForegroundSession(ctx: unknown): boolean;
223
- /**
224
- * #868: derive the bridge child's spawn env for a session kind. The FOREGROUND
225
- * interactive session's child must never be idle-reaped — a multi-minute human
226
- * pause should not drop its ctx_* tools — so we disable the #854 reaper for it
227
- * via `CONTEXT_MODE_BRIDGE_IDLE_MS=0` (lifecycle.ts honors 0 → reaper not armed).
228
- * Sub-context / non-interactive children keep the default reaper so abandoned
229
- * children still can't accumulate (#854). The foreground child is still reaped
230
- * on actual parent death by the ppid/​signal watchdog (#311/#388) — only the
231
- * idle-time path is disabled. Pure; does not mutate the input env.
232
- */
233
- export declare function foregroundBridgeEnv(baseEnv: NodeJS.ProcessEnv, foreground: boolean): NodeJS.ProcessEnv;
234
- /** Result of bootstrapping the bridge. */
235
- export interface BridgeHandle {
236
- /** Names of tools registered with Pi (for diagnostics / tests). */
237
- tools: string[];
238
- /** Idempotent shutdown — terminates the MCP child. */
239
- shutdown: () => void;
240
- /** Underlying client, exposed for tests / advanced callers. */
241
- client: MCPStdioClient;
242
- }
243
- /**
244
- * Spawn the MCP server and register each of its tools with Pi via
245
- * `pi.registerTool()`. The same JSON Schema returned by `tools/list` is
246
- * passed straight through as `parameters` — TypeBox emits JSON-Schema
247
- * compatible objects, so any Pi runtime that validates JSON Schema
248
- * accepts this shape (verified against pi 0.73.x).
249
- *
250
- * Errors during MCP `tools/call` are translated to a `throw` from the
251
- * `execute()` callback — Pi's contract is "throw to mark the tool call
252
- * failed", which lets the LLM see and adapt.
253
- */
254
- export interface BootstrapOptions {
255
- env?: NodeJS.ProcessEnv;
256
- /** DI hook for tests: override the runtime resolver entirely. */
257
- _resolveJsRuntime?: () => string | null;
258
- /**
259
- * #868: true for the foreground interactive Pi session → spawn the child with
260
- * the #854 idle reaper DISABLED so a human pause never drops its tools.
261
- * Defaults to false (keep the reaper) for any non-foreground / unspecified
262
- * caller; the pi extension resolves this from `ctx.hasUI` via
263
- * {@link isForegroundSession}.
264
- */
265
- foreground?: boolean;
266
- }
267
- export declare function bootstrapMCPTools(pi: PiLikeAPI, serverScript: string, options?: BootstrapOptions): Promise<BridgeHandle>;
268
- export {};