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