context-mode 1.0.169 → 2.0.0-next.6

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 (382) hide show
  1. package/.claude-plugin/marketplace.json +4 -22
  2. package/.claude-plugin/plugin.json +9 -24
  3. package/.codex-plugin/hooks.json +18 -33
  4. package/.codex-plugin/mcp.json +5 -4
  5. package/.codex-plugin/plugin.json +8 -27
  6. package/SHA256SUMS +37 -0
  7. package/claude-code/skills/ctx-doctor/SKILL.md +6 -0
  8. package/claude-code/skills/ctx-stats/SKILL.md +6 -0
  9. package/claude-code/skills/ctx-upgrade/SKILL.md +6 -0
  10. package/cli.mjs +6859 -0
  11. package/codex/skills/ctx-doctor/SKILL.md +6 -0
  12. package/codex/skills/ctx-stats/SKILL.md +6 -0
  13. package/codex/skills/ctx-upgrade/SKILL.md +6 -0
  14. package/copilot/plugin.json +14 -0
  15. package/fixtures/hook-roundtrip.json +22 -0
  16. package/gemini-extension.json +14 -0
  17. package/hook.mjs +202 -0
  18. package/hooks/claude-code.json +50 -0
  19. package/hooks/codex.json +50 -0
  20. package/hooks/copilot-cli.json +33 -0
  21. package/hooks/hooks.json +16 -111
  22. package/hooks/kiro.json +69 -0
  23. package/hooks/qwen.json +50 -0
  24. package/hooks/vscode.json +40 -0
  25. package/hooks/zcode.json +53 -0
  26. package/opencode/plugin.js +22491 -0
  27. package/package.json +32 -114
  28. package/pi/index.js +50876 -0
  29. package/pi/skills/ctx-doctor/SKILL.md +6 -0
  30. package/pi/skills/ctx-stats/SKILL.md +6 -0
  31. package/pi/skills/ctx-upgrade/SKILL.md +6 -0
  32. package/qwen-extension.json +15 -0
  33. package/run.mjs +5639 -0
  34. package/search.mjs +5639 -0
  35. package/server.mjs +48214 -0
  36. package/skills/ctx-doctor/SKILL.md +3 -19
  37. package/skills/ctx-stats/SKILL.md +3 -23
  38. package/skills/ctx-upgrade/SKILL.md +3 -28
  39. package/.openclaw-plugin/index.ts +0 -12
  40. package/.openclaw-plugin/openclaw.plugin.json +0 -38
  41. package/.openclaw-plugin/package.json +0 -28
  42. package/LICENSE +0 -94
  43. package/README.md +0 -1619
  44. package/bin/statusline.mjs +0 -378
  45. package/build/adapters/antigravity/index.d.ts +0 -51
  46. package/build/adapters/antigravity/index.js +0 -169
  47. package/build/adapters/antigravity-cli/index.d.ts +0 -51
  48. package/build/adapters/antigravity-cli/index.js +0 -342
  49. package/build/adapters/base.d.ts +0 -92
  50. package/build/adapters/base.js +0 -135
  51. package/build/adapters/claude-code/config.d.ts +0 -8
  52. package/build/adapters/claude-code/config.js +0 -8
  53. package/build/adapters/claude-code/hooks.d.ts +0 -106
  54. package/build/adapters/claude-code/hooks.js +0 -183
  55. package/build/adapters/claude-code/index.d.ts +0 -80
  56. package/build/adapters/claude-code/index.js +0 -569
  57. package/build/adapters/claude-code-base.d.ts +0 -49
  58. package/build/adapters/claude-code-base.js +0 -113
  59. package/build/adapters/client-map.d.ts +0 -10
  60. package/build/adapters/client-map.js +0 -42
  61. package/build/adapters/codex/config.d.ts +0 -8
  62. package/build/adapters/codex/config.js +0 -8
  63. package/build/adapters/codex/hooks.d.ts +0 -55
  64. package/build/adapters/codex/hooks.js +0 -64
  65. package/build/adapters/codex/index.d.ts +0 -87
  66. package/build/adapters/codex/index.js +0 -992
  67. package/build/adapters/codex/paths.d.ts +0 -1
  68. package/build/adapters/codex/paths.js +0 -12
  69. package/build/adapters/codex/usage.d.ts +0 -107
  70. package/build/adapters/codex/usage.js +0 -227
  71. package/build/adapters/copilot-base.d.ts +0 -94
  72. package/build/adapters/copilot-base.js +0 -297
  73. package/build/adapters/copilot-cli/hooks.d.ts +0 -33
  74. package/build/adapters/copilot-cli/hooks.js +0 -64
  75. package/build/adapters/copilot-cli/index.d.ts +0 -48
  76. package/build/adapters/copilot-cli/index.js +0 -341
  77. package/build/adapters/cursor/config.d.ts +0 -4
  78. package/build/adapters/cursor/config.js +0 -4
  79. package/build/adapters/cursor/hooks.d.ts +0 -55
  80. package/build/adapters/cursor/hooks.js +0 -82
  81. package/build/adapters/cursor/index.d.ts +0 -64
  82. package/build/adapters/cursor/index.js +0 -517
  83. package/build/adapters/detect.d.ts +0 -136
  84. package/build/adapters/detect.js +0 -623
  85. package/build/adapters/gemini-cli/config.d.ts +0 -8
  86. package/build/adapters/gemini-cli/config.js +0 -8
  87. package/build/adapters/gemini-cli/hooks.d.ts +0 -83
  88. package/build/adapters/gemini-cli/hooks.js +0 -115
  89. package/build/adapters/gemini-cli/index.d.ts +0 -80
  90. package/build/adapters/gemini-cli/index.js +0 -483
  91. package/build/adapters/jetbrains-copilot/config.d.ts +0 -8
  92. package/build/adapters/jetbrains-copilot/config.js +0 -8
  93. package/build/adapters/jetbrains-copilot/hooks.d.ts +0 -59
  94. package/build/adapters/jetbrains-copilot/hooks.js +0 -87
  95. package/build/adapters/jetbrains-copilot/index.d.ts +0 -31
  96. package/build/adapters/jetbrains-copilot/index.js +0 -131
  97. package/build/adapters/kimi/config.d.ts +0 -8
  98. package/build/adapters/kimi/config.js +0 -8
  99. package/build/adapters/kimi/hooks.d.ts +0 -28
  100. package/build/adapters/kimi/hooks.js +0 -34
  101. package/build/adapters/kimi/index.d.ts +0 -66
  102. package/build/adapters/kimi/index.js +0 -537
  103. package/build/adapters/kimi/paths.d.ts +0 -21
  104. package/build/adapters/kimi/paths.js +0 -52
  105. package/build/adapters/kimi/usage.d.ts +0 -82
  106. package/build/adapters/kimi/usage.js +0 -217
  107. package/build/adapters/kiro/hooks.d.ts +0 -61
  108. package/build/adapters/kiro/hooks.js +0 -94
  109. package/build/adapters/kiro/index.d.ts +0 -61
  110. package/build/adapters/kiro/index.js +0 -301
  111. package/build/adapters/omp/index.d.ts +0 -65
  112. package/build/adapters/omp/index.js +0 -182
  113. package/build/adapters/omp/plugin.d.ts +0 -81
  114. package/build/adapters/omp/plugin.js +0 -331
  115. package/build/adapters/omp/usage.d.ts +0 -49
  116. package/build/adapters/omp/usage.js +0 -110
  117. package/build/adapters/openclaw/config.d.ts +0 -8
  118. package/build/adapters/openclaw/config.js +0 -8
  119. package/build/adapters/openclaw/hooks.d.ts +0 -50
  120. package/build/adapters/openclaw/hooks.js +0 -61
  121. package/build/adapters/openclaw/index.d.ts +0 -74
  122. package/build/adapters/openclaw/index.js +0 -439
  123. package/build/adapters/openclaw/mcp-tools.d.ts +0 -54
  124. package/build/adapters/openclaw/mcp-tools.js +0 -207
  125. package/build/adapters/openclaw/plugin.d.ts +0 -141
  126. package/build/adapters/openclaw/plugin.js +0 -818
  127. package/build/adapters/openclaw/session-db.d.ts +0 -55
  128. package/build/adapters/openclaw/session-db.js +0 -88
  129. package/build/adapters/openclaw/usage.d.ts +0 -34
  130. package/build/adapters/openclaw/usage.js +0 -52
  131. package/build/adapters/openclaw/workspace-router.d.ts +0 -29
  132. package/build/adapters/openclaw/workspace-router.js +0 -64
  133. package/build/adapters/opencode/config.d.ts +0 -8
  134. package/build/adapters/opencode/config.js +0 -8
  135. package/build/adapters/opencode/hooks.d.ts +0 -38
  136. package/build/adapters/opencode/hooks.js +0 -50
  137. package/build/adapters/opencode/index.d.ts +0 -67
  138. package/build/adapters/opencode/index.js +0 -463
  139. package/build/adapters/opencode/plugin.d.ts +0 -184
  140. package/build/adapters/opencode/plugin.js +0 -558
  141. package/build/adapters/opencode/zod3tov4.d.ts +0 -1
  142. package/build/adapters/opencode/zod3tov4.js +0 -132
  143. package/build/adapters/pi/extension.d.ts +0 -81
  144. package/build/adapters/pi/extension.js +0 -861
  145. package/build/adapters/pi/index.d.ts +0 -57
  146. package/build/adapters/pi/index.js +0 -173
  147. package/build/adapters/pi/mcp-bridge.d.ts +0 -268
  148. package/build/adapters/pi/mcp-bridge.js +0 -894
  149. package/build/adapters/qwen-code/hooks.d.ts +0 -26
  150. package/build/adapters/qwen-code/hooks.js +0 -29
  151. package/build/adapters/qwen-code/index.d.ts +0 -40
  152. package/build/adapters/qwen-code/index.js +0 -361
  153. package/build/adapters/qwen-code/usage.d.ts +0 -90
  154. package/build/adapters/qwen-code/usage.js +0 -222
  155. package/build/adapters/types.d.ts +0 -360
  156. package/build/adapters/types.js +0 -118
  157. package/build/adapters/vscode-copilot/config.d.ts +0 -8
  158. package/build/adapters/vscode-copilot/config.js +0 -8
  159. package/build/adapters/vscode-copilot/hooks.d.ts +0 -71
  160. package/build/adapters/vscode-copilot/hooks.js +0 -98
  161. package/build/adapters/vscode-copilot/index.d.ts +0 -32
  162. package/build/adapters/vscode-copilot/index.js +0 -222
  163. package/build/adapters/zed/index.d.ts +0 -40
  164. package/build/adapters/zed/index.js +0 -163
  165. package/build/cli.d.ts +0 -34
  166. package/build/cli.js +0 -1827
  167. package/build/db-base.d.ts +0 -179
  168. package/build/db-base.js +0 -569
  169. package/build/executor.d.ts +0 -72
  170. package/build/executor.js +0 -678
  171. package/build/exit-classify.d.ts +0 -19
  172. package/build/exit-classify.js +0 -12
  173. package/build/fetch-cache.d.ts +0 -13
  174. package/build/fetch-cache.js +0 -15
  175. package/build/lifecycle.d.ts +0 -124
  176. package/build/lifecycle.js +0 -278
  177. package/build/runPool.d.ts +0 -36
  178. package/build/runPool.js +0 -51
  179. package/build/runtime.d.ts +0 -71
  180. package/build/runtime.js +0 -659
  181. package/build/search/auto-memory.d.ts +0 -47
  182. package/build/search/auto-memory.js +0 -170
  183. package/build/search/ctx-search-schema.d.ts +0 -90
  184. package/build/search/ctx-search-schema.js +0 -135
  185. package/build/search/flood-guard.d.ts +0 -57
  186. package/build/search/flood-guard.js +0 -80
  187. package/build/search/unified.d.ts +0 -56
  188. package/build/search/unified.js +0 -104
  189. package/build/security.d.ts +0 -206
  190. package/build/security.js +0 -780
  191. package/build/server.d.ts +0 -184
  192. package/build/server.js +0 -4563
  193. package/build/session/analytics.d.ts +0 -773
  194. package/build/session/analytics.js +0 -2420
  195. package/build/session/db.d.ts +0 -468
  196. package/build/session/db.js +0 -1308
  197. package/build/session/error-classifier.d.ts +0 -87
  198. package/build/session/error-classifier.js +0 -303
  199. package/build/session/event-emit.d.ts +0 -48
  200. package/build/session/event-emit.js +0 -101
  201. package/build/session/extract.d.ts +0 -333
  202. package/build/session/extract.js +0 -2688
  203. package/build/session/model-prices.json +0 -429
  204. package/build/session/persist-tool-calls.d.ts +0 -54
  205. package/build/session/persist-tool-calls.js +0 -105
  206. package/build/session/pricing.d.ts +0 -64
  207. package/build/session/pricing.js +0 -151
  208. package/build/session/project-attribution.d.ts +0 -73
  209. package/build/session/project-attribution.js +0 -245
  210. package/build/session/purge.d.ts +0 -138
  211. package/build/session/purge.js +0 -240
  212. package/build/session/retrieval-marker.d.ts +0 -39
  213. package/build/session/retrieval-marker.js +0 -65
  214. package/build/session/snapshot.d.ts +0 -46
  215. package/build/session/snapshot.js +0 -532
  216. package/build/store-directory.d.ts +0 -56
  217. package/build/store-directory.js +0 -254
  218. package/build/store.d.ts +0 -147
  219. package/build/store.js +0 -1714
  220. package/build/truncate.d.ts +0 -57
  221. package/build/truncate.js +0 -142
  222. package/build/types.d.ts +0 -117
  223. package/build/types.js +0 -20
  224. package/build/util/claude-config.d.ts +0 -32
  225. package/build/util/claude-config.js +0 -84
  226. package/build/util/hook-config.d.ts +0 -27
  227. package/build/util/hook-config.js +0 -76
  228. package/build/util/jsonc.d.ts +0 -14
  229. package/build/util/jsonc.js +0 -104
  230. package/build/util/plugin-cache-integrity.d.ts +0 -51
  231. package/build/util/plugin-cache-integrity.js +0 -146
  232. package/build/util/project-dir.d.ts +0 -149
  233. package/build/util/project-dir.js +0 -340
  234. package/build/util/sibling-mcp.d.ts +0 -79
  235. package/build/util/sibling-mcp.js +0 -181
  236. package/cli.bundle.mjs +0 -1236
  237. package/configs/antigravity/GEMINI.md +0 -68
  238. package/configs/antigravity/mcp_config.json +0 -7
  239. package/configs/antigravity-cli/hooks/hooks.json +0 -37
  240. package/configs/antigravity-cli/hooks.json +0 -37
  241. package/configs/antigravity-cli/mcp_config.json +0 -10
  242. package/configs/antigravity-cli/plugin.json +0 -14
  243. package/configs/antigravity-cli/rules/context-mode.md +0 -77
  244. package/configs/antigravity-cli/skills/context-mode/SKILL.md +0 -77
  245. package/configs/claude-code/CLAUDE.md +0 -91
  246. package/configs/codex/AGENTS.md +0 -99
  247. package/configs/codex/config.toml +0 -8
  248. package/configs/codex/hooks.json +0 -47
  249. package/configs/copilot-cli/.github/plugin/plugin.json +0 -23
  250. package/configs/copilot-cli/.mcp.json +0 -12
  251. package/configs/copilot-cli/README.md +0 -47
  252. package/configs/copilot-cli/hooks.json +0 -41
  253. package/configs/copilot-cli/skills/context-mode/SKILL.md +0 -38
  254. package/configs/cursor/context-mode.mdc +0 -76
  255. package/configs/cursor/hooks.json +0 -21
  256. package/configs/cursor/mcp.json +0 -7
  257. package/configs/gemini-cli/GEMINI.md +0 -88
  258. package/configs/gemini-cli/mcp.json +0 -7
  259. package/configs/gemini-cli/settings.json +0 -60
  260. package/configs/jetbrains-copilot/copilot-instructions.md +0 -80
  261. package/configs/jetbrains-copilot/hooks.json +0 -16
  262. package/configs/jetbrains-copilot/mcp.json +0 -7
  263. package/configs/kilo/AGENTS.md +0 -84
  264. package/configs/kilo/kilo.json +0 -6
  265. package/configs/kimi/hooks.json +0 -54
  266. package/configs/kiro/KIRO.md +0 -84
  267. package/configs/kiro/agent.json +0 -18
  268. package/configs/kiro/mcp.json +0 -7
  269. package/configs/omp/SYSTEM.md +0 -85
  270. package/configs/omp/mcp.json +0 -7
  271. package/configs/openclaw/AGENTS.md +0 -87
  272. package/configs/openclaw/openclaw.json +0 -13
  273. package/configs/opencode/AGENTS.md +0 -84
  274. package/configs/opencode/opencode.json +0 -6
  275. package/configs/pi/AGENTS.md +0 -3
  276. package/configs/qwen-code/QWEN.md +0 -91
  277. package/configs/vscode-copilot/copilot-instructions.md +0 -80
  278. package/configs/vscode-copilot/hooks.json +0 -16
  279. package/configs/vscode-copilot/mcp.json +0 -7
  280. package/configs/zed/AGENTS.md +0 -68
  281. package/hooks/antigravity-cli/payload.mjs +0 -98
  282. package/hooks/antigravity-cli/posttooluse.mjs +0 -138
  283. package/hooks/antigravity-cli/pretooluse.mjs +0 -78
  284. package/hooks/antigravity-cli/stop.mjs +0 -58
  285. package/hooks/auto-injection.mjs +0 -102
  286. package/hooks/cache-heal-utils.mjs +0 -379
  287. package/hooks/codex/platform.mjs +0 -1
  288. package/hooks/codex/posttooluse.mjs +0 -66
  289. package/hooks/codex/precompact.mjs +0 -70
  290. package/hooks/codex/pretooluse.mjs +0 -42
  291. package/hooks/codex/sessionstart.mjs +0 -121
  292. package/hooks/codex/stop.mjs +0 -138
  293. package/hooks/codex/userpromptsubmit.mjs +0 -75
  294. package/hooks/copilot-cli/posttooluse.mjs +0 -79
  295. package/hooks/copilot-cli/precompact.mjs +0 -66
  296. package/hooks/copilot-cli/pretooluse.mjs +0 -41
  297. package/hooks/copilot-cli/sessionstart.mjs +0 -121
  298. package/hooks/copilot-cli/stop.mjs +0 -59
  299. package/hooks/copilot-cli/userpromptsubmit.mjs +0 -77
  300. package/hooks/core/codex-caps.mjs +0 -112
  301. package/hooks/core/formatters.mjs +0 -356
  302. package/hooks/core/mcp-ready.mjs +0 -109
  303. package/hooks/core/platform-detect.mjs +0 -49
  304. package/hooks/core/routing.mjs +0 -1017
  305. package/hooks/core/stdin.mjs +0 -90
  306. package/hooks/core/tool-naming.mjs +0 -57
  307. package/hooks/cursor/afteragentresponse.mjs +0 -74
  308. package/hooks/cursor/hooks.json +0 -31
  309. package/hooks/cursor/posttooluse.mjs +0 -72
  310. package/hooks/cursor/pretooluse.mjs +0 -26
  311. package/hooks/cursor/sessionstart.mjs +0 -97
  312. package/hooks/cursor/stop.mjs +0 -48
  313. package/hooks/ensure-deps.mjs +0 -254
  314. package/hooks/formatters/claude-code.mjs +0 -113
  315. package/hooks/formatters/cursor.mjs +0 -37
  316. package/hooks/formatters/gemini-cli.mjs +0 -55
  317. package/hooks/formatters/vscode-copilot.mjs +0 -55
  318. package/hooks/gemini-cli/aftermodel.mjs +0 -70
  319. package/hooks/gemini-cli/aftertool.mjs +0 -61
  320. package/hooks/gemini-cli/beforeagent.mjs +0 -99
  321. package/hooks/gemini-cli/beforetool.mjs +0 -27
  322. package/hooks/gemini-cli/precompress.mjs +0 -55
  323. package/hooks/gemini-cli/sessionstart.mjs +0 -137
  324. package/hooks/heal-partial-install.mjs +0 -712
  325. package/hooks/jetbrains-copilot/posttooluse.mjs +0 -61
  326. package/hooks/jetbrains-copilot/precompact.mjs +0 -55
  327. package/hooks/jetbrains-copilot/pretooluse.mjs +0 -27
  328. package/hooks/jetbrains-copilot/sessionstart.mjs +0 -124
  329. package/hooks/kimi/platform.mjs +0 -1
  330. package/hooks/kimi/posttooluse.mjs +0 -72
  331. package/hooks/kimi/precompact.mjs +0 -80
  332. package/hooks/kimi/pretooluse.mjs +0 -42
  333. package/hooks/kimi/sessionend.mjs +0 -61
  334. package/hooks/kimi/sessionstart.mjs +0 -113
  335. package/hooks/kimi/stop.mjs +0 -132
  336. package/hooks/kimi/userpromptsubmit.mjs +0 -90
  337. package/hooks/kiro/agentspawn.mjs +0 -97
  338. package/hooks/kiro/posttooluse.mjs +0 -51
  339. package/hooks/kiro/pretooluse.mjs +0 -64
  340. package/hooks/kiro/userpromptsubmit.mjs +0 -88
  341. package/hooks/normalize-hooks.mjs +0 -323
  342. package/hooks/platform-bridge.mjs +0 -340
  343. package/hooks/posttooluse.mjs +0 -225
  344. package/hooks/precompact.mjs +0 -100
  345. package/hooks/pretooluse.mjs +0 -227
  346. package/hooks/qwen-code/platform.mjs +0 -1
  347. package/hooks/qwen-code/stop.mjs +0 -168
  348. package/hooks/routing-block.mjs +0 -105
  349. package/hooks/run-hook.mjs +0 -95
  350. package/hooks/security.bundle.mjs +0 -2
  351. package/hooks/session-attribution.bundle.mjs +0 -1
  352. package/hooks/session-db.bundle.mjs +0 -144
  353. package/hooks/session-directive.mjs +0 -520
  354. package/hooks/session-extract.bundle.mjs +0 -3
  355. package/hooks/session-helpers.mjs +0 -428
  356. package/hooks/session-loaders.mjs +0 -448
  357. package/hooks/session-snapshot.bundle.mjs +0 -32
  358. package/hooks/sessionstart.mjs +0 -464
  359. package/hooks/stop.mjs +0 -82
  360. package/hooks/suppress-stderr.mjs +0 -25
  361. package/hooks/userpromptsubmit.mjs +0 -108
  362. package/hooks/vscode-copilot/posttooluse.mjs +0 -61
  363. package/hooks/vscode-copilot/precompact.mjs +0 -55
  364. package/hooks/vscode-copilot/pretooluse.mjs +0 -27
  365. package/hooks/vscode-copilot/sessionstart.mjs +0 -129
  366. package/openclaw.plugin.json +0 -38
  367. package/scripts/heal-better-sqlite3.mjs +0 -430
  368. package/scripts/heal-installed-plugins.mjs +0 -598
  369. package/scripts/plugin-cache-integrity.mjs +0 -248
  370. package/scripts/postinstall.mjs +0 -384
  371. package/server.bundle.mjs +0 -1162
  372. package/skills/.ignore +0 -7
  373. package/skills/context-mode/SKILL.md +0 -300
  374. package/skills/context-mode/references/anti-patterns.md +0 -283
  375. package/skills/context-mode/references/patterns-javascript.md +0 -298
  376. package/skills/context-mode/references/patterns-python.md +0 -304
  377. package/skills/context-mode/references/patterns-shell.md +0 -277
  378. package/skills/ctx-index/SKILL.md +0 -46
  379. package/skills/ctx-insight/SKILL.md +0 -24
  380. package/skills/ctx-purge/SKILL.md +0 -49
  381. package/skills/ctx-search/SKILL.md +0 -35
  382. 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 {};