@mxalbert/context-mode 2.0.0

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 (365) hide show
  1. package/.claude-plugin/marketplace.json +33 -0
  2. package/.claude-plugin/plugin.json +31 -0
  3. package/.codex-plugin/hooks.json +65 -0
  4. package/.codex-plugin/mcp.json +13 -0
  5. package/.codex-plugin/plugin.json +31 -0
  6. package/.openclaw-plugin/index.ts +12 -0
  7. package/.openclaw-plugin/openclaw.plugin.json +38 -0
  8. package/.openclaw-plugin/package.json +28 -0
  9. package/LICENSE +94 -0
  10. package/README.md +1619 -0
  11. package/bin/statusline.mjs +378 -0
  12. package/build/adapters/antigravity/index.d.ts +51 -0
  13. package/build/adapters/antigravity/index.js +169 -0
  14. package/build/adapters/antigravity-cli/index.d.ts +51 -0
  15. package/build/adapters/antigravity-cli/index.js +342 -0
  16. package/build/adapters/base.d.ts +92 -0
  17. package/build/adapters/base.js +135 -0
  18. package/build/adapters/claude-code/config.d.ts +8 -0
  19. package/build/adapters/claude-code/config.js +8 -0
  20. package/build/adapters/claude-code/hooks.d.ts +106 -0
  21. package/build/adapters/claude-code/hooks.js +183 -0
  22. package/build/adapters/claude-code/index.d.ts +80 -0
  23. package/build/adapters/claude-code/index.js +569 -0
  24. package/build/adapters/claude-code-base.d.ts +49 -0
  25. package/build/adapters/claude-code-base.js +113 -0
  26. package/build/adapters/client-map.d.ts +10 -0
  27. package/build/adapters/client-map.js +42 -0
  28. package/build/adapters/codex/config.d.ts +8 -0
  29. package/build/adapters/codex/config.js +8 -0
  30. package/build/adapters/codex/hooks.d.ts +55 -0
  31. package/build/adapters/codex/hooks.js +64 -0
  32. package/build/adapters/codex/index.d.ts +87 -0
  33. package/build/adapters/codex/index.js +995 -0
  34. package/build/adapters/codex/paths.d.ts +1 -0
  35. package/build/adapters/codex/paths.js +12 -0
  36. package/build/adapters/codex/usage.d.ts +107 -0
  37. package/build/adapters/codex/usage.js +227 -0
  38. package/build/adapters/copilot-base.d.ts +94 -0
  39. package/build/adapters/copilot-base.js +297 -0
  40. package/build/adapters/copilot-cli/hooks.d.ts +33 -0
  41. package/build/adapters/copilot-cli/hooks.js +64 -0
  42. package/build/adapters/copilot-cli/index.d.ts +48 -0
  43. package/build/adapters/copilot-cli/index.js +341 -0
  44. package/build/adapters/cursor/config.d.ts +4 -0
  45. package/build/adapters/cursor/config.js +4 -0
  46. package/build/adapters/cursor/hooks.d.ts +55 -0
  47. package/build/adapters/cursor/hooks.js +82 -0
  48. package/build/adapters/cursor/index.d.ts +64 -0
  49. package/build/adapters/cursor/index.js +517 -0
  50. package/build/adapters/detect.d.ts +136 -0
  51. package/build/adapters/detect.js +623 -0
  52. package/build/adapters/gemini-cli/config.d.ts +8 -0
  53. package/build/adapters/gemini-cli/config.js +8 -0
  54. package/build/adapters/gemini-cli/hooks.d.ts +83 -0
  55. package/build/adapters/gemini-cli/hooks.js +115 -0
  56. package/build/adapters/gemini-cli/index.d.ts +80 -0
  57. package/build/adapters/gemini-cli/index.js +483 -0
  58. package/build/adapters/jetbrains-copilot/config.d.ts +8 -0
  59. package/build/adapters/jetbrains-copilot/config.js +8 -0
  60. package/build/adapters/jetbrains-copilot/hooks.d.ts +59 -0
  61. package/build/adapters/jetbrains-copilot/hooks.js +87 -0
  62. package/build/adapters/jetbrains-copilot/index.d.ts +31 -0
  63. package/build/adapters/jetbrains-copilot/index.js +131 -0
  64. package/build/adapters/kimi/config.d.ts +8 -0
  65. package/build/adapters/kimi/config.js +8 -0
  66. package/build/adapters/kimi/hooks.d.ts +28 -0
  67. package/build/adapters/kimi/hooks.js +34 -0
  68. package/build/adapters/kimi/index.d.ts +66 -0
  69. package/build/adapters/kimi/index.js +537 -0
  70. package/build/adapters/kimi/paths.d.ts +21 -0
  71. package/build/adapters/kimi/paths.js +52 -0
  72. package/build/adapters/kimi/usage.d.ts +82 -0
  73. package/build/adapters/kimi/usage.js +217 -0
  74. package/build/adapters/kiro/hooks.d.ts +61 -0
  75. package/build/adapters/kiro/hooks.js +94 -0
  76. package/build/adapters/kiro/index.d.ts +61 -0
  77. package/build/adapters/kiro/index.js +301 -0
  78. package/build/adapters/omp/index.d.ts +65 -0
  79. package/build/adapters/omp/index.js +182 -0
  80. package/build/adapters/omp/plugin.d.ts +81 -0
  81. package/build/adapters/omp/plugin.js +331 -0
  82. package/build/adapters/omp/usage.d.ts +49 -0
  83. package/build/adapters/omp/usage.js +110 -0
  84. package/build/adapters/openclaw/config.d.ts +8 -0
  85. package/build/adapters/openclaw/config.js +8 -0
  86. package/build/adapters/openclaw/hooks.d.ts +50 -0
  87. package/build/adapters/openclaw/hooks.js +61 -0
  88. package/build/adapters/openclaw/index.d.ts +74 -0
  89. package/build/adapters/openclaw/index.js +439 -0
  90. package/build/adapters/openclaw/mcp-tools.d.ts +54 -0
  91. package/build/adapters/openclaw/mcp-tools.js +207 -0
  92. package/build/adapters/openclaw/plugin.d.ts +141 -0
  93. package/build/adapters/openclaw/plugin.js +818 -0
  94. package/build/adapters/openclaw/session-db.d.ts +55 -0
  95. package/build/adapters/openclaw/session-db.js +88 -0
  96. package/build/adapters/openclaw/usage.d.ts +34 -0
  97. package/build/adapters/openclaw/usage.js +52 -0
  98. package/build/adapters/openclaw/workspace-router.d.ts +29 -0
  99. package/build/adapters/openclaw/workspace-router.js +64 -0
  100. package/build/adapters/opencode/config.d.ts +8 -0
  101. package/build/adapters/opencode/config.js +8 -0
  102. package/build/adapters/opencode/hooks.d.ts +38 -0
  103. package/build/adapters/opencode/hooks.js +50 -0
  104. package/build/adapters/opencode/index.d.ts +144 -0
  105. package/build/adapters/opencode/index.js +638 -0
  106. package/build/adapters/opencode/plugin.d.ts +249 -0
  107. package/build/adapters/opencode/plugin.js +1536 -0
  108. package/build/adapters/opencode/v2.d.ts +117 -0
  109. package/build/adapters/opencode/v2.js +224 -0
  110. package/build/adapters/opencode/zod3tov4.d.ts +1 -0
  111. package/build/adapters/opencode/zod3tov4.js +132 -0
  112. package/build/adapters/pi/extension.d.ts +81 -0
  113. package/build/adapters/pi/extension.js +861 -0
  114. package/build/adapters/pi/index.d.ts +57 -0
  115. package/build/adapters/pi/index.js +173 -0
  116. package/build/adapters/pi/mcp-bridge.d.ts +268 -0
  117. package/build/adapters/pi/mcp-bridge.js +894 -0
  118. package/build/adapters/qwen-code/hooks.d.ts +26 -0
  119. package/build/adapters/qwen-code/hooks.js +29 -0
  120. package/build/adapters/qwen-code/index.d.ts +40 -0
  121. package/build/adapters/qwen-code/index.js +361 -0
  122. package/build/adapters/qwen-code/usage.d.ts +90 -0
  123. package/build/adapters/qwen-code/usage.js +222 -0
  124. package/build/adapters/types.d.ts +360 -0
  125. package/build/adapters/types.js +118 -0
  126. package/build/adapters/vscode-copilot/config.d.ts +8 -0
  127. package/build/adapters/vscode-copilot/config.js +8 -0
  128. package/build/adapters/vscode-copilot/hooks.d.ts +71 -0
  129. package/build/adapters/vscode-copilot/hooks.js +98 -0
  130. package/build/adapters/vscode-copilot/index.d.ts +32 -0
  131. package/build/adapters/vscode-copilot/index.js +222 -0
  132. package/build/adapters/zed/index.d.ts +40 -0
  133. package/build/adapters/zed/index.js +163 -0
  134. package/build/cli.d.ts +34 -0
  135. package/build/cli.js +1828 -0
  136. package/build/db-base.d.ts +250 -0
  137. package/build/db-base.js +756 -0
  138. package/build/executor.d.ts +72 -0
  139. package/build/executor.js +678 -0
  140. package/build/exit-classify.d.ts +19 -0
  141. package/build/exit-classify.js +12 -0
  142. package/build/fetch/blocks.d.ts +145 -0
  143. package/build/fetch/blocks.js +244 -0
  144. package/build/fetch/extract.d.ts +68 -0
  145. package/build/fetch/extract.js +123 -0
  146. package/build/fetch/page-store.d.ts +66 -0
  147. package/build/fetch/page-store.js +174 -0
  148. package/build/fetch-cache.d.ts +13 -0
  149. package/build/fetch-cache.js +15 -0
  150. package/build/lifecycle.d.ts +124 -0
  151. package/build/lifecycle.js +278 -0
  152. package/build/package-identity.d.ts +26 -0
  153. package/build/package-identity.js +28 -0
  154. package/build/runPool.d.ts +36 -0
  155. package/build/runPool.js +51 -0
  156. package/build/runtime.d.ts +71 -0
  157. package/build/runtime.js +659 -0
  158. package/build/search/auto-memory.d.ts +47 -0
  159. package/build/search/auto-memory.js +170 -0
  160. package/build/search/ctx-search-schema.d.ts +90 -0
  161. package/build/search/ctx-search-schema.js +135 -0
  162. package/build/search/flood-guard.d.ts +57 -0
  163. package/build/search/flood-guard.js +80 -0
  164. package/build/search/unified.d.ts +56 -0
  165. package/build/search/unified.js +104 -0
  166. package/build/security.d.ts +206 -0
  167. package/build/security.js +780 -0
  168. package/build/server.d.ts +240 -0
  169. package/build/server.js +5034 -0
  170. package/build/session/analytics.d.ts +773 -0
  171. package/build/session/analytics.js +2420 -0
  172. package/build/session/db.d.ts +468 -0
  173. package/build/session/db.js +1330 -0
  174. package/build/session/error-classifier.d.ts +87 -0
  175. package/build/session/error-classifier.js +303 -0
  176. package/build/session/event-emit.d.ts +48 -0
  177. package/build/session/event-emit.js +101 -0
  178. package/build/session/extract.d.ts +333 -0
  179. package/build/session/extract.js +2688 -0
  180. package/build/session/model-prices.json +429 -0
  181. package/build/session/persist-tool-calls.d.ts +54 -0
  182. package/build/session/persist-tool-calls.js +105 -0
  183. package/build/session/pricing.d.ts +64 -0
  184. package/build/session/pricing.js +151 -0
  185. package/build/session/project-attribution.d.ts +73 -0
  186. package/build/session/project-attribution.js +245 -0
  187. package/build/session/purge.d.ts +138 -0
  188. package/build/session/purge.js +240 -0
  189. package/build/session/retrieval-marker.d.ts +39 -0
  190. package/build/session/retrieval-marker.js +65 -0
  191. package/build/session/snapshot.d.ts +46 -0
  192. package/build/session/snapshot.js +532 -0
  193. package/build/store-directory.d.ts +56 -0
  194. package/build/store-directory.js +254 -0
  195. package/build/store.d.ts +147 -0
  196. package/build/store.js +1714 -0
  197. package/build/truncate.d.ts +57 -0
  198. package/build/truncate.js +142 -0
  199. package/build/types.d.ts +117 -0
  200. package/build/types.js +20 -0
  201. package/build/util/claude-config.d.ts +32 -0
  202. package/build/util/claude-config.js +84 -0
  203. package/build/util/hook-config.d.ts +27 -0
  204. package/build/util/hook-config.js +76 -0
  205. package/build/util/jsonc.d.ts +14 -0
  206. package/build/util/jsonc.js +104 -0
  207. package/build/util/plugin-cache-integrity.d.ts +51 -0
  208. package/build/util/plugin-cache-integrity.js +146 -0
  209. package/build/util/project-dir.d.ts +149 -0
  210. package/build/util/project-dir.js +340 -0
  211. package/build/util/sibling-mcp.d.ts +79 -0
  212. package/build/util/sibling-mcp.js +181 -0
  213. package/cli.bundle.mjs +1495 -0
  214. package/configs/antigravity/GEMINI.md +68 -0
  215. package/configs/antigravity/mcp_config.json +7 -0
  216. package/configs/antigravity-cli/hooks/hooks.json +37 -0
  217. package/configs/antigravity-cli/hooks.json +37 -0
  218. package/configs/antigravity-cli/mcp_config.json +10 -0
  219. package/configs/antigravity-cli/plugin.json +14 -0
  220. package/configs/antigravity-cli/rules/context-mode.md +77 -0
  221. package/configs/antigravity-cli/skills/context-mode/SKILL.md +77 -0
  222. package/configs/claude-code/CLAUDE.md +91 -0
  223. package/configs/codex/AGENTS.md +99 -0
  224. package/configs/codex/config.toml +8 -0
  225. package/configs/codex/hooks.json +47 -0
  226. package/configs/copilot-cli/.github/plugin/plugin.json +23 -0
  227. package/configs/copilot-cli/.mcp.json +12 -0
  228. package/configs/copilot-cli/README.md +47 -0
  229. package/configs/copilot-cli/hooks.json +41 -0
  230. package/configs/copilot-cli/skills/context-mode/SKILL.md +38 -0
  231. package/configs/cursor/context-mode.mdc +76 -0
  232. package/configs/cursor/hooks.json +21 -0
  233. package/configs/cursor/mcp.json +7 -0
  234. package/configs/gemini-cli/GEMINI.md +88 -0
  235. package/configs/gemini-cli/mcp.json +7 -0
  236. package/configs/gemini-cli/settings.json +60 -0
  237. package/configs/jetbrains-copilot/copilot-instructions.md +80 -0
  238. package/configs/jetbrains-copilot/hooks.json +16 -0
  239. package/configs/jetbrains-copilot/mcp.json +7 -0
  240. package/configs/kilo/AGENTS.md +84 -0
  241. package/configs/kilo/kilo.json +6 -0
  242. package/configs/kimi/hooks.json +54 -0
  243. package/configs/kiro/KIRO.md +84 -0
  244. package/configs/kiro/agent.json +18 -0
  245. package/configs/kiro/mcp.json +7 -0
  246. package/configs/omp/SYSTEM.md +85 -0
  247. package/configs/omp/mcp.json +7 -0
  248. package/configs/openclaw/AGENTS.md +87 -0
  249. package/configs/openclaw/openclaw.json +13 -0
  250. package/configs/opencode/AGENTS.md +84 -0
  251. package/configs/opencode/opencode.json +6 -0
  252. package/configs/pi/AGENTS.md +3 -0
  253. package/configs/qwen-code/QWEN.md +91 -0
  254. package/configs/vscode-copilot/copilot-instructions.md +80 -0
  255. package/configs/vscode-copilot/hooks.json +16 -0
  256. package/configs/vscode-copilot/mcp.json +7 -0
  257. package/configs/zed/AGENTS.md +68 -0
  258. package/hooks/antigravity-cli/payload.mjs +98 -0
  259. package/hooks/antigravity-cli/posttooluse.mjs +138 -0
  260. package/hooks/antigravity-cli/pretooluse.mjs +78 -0
  261. package/hooks/antigravity-cli/stop.mjs +58 -0
  262. package/hooks/auto-injection.mjs +102 -0
  263. package/hooks/cache-heal-utils.mjs +379 -0
  264. package/hooks/codex/platform.mjs +1 -0
  265. package/hooks/codex/posttooluse.mjs +66 -0
  266. package/hooks/codex/precompact.mjs +70 -0
  267. package/hooks/codex/pretooluse.mjs +42 -0
  268. package/hooks/codex/sessionstart.mjs +121 -0
  269. package/hooks/codex/stop.mjs +138 -0
  270. package/hooks/codex/userpromptsubmit.mjs +75 -0
  271. package/hooks/copilot-cli/posttooluse.mjs +79 -0
  272. package/hooks/copilot-cli/precompact.mjs +66 -0
  273. package/hooks/copilot-cli/pretooluse.mjs +41 -0
  274. package/hooks/copilot-cli/sessionstart.mjs +121 -0
  275. package/hooks/copilot-cli/stop.mjs +59 -0
  276. package/hooks/copilot-cli/userpromptsubmit.mjs +77 -0
  277. package/hooks/core/codex-caps.mjs +112 -0
  278. package/hooks/core/formatters.mjs +356 -0
  279. package/hooks/core/mcp-ready.mjs +109 -0
  280. package/hooks/core/platform-detect.mjs +49 -0
  281. package/hooks/core/routing.mjs +1050 -0
  282. package/hooks/core/stdin.mjs +90 -0
  283. package/hooks/core/tool-naming.mjs +57 -0
  284. package/hooks/cursor/afteragentresponse.mjs +74 -0
  285. package/hooks/cursor/hooks.json +31 -0
  286. package/hooks/cursor/posttooluse.mjs +72 -0
  287. package/hooks/cursor/pretooluse.mjs +26 -0
  288. package/hooks/cursor/sessionstart.mjs +97 -0
  289. package/hooks/cursor/stop.mjs +48 -0
  290. package/hooks/ensure-deps.mjs +254 -0
  291. package/hooks/formatters/claude-code.mjs +113 -0
  292. package/hooks/formatters/cursor.mjs +37 -0
  293. package/hooks/formatters/gemini-cli.mjs +55 -0
  294. package/hooks/formatters/vscode-copilot.mjs +55 -0
  295. package/hooks/gemini-cli/aftermodel.mjs +70 -0
  296. package/hooks/gemini-cli/aftertool.mjs +61 -0
  297. package/hooks/gemini-cli/beforeagent.mjs +99 -0
  298. package/hooks/gemini-cli/beforetool.mjs +27 -0
  299. package/hooks/gemini-cli/precompress.mjs +55 -0
  300. package/hooks/gemini-cli/sessionstart.mjs +137 -0
  301. package/hooks/heal-partial-install.mjs +712 -0
  302. package/hooks/hooks.json +143 -0
  303. package/hooks/jetbrains-copilot/posttooluse.mjs +61 -0
  304. package/hooks/jetbrains-copilot/precompact.mjs +55 -0
  305. package/hooks/jetbrains-copilot/pretooluse.mjs +27 -0
  306. package/hooks/jetbrains-copilot/sessionstart.mjs +124 -0
  307. package/hooks/kimi/platform.mjs +1 -0
  308. package/hooks/kimi/posttooluse.mjs +72 -0
  309. package/hooks/kimi/precompact.mjs +80 -0
  310. package/hooks/kimi/pretooluse.mjs +42 -0
  311. package/hooks/kimi/sessionend.mjs +61 -0
  312. package/hooks/kimi/sessionstart.mjs +113 -0
  313. package/hooks/kimi/stop.mjs +132 -0
  314. package/hooks/kimi/userpromptsubmit.mjs +90 -0
  315. package/hooks/kiro/agentspawn.mjs +97 -0
  316. package/hooks/kiro/posttooluse.mjs +51 -0
  317. package/hooks/kiro/pretooluse.mjs +64 -0
  318. package/hooks/kiro/userpromptsubmit.mjs +88 -0
  319. package/hooks/normalize-hooks.mjs +323 -0
  320. package/hooks/platform-bridge.mjs +340 -0
  321. package/hooks/posttooluse.mjs +225 -0
  322. package/hooks/precompact.mjs +100 -0
  323. package/hooks/pretooluse.mjs +227 -0
  324. package/hooks/qwen-code/platform.mjs +1 -0
  325. package/hooks/qwen-code/stop.mjs +168 -0
  326. package/hooks/routing-block.mjs +105 -0
  327. package/hooks/run-hook.mjs +95 -0
  328. package/hooks/security.bundle.mjs +2 -0
  329. package/hooks/session-attribution.bundle.mjs +1 -0
  330. package/hooks/session-db.bundle.mjs +145 -0
  331. package/hooks/session-directive.mjs +520 -0
  332. package/hooks/session-extract.bundle.mjs +3 -0
  333. package/hooks/session-helpers.mjs +428 -0
  334. package/hooks/session-loaders.mjs +448 -0
  335. package/hooks/session-snapshot.bundle.mjs +32 -0
  336. package/hooks/sessionstart.mjs +464 -0
  337. package/hooks/stop.mjs +82 -0
  338. package/hooks/suppress-stderr.mjs +25 -0
  339. package/hooks/userpromptsubmit.mjs +108 -0
  340. package/hooks/vscode-copilot/posttooluse.mjs +61 -0
  341. package/hooks/vscode-copilot/precompact.mjs +55 -0
  342. package/hooks/vscode-copilot/pretooluse.mjs +27 -0
  343. package/hooks/vscode-copilot/sessionstart.mjs +129 -0
  344. package/openclaw.plugin.json +38 -0
  345. package/package.json +132 -0
  346. package/scripts/heal-better-sqlite3.mjs +430 -0
  347. package/scripts/heal-installed-plugins.mjs +635 -0
  348. package/scripts/plugin-cache-integrity.mjs +248 -0
  349. package/scripts/postinstall.mjs +397 -0
  350. package/server.bundle.mjs +1421 -0
  351. package/server.js +5 -0
  352. package/skills/.ignore +7 -0
  353. package/skills/context-mode/SKILL.md +300 -0
  354. package/skills/context-mode/references/anti-patterns.md +283 -0
  355. package/skills/context-mode/references/patterns-javascript.md +298 -0
  356. package/skills/context-mode/references/patterns-python.md +304 -0
  357. package/skills/context-mode/references/patterns-shell.md +277 -0
  358. package/skills/ctx-doctor/SKILL.md +22 -0
  359. package/skills/ctx-index/SKILL.md +46 -0
  360. package/skills/ctx-insight/SKILL.md +24 -0
  361. package/skills/ctx-purge/SKILL.md +49 -0
  362. package/skills/ctx-search/SKILL.md +35 -0
  363. package/skills/ctx-stats/SKILL.md +26 -0
  364. package/skills/ctx-upgrade/SKILL.md +31 -0
  365. package/start.mjs +616 -0
@@ -0,0 +1,301 @@
1
+ /**
2
+ * adapters/kiro — Kiro IDE/CLI platform adapter.
3
+ *
4
+ * Implements HookAdapter for Kiro's hooks-capable paradigm (json-stdio).
5
+ *
6
+ * Kiro specifics:
7
+ * - Hooks via agent config files (~/.kiro/agents/<name>.json)
8
+ * - Config: ~/.kiro/settings/mcp.json (JSON format)
9
+ * - MCP: full support via mcpServers in mcp.json
10
+ * - Hook exit codes: 0=allow, 2=block
11
+ * - Cannot modify tool input (exit codes only)
12
+ * - Session dir: ~/.kiro/context-mode/sessions/
13
+ * - Routing file: KIRO.md
14
+ *
15
+ * Sources:
16
+ * - MCP config: https://kiro.dev/docs/mcp/configuration/
17
+ * - clientInfo.name: https://github.com/kirodotdev/Kiro/issues/5205 ("Kiro CLI")
18
+ * - CLI hooks: https://kiro.dev/docs/cli/custom-agents/configuration-reference#hooks-field
19
+ */
20
+ import { readFileSync, writeFileSync, mkdirSync, } from "node:fs";
21
+ import { resolve, dirname } from "node:path";
22
+ import { fileURLToPath } from "node:url";
23
+ import { homedir } from "node:os";
24
+ import { BaseAdapter } from "../base.js";
25
+ import { HOOK_TYPES as KIRO_HOOK_TYPES, PRE_TOOL_USE_MATCHER_PATTERN as KIRO_PRE_TOOL_USE_MATCHER_PATTERN, buildHookCommand as buildKiroHookCommand, isContextModeHook as isKiroContextModeHook, } from "./hooks.js";
26
+ // ─────────────────────────────────────────────────────────
27
+ // Adapter implementation
28
+ // ─────────────────────────────────────────────────────────
29
+ export class KiroAdapter extends BaseAdapter {
30
+ constructor() {
31
+ super([".kiro"]);
32
+ }
33
+ name = "Kiro";
34
+ paradigm = "json-stdio";
35
+ capabilities = {
36
+ preToolUse: true,
37
+ postToolUse: true,
38
+ preCompact: false,
39
+ sessionStart: true, // Kiro agentSpawn = SessionStart equivalent
40
+ canModifyArgs: false, // Kiro CLI uses exit codes, can't modify input
41
+ canModifyOutput: false,
42
+ canInjectSessionContext: true, // agentSpawn returns additionalContext via JSON stdout
43
+ };
44
+ // ── Input parsing ──────────────────────────────────────
45
+ parsePreToolUseInput(raw) {
46
+ const input = raw;
47
+ return {
48
+ toolName: input.tool_name ?? "",
49
+ toolInput: input.tool_input ?? {},
50
+ sessionId: `pid-${process.ppid}`,
51
+ projectDir: input.cwd ?? process.cwd(),
52
+ raw,
53
+ };
54
+ }
55
+ parsePostToolUseInput(raw) {
56
+ const input = raw;
57
+ const toolResponse = input.tool_response;
58
+ return {
59
+ toolName: input.tool_name ?? "",
60
+ toolInput: input.tool_input ?? {},
61
+ toolOutput: typeof toolResponse === "string"
62
+ ? toolResponse
63
+ : JSON.stringify(toolResponse ?? ""),
64
+ sessionId: `pid-${process.ppid}`,
65
+ projectDir: input.cwd ?? process.cwd(),
66
+ raw,
67
+ };
68
+ }
69
+ parsePreCompactInput(_raw) {
70
+ throw new Error("Kiro does not support PreCompact hooks");
71
+ }
72
+ parseSessionStartInput(raw) {
73
+ // Kiro maps agentSpawn -> SessionStart. Stdin shape mirrors codex/CC.
74
+ const input = (raw ?? {});
75
+ const source = input.source ?? "startup";
76
+ return {
77
+ source,
78
+ sessionId: `pid-${process.ppid}`,
79
+ projectDir: input.cwd ?? process.cwd(),
80
+ raw,
81
+ };
82
+ }
83
+ // ── Response formatting ────────────────────────────────
84
+ formatPreToolUseResponse(response) {
85
+ // Kiro CLI uses exit codes — this format is for adapter interface completeness.
86
+ // The actual hook script handles exit codes directly.
87
+ switch (response.decision) {
88
+ case "deny":
89
+ return { exitCode: 2, stderr: response.reason ?? "Blocked by context-mode" };
90
+ case "context":
91
+ return { exitCode: 0, stdout: response.additionalContext ?? "" };
92
+ default:
93
+ return undefined; // allow — no output needed
94
+ }
95
+ }
96
+ formatPostToolUseResponse(_response) {
97
+ return undefined; // PostToolUse is non-blocking
98
+ }
99
+ formatPreCompactResponse(_response) {
100
+ return undefined;
101
+ }
102
+ formatSessionStartResponse(response) {
103
+ // Kiro agentSpawn returns the same hookSpecificOutput shape as CC SessionStart.
104
+ if (!response?.context)
105
+ return undefined;
106
+ return {
107
+ hookSpecificOutput: {
108
+ hookEventName: "agentSpawn",
109
+ additionalContext: response.context,
110
+ },
111
+ };
112
+ }
113
+ // ── Configuration ──────────────────────────────────────
114
+ getSettingsPath() {
115
+ return resolve(homedir(), ".kiro", "settings", "mcp.json");
116
+ }
117
+ /**
118
+ * Kiro stores per-project context under .kiro/ (steering files, etc).
119
+ * Auto-memory + rule detection use this project-relative dir, returned as
120
+ * an absolute path resolved against `projectDir` (or `process.cwd()`).
121
+ * (Settings/MCP config still live under ~/.kiro/.)
122
+ */
123
+ getConfigDir(projectDir) {
124
+ return resolve(projectDir ?? process.cwd(), ".kiro");
125
+ }
126
+ getInstructionFiles() {
127
+ return ["KIRO.md"];
128
+ }
129
+ generateHookConfig(pluginRoot) {
130
+ // Kiro CLI hook config format: { <hookName>: [{ matcher, command }] }
131
+ // Note: This generates the entries for agent config files (~/.kiro/agents/*.json).
132
+ return {
133
+ [KIRO_HOOK_TYPES.PRE_TOOL_USE]: [{
134
+ matcher: KIRO_PRE_TOOL_USE_MATCHER_PATTERN,
135
+ hooks: [{ type: "command", command: buildKiroHookCommand(KIRO_HOOK_TYPES.PRE_TOOL_USE, pluginRoot) }],
136
+ }],
137
+ [KIRO_HOOK_TYPES.POST_TOOL_USE]: [{
138
+ matcher: "*",
139
+ hooks: [{ type: "command", command: buildKiroHookCommand(KIRO_HOOK_TYPES.POST_TOOL_USE, pluginRoot) }],
140
+ }],
141
+ [KIRO_HOOK_TYPES.AGENT_SPAWN]: [{
142
+ matcher: "*",
143
+ hooks: [{ type: "command", command: buildKiroHookCommand(KIRO_HOOK_TYPES.AGENT_SPAWN, pluginRoot) }],
144
+ }],
145
+ [KIRO_HOOK_TYPES.USER_PROMPT_SUBMIT]: [{
146
+ matcher: "*",
147
+ hooks: [{ type: "command", command: buildKiroHookCommand(KIRO_HOOK_TYPES.USER_PROMPT_SUBMIT, pluginRoot) }],
148
+ }],
149
+ };
150
+ }
151
+ readSettings() {
152
+ try {
153
+ const raw = readFileSync(this.getSettingsPath(), "utf-8");
154
+ return JSON.parse(raw);
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ }
160
+ writeSettings(settings) {
161
+ const settingsPath = this.getSettingsPath();
162
+ mkdirSync(dirname(settingsPath), { recursive: true });
163
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
164
+ }
165
+ // ── Diagnostics (doctor) ─────────────────────────────────
166
+ validateHooks(pluginRoot) {
167
+ const results = [];
168
+ const defaultAgent = resolve(homedir(), ".kiro", "agents", "default.json");
169
+ try {
170
+ const config = JSON.parse(readFileSync(defaultAgent, "utf-8"));
171
+ const hooks = config.hooks ?? {};
172
+ // Check required hooks
173
+ for (const hookType of [KIRO_HOOK_TYPES.PRE_TOOL_USE]) {
174
+ const entries = hooks[hookType] ?? [];
175
+ const found = entries.some((e) => isKiroContextModeHook(e, hookType));
176
+ results.push({
177
+ check: `Hook: ${hookType}`,
178
+ status: found ? "pass" : "fail",
179
+ message: found
180
+ ? `context-mode ${hookType} hook found`
181
+ : `context-mode ${hookType} hook not configured`,
182
+ ...(found ? {} : { fix: `Run: context-mode upgrade` }),
183
+ });
184
+ }
185
+ // Check optional hooks
186
+ for (const hookType of [KIRO_HOOK_TYPES.POST_TOOL_USE]) {
187
+ const entries = hooks[hookType] ?? [];
188
+ const found = entries.some((e) => isKiroContextModeHook(e, hookType));
189
+ results.push({
190
+ check: `Hook: ${hookType}`,
191
+ status: found ? "pass" : "warn",
192
+ message: found
193
+ ? `context-mode ${hookType} hook found`
194
+ : `context-mode ${hookType} hook not configured (optional)`,
195
+ });
196
+ }
197
+ }
198
+ catch {
199
+ results.push({
200
+ check: "Hook configuration",
201
+ status: "warn",
202
+ message: "Could not read ~/.kiro/agents/default.json",
203
+ fix: "Run: context-mode upgrade",
204
+ });
205
+ }
206
+ return results;
207
+ }
208
+ checkPluginRegistration() {
209
+ try {
210
+ const raw = readFileSync(this.getSettingsPath(), "utf-8");
211
+ const config = JSON.parse(raw);
212
+ const mcpServers = config?.mcpServers ?? {};
213
+ if ("context-mode" in mcpServers) {
214
+ return {
215
+ check: "MCP registration",
216
+ status: "pass",
217
+ message: "context-mode found in mcpServers config",
218
+ };
219
+ }
220
+ return {
221
+ check: "MCP registration",
222
+ status: "fail",
223
+ message: "context-mode not found in mcpServers",
224
+ fix: "Add context-mode to mcpServers in ~/.kiro/settings/mcp.json",
225
+ };
226
+ }
227
+ catch {
228
+ return {
229
+ check: "MCP registration",
230
+ status: "warn",
231
+ message: "Could not read ~/.kiro/settings/mcp.json",
232
+ };
233
+ }
234
+ }
235
+ getInstalledVersion() {
236
+ try {
237
+ const pkgPath = resolve(homedir(), ".kiro", "extensions", "context-mode", "package.json");
238
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
239
+ return pkg.version ?? "unknown";
240
+ }
241
+ catch {
242
+ return "not installed";
243
+ }
244
+ }
245
+ // ── Upgrade ────────────────────────────────────────────
246
+ configureAllHooks(pluginRoot) {
247
+ const changes = [];
248
+ const configDir = resolve(homedir(), ".kiro", "agents");
249
+ const defaultAgent = resolve(configDir, "default.json");
250
+ try {
251
+ mkdirSync(configDir, { recursive: true });
252
+ let config = {};
253
+ try {
254
+ config = JSON.parse(readFileSync(defaultAgent, "utf-8"));
255
+ }
256
+ catch {
257
+ // No existing config — create new
258
+ }
259
+ const hooks = (config.hooks ?? {});
260
+ // Hooks to add: [hookType, matcher]
261
+ const hookSpecs = [
262
+ [KIRO_HOOK_TYPES.PRE_TOOL_USE, KIRO_PRE_TOOL_USE_MATCHER_PATTERN],
263
+ [KIRO_HOOK_TYPES.POST_TOOL_USE, "*"],
264
+ [KIRO_HOOK_TYPES.AGENT_SPAWN, "*"],
265
+ [KIRO_HOOK_TYPES.USER_PROMPT_SUBMIT, "*"],
266
+ ];
267
+ for (const [hookType, matcher] of hookSpecs) {
268
+ const entries = (hooks[hookType] ?? []);
269
+ if (!entries.some(e => isKiroContextModeHook(e, hookType))) {
270
+ entries.push({
271
+ matcher,
272
+ command: buildKiroHookCommand(hookType, pluginRoot),
273
+ });
274
+ hooks[hookType] = entries;
275
+ changes.push(`Added ${hookType} hook to ${defaultAgent}`);
276
+ }
277
+ }
278
+ config.hooks = hooks;
279
+ writeFileSync(defaultAgent, JSON.stringify(config, null, 2), "utf-8");
280
+ }
281
+ catch (err) {
282
+ changes.push(`Failed to configure hooks: ${err.message}`);
283
+ }
284
+ return changes;
285
+ }
286
+ setHookPermissions(_pluginRoot) {
287
+ return [];
288
+ }
289
+ updatePluginRegistry(_pluginRoot, _version) {
290
+ // Kiro plugin registry is managed via mcp.json
291
+ }
292
+ getRoutingInstructions() {
293
+ const instructionsPath = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..", "configs", "kiro", "KIRO.md");
294
+ try {
295
+ return readFileSync(instructionsPath, "utf-8");
296
+ }
297
+ catch {
298
+ return "# context-mode\n\nUse context-mode MCP tools (execute, execute_file, batch_execute, fetch_and_index, search) instead of run_command/view_file for data-heavy operations.";
299
+ }
300
+ }
301
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * adapters/omp — Oh My Pi (OMP) platform adapter.
3
+ *
4
+ * OMP integration facts (verified against can1357/oh-my-pi @ v3.20.1):
5
+ * - MCP config: `~/.omp/agent/mcp.json` (global) or `<project>/.omp/mcp.json`
6
+ * (project), per `packages/utils/src/dirs.ts` `getMCPConfigPath()` and
7
+ * `docs/mcp-config.md` "Preferred config locations".
8
+ * - Agent-dir env override: `PI_CODING_AGENT_DIR` — `packages/utils/src/dirs.ts`:
9
+ * `let dirs = new DirResolver(process.env.PI_CODING_AGENT_DIR);`
10
+ * (No `OMP_*` runtime env exists; `.env`-file `OMP_*` keys are mirrored to
11
+ * `PI_*` BEFORE process.env is read.)
12
+ * - System-prompt file: `SYSTEM.md` (project `.omp/SYSTEM.md` precedence,
13
+ * global `~/.omp/agent/SYSTEM.md` fallback). NOT `PI.md` — no `PI.md`
14
+ * loader exists upstream. OMP also auto-discovers `AGENTS.md` via
15
+ * `packages/coding-agent/src/discovery/agents-md.ts`.
16
+ * - Hook surface: OMP DOES expose pre/post tool-call hooks
17
+ * (`~/.omp/agent/hooks/{pre,post}/*.ts`, `omp.on("tool_call", ...)`).
18
+ * This adapter ships MCP-only delivery for now; wiring native OMP
19
+ * hooks is future work tracked separately.
20
+ *
21
+ * Why a dedicated adapter rather than reusing pi:
22
+ * OMP and Pi share a runtime surface but different storage roots
23
+ * (`~/.omp/agent/` vs `~/.pi/`). Without an OMP adapter, OMP users
24
+ * running through a Claude-installed harness silently land their
25
+ * context-mode data under `~/.claude/context-mode/` (issue #473).
26
+ */
27
+ import { BaseAdapter } from "../base.js";
28
+ import type { HookAdapter, HookParadigm, PlatformCapabilities, DiagnosticResult, PreToolUseEvent, PostToolUseEvent, PreCompactEvent, SessionStartEvent, PreToolUseResponse, PostToolUseResponse, PreCompactResponse, SessionStartResponse, HookRegistration } from "../types.js";
29
+ export declare class OMPAdapter extends BaseAdapter implements HookAdapter {
30
+ constructor();
31
+ readonly name = "OMP";
32
+ readonly paradigm: HookParadigm;
33
+ readonly capabilities: PlatformCapabilities;
34
+ parsePreToolUseInput(_raw: unknown): PreToolUseEvent;
35
+ parsePostToolUseInput(_raw: unknown): PostToolUseEvent;
36
+ parsePreCompactInput(_raw: unknown): PreCompactEvent;
37
+ parseSessionStartInput(_raw: unknown): SessionStartEvent;
38
+ formatPreToolUseResponse(_response: PreToolUseResponse): unknown;
39
+ formatPostToolUseResponse(_response: PostToolUseResponse): unknown;
40
+ formatPreCompactResponse(_response: PreCompactResponse): unknown;
41
+ formatSessionStartResponse(_response: SessionStartResponse): unknown;
42
+ /**
43
+ * Resolve OMP agent root, honoring `PI_CODING_AGENT_DIR` when set
44
+ * (the upstream OMP convention — see `packages/utils/src/dirs.ts`)
45
+ * and falling back to `~/.omp/agent`.
46
+ */
47
+ private getAgentDir;
48
+ getSettingsPath(): string;
49
+ /**
50
+ * OMP nests its config under the agent dir. Always absolute.
51
+ * `_projectDir` accepted for interface symmetry but unused — home-rooted.
52
+ */
53
+ getConfigDir(_projectDir?: string): string;
54
+ getInstructionFiles(): string[];
55
+ generateHookConfig(_pluginRoot: string): HookRegistration;
56
+ readSettings(): Record<string, unknown> | null;
57
+ writeSettings(settings: Record<string, unknown>): void;
58
+ validateHooks(_pluginRoot: string): DiagnosticResult[];
59
+ checkPluginRegistration(): DiagnosticResult;
60
+ getInstalledVersion(): string;
61
+ configureAllHooks(_pluginRoot: string): string[];
62
+ setHookPermissions(_pluginRoot: string): string[];
63
+ updatePluginRegistry(_pluginRoot: string, _version: string): void;
64
+ getRoutingInstructions(): string;
65
+ }
@@ -0,0 +1,182 @@
1
+ /**
2
+ * adapters/omp — Oh My Pi (OMP) platform adapter.
3
+ *
4
+ * OMP integration facts (verified against can1357/oh-my-pi @ v3.20.1):
5
+ * - MCP config: `~/.omp/agent/mcp.json` (global) or `<project>/.omp/mcp.json`
6
+ * (project), per `packages/utils/src/dirs.ts` `getMCPConfigPath()` and
7
+ * `docs/mcp-config.md` "Preferred config locations".
8
+ * - Agent-dir env override: `PI_CODING_AGENT_DIR` — `packages/utils/src/dirs.ts`:
9
+ * `let dirs = new DirResolver(process.env.PI_CODING_AGENT_DIR);`
10
+ * (No `OMP_*` runtime env exists; `.env`-file `OMP_*` keys are mirrored to
11
+ * `PI_*` BEFORE process.env is read.)
12
+ * - System-prompt file: `SYSTEM.md` (project `.omp/SYSTEM.md` precedence,
13
+ * global `~/.omp/agent/SYSTEM.md` fallback). NOT `PI.md` — no `PI.md`
14
+ * loader exists upstream. OMP also auto-discovers `AGENTS.md` via
15
+ * `packages/coding-agent/src/discovery/agents-md.ts`.
16
+ * - Hook surface: OMP DOES expose pre/post tool-call hooks
17
+ * (`~/.omp/agent/hooks/{pre,post}/*.ts`, `omp.on("tool_call", ...)`).
18
+ * This adapter ships MCP-only delivery for now; wiring native OMP
19
+ * hooks is future work tracked separately.
20
+ *
21
+ * Why a dedicated adapter rather than reusing pi:
22
+ * OMP and Pi share a runtime surface but different storage roots
23
+ * (`~/.omp/agent/` vs `~/.pi/`). Without an OMP adapter, OMP users
24
+ * running through a Claude-installed harness silently land their
25
+ * context-mode data under `~/.claude/context-mode/` (issue #473).
26
+ */
27
+ import { readFileSync, writeFileSync, mkdirSync, } from "node:fs";
28
+ import { resolve, dirname } from "node:path";
29
+ import { homedir } from "node:os";
30
+ import { BaseAdapter } from "../base.js";
31
+ // ─────────────────────────────────────────────────────────
32
+ // Adapter implementation
33
+ // ─────────────────────────────────────────────────────────
34
+ export class OMPAdapter extends BaseAdapter {
35
+ constructor() {
36
+ super([".omp"]);
37
+ }
38
+ name = "OMP";
39
+ paradigm = "mcp-only";
40
+ capabilities = {
41
+ preToolUse: false,
42
+ postToolUse: false,
43
+ preCompact: false,
44
+ sessionStart: false,
45
+ canModifyArgs: false,
46
+ canModifyOutput: false,
47
+ canInjectSessionContext: false,
48
+ };
49
+ // ── Input parsing ──────────────────────────────────────
50
+ // OMP does not support hooks. These methods exist to satisfy the
51
+ // interface contract but will throw if called.
52
+ parsePreToolUseInput(_raw) {
53
+ throw new Error("OMP hooks not wired by this adapter (MCP-only delivery)");
54
+ }
55
+ parsePostToolUseInput(_raw) {
56
+ throw new Error("OMP hooks not wired by this adapter (MCP-only delivery)");
57
+ }
58
+ parsePreCompactInput(_raw) {
59
+ throw new Error("OMP hooks not wired by this adapter (MCP-only delivery)");
60
+ }
61
+ parseSessionStartInput(_raw) {
62
+ throw new Error("OMP hooks not wired by this adapter (MCP-only delivery)");
63
+ }
64
+ // ── Response formatting ────────────────────────────────
65
+ // OMP does not support hooks. Return undefined for all responses.
66
+ formatPreToolUseResponse(_response) {
67
+ return undefined;
68
+ }
69
+ formatPostToolUseResponse(_response) {
70
+ return undefined;
71
+ }
72
+ formatPreCompactResponse(_response) {
73
+ return undefined;
74
+ }
75
+ formatSessionStartResponse(_response) {
76
+ return undefined;
77
+ }
78
+ // ── Configuration ──────────────────────────────────────
79
+ /**
80
+ * Resolve OMP agent root, honoring `PI_CODING_AGENT_DIR` when set
81
+ * (the upstream OMP convention — see `packages/utils/src/dirs.ts`)
82
+ * and falling back to `~/.omp/agent`.
83
+ */
84
+ getAgentDir() {
85
+ return process.env.PI_CODING_AGENT_DIR
86
+ ?? resolve(homedir(), ".omp", "agent");
87
+ }
88
+ getSettingsPath() {
89
+ return resolve(this.getAgentDir(), "mcp.json");
90
+ }
91
+ /**
92
+ * OMP nests its config under the agent dir. Always absolute.
93
+ * `_projectDir` accepted for interface symmetry but unused — home-rooted.
94
+ */
95
+ getConfigDir(_projectDir) {
96
+ return this.getAgentDir();
97
+ }
98
+ getInstructionFiles() {
99
+ // SYSTEM.md is the OMP-native system-prompt file (see
100
+ // can1357/oh-my-pi README "Custom System Prompt"). AGENTS.md is also
101
+ // auto-discovered by the universal discovery layer.
102
+ return ["SYSTEM.md", "AGENTS.md"];
103
+ }
104
+ generateHookConfig(_pluginRoot) {
105
+ return {};
106
+ }
107
+ readSettings() {
108
+ try {
109
+ const raw = readFileSync(this.getSettingsPath(), "utf-8");
110
+ return JSON.parse(raw);
111
+ }
112
+ catch {
113
+ return null;
114
+ }
115
+ }
116
+ writeSettings(settings) {
117
+ const settingsPath = this.getSettingsPath();
118
+ mkdirSync(dirname(settingsPath), { recursive: true });
119
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
120
+ }
121
+ // ── Diagnostics (doctor) ─────────────────────────────────
122
+ validateHooks(_pluginRoot) {
123
+ return [
124
+ {
125
+ check: "Hook support",
126
+ status: "warn",
127
+ message: "context-mode delivers via MCP for OMP. " +
128
+ "Native OMP pre/post tool-call hooks are not yet wired by this adapter.",
129
+ },
130
+ ];
131
+ }
132
+ checkPluginRegistration() {
133
+ try {
134
+ const raw = readFileSync(this.getSettingsPath(), "utf-8");
135
+ const config = JSON.parse(raw);
136
+ const mcpServers = config?.mcpServers ?? {};
137
+ if ("context-mode" in mcpServers) {
138
+ return {
139
+ check: "MCP registration",
140
+ status: "pass",
141
+ message: "context-mode found in mcpServers config",
142
+ };
143
+ }
144
+ return {
145
+ check: "MCP registration",
146
+ status: "fail",
147
+ message: "context-mode not found in mcpServers",
148
+ fix: `Add context-mode to mcpServers in ${this.getSettingsPath()}`,
149
+ };
150
+ }
151
+ catch {
152
+ return {
153
+ check: "MCP registration",
154
+ status: "warn",
155
+ message: `Could not read ${this.getSettingsPath()}`,
156
+ };
157
+ }
158
+ }
159
+ getInstalledVersion() {
160
+ try {
161
+ const pkgPath = resolve(this.getAgentDir(), "extensions", "context-mode", "package.json");
162
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
163
+ return pkg.version ?? "unknown";
164
+ }
165
+ catch {
166
+ return "not installed";
167
+ }
168
+ }
169
+ // ── Upgrade ────────────────────────────────────────────
170
+ configureAllHooks(_pluginRoot) {
171
+ return [];
172
+ }
173
+ setHookPermissions(_pluginRoot) {
174
+ return [];
175
+ }
176
+ updatePluginRegistry(_pluginRoot, _version) {
177
+ // OMP MCP server registry is managed via mcp.json
178
+ }
179
+ getRoutingInstructions() {
180
+ return "# context-mode\n\nUse context-mode MCP tools (execute, execute_file, batch_execute, fetch_and_index, search) instead of run_command/view_file for data-heavy operations.";
181
+ }
182
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Oh My Pi (OMP) plugin entry point for context-mode.
3
+ *
4
+ * Mirrors the Pi extension shape (`src/adapters/pi/extension.ts`) for
5
+ * the four OMP hook events that materially protect the context window
6
+ * and persist session continuity:
7
+ *
8
+ * - session_start — initialize the session row in our DB
9
+ * - tool_call — hard-block curl/wget/inline-HTTP in bash
10
+ * - tool_result — extract structured events into the session DB
11
+ * - session_before_compact — persist a resume snapshot before compaction
12
+ *
13
+ * Loaded by OMP via the `omp` (or `pi`) field in package.json — see
14
+ * upstream loader at refs/platforms/oh-my-pi/packages/coding-agent/src/
15
+ * extensibility/plugins/loader.ts:75:
16
+ * `const manifest: PluginManifest | undefined = pluginPkg.omp || pluginPkg.pi;`
17
+ * Hook factory contract from refs/.../extensibility/hooks/types.ts:809:
18
+ * `export type HookFactory = (pi: HookAPI) => void;`
19
+ *
20
+ * OMP differs from Pi in two ways that justify a dedicated plugin file:
21
+ * 1. Storage roots at ~/.omp/context-mode/ via OMPAdapter, not ~/.pi/
22
+ * 2. OMP has native MCP support (mcp.json), so no MCP bridge is needed
23
+ * — the bridge that Pi's extension ships (mcp-bridge.ts) is dead weight
24
+ * under OMP and is intentionally omitted here.
25
+ */
26
+ export declare function _resetOmpPluginStateForTests(): void;
27
+ /**
28
+ * Return the current session ID picked by the most recent session_start
29
+ * handler. Test-only — production code reads `_sessionId` directly via
30
+ * the closure. The shared SQLite DB at `~/.omp/context-mode/` survives
31
+ * between tests, so `getLatestSessionId()` cannot disambiguate which
32
+ * row belongs to "this" test when multiple tests insert in the same
33
+ * second; tests use this getter instead.
34
+ */
35
+ export declare function _getOmpPluginSessionIdForTests(): string;
36
+ type ToolCallEvent = {
37
+ toolName: string;
38
+ toolCallId?: string;
39
+ input?: Record<string, unknown>;
40
+ };
41
+ type ToolResultEvent = {
42
+ toolName: string;
43
+ toolCallId?: string;
44
+ input?: Record<string, unknown>;
45
+ content?: Array<{
46
+ type: string;
47
+ text?: string;
48
+ }>;
49
+ isError?: boolean;
50
+ };
51
+ type ToolCallEventResult = {
52
+ block?: boolean;
53
+ reason?: string;
54
+ };
55
+ type TurnEndEvent = {
56
+ type?: string;
57
+ message?: unknown;
58
+ messages?: unknown;
59
+ };
60
+ type HookEventCtx = Record<string, unknown> | undefined;
61
+ type HookHandler<E, R = void> = (event: E, ctx: HookEventCtx) => R | undefined | Promise<R | undefined>;
62
+ export interface MinimalHookAPI {
63
+ on(event: "session_start", handler: HookHandler<{
64
+ type: "session_start";
65
+ }>): void;
66
+ on(event: "session_before_compact", handler: HookHandler<{
67
+ type: "session_before_compact";
68
+ }>): void;
69
+ on(event: "tool_call", handler: HookHandler<ToolCallEvent, ToolCallEventResult>): void;
70
+ on(event: "tool_result", handler: HookHandler<ToolResultEvent>): void;
71
+ on(event: "turn_end", handler: HookHandler<TurnEndEvent>): void;
72
+ on(event: string, handler: (...args: unknown[]) => unknown): void;
73
+ }
74
+ /**
75
+ * OMP plugin default export. Called once by the OMP runtime per
76
+ * upstream `extensibility/plugins/loader.ts` after `omp plugin install
77
+ * context-mode`. Subsequent `pi.on(...)` registrations route the four
78
+ * lifecycle events to our SessionDB-backed handlers below.
79
+ */
80
+ export default function ompPlugin(pi: MinimalHookAPI): void;
81
+ export {};