open-multi-agent-kit 0.78.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 (1304) hide show
  1. package/AGENTS.md +550 -0
  2. package/CHANGELOG.md +464 -0
  3. package/CLAUDE.md +8 -0
  4. package/DESIGN.md +334 -0
  5. package/GEMINI.md +8 -0
  6. package/LICENSE +21 -0
  7. package/MATURITY.md +77 -0
  8. package/README.md +279 -0
  9. package/ROADMAP.md +130 -0
  10. package/SECURITY.md +83 -0
  11. package/WORKER_MANIFEST.md +35 -0
  12. package/dist/adapters/commandcode/commandcode-cli-adapter.d.ts +10 -0
  13. package/dist/adapters/commandcode/commandcode-cli-adapter.js +57 -0
  14. package/dist/adapters/kimi/ascii-art.d.ts +1 -0
  15. package/dist/adapters/kimi/ascii-art.js +23 -0
  16. package/dist/adapters/kimi/banner.d.ts +53 -0
  17. package/dist/adapters/kimi/banner.js +284 -0
  18. package/dist/adapters/kimi/bug-filter.d.ts +15 -0
  19. package/dist/adapters/kimi/bug-filter.js +150 -0
  20. package/dist/adapters/kimi/capability.d.ts +25 -0
  21. package/dist/adapters/kimi/capability.js +68 -0
  22. package/dist/adapters/kimi/continue-prompt-guard.d.ts +20 -0
  23. package/dist/adapters/kimi/continue-prompt-guard.js +70 -0
  24. package/dist/adapters/kimi/isolated-home.d.ts +21 -0
  25. package/dist/adapters/kimi/isolated-home.js +270 -0
  26. package/dist/adapters/kimi/runner.d.ts +71 -0
  27. package/dist/adapters/kimi/runner.js +1084 -0
  28. package/dist/adapters/kimi/simple-art.d.ts +1 -0
  29. package/dist/adapters/kimi/simple-art.js +1 -0
  30. package/dist/adapters/kimi/statusline.d.ts +26 -0
  31. package/dist/adapters/kimi/statusline.js +142 -0
  32. package/dist/adapters/kimi/usage.d.ts +52 -0
  33. package/dist/adapters/kimi/usage.js +481 -0
  34. package/dist/adapters/kimi/wire-client.d.ts +142 -0
  35. package/dist/adapters/kimi/wire-client.js +725 -0
  36. package/dist/adapters/kimi/wire-protocol-types.d.ts +549 -0
  37. package/dist/adapters/kimi/wire-protocol-types.js +59 -0
  38. package/dist/adapters/opencode/opencode-cli-adapter.d.ts +9 -0
  39. package/dist/adapters/opencode/opencode-cli-adapter.js +43 -0
  40. package/dist/awareness/classifiers/browser-console-classifier.d.ts +3 -0
  41. package/dist/awareness/classifiers/browser-console-classifier.js +47 -0
  42. package/dist/awareness/classifiers/evidence-gap-classifier.d.ts +3 -0
  43. package/dist/awareness/classifiers/evidence-gap-classifier.js +31 -0
  44. package/dist/awareness/classifiers/stalled-run-classifier.d.ts +2 -0
  45. package/dist/awareness/classifiers/stalled-run-classifier.js +24 -0
  46. package/dist/awareness/notice-store.d.ts +6 -0
  47. package/dist/awareness/notice-store.js +91 -0
  48. package/dist/awareness/notice.d.ts +17 -0
  49. package/dist/awareness/notice.js +1 -0
  50. package/dist/awareness/noticer-engine.d.ts +42 -0
  51. package/dist/awareness/noticer-engine.js +63 -0
  52. package/dist/awareness/router.d.ts +6 -0
  53. package/dist/awareness/router.js +46 -0
  54. package/dist/brand/matrix-rain.d.ts +15 -0
  55. package/dist/brand/matrix-rain.js +132 -0
  56. package/dist/brand/omk-matrix-art.d.ts +1 -0
  57. package/dist/brand/omk-matrix-art.js +10 -0
  58. package/dist/brand/omk-simple-art.d.ts +7 -0
  59. package/dist/brand/omk-simple-art.js +13 -0
  60. package/dist/brand/palette.d.ts +194 -0
  61. package/dist/brand/palette.js +53 -0
  62. package/dist/brand/theme.d.ts +41 -0
  63. package/dist/brand/theme.js +262 -0
  64. package/dist/browser/browser-feedback.d.ts +10 -0
  65. package/dist/browser/browser-feedback.js +84 -0
  66. package/dist/browser/browser-observer.d.ts +21 -0
  67. package/dist/browser/browser-observer.js +159 -0
  68. package/dist/browser/browser-session.d.ts +26 -0
  69. package/dist/browser/browser-session.js +63 -0
  70. package/dist/cli/command-registry.d.ts +2 -0
  71. package/dist/cli/command-registry.js +20 -0
  72. package/dist/cli/input/argv-parser.d.ts +16 -0
  73. package/dist/cli/input/argv-parser.js +50 -0
  74. package/dist/cli/input/command-envelope.d.ts +16 -0
  75. package/dist/cli/input/command-envelope.js +64 -0
  76. package/dist/cli/input/config-loader.d.ts +16 -0
  77. package/dist/cli/input/config-loader.js +48 -0
  78. package/dist/cli/input/index.d.ts +8 -0
  79. package/dist/cli/input/index.js +8 -0
  80. package/dist/cli/input/input-resolver.d.ts +13 -0
  81. package/dist/cli/input/input-resolver.js +50 -0
  82. package/dist/cli/input/validator.d.ts +10 -0
  83. package/dist/cli/input/validator.js +37 -0
  84. package/dist/cli/main.d.ts +4 -0
  85. package/dist/cli/main.js +34 -0
  86. package/dist/cli/output/error-renderer.d.ts +10 -0
  87. package/dist/cli/output/error-renderer.js +68 -0
  88. package/dist/cli/output/hash.d.ts +1 -0
  89. package/dist/cli/output/hash.js +10 -0
  90. package/dist/cli/output/index.d.ts +9 -0
  91. package/dist/cli/output/index.js +9 -0
  92. package/dist/cli/output/json-renderer.d.ts +7 -0
  93. package/dist/cli/output/json-renderer.js +35 -0
  94. package/dist/cli/output/markdown-renderer.d.ts +5 -0
  95. package/dist/cli/output/markdown-renderer.js +86 -0
  96. package/dist/cli/output/nlp-renderer.d.ts +7 -0
  97. package/dist/cli/output/nlp-renderer.js +96 -0
  98. package/dist/cli/output/output-router.d.ts +5 -0
  99. package/dist/cli/output/output-router.js +33 -0
  100. package/dist/cli/register-awareness-commands.d.ts +2 -0
  101. package/dist/cli/register-awareness-commands.js +133 -0
  102. package/dist/cli/register-basic-commands.d.ts +2 -0
  103. package/dist/cli/register-basic-commands.js +487 -0
  104. package/dist/cli/register-integration-commands.d.ts +2 -0
  105. package/dist/cli/register-integration-commands.js +59 -0
  106. package/dist/cli/register-mcp-dag-cron-screenshot-commands.d.ts +2 -0
  107. package/dist/cli/register-mcp-dag-cron-screenshot-commands.js +273 -0
  108. package/dist/cli/register-openai-codex-commands.d.ts +2 -0
  109. package/dist/cli/register-openai-codex-commands.js +55 -0
  110. package/dist/cli/register-provider-commands.d.ts +2 -0
  111. package/dist/cli/register-provider-commands.js +244 -0
  112. package/dist/cli/register-spec-agent-goal-commands.d.ts +2 -0
  113. package/dist/cli/register-spec-agent-goal-commands.js +441 -0
  114. package/dist/cli/register-tool-commands.d.ts +2 -0
  115. package/dist/cli/register-tool-commands.js +191 -0
  116. package/dist/cli/register-workflow-commands.d.ts +2 -0
  117. package/dist/cli/register-workflow-commands.js +157 -0
  118. package/dist/cli/registry/core.d.ts +2 -0
  119. package/dist/cli/registry/core.js +27 -0
  120. package/dist/cli/registry/session.d.ts +2 -0
  121. package/dist/cli/registry/session.js +137 -0
  122. package/dist/cli/registry/system.d.ts +2 -0
  123. package/dist/cli/registry/system.js +95 -0
  124. package/dist/cli/registry/tooling.d.ts +2 -0
  125. package/dist/cli/registry/tooling.js +111 -0
  126. package/dist/cli/registry/visual.d.ts +2 -0
  127. package/dist/cli/registry/visual.js +91 -0
  128. package/dist/cli/root.d.ts +10 -0
  129. package/dist/cli/root.js +118 -0
  130. package/dist/cli/runtime/capability-selector.d.ts +18 -0
  131. package/dist/cli/runtime/capability-selector.js +208 -0
  132. package/dist/cli/runtime/cli-runtime.d.ts +10 -0
  133. package/dist/cli/runtime/cli-runtime.js +35 -0
  134. package/dist/cli/runtime/cli-writer.d.ts +18 -0
  135. package/dist/cli/runtime/cli-writer.js +87 -0
  136. package/dist/cli/runtime/command-bus.d.ts +45 -0
  137. package/dist/cli/runtime/command-bus.js +132 -0
  138. package/dist/cli/runtime/event-bus.d.ts +12 -0
  139. package/dist/cli/runtime/event-bus.js +31 -0
  140. package/dist/cli/runtime/generic-provider-adapter.d.ts +24 -0
  141. package/dist/cli/runtime/generic-provider-adapter.js +38 -0
  142. package/dist/cli/runtime/index.d.ts +17 -0
  143. package/dist/cli/runtime/index.js +18 -0
  144. package/dist/cli/runtime/intent-classifier.d.ts +16 -0
  145. package/dist/cli/runtime/intent-classifier.js +113 -0
  146. package/dist/cli/runtime/plan-controller.d.ts +7 -0
  147. package/dist/cli/runtime/plan-controller.js +29 -0
  148. package/dist/cli/runtime/provider-adapter-registry.d.ts +32 -0
  149. package/dist/cli/runtime/provider-adapter-registry.js +60 -0
  150. package/dist/cli/runtime/provider-event-normalizer.d.ts +19 -0
  151. package/dist/cli/runtime/provider-event-normalizer.js +150 -0
  152. package/dist/cli/runtime/run-controller.d.ts +7 -0
  153. package/dist/cli/runtime/run-controller.js +30 -0
  154. package/dist/cli/runtime/runtime-sidecar.d.ts +17 -0
  155. package/dist/cli/runtime/runtime-sidecar.js +138 -0
  156. package/dist/cli/runtime/task-controller.d.ts +7 -0
  157. package/dist/cli/runtime/task-controller.js +29 -0
  158. package/dist/cli/runtime/types.d.ts +312 -0
  159. package/dist/cli/runtime/types.js +6 -0
  160. package/dist/cli/theme/index.d.ts +9 -0
  161. package/dist/cli/theme/index.js +6 -0
  162. package/dist/cli/theme/terminal-capability.d.ts +18 -0
  163. package/dist/cli/theme/terminal-capability.js +88 -0
  164. package/dist/cli/theme/theme-registry.d.ts +25 -0
  165. package/dist/cli/theme/theme-registry.js +336 -0
  166. package/dist/cli/theme/theme-resolver.d.ts +12 -0
  167. package/dist/cli/theme/theme-resolver.js +38 -0
  168. package/dist/cli/ui/event.d.ts +65 -0
  169. package/dist/cli/ui/event.js +1 -0
  170. package/dist/cli/ui/green-rain-renderer.d.ts +17 -0
  171. package/dist/cli/ui/green-rain-renderer.js +96 -0
  172. package/dist/cli/ui/neon-grid-renderer.d.ts +17 -0
  173. package/dist/cli/ui/neon-grid-renderer.js +99 -0
  174. package/dist/cli/ui/plain-renderer.d.ts +37 -0
  175. package/dist/cli/ui/plain-renderer.js +160 -0
  176. package/dist/cli/ui/renderer.d.ts +7 -0
  177. package/dist/cli/ui/renderer.js +1 -0
  178. package/dist/cli/ui/rich-renderer.d.ts +32 -0
  179. package/dist/cli/ui/rich-renderer.js +234 -0
  180. package/dist/cli/ui/route-blocked-panel.d.ts +5 -0
  181. package/dist/cli/ui/route-blocked-panel.js +67 -0
  182. package/dist/cli/ui/rust-forge-renderer.d.ts +19 -0
  183. package/dist/cli/ui/rust-forge-renderer.js +129 -0
  184. package/dist/cli/ui/system24-renderer.d.ts +79 -0
  185. package/dist/cli/ui/system24-renderer.js +508 -0
  186. package/dist/cli/v2/chat-repl.d.ts +37 -0
  187. package/dist/cli/v2/chat-repl.js +280 -0
  188. package/dist/cli/v2/cli-v2-skeleton.d.ts +99 -0
  189. package/dist/cli/v2/cli-v2-skeleton.js +350 -0
  190. package/dist/cli/v2/interactive-prompt.d.ts +51 -0
  191. package/dist/cli/v2/interactive-prompt.js +187 -0
  192. package/dist/cli/v2/persistent-memory.d.ts +70 -0
  193. package/dist/cli/v2/persistent-memory.js +229 -0
  194. package/dist/cli/v2/provider-commands.d.ts +120 -0
  195. package/dist/cli/v2/provider-commands.js +244 -0
  196. package/dist/cli/v2/workflow-commands.d.ts +72 -0
  197. package/dist/cli/v2/workflow-commands.js +198 -0
  198. package/dist/cli.d.ts +2 -0
  199. package/dist/cli.js +17 -0
  200. package/dist/cockpit/git-numstat.d.ts +10 -0
  201. package/dist/cockpit/git-numstat.js +97 -0
  202. package/dist/cockpit/lsp-status.d.ts +5 -0
  203. package/dist/cockpit/lsp-status.js +51 -0
  204. package/dist/cockpit/types.d.ts +66 -0
  205. package/dist/cockpit/types.js +4 -0
  206. package/dist/cockpit/views/rail-view.d.ts +9 -0
  207. package/dist/cockpit/views/rail-view.js +160 -0
  208. package/dist/commands/agent.d.ts +6 -0
  209. package/dist/commands/agent.js +263 -0
  210. package/dist/commands/appshot.d.ts +15 -0
  211. package/dist/commands/appshot.js +122 -0
  212. package/dist/commands/auth.d.ts +43 -0
  213. package/dist/commands/auth.js +167 -0
  214. package/dist/commands/browser.d.ts +18 -0
  215. package/dist/commands/browser.js +110 -0
  216. package/dist/commands/chat/chat-turn-dag.d.ts +21 -0
  217. package/dist/commands/chat/chat-turn-dag.js +72 -0
  218. package/dist/commands/chat/core.d.ts +27 -0
  219. package/dist/commands/chat/core.js +418 -0
  220. package/dist/commands/chat/index.d.ts +5 -0
  221. package/dist/commands/chat/index.js +5 -0
  222. package/dist/commands/chat/native-root-loop.d.ts +57 -0
  223. package/dist/commands/chat/native-root-loop.js +1041 -0
  224. package/dist/commands/chat/runtime.d.ts +46 -0
  225. package/dist/commands/chat/runtime.js +395 -0
  226. package/dist/commands/chat/slash/commands/control.d.ts +2 -0
  227. package/dist/commands/chat/slash/commands/control.js +196 -0
  228. package/dist/commands/chat/slash/commands/diagnostics.d.ts +2 -0
  229. package/dist/commands/chat/slash/commands/diagnostics.js +64 -0
  230. package/dist/commands/chat/slash/commands/harness.d.ts +2 -0
  231. package/dist/commands/chat/slash/commands/harness.js +21 -0
  232. package/dist/commands/chat/slash/commands/index.d.ts +2 -0
  233. package/dist/commands/chat/slash/commands/index.js +18 -0
  234. package/dist/commands/chat/slash/commands/routing.d.ts +2 -0
  235. package/dist/commands/chat/slash/commands/routing.js +355 -0
  236. package/dist/commands/chat/slash/commands/session.d.ts +2 -0
  237. package/dist/commands/chat/slash/commands/session.js +86 -0
  238. package/dist/commands/chat/slash/commands/tool-plane.d.ts +2 -0
  239. package/dist/commands/chat/slash/commands/tool-plane.js +64 -0
  240. package/dist/commands/chat/slash/commands/ui.d.ts +2 -0
  241. package/dist/commands/chat/slash/commands/ui.js +108 -0
  242. package/dist/commands/chat/slash/context.d.ts +3 -0
  243. package/dist/commands/chat/slash/context.js +9 -0
  244. package/dist/commands/chat/slash/format.d.ts +3 -0
  245. package/dist/commands/chat/slash/format.js +19 -0
  246. package/dist/commands/chat/slash/parser.d.ts +15 -0
  247. package/dist/commands/chat/slash/parser.js +97 -0
  248. package/dist/commands/chat/slash/registry.d.ts +13 -0
  249. package/dist/commands/chat/slash/registry.js +38 -0
  250. package/dist/commands/chat/slash/result.d.ts +7 -0
  251. package/dist/commands/chat/slash/result.js +35 -0
  252. package/dist/commands/chat/slash/types.d.ts +32 -0
  253. package/dist/commands/chat/slash/types.js +1 -0
  254. package/dist/commands/chat/startup.d.ts +68 -0
  255. package/dist/commands/chat/startup.js +150 -0
  256. package/dist/commands/chat/state.d.ts +3 -0
  257. package/dist/commands/chat/state.js +100 -0
  258. package/dist/commands/chat/utils.d.ts +25 -0
  259. package/dist/commands/chat/utils.js +208 -0
  260. package/dist/commands/chat.d.ts +2 -0
  261. package/dist/commands/chat.js +2 -0
  262. package/dist/commands/cockpit/core.d.ts +5 -0
  263. package/dist/commands/cockpit/core.js +91 -0
  264. package/dist/commands/cockpit/render.d.ts +5 -0
  265. package/dist/commands/cockpit/render.js +931 -0
  266. package/dist/commands/cockpit/scroll.d.ts +39 -0
  267. package/dist/commands/cockpit/scroll.js +87 -0
  268. package/dist/commands/cockpit/telemetry.d.ts +30 -0
  269. package/dist/commands/cockpit/telemetry.js +361 -0
  270. package/dist/commands/cockpit/update-loop.d.ts +54 -0
  271. package/dist/commands/cockpit/update-loop.js +285 -0
  272. package/dist/commands/cockpit/utils.d.ts +231 -0
  273. package/dist/commands/cockpit/utils.js +388 -0
  274. package/dist/commands/cockpit.d.ts +8 -0
  275. package/dist/commands/cockpit.js +7 -0
  276. package/dist/commands/codex.d.ts +70 -0
  277. package/dist/commands/codex.js +597 -0
  278. package/dist/commands/consent.d.ts +24 -0
  279. package/dist/commands/consent.js +255 -0
  280. package/dist/commands/cron.d.ts +16 -0
  281. package/dist/commands/cron.js +187 -0
  282. package/dist/commands/dag-from-spec.d.ts +30 -0
  283. package/dist/commands/dag-from-spec.js +284 -0
  284. package/dist/commands/dag.d.ts +10 -0
  285. package/dist/commands/dag.js +467 -0
  286. package/dist/commands/design.d.ts +73 -0
  287. package/dist/commands/design.js +1251 -0
  288. package/dist/commands/diff-runs.d.ts +3 -0
  289. package/dist/commands/diff-runs.js +36 -0
  290. package/dist/commands/do.d.ts +29 -0
  291. package/dist/commands/do.js +196 -0
  292. package/dist/commands/doctor/checks.d.ts +20 -0
  293. package/dist/commands/doctor/checks.js +896 -0
  294. package/dist/commands/doctor/core.d.ts +2 -0
  295. package/dist/commands/doctor/core.js +53 -0
  296. package/dist/commands/doctor/fix-plan.d.ts +69 -0
  297. package/dist/commands/doctor/fix-plan.js +78 -0
  298. package/dist/commands/doctor/fix.d.ts +5 -0
  299. package/dist/commands/doctor/fix.js +1002 -0
  300. package/dist/commands/doctor/report.d.ts +7 -0
  301. package/dist/commands/doctor/report.js +151 -0
  302. package/dist/commands/doctor/utils.d.ts +52 -0
  303. package/dist/commands/doctor/utils.js +124 -0
  304. package/dist/commands/doctor.d.ts +2 -0
  305. package/dist/commands/doctor.js +1 -0
  306. package/dist/commands/goal.d.ts +46 -0
  307. package/dist/commands/goal.js +492 -0
  308. package/dist/commands/google.d.ts +1 -0
  309. package/dist/commands/google.js +27 -0
  310. package/dist/commands/graph.d.ts +9 -0
  311. package/dist/commands/graph.js +26 -0
  312. package/dist/commands/hud.d.ts +57 -0
  313. package/dist/commands/hud.js +1031 -0
  314. package/dist/commands/image.d.ts +16 -0
  315. package/dist/commands/image.js +102 -0
  316. package/dist/commands/init/config.d.ts +8 -0
  317. package/dist/commands/init/config.js +97 -0
  318. package/dist/commands/init/constants.d.ts +7 -0
  319. package/dist/commands/init/constants.js +49 -0
  320. package/dist/commands/init/content.d.ts +12 -0
  321. package/dist/commands/init/content.js +1783 -0
  322. package/dist/commands/init/core.d.ts +2 -0
  323. package/dist/commands/init/core.js +298 -0
  324. package/dist/commands/init/interactive.d.ts +9 -0
  325. package/dist/commands/init/interactive.js +170 -0
  326. package/dist/commands/init/scaffold.d.ts +17 -0
  327. package/dist/commands/init/scaffold.js +146 -0
  328. package/dist/commands/init/types.d.ts +35 -0
  329. package/dist/commands/init/types.js +1 -0
  330. package/dist/commands/init/utils.d.ts +13 -0
  331. package/dist/commands/init/utils.js +107 -0
  332. package/dist/commands/init.d.ts +32 -0
  333. package/dist/commands/init.js +2581 -0
  334. package/dist/commands/inspect.d.ts +9 -0
  335. package/dist/commands/inspect.js +12 -0
  336. package/dist/commands/lsp.d.ts +8 -0
  337. package/dist/commands/lsp.js +60 -0
  338. package/dist/commands/mcp.d.ts +104 -0
  339. package/dist/commands/mcp.js +1603 -0
  340. package/dist/commands/menu.d.ts +4 -0
  341. package/dist/commands/menu.js +213 -0
  342. package/dist/commands/merge.d.ts +8 -0
  343. package/dist/commands/merge.js +229 -0
  344. package/dist/commands/mode.d.ts +3 -0
  345. package/dist/commands/mode.js +60 -0
  346. package/dist/commands/model.d.ts +15 -0
  347. package/dist/commands/model.js +215 -0
  348. package/dist/commands/notice.d.ts +7 -0
  349. package/dist/commands/notice.js +76 -0
  350. package/dist/commands/open-design-agent.d.ts +46 -0
  351. package/dist/commands/open-design-agent.js +569 -0
  352. package/dist/commands/orchestrate.d.ts +18 -0
  353. package/dist/commands/orchestrate.js +284 -0
  354. package/dist/commands/parallel/core.d.ts +34 -0
  355. package/dist/commands/parallel/core.js +296 -0
  356. package/dist/commands/parallel/index.d.ts +5 -0
  357. package/dist/commands/parallel/index.js +5 -0
  358. package/dist/commands/parallel/interactive.d.ts +27 -0
  359. package/dist/commands/parallel/interactive.js +172 -0
  360. package/dist/commands/parallel/orchestrator.d.ts +40 -0
  361. package/dist/commands/parallel/orchestrator.js +564 -0
  362. package/dist/commands/parallel/utils.d.ts +12 -0
  363. package/dist/commands/parallel/utils.js +114 -0
  364. package/dist/commands/parallel/worker.d.ts +43 -0
  365. package/dist/commands/parallel/worker.js +276 -0
  366. package/dist/commands/parallel.d.ts +4 -0
  367. package/dist/commands/parallel.js +3 -0
  368. package/dist/commands/plan.d.ts +6 -0
  369. package/dist/commands/plan.js +113 -0
  370. package/dist/commands/project-index.d.ts +18 -0
  371. package/dist/commands/project-index.js +312 -0
  372. package/dist/commands/provider.d.ts +65 -0
  373. package/dist/commands/provider.js +619 -0
  374. package/dist/commands/rail.d.ts +6 -0
  375. package/dist/commands/rail.js +7 -0
  376. package/dist/commands/replay.d.ts +7 -0
  377. package/dist/commands/replay.js +10 -0
  378. package/dist/commands/research.d.ts +5 -0
  379. package/dist/commands/research.js +48 -0
  380. package/dist/commands/run.d.ts +15 -0
  381. package/dist/commands/run.js +312 -0
  382. package/dist/commands/runs.d.ts +36 -0
  383. package/dist/commands/runs.js +504 -0
  384. package/dist/commands/screenshot.d.ts +10 -0
  385. package/dist/commands/screenshot.js +72 -0
  386. package/dist/commands/skill.d.ts +28 -0
  387. package/dist/commands/skill.js +382 -0
  388. package/dist/commands/snip.d.ts +8 -0
  389. package/dist/commands/snip.js +77 -0
  390. package/dist/commands/spec.d.ts +17 -0
  391. package/dist/commands/spec.js +262 -0
  392. package/dist/commands/specify.d.ts +18 -0
  393. package/dist/commands/specify.js +111 -0
  394. package/dist/commands/star.d.ts +3 -0
  395. package/dist/commands/star.js +30 -0
  396. package/dist/commands/summary.d.ts +2 -0
  397. package/dist/commands/summary.js +343 -0
  398. package/dist/commands/sync.d.ts +6 -0
  399. package/dist/commands/sync.js +129 -0
  400. package/dist/commands/team.d.ts +7 -0
  401. package/dist/commands/team.js +264 -0
  402. package/dist/commands/verify.d.ts +4 -0
  403. package/dist/commands/verify.js +320 -0
  404. package/dist/commands/version.d.ts +6 -0
  405. package/dist/commands/version.js +83 -0
  406. package/dist/commands/web-bridge.d.ts +12 -0
  407. package/dist/commands/web-bridge.js +75 -0
  408. package/dist/commands/why.d.ts +14 -0
  409. package/dist/commands/why.js +46 -0
  410. package/dist/commands/workflow.d.ts +13 -0
  411. package/dist/commands/workflow.js +385 -0
  412. package/dist/contracts/dag.d.ts +134 -0
  413. package/dist/contracts/dag.js +4 -0
  414. package/dist/contracts/decision.d.ts +23 -0
  415. package/dist/contracts/decision.js +1 -0
  416. package/dist/contracts/envelope.d.ts +29 -0
  417. package/dist/contracts/envelope.js +1 -0
  418. package/dist/contracts/errors.d.ts +13 -0
  419. package/dist/contracts/errors.js +15 -0
  420. package/dist/contracts/evidence.d.ts +23 -0
  421. package/dist/contracts/evidence.js +1 -0
  422. package/dist/contracts/goal.d.ts +169 -0
  423. package/dist/contracts/goal.js +4 -0
  424. package/dist/contracts/hud.d.ts +17 -0
  425. package/dist/contracts/hud.js +4 -0
  426. package/dist/contracts/index.d.ts +8 -0
  427. package/dist/contracts/index.js +8 -0
  428. package/dist/contracts/orchestration.d.ts +215 -0
  429. package/dist/contracts/orchestration.js +4 -0
  430. package/dist/contracts/proof.d.ts +32 -0
  431. package/dist/contracts/proof.js +1 -0
  432. package/dist/contracts/provider.d.ts +35 -0
  433. package/dist/contracts/provider.js +1 -0
  434. package/dist/contracts/replay.d.ts +95 -0
  435. package/dist/contracts/replay.js +7 -0
  436. package/dist/contracts/run.d.ts +34 -0
  437. package/dist/contracts/run.js +1 -0
  438. package/dist/contracts/safety.d.ts +10 -0
  439. package/dist/contracts/safety.js +4 -0
  440. package/dist/contracts/version.d.ts +21 -0
  441. package/dist/contracts/version.js +1 -0
  442. package/dist/contracts/web-bridge.d.ts +95 -0
  443. package/dist/contracts/web-bridge.js +168 -0
  444. package/dist/contracts/worker-context.d.ts +70 -0
  445. package/dist/contracts/worker-context.js +1 -0
  446. package/dist/evidence/attempt-record.d.ts +78 -0
  447. package/dist/evidence/attempt-record.js +16 -0
  448. package/dist/evidence/context-snapshot.d.ts +20 -0
  449. package/dist/evidence/context-snapshot.js +81 -0
  450. package/dist/evidence/decision-trace.d.ts +14 -0
  451. package/dist/evidence/decision-trace.js +54 -0
  452. package/dist/evidence/diagnosis.d.ts +15 -0
  453. package/dist/evidence/diagnosis.js +279 -0
  454. package/dist/evidence/evidence-recorder.d.ts +19 -0
  455. package/dist/evidence/evidence-recorder.js +55 -0
  456. package/dist/evidence/index.d.ts +15 -0
  457. package/dist/evidence/index.js +7 -0
  458. package/dist/evidence/run-trace.d.ts +103 -0
  459. package/dist/evidence/run-trace.js +191 -0
  460. package/dist/goal/compiler.d.ts +5 -0
  461. package/dist/goal/compiler.js +350 -0
  462. package/dist/goal/control-loop.d.ts +109 -0
  463. package/dist/goal/control-loop.js +1089 -0
  464. package/dist/goal/ensemble-memory.d.ts +26 -0
  465. package/dist/goal/ensemble-memory.js +55 -0
  466. package/dist/goal/eval-criteria.d.ts +3 -0
  467. package/dist/goal/eval-criteria.js +72 -0
  468. package/dist/goal/evidence.d.ts +20 -0
  469. package/dist/goal/evidence.js +321 -0
  470. package/dist/goal/goal-daemon.d.ts +40 -0
  471. package/dist/goal/goal-daemon.js +318 -0
  472. package/dist/goal/intake.d.ts +48 -0
  473. package/dist/goal/intake.js +561 -0
  474. package/dist/goal/intent-analyzer.d.ts +9 -0
  475. package/dist/goal/intent-analyzer.js +322 -0
  476. package/dist/goal/intent-frame.d.ts +35 -0
  477. package/dist/goal/intent-frame.js +566 -0
  478. package/dist/goal/persistence.d.ts +11 -0
  479. package/dist/goal/persistence.js +134 -0
  480. package/dist/goal/prompt-digest.d.ts +13 -0
  481. package/dist/goal/prompt-digest.js +111 -0
  482. package/dist/goal/scoring.d.ts +2 -0
  483. package/dist/goal/scoring.js +69 -0
  484. package/dist/goal/wake-policy.d.ts +26 -0
  485. package/dist/goal/wake-policy.js +58 -0
  486. package/dist/harness/create-harness-task-runner.d.ts +43 -0
  487. package/dist/harness/create-harness-task-runner.js +56 -0
  488. package/dist/harness/execute-harness-run.d.ts +34 -0
  489. package/dist/harness/execute-harness-run.js +109 -0
  490. package/dist/hooks/events.d.ts +71 -0
  491. package/dist/hooks/events.js +1 -0
  492. package/dist/hooks/hook-bus.d.ts +13 -0
  493. package/dist/hooks/hook-bus.js +59 -0
  494. package/dist/hooks/hook-registry.d.ts +6 -0
  495. package/dist/hooks/hook-registry.js +64 -0
  496. package/dist/hooks/index.d.ts +3 -0
  497. package/dist/hooks/index.js +2 -0
  498. package/dist/hud/index.d.ts +9 -0
  499. package/dist/hud/index.js +11 -0
  500. package/dist/hud/live-renderer.d.ts +17 -0
  501. package/dist/hud/live-renderer.js +52 -0
  502. package/dist/hud/render.d.ts +62 -0
  503. package/dist/hud/render.js +954 -0
  504. package/dist/hud/types.d.ts +58 -0
  505. package/dist/hud/types.js +7 -0
  506. package/dist/input/input-artifacts.d.ts +10 -0
  507. package/dist/input/input-artifacts.js +19 -0
  508. package/dist/input/input-envelope.d.ts +64 -0
  509. package/dist/input/input-envelope.js +86 -0
  510. package/dist/integrations/servarr/adapter.d.ts +29 -0
  511. package/dist/integrations/servarr/adapter.js +156 -0
  512. package/dist/integrations/servarr/commands.d.ts +15 -0
  513. package/dist/integrations/servarr/commands.js +119 -0
  514. package/dist/integrations/servarr/schema.d.ts +34 -0
  515. package/dist/integrations/servarr/schema.js +149 -0
  516. package/dist/kimi/ascii-art.d.ts +1 -0
  517. package/dist/kimi/ascii-art.js +23 -0
  518. package/dist/kimi/banner.d.ts +53 -0
  519. package/dist/kimi/banner.js +284 -0
  520. package/dist/kimi/bug-filter.d.ts +15 -0
  521. package/dist/kimi/bug-filter.js +150 -0
  522. package/dist/kimi/capability.d.ts +25 -0
  523. package/dist/kimi/capability.js +68 -0
  524. package/dist/kimi/isolated-home.d.ts +21 -0
  525. package/dist/kimi/isolated-home.js +270 -0
  526. package/dist/kimi/runner.d.ts +74 -0
  527. package/dist/kimi/runner.js +1052 -0
  528. package/dist/kimi/simple-art.d.ts +1 -0
  529. package/dist/kimi/simple-art.js +1 -0
  530. package/dist/kimi/statusline.d.ts +26 -0
  531. package/dist/kimi/statusline.js +142 -0
  532. package/dist/kimi/usage.d.ts +52 -0
  533. package/dist/kimi/usage.js +481 -0
  534. package/dist/kimi/wire-client.d.ts +95 -0
  535. package/dist/kimi/wire-client.js +338 -0
  536. package/dist/lsp/default-config.d.ts +16 -0
  537. package/dist/lsp/default-config.js +26 -0
  538. package/dist/mcp/acp-server.d.ts +2 -0
  539. package/dist/mcp/acp-server.js +357 -0
  540. package/dist/mcp/autoconnect.d.ts +60 -0
  541. package/dist/mcp/autoconnect.js +192 -0
  542. package/dist/mcp/client.d.ts +112 -0
  543. package/dist/mcp/client.js +276 -0
  544. package/dist/mcp/config-permissions.d.ts +23 -0
  545. package/dist/mcp/config-permissions.js +66 -0
  546. package/dist/mcp/consent-flow.d.ts +152 -0
  547. package/dist/mcp/consent-flow.js +329 -0
  548. package/dist/mcp/filesystem-readonly-server.d.ts +2 -0
  549. package/dist/mcp/filesystem-readonly-server.js +320 -0
  550. package/dist/mcp/governance.d.ts +292 -0
  551. package/dist/mcp/governance.js +602 -0
  552. package/dist/mcp/host.d.ts +154 -0
  553. package/dist/mcp/host.js +792 -0
  554. package/dist/mcp/omk-project-server.d.ts +2 -0
  555. package/dist/mcp/omk-project-server.js +1632 -0
  556. package/dist/mcp/omk-web-bridge-server.d.ts +14 -0
  557. package/dist/mcp/omk-web-bridge-server.js +154 -0
  558. package/dist/mcp/permission-resolver.d.ts +67 -0
  559. package/dist/mcp/permission-resolver.js +124 -0
  560. package/dist/mcp/quality-gate.d.ts +36 -0
  561. package/dist/mcp/quality-gate.js +247 -0
  562. package/dist/mcp/quarantine.d.ts +11 -0
  563. package/dist/mcp/quarantine.js +79 -0
  564. package/dist/mcp/secret-scanner.d.ts +189 -0
  565. package/dist/mcp/secret-scanner.js +709 -0
  566. package/dist/mcp/server-catalog.d.ts +36 -0
  567. package/dist/mcp/server-catalog.js +168 -0
  568. package/dist/mcp/shared-secret-registry.d.ts +61 -0
  569. package/dist/mcp/shared-secret-registry.js +171 -0
  570. package/dist/mcp/transports/stdio.d.ts +22 -0
  571. package/dist/mcp/transports/stdio.js +165 -0
  572. package/dist/mcp/transports/streamable-http.d.ts +31 -0
  573. package/dist/mcp/transports/streamable-http.js +289 -0
  574. package/dist/mcp/transports/transport.d.ts +20 -0
  575. package/dist/mcp/transports/transport.js +3 -0
  576. package/dist/memory/embedding.d.ts +11 -0
  577. package/dist/memory/embedding.js +24 -0
  578. package/dist/memory/graph-viewer.d.ts +72 -0
  579. package/dist/memory/graph-viewer.js +402 -0
  580. package/dist/memory/kuzu-memory-store.d.ts +37 -0
  581. package/dist/memory/kuzu-memory-store.js +453 -0
  582. package/dist/memory/local-graph-memory-store.d.ts +141 -0
  583. package/dist/memory/local-graph-memory-store.js +884 -0
  584. package/dist/memory/memory-config.d.ts +51 -0
  585. package/dist/memory/memory-config.js +187 -0
  586. package/dist/memory/memory-store.d.ts +48 -0
  587. package/dist/memory/memory-store.js +210 -0
  588. package/dist/memory/ontology-model.d.ts +175 -0
  589. package/dist/memory/ontology-model.js +131 -0
  590. package/dist/native/linux-x64/omk-safety +0 -0
  591. package/dist/openai/image-client.d.ts +103 -0
  592. package/dist/openai/image-client.js +380 -0
  593. package/dist/orchestration/agent-worker.d.ts +72 -0
  594. package/dist/orchestration/agent-worker.js +278 -0
  595. package/dist/orchestration/capability-agents.d.ts +14 -0
  596. package/dist/orchestration/capability-agents.js +180 -0
  597. package/dist/orchestration/capability-routing.d.ts +42 -0
  598. package/dist/orchestration/capability-routing.js +65 -0
  599. package/dist/orchestration/compiled-dag-executor.d.ts +56 -0
  600. package/dist/orchestration/compiled-dag-executor.js +88 -0
  601. package/dist/orchestration/completion-artifacts.d.ts +37 -0
  602. package/dist/orchestration/completion-artifacts.js +84 -0
  603. package/dist/orchestration/completion-sentinel.d.ts +37 -0
  604. package/dist/orchestration/completion-sentinel.js +66 -0
  605. package/dist/orchestration/contracts/index.d.ts +45 -0
  606. package/dist/orchestration/contracts/index.js +6 -0
  607. package/dist/orchestration/dag-artifacts.d.ts +11 -0
  608. package/dist/orchestration/dag-artifacts.js +42 -0
  609. package/dist/orchestration/dag-compiler-presets.d.ts +20 -0
  610. package/dist/orchestration/dag-compiler-presets.js +476 -0
  611. package/dist/orchestration/dag-compiler-types.d.ts +40 -0
  612. package/dist/orchestration/dag-compiler-types.js +1 -0
  613. package/dist/orchestration/dag-compiler.d.ts +3 -0
  614. package/dist/orchestration/dag-compiler.js +122 -0
  615. package/dist/orchestration/dag.d.ts +158 -0
  616. package/dist/orchestration/dag.js +310 -0
  617. package/dist/orchestration/diagnostics.d.ts +27 -0
  618. package/dist/orchestration/diagnostics.js +262 -0
  619. package/dist/orchestration/enhanced-modes.d.ts +116 -0
  620. package/dist/orchestration/enhanced-modes.js +231 -0
  621. package/dist/orchestration/enhanced-parallel-orchestrator.d.ts +127 -0
  622. package/dist/orchestration/enhanced-parallel-orchestrator.js +734 -0
  623. package/dist/orchestration/ensemble-decision.d.ts +40 -0
  624. package/dist/orchestration/ensemble-decision.js +297 -0
  625. package/dist/orchestration/ensemble.d.ts +22 -0
  626. package/dist/orchestration/ensemble.js +558 -0
  627. package/dist/orchestration/eta.d.ts +10 -0
  628. package/dist/orchestration/eta.js +75 -0
  629. package/dist/orchestration/evidence-check.d.ts +36 -0
  630. package/dist/orchestration/evidence-check.js +257 -0
  631. package/dist/orchestration/evidence-gate.d.ts +34 -0
  632. package/dist/orchestration/evidence-gate.js +501 -0
  633. package/dist/orchestration/execution-planner.d.ts +40 -0
  634. package/dist/orchestration/execution-planner.js +252 -0
  635. package/dist/orchestration/executor.d.ts +11 -0
  636. package/dist/orchestration/executor.js +979 -0
  637. package/dist/orchestration/interactive-orchestrator.d.ts +134 -0
  638. package/dist/orchestration/interactive-orchestrator.js +450 -0
  639. package/dist/orchestration/log-streamer.d.ts +104 -0
  640. package/dist/orchestration/log-streamer.js +288 -0
  641. package/dist/orchestration/loop-artifacts.d.ts +14 -0
  642. package/dist/orchestration/loop-artifacts.js +20 -0
  643. package/dist/orchestration/loop-controller.d.ts +14 -0
  644. package/dist/orchestration/loop-controller.js +311 -0
  645. package/dist/orchestration/loop-guard.d.ts +28 -0
  646. package/dist/orchestration/loop-guard.js +104 -0
  647. package/dist/orchestration/loop-state.d.ts +86 -0
  648. package/dist/orchestration/loop-state.js +1 -0
  649. package/dist/orchestration/node-monitor.d.ts +18 -0
  650. package/dist/orchestration/node-monitor.js +98 -0
  651. package/dist/orchestration/orchestrate-prompt.d.ts +43 -0
  652. package/dist/orchestration/orchestrate-prompt.js +533 -0
  653. package/dist/orchestration/orchestration-state.d.ts +3 -0
  654. package/dist/orchestration/orchestration-state.js +2 -0
  655. package/dist/orchestration/parallel-orchestrator.d.ts +159 -0
  656. package/dist/orchestration/parallel-orchestrator.js +576 -0
  657. package/dist/orchestration/parallel-ui.d.ts +51 -0
  658. package/dist/orchestration/parallel-ui.js +470 -0
  659. package/dist/orchestration/repair-policy.d.ts +20 -0
  660. package/dist/orchestration/repair-policy.js +221 -0
  661. package/dist/orchestration/routing/inventory.d.ts +9 -0
  662. package/dist/orchestration/routing/inventory.js +273 -0
  663. package/dist/orchestration/routing/mcp-config.d.ts +17 -0
  664. package/dist/orchestration/routing/mcp-config.js +154 -0
  665. package/dist/orchestration/routing/types.d.ts +38 -0
  666. package/dist/orchestration/routing/types.js +4 -0
  667. package/dist/orchestration/routing.d.ts +31 -0
  668. package/dist/orchestration/routing.js +961 -0
  669. package/dist/orchestration/run-state.d.ts +36 -0
  670. package/dist/orchestration/run-state.js +176 -0
  671. package/dist/orchestration/scheduler.d.ts +9 -0
  672. package/dist/orchestration/scheduler.js +85 -0
  673. package/dist/orchestration/skill-assigner.d.ts +22 -0
  674. package/dist/orchestration/skill-assigner.js +345 -0
  675. package/dist/orchestration/state-machine/index.d.ts +3 -0
  676. package/dist/orchestration/state-machine/index.js +3 -0
  677. package/dist/orchestration/state-machine/node-state-machine.d.ts +24 -0
  678. package/dist/orchestration/state-machine/node-state-machine.js +35 -0
  679. package/dist/orchestration/state-machine/run-state-machine.d.ts +38 -0
  680. package/dist/orchestration/state-machine/run-state-machine.js +161 -0
  681. package/dist/orchestration/state-machine/run-state-manager.d.ts +108 -0
  682. package/dist/orchestration/state-machine/run-state-manager.js +314 -0
  683. package/dist/orchestration/state-persister.d.ts +7 -0
  684. package/dist/orchestration/state-persister.js +77 -0
  685. package/dist/orchestration/task-graph.d.ts +29 -0
  686. package/dist/orchestration/task-graph.js +261 -0
  687. package/dist/orchestration/verification-only.d.ts +28 -0
  688. package/dist/orchestration/verification-only.js +94 -0
  689. package/dist/providers/attempt-recorder.d.ts +10 -0
  690. package/dist/providers/attempt-recorder.js +38 -0
  691. package/dist/providers/codex-cli-runner.d.ts +11 -0
  692. package/dist/providers/codex-cli-runner.js +129 -0
  693. package/dist/providers/context-preflight.d.ts +47 -0
  694. package/dist/providers/context-preflight.js +134 -0
  695. package/dist/providers/deepseek/deepseek-balance.d.ts +29 -0
  696. package/dist/providers/deepseek/deepseek-balance.js +80 -0
  697. package/dist/providers/deepseek/deepseek-client.d.ts +53 -0
  698. package/dist/providers/deepseek/deepseek-client.js +164 -0
  699. package/dist/providers/deepseek/deepseek-config.d.ts +89 -0
  700. package/dist/providers/deepseek/deepseek-config.js +272 -0
  701. package/dist/providers/deepseek/deepseek-errors.d.ts +5 -0
  702. package/dist/providers/deepseek/deepseek-errors.js +48 -0
  703. package/dist/providers/deepseek/deepseek-provider.d.ts +10 -0
  704. package/dist/providers/deepseek/deepseek-provider.js +162 -0
  705. package/dist/providers/deepseek/deepseek-super-config.d.ts +31 -0
  706. package/dist/providers/deepseek/deepseek-super-config.js +136 -0
  707. package/dist/providers/deepseek-provider.d.ts +8 -0
  708. package/dist/providers/deepseek-provider.js +78 -0
  709. package/dist/providers/health.d.ts +13 -0
  710. package/dist/providers/health.js +55 -0
  711. package/dist/providers/index.d.ts +22 -0
  712. package/dist/providers/index.js +22 -0
  713. package/dist/providers/kimi-provider-failure.d.ts +8 -0
  714. package/dist/providers/kimi-provider-failure.js +56 -0
  715. package/dist/providers/kimi-provider.d.ts +7 -0
  716. package/dist/providers/kimi-provider.js +27 -0
  717. package/dist/providers/model-registry.d.ts +103 -0
  718. package/dist/providers/model-registry.js +571 -0
  719. package/dist/providers/model-table.d.ts +24 -0
  720. package/dist/providers/model-table.js +140 -0
  721. package/dist/providers/model-tabs.d.ts +33 -0
  722. package/dist/providers/model-tabs.js +98 -0
  723. package/dist/providers/openai-compatible-runner.d.ts +17 -0
  724. package/dist/providers/openai-compatible-runner.js +180 -0
  725. package/dist/providers/provider-router.d.ts +8 -0
  726. package/dist/providers/provider-router.js +174 -0
  727. package/dist/providers/provider-runtime.d.ts +17 -0
  728. package/dist/providers/provider-runtime.js +246 -0
  729. package/dist/providers/provider-stats.d.ts +56 -0
  730. package/dist/providers/provider-stats.js +303 -0
  731. package/dist/providers/provider-task-runner.d.ts +23 -0
  732. package/dist/providers/provider-task-runner.js +1171 -0
  733. package/dist/providers/provider.d.ts +74 -0
  734. package/dist/providers/provider.js +9 -0
  735. package/dist/providers/router.d.ts +14 -0
  736. package/dist/providers/router.js +486 -0
  737. package/dist/providers/runner/deepseek-helpers.d.ts +38 -0
  738. package/dist/providers/runner/deepseek-helpers.js +150 -0
  739. package/dist/providers/runner/env.d.ts +12 -0
  740. package/dist/providers/runner/env.js +98 -0
  741. package/dist/providers/runner/execution.d.ts +26 -0
  742. package/dist/providers/runner/execution.js +42 -0
  743. package/dist/providers/runner/helpers.d.ts +9 -0
  744. package/dist/providers/runner/helpers.js +38 -0
  745. package/dist/providers/runner/results.d.ts +26 -0
  746. package/dist/providers/runner/results.js +104 -0
  747. package/dist/providers/thinking-levels.d.ts +7 -0
  748. package/dist/providers/thinking-levels.js +67 -0
  749. package/dist/providers/types.d.ts +139 -0
  750. package/dist/providers/types.js +60 -0
  751. package/dist/replay/differ.d.ts +5 -0
  752. package/dist/replay/differ.js +314 -0
  753. package/dist/replay/index.d.ts +6 -0
  754. package/dist/replay/index.js +4 -0
  755. package/dist/replay/inspector.d.ts +14 -0
  756. package/dist/replay/inspector.js +264 -0
  757. package/dist/replay/manifest-builder.d.ts +11 -0
  758. package/dist/replay/manifest-builder.js +184 -0
  759. package/dist/replay/replay-engine.d.ts +18 -0
  760. package/dist/replay/replay-engine.js +265 -0
  761. package/dist/runtime/adapter.d.ts +77 -0
  762. package/dist/runtime/adapter.js +28 -0
  763. package/dist/runtime/agent-runtime.d.ts +123 -0
  764. package/dist/runtime/agent-runtime.js +18 -0
  765. package/dist/runtime/cache-stable-session.d.ts +55 -0
  766. package/dist/runtime/cache-stable-session.js +108 -0
  767. package/dist/runtime/capability-injection.d.ts +39 -0
  768. package/dist/runtime/capability-injection.js +93 -0
  769. package/dist/runtime/chat-advisory-runtime.d.ts +2 -0
  770. package/dist/runtime/chat-advisory-runtime.js +71 -0
  771. package/dist/runtime/child-env.d.ts +31 -0
  772. package/dist/runtime/child-env.js +131 -0
  773. package/dist/runtime/codex-cli-runtime.d.ts +10 -0
  774. package/dist/runtime/codex-cli-runtime.js +78 -0
  775. package/dist/runtime/codex-runtime.d.ts +35 -0
  776. package/dist/runtime/codex-runtime.js +264 -0
  777. package/dist/runtime/command-bus.d.ts +13 -0
  778. package/dist/runtime/command-bus.js +57 -0
  779. package/dist/runtime/context-broker-converter.d.ts +9 -0
  780. package/dist/runtime/context-broker-converter.js +96 -0
  781. package/dist/runtime/context-broker.d.ts +25 -0
  782. package/dist/runtime/context-broker.js +308 -0
  783. package/dist/runtime/context-budget-optimizer.d.ts +73 -0
  784. package/dist/runtime/context-budget-optimizer.js +300 -0
  785. package/dist/runtime/context-capsule.d.ts +81 -0
  786. package/dist/runtime/context-capsule.js +46 -0
  787. package/dist/runtime/contracts/command-envelope.d.ts +99 -0
  788. package/dist/runtime/contracts/command-envelope.js +5 -0
  789. package/dist/runtime/contracts/reasoning-trace.d.ts +120 -0
  790. package/dist/runtime/contracts/reasoning-trace.js +10 -0
  791. package/dist/runtime/contracts/shared.d.ts +34 -0
  792. package/dist/runtime/contracts/shared.js +12 -0
  793. package/dist/runtime/core-verified-preset.d.ts +37 -0
  794. package/dist/runtime/core-verified-preset.js +205 -0
  795. package/dist/runtime/debloat-nlp.d.ts +140 -0
  796. package/dist/runtime/debloat-nlp.js +398 -0
  797. package/dist/runtime/deepseek-runtime.d.ts +28 -0
  798. package/dist/runtime/deepseek-runtime.js +270 -0
  799. package/dist/runtime/external-cli-adapter.d.ts +29 -0
  800. package/dist/runtime/external-cli-adapter.js +283 -0
  801. package/dist/runtime/index.d.ts +8 -0
  802. package/dist/runtime/index.js +8 -0
  803. package/dist/runtime/kimi-api-runtime.d.ts +52 -0
  804. package/dist/runtime/kimi-api-runtime.js +367 -0
  805. package/dist/runtime/kimi-print-runtime.d.ts +10 -0
  806. package/dist/runtime/kimi-print-runtime.js +87 -0
  807. package/dist/runtime/kimi-wire-protocol-runtime.d.ts +44 -0
  808. package/dist/runtime/kimi-wire-protocol-runtime.js +436 -0
  809. package/dist/runtime/kimi-wire-runtime.d.ts +17 -0
  810. package/dist/runtime/kimi-wire-runtime.js +112 -0
  811. package/dist/runtime/legacy-bridge.d.ts +14 -0
  812. package/dist/runtime/legacy-bridge.js +27 -0
  813. package/dist/runtime/local-llm-runtime.d.ts +29 -0
  814. package/dist/runtime/local-llm-runtime.js +231 -0
  815. package/dist/runtime/mimo-api-runtime.d.ts +13 -0
  816. package/dist/runtime/mimo-api-runtime.js +24 -0
  817. package/dist/runtime/nlg-renderer.d.ts +38 -0
  818. package/dist/runtime/nlg-renderer.js +132 -0
  819. package/dist/runtime/output-router.d.ts +20 -0
  820. package/dist/runtime/output-router.js +171 -0
  821. package/dist/runtime/process-session.d.ts +27 -0
  822. package/dist/runtime/process-session.js +35 -0
  823. package/dist/runtime/prompt-envelope.d.ts +28 -0
  824. package/dist/runtime/prompt-envelope.js +78 -0
  825. package/dist/runtime/provider-event-normalizer.d.ts +117 -0
  826. package/dist/runtime/provider-event-normalizer.js +454 -0
  827. package/dist/runtime/provider-tool-contracts.d.ts +24 -0
  828. package/dist/runtime/provider-tool-contracts.js +56 -0
  829. package/dist/runtime/reasoning-trace.d.ts +46 -0
  830. package/dist/runtime/reasoning-trace.js +289 -0
  831. package/dist/runtime/renderers.d.ts +33 -0
  832. package/dist/runtime/renderers.js +221 -0
  833. package/dist/runtime/runtime-backed-task-runner.d.ts +20 -0
  834. package/dist/runtime/runtime-backed-task-runner.js +166 -0
  835. package/dist/runtime/runtime-bootstrap.d.ts +21 -0
  836. package/dist/runtime/runtime-bootstrap.js +208 -0
  837. package/dist/runtime/runtime-registry.d.ts +23 -0
  838. package/dist/runtime/runtime-registry.js +95 -0
  839. package/dist/runtime/runtime-router.d.ts +51 -0
  840. package/dist/runtime/runtime-router.js +620 -0
  841. package/dist/runtime/sandbox-profile.d.ts +25 -0
  842. package/dist/runtime/sandbox-profile.js +35 -0
  843. package/dist/runtime/slash-commands.d.ts +46 -0
  844. package/dist/runtime/slash-commands.js +321 -0
  845. package/dist/runtime/stable-json.d.ts +9 -0
  846. package/dist/runtime/stable-json.js +45 -0
  847. package/dist/runtime/tool-call-repair.d.ts +35 -0
  848. package/dist/runtime/tool-call-repair.js +181 -0
  849. package/dist/runtime/tool-dispatch-contracts.d.ts +8 -0
  850. package/dist/runtime/tool-dispatch-contracts.js +32 -0
  851. package/dist/runtime/tool-plane.d.ts +31 -0
  852. package/dist/runtime/tool-plane.js +112 -0
  853. package/dist/runtime/tool-proxy.d.ts +20 -0
  854. package/dist/runtime/tool-proxy.js +109 -0
  855. package/dist/runtime/tool-registry-contract.d.ts +40 -0
  856. package/dist/runtime/tool-registry-contract.js +52 -0
  857. package/dist/runtime/ui-components.d.ts +64 -0
  858. package/dist/runtime/ui-components.js +232 -0
  859. package/dist/runtime/worker-manifest.d.ts +34 -0
  860. package/dist/runtime/worker-manifest.js +204 -0
  861. package/dist/safety/approval-policy.d.ts +4 -0
  862. package/dist/safety/approval-policy.js +33 -0
  863. package/dist/safety/guard-hooks.d.ts +3 -0
  864. package/dist/safety/guard-hooks.js +64 -0
  865. package/dist/schema/decision.schema.d.ts +57 -0
  866. package/dist/schema/decision.schema.js +32 -0
  867. package/dist/schema/envelope.schema.d.ts +216 -0
  868. package/dist/schema/envelope.schema.js +38 -0
  869. package/dist/schema/error.schema.d.ts +51 -0
  870. package/dist/schema/error.schema.js +12 -0
  871. package/dist/schema/evidence.schema.d.ts +58 -0
  872. package/dist/schema/evidence.schema.js +31 -0
  873. package/dist/schema/index.d.ts +8 -0
  874. package/dist/schema/index.js +8 -0
  875. package/dist/schema/proof-bundle.schema.d.ts +150 -0
  876. package/dist/schema/proof-bundle.schema.js +42 -0
  877. package/dist/schema/provider.schema.d.ts +138 -0
  878. package/dist/schema/provider.schema.js +35 -0
  879. package/dist/schema/run-manifest.schema.d.ts +168 -0
  880. package/dist/schema/run-manifest.schema.js +35 -0
  881. package/dist/schema/version.schema.d.ts +64 -0
  882. package/dist/schema/version.schema.js +21 -0
  883. package/dist/theme/ansi.d.ts +15 -0
  884. package/dist/theme/ansi.js +41 -0
  885. package/dist/theme/colors.d.ts +87 -0
  886. package/dist/theme/colors.js +105 -0
  887. package/dist/theme/hud-theme.d.ts +6 -0
  888. package/dist/theme/hud-theme.js +41 -0
  889. package/dist/theme/index.d.ts +12 -0
  890. package/dist/theme/index.js +20 -0
  891. package/dist/theme/layout.d.ts +24 -0
  892. package/dist/theme/layout.js +139 -0
  893. package/dist/theme/metrics.d.ts +23 -0
  894. package/dist/theme/metrics.js +93 -0
  895. package/dist/theme/parallel.d.ts +68 -0
  896. package/dist/theme/parallel.js +345 -0
  897. package/dist/theme/working-indicator.d.ts +38 -0
  898. package/dist/theme/working-indicator.js +149 -0
  899. package/dist/tui/model.d.ts +28 -0
  900. package/dist/tui/model.js +1 -0
  901. package/dist/tui/terminal-frame-renderer.d.ts +19 -0
  902. package/dist/tui/terminal-frame-renderer.js +60 -0
  903. package/dist/tui/views/capabilities-view.d.ts +3 -0
  904. package/dist/tui/views/capabilities-view.js +13 -0
  905. package/dist/tui/views/common.d.ts +11 -0
  906. package/dist/tui/views/common.js +35 -0
  907. package/dist/tui/views/dag-view.d.ts +3 -0
  908. package/dist/tui/views/dag-view.js +12 -0
  909. package/dist/tui/views/evidence-view.d.ts +3 -0
  910. package/dist/tui/views/evidence-view.js +18 -0
  911. package/dist/tui/views/index.d.ts +4 -0
  912. package/dist/tui/views/index.js +3 -0
  913. package/dist/ui/omk-sigil.d.ts +13 -0
  914. package/dist/ui/omk-sigil.js +277 -0
  915. package/dist/ui/omk-working-sweep.d.ts +61 -0
  916. package/dist/ui/omk-working-sweep.js +416 -0
  917. package/dist/util/agent-schema.d.ts +24 -0
  918. package/dist/util/agent-schema.js +293 -0
  919. package/dist/util/appshot-store.d.ts +68 -0
  920. package/dist/util/appshot-store.js +506 -0
  921. package/dist/util/chat-agent-mode.d.ts +173 -0
  922. package/dist/util/chat-agent-mode.js +905 -0
  923. package/dist/util/chat-cockpit.d.ts +45 -0
  924. package/dist/util/chat-cockpit.js +293 -0
  925. package/dist/util/chat-startup.d.ts +35 -0
  926. package/dist/util/chat-startup.js +330 -0
  927. package/dist/util/chat-state.d.ts +27 -0
  928. package/dist/util/chat-state.js +105 -0
  929. package/dist/util/checkpoint.d.ts +21 -0
  930. package/dist/util/checkpoint.js +238 -0
  931. package/dist/util/cli-contract.d.ts +46 -0
  932. package/dist/util/cli-contract.js +72 -0
  933. package/dist/util/cron-engine.d.ts +24 -0
  934. package/dist/util/cron-engine.js +227 -0
  935. package/dist/util/events-logger.d.ts +30 -0
  936. package/dist/util/events-logger.js +135 -0
  937. package/dist/util/execution-selection.d.ts +13 -0
  938. package/dist/util/execution-selection.js +82 -0
  939. package/dist/util/first-run-star.d.ts +49 -0
  940. package/dist/util/first-run-star.js +223 -0
  941. package/dist/util/fs.d.ts +128 -0
  942. package/dist/util/fs.js +1757 -0
  943. package/dist/util/git.d.ts +11 -0
  944. package/dist/util/git.js +39 -0
  945. package/dist/util/help-text.d.ts +1 -0
  946. package/dist/util/help-text.js +60 -0
  947. package/dist/util/i18n.d.ts +10 -0
  948. package/dist/util/i18n.js +848 -0
  949. package/dist/util/json-envelope.d.ts +15 -0
  950. package/dist/util/json-envelope.js +28 -0
  951. package/dist/util/mcp-preflight.d.ts +26 -0
  952. package/dist/util/mcp-preflight.js +29 -0
  953. package/dist/util/mode-preset.d.ts +29 -0
  954. package/dist/util/mode-preset.js +222 -0
  955. package/dist/util/mode-selector.d.ts +6 -0
  956. package/dist/util/mode-selector.js +74 -0
  957. package/dist/util/native-safety.d.ts +28 -0
  958. package/dist/util/native-safety.js +118 -0
  959. package/dist/util/output-buffer.d.ts +12 -0
  960. package/dist/util/output-buffer.js +59 -0
  961. package/dist/util/process-tree.d.ts +18 -0
  962. package/dist/util/process-tree.js +102 -0
  963. package/dist/util/project-root.d.ts +27 -0
  964. package/dist/util/project-root.js +382 -0
  965. package/dist/util/provider-usage.d.ts +2 -0
  966. package/dist/util/provider-usage.js +1 -0
  967. package/dist/util/reasoning-nlp.d.ts +84 -0
  968. package/dist/util/reasoning-nlp.js +325 -0
  969. package/dist/util/resource-profile.d.ts +32 -0
  970. package/dist/util/resource-profile.js +219 -0
  971. package/dist/util/run-store.d.ts +38 -0
  972. package/dist/util/run-store.js +151 -0
  973. package/dist/util/run-view-model.d.ts +111 -0
  974. package/dist/util/run-view-model.js +333 -0
  975. package/dist/util/runtime-profile.d.ts +34 -0
  976. package/dist/util/runtime-profile.js +149 -0
  977. package/dist/util/runtime-scope.d.ts +2 -0
  978. package/dist/util/runtime-scope.js +19 -0
  979. package/dist/util/scoped-agent-file.d.ts +47 -0
  980. package/dist/util/scoped-agent-file.js +121 -0
  981. package/dist/util/screenshot-store.d.ts +35 -0
  982. package/dist/util/screenshot-store.js +310 -0
  983. package/dist/util/secret-mask.d.ts +5 -0
  984. package/dist/util/secret-mask.js +41 -0
  985. package/dist/util/session.d.ts +19 -0
  986. package/dist/util/session.js +80 -0
  987. package/dist/util/shell.d.ts +30 -0
  988. package/dist/util/shell.js +350 -0
  989. package/dist/util/snippet.d.ts +17 -0
  990. package/dist/util/snippet.js +110 -0
  991. package/dist/util/sync-manifest.d.ts +13 -0
  992. package/dist/util/sync-manifest.js +22 -0
  993. package/dist/util/terminal-input.d.ts +25 -0
  994. package/dist/util/terminal-input.js +35 -0
  995. package/dist/util/terminal-layout.d.ts +18 -0
  996. package/dist/util/terminal-layout.js +108 -0
  997. package/dist/util/terminal-owner.d.ts +19 -0
  998. package/dist/util/terminal-owner.js +64 -0
  999. package/dist/util/theme.d.ts +9 -0
  1000. package/dist/util/theme.js +9 -0
  1001. package/dist/util/timeout-config.d.ts +18 -0
  1002. package/dist/util/timeout-config.js +101 -0
  1003. package/dist/util/todo-sync.d.ts +58 -0
  1004. package/dist/util/todo-sync.js +473 -0
  1005. package/dist/util/update-check.d.ts +89 -0
  1006. package/dist/util/update-check.js +321 -0
  1007. package/dist/util/usage-view-model.d.ts +22 -0
  1008. package/dist/util/usage-view-model.js +57 -0
  1009. package/dist/util/user-visible-output.d.ts +19 -0
  1010. package/dist/util/user-visible-output.js +48 -0
  1011. package/dist/util/version.d.ts +4 -0
  1012. package/dist/util/version.js +51 -0
  1013. package/dist/util/worktree.d.ts +10 -0
  1014. package/dist/util/worktree.js +165 -0
  1015. package/dist/ux/explain-loop-decision.d.ts +4 -0
  1016. package/dist/ux/explain-loop-decision.js +55 -0
  1017. package/dist/ux/intent-router.d.ts +15 -0
  1018. package/dist/ux/intent-router.js +64 -0
  1019. package/dist/ux/natural-entrypoint.d.ts +21 -0
  1020. package/dist/ux/natural-entrypoint.js +122 -0
  1021. package/dist/version.d.ts +11 -0
  1022. package/dist/version.js +18 -0
  1023. package/dist/web-bridge/host.d.ts +8 -0
  1024. package/dist/web-bridge/host.js +109 -0
  1025. package/dist/web-bridge/native-host.d.ts +6 -0
  1026. package/dist/web-bridge/native-host.js +40 -0
  1027. package/dist/web-bridge/status.d.ts +84 -0
  1028. package/dist/web-bridge/status.js +201 -0
  1029. package/docs/2026-05-01-16gb-lite-mode.md +37 -0
  1030. package/docs/2026-05-01-critical-issues-and-improvements.md +361 -0
  1031. package/docs/2026-05-01-dag-ensemble-runtime.md +74 -0
  1032. package/docs/2026-05-02-p1-p2-hardening-handoff.md +139 -0
  1033. package/docs/2026-05-05-adjustable-timeouts-and-cron-jobs.md +252 -0
  1034. package/docs/2026-05-08-omk-hardening-plan.md +62 -0
  1035. package/docs/2026-05-14/critical-issues.md +20 -0
  1036. package/docs/2026-05-14/improvements.md +14 -0
  1037. package/docs/2026-05-14/init-checklist.md +25 -0
  1038. package/docs/2026-05-14/plan.md +20 -0
  1039. package/docs/2026-05-15/critical-issues.md +20 -0
  1040. package/docs/2026-05-15/improvements.md +14 -0
  1041. package/docs/2026-05-15/init-checklist.md +25 -0
  1042. package/docs/2026-05-15/plan.md +20 -0
  1043. package/docs/2026-05-16/critical-issues.md +20 -0
  1044. package/docs/2026-05-16/improvements.md +14 -0
  1045. package/docs/2026-05-16/init-checklist.md +25 -0
  1046. package/docs/2026-05-16/plan.md +20 -0
  1047. package/docs/2026-05-17/critical-issues.md +20 -0
  1048. package/docs/2026-05-17/improvements.md +14 -0
  1049. package/docs/2026-05-17/init-checklist.md +25 -0
  1050. package/docs/2026-05-17/plan.md +20 -0
  1051. package/docs/2026-05-18/improvements.md +14 -0
  1052. package/docs/2026-05-18/init-checklist.md +25 -0
  1053. package/docs/2026-05-18/plan.md +20 -0
  1054. package/docs/2026-05-18-critical-issues-and-improvements.md +441 -0
  1055. package/docs/2026-05-18-project-direction.md +223 -0
  1056. package/docs/2026-05-19/critical-issues.md +20 -0
  1057. package/docs/2026-05-19/improvements.md +14 -0
  1058. package/docs/2026-05-19/init-checklist.md +25 -0
  1059. package/docs/2026-05-19/plan.md +20 -0
  1060. package/docs/2026-05-20/critical-issues.md +20 -0
  1061. package/docs/2026-05-20/improvements.md +14 -0
  1062. package/docs/2026-05-20/init-checklist.md +25 -0
  1063. package/docs/2026-05-20/plan.md +20 -0
  1064. package/docs/2026-05-21/critical-issues.md +20 -0
  1065. package/docs/2026-05-21/improvements.md +14 -0
  1066. package/docs/2026-05-21/init-checklist.md +25 -0
  1067. package/docs/2026-05-21/plan.md +20 -0
  1068. package/docs/2026-05-22/critical-issues.md +20 -0
  1069. package/docs/2026-05-22/improvements.md +14 -0
  1070. package/docs/2026-05-22/init-checklist.md +25 -0
  1071. package/docs/2026-05-22/plan.md +20 -0
  1072. package/docs/2026-05-23/critical-issues.md +20 -0
  1073. package/docs/2026-05-23/improvements.md +14 -0
  1074. package/docs/2026-05-23/init-checklist.md +25 -0
  1075. package/docs/2026-05-23/plan.md +20 -0
  1076. package/docs/2026-05-24/critical-issues.md +30 -0
  1077. package/docs/2026-05-24/improvements.md +23 -0
  1078. package/docs/2026-05-24/init-checklist.md +25 -0
  1079. package/docs/2026-05-24/plan.md +22 -0
  1080. package/docs/2026-05-25/critical-issues.md +20 -0
  1081. package/docs/2026-05-25/improvements.md +14 -0
  1082. package/docs/2026-05-25/init-checklist.md +25 -0
  1083. package/docs/2026-05-25/plan.md +20 -0
  1084. package/docs/2026-05-26/critical-issues.md +20 -0
  1085. package/docs/2026-05-26/improvements.md +14 -0
  1086. package/docs/2026-05-26/init-checklist.md +25 -0
  1087. package/docs/2026-05-26/plan.md +20 -0
  1088. package/docs/2026-05-27/critical-issues.md +20 -0
  1089. package/docs/2026-05-27/improvements.md +14 -0
  1090. package/docs/2026-05-27/init-checklist.md +25 -0
  1091. package/docs/2026-05-27/plan.md +20 -0
  1092. package/docs/2026-05-28/critical-issues.md +20 -0
  1093. package/docs/2026-05-28/improvements.md +14 -0
  1094. package/docs/2026-05-28/init-checklist.md +25 -0
  1095. package/docs/2026-05-28/plan.md +20 -0
  1096. package/docs/2026-05-29/critical-issues.md +20 -0
  1097. package/docs/2026-05-29/improvements.md +14 -0
  1098. package/docs/2026-05-29/init-checklist.md +25 -0
  1099. package/docs/2026-05-29/plan.md +20 -0
  1100. package/docs/2026-05-30/critical-issues.md +20 -0
  1101. package/docs/2026-05-30/improvements.md +14 -0
  1102. package/docs/2026-05-30/init-checklist.md +25 -0
  1103. package/docs/2026-05-30/plan.md +20 -0
  1104. package/docs/2026-05-31/critical-issues.md +20 -0
  1105. package/docs/2026-05-31/improvements.md +14 -0
  1106. package/docs/2026-05-31/init-checklist.md +25 -0
  1107. package/docs/2026-05-31/plan.md +20 -0
  1108. package/docs/2026-06-01/critical-issues.md +20 -0
  1109. package/docs/2026-06-01/improvements.md +14 -0
  1110. package/docs/2026-06-01/init-checklist.md +25 -0
  1111. package/docs/2026-06-01/plan.md +20 -0
  1112. package/docs/2026-06-02/critical-issues.md +20 -0
  1113. package/docs/2026-06-02/improvements.md +14 -0
  1114. package/docs/2026-06-02/init-checklist.md +25 -0
  1115. package/docs/2026-06-02/plan.md +20 -0
  1116. package/docs/2026-06-03/critical-issues.md +20 -0
  1117. package/docs/2026-06-03/improvements.md +14 -0
  1118. package/docs/2026-06-03/init-checklist.md +25 -0
  1119. package/docs/2026-06-03/plan.md +20 -0
  1120. package/docs/2026-06-04/critical-issues.md +20 -0
  1121. package/docs/2026-06-04/improvements.md +14 -0
  1122. package/docs/2026-06-04/init-checklist.md +25 -0
  1123. package/docs/2026-06-04/plan.md +20 -0
  1124. package/docs/2026-06-05/critical-issues.md +20 -0
  1125. package/docs/2026-06-05/improvements.md +14 -0
  1126. package/docs/2026-06-05/init-checklist.md +25 -0
  1127. package/docs/2026-06-05/plan.md +20 -0
  1128. package/docs/2026-06-06/critical-issues.md +20 -0
  1129. package/docs/2026-06-06/improvements.md +14 -0
  1130. package/docs/2026-06-06/init-checklist.md +25 -0
  1131. package/docs/2026-06-06/plan.md +20 -0
  1132. package/docs/2026-06-07/critical-issues.md +20 -0
  1133. package/docs/2026-06-07/improvements.md +14 -0
  1134. package/docs/2026-06-07/init-checklist.md +25 -0
  1135. package/docs/2026-06-07/plan.md +20 -0
  1136. package/docs/GSTACK_MIGRATION.md +169 -0
  1137. package/docs/OMK_CLI_V2_RUNTIME_ARCHITECTURE.md +2058 -0
  1138. package/docs/cli-v2-migration.md +87 -0
  1139. package/docs/codex-oauth-setup.md +48 -0
  1140. package/docs/demo/verified-run/README.md +32 -0
  1141. package/docs/demo/verified-run/artifacts/README.md +18 -0
  1142. package/docs/demo/verified-run/capture-plan.md +51 -0
  1143. package/docs/demo/verified-run/generated-diff.md +27 -0
  1144. package/docs/demo/verified-run/raw-prompt.md +21 -0
  1145. package/docs/demo/verified-run/video-shot-list.md +14 -0
  1146. package/docs/design-md.md +35 -0
  1147. package/docs/getting-started.md +37 -0
  1148. package/docs/hud-and-parallel-ux.md +155 -0
  1149. package/docs/kimi-oauth-usage-status.md +33 -0
  1150. package/docs/kimi-okabe-dmail.md +44 -0
  1151. package/docs/local-graph-memory.md +102 -0
  1152. package/docs/lsp.md +48 -0
  1153. package/docs/mcp-ontology-proposal.md +12 -0
  1154. package/docs/native-root-runtime-algorithms.md +402 -0
  1155. package/docs/native-root-runtime-hardening.md +131 -0
  1156. package/docs/neo4j-memory.md +5 -0
  1157. package/docs/openai-platform-image-keys.md +23 -0
  1158. package/docs/phase1-final-report.md +154 -0
  1159. package/docs/provider-maturity.md +44 -0
  1160. package/docs/runtime-architecture.md +89 -0
  1161. package/docs/versioning.md +49 -0
  1162. package/llms.txt +38 -0
  1163. package/package.json +188 -0
  1164. package/readmeasset/.npmignore +20 -0
  1165. package/readmeasset/ASSET_INDEX.md +36 -0
  1166. package/readmeasset/ASSET_PROVENANCE.md +94 -0
  1167. package/readmeasset/omk-control.webp +0 -0
  1168. package/readmeasset/omk-core-loop.svg +25 -0
  1169. package/readmeasset/omk-evidence-gate-card.png +0 -0
  1170. package/readmeasset/omk-github-banner.webp +0 -0
  1171. package/readmeasset/omk-github-header.webp +0 -0
  1172. package/readmeasset/omk-install-card.png +0 -0
  1173. package/readmeasset/omk-logo-512.png +0 -0
  1174. package/readmeasset/omk-logo-mark.svg +7 -0
  1175. package/readmeasset/omk-provider-router-card.png +0 -0
  1176. package/readmeasset/omk-runtime-flow-0.78.0.webp +0 -0
  1177. package/readmeasset/omk-social-preview.png +0 -0
  1178. package/readmeasset/omk-tui-0.78.0.webp +0 -0
  1179. package/readmeasset/omk_tui.png +0 -0
  1180. package/templates/.kimi/AGENTS.md +93 -0
  1181. package/templates/.omk/agents/okabe.yaml +30 -0
  1182. package/templates/.omk/agents/roles/aggregator.yaml +13 -0
  1183. package/templates/.omk/agents/roles/architect.yaml +13 -0
  1184. package/templates/.omk/agents/roles/coder.yaml +9 -0
  1185. package/templates/.omk/agents/roles/explorer.yaml +13 -0
  1186. package/templates/.omk/agents/roles/integrator.yaml +13 -0
  1187. package/templates/.omk/agents/roles/interviewer.yaml +13 -0
  1188. package/templates/.omk/agents/roles/ontology.yaml +18 -0
  1189. package/templates/.omk/agents/roles/planner.yaml +13 -0
  1190. package/templates/.omk/agents/roles/qa.yaml +12 -0
  1191. package/templates/.omk/agents/roles/researcher.yaml +13 -0
  1192. package/templates/.omk/agents/roles/reviewer.yaml +13 -0
  1193. package/templates/.omk/agents/roles/router.yaml +13 -0
  1194. package/templates/.omk/agents/roles/security.yaml +12 -0
  1195. package/templates/.omk/agents/roles/tester.yaml +12 -0
  1196. package/templates/.omk/agents/roles/vision-debugger.yaml +12 -0
  1197. package/templates/.omk/agents/root.yaml +62 -0
  1198. package/templates/.omk/lsp.json +27 -0
  1199. package/templates/.omk/prompts/root.md +74 -0
  1200. package/templates/AGENTS.md +510 -0
  1201. package/templates/skills/agents/agentmemory/SKILL.md +40 -0
  1202. package/templates/skills/agents/andrej-karpathy-skills/SKILL.md +41 -0
  1203. package/templates/skills/agents/claude-for-legal/SKILL.md +63 -0
  1204. package/templates/skills/agents/claude-for-legal/references/workflow-catalog.md +38 -0
  1205. package/templates/skills/agents/matt-pocock-skills/SKILL.md +40 -0
  1206. package/templates/skills/agents/multica/SKILL.md +40 -0
  1207. package/templates/skills/agents/omk-adaptorch-orchestration-review/SKILL.md +52 -0
  1208. package/templates/skills/agents/omk-backend-api-review/SKILL.md +30 -0
  1209. package/templates/skills/agents/omk-code-review/SKILL.md +40 -0
  1210. package/templates/skills/agents/omk-context-broker/SKILL.md +57 -0
  1211. package/templates/skills/agents/omk-control-loop-debugger/SKILL.md +49 -0
  1212. package/templates/skills/agents/omk-design-system/SKILL.md +22 -0
  1213. package/templates/skills/agents/omk-docs-release/SKILL.md +42 -0
  1214. package/templates/skills/agents/omk-evidence-contract/SKILL.md +52 -0
  1215. package/templates/skills/agents/omk-frontend-implementation/SKILL.md +13 -0
  1216. package/templates/skills/agents/omk-frontend-ui-review/SKILL.md +29 -0
  1217. package/templates/skills/agents/omk-git-commit-pr/SKILL.md +45 -0
  1218. package/templates/skills/agents/omk-industrial-control-loop/SKILL.md +33 -0
  1219. package/templates/skills/agents/omk-plan-first/SKILL.md +39 -0
  1220. package/templates/skills/agents/omk-project-rules/SKILL.md +46 -0
  1221. package/templates/skills/agents/omk-python-typing/SKILL.md +33 -0
  1222. package/templates/skills/agents/omk-quality-gate/SKILL.md +54 -0
  1223. package/templates/skills/agents/omk-repo-explorer/SKILL.md +33 -0
  1224. package/templates/skills/agents/omk-research-verify/SKILL.md +30 -0
  1225. package/templates/skills/agents/omk-secret-guard/SKILL.md +23 -0
  1226. package/templates/skills/agents/omk-security-review/SKILL.md +49 -0
  1227. package/templates/skills/agents/omk-test-debug-loop/SKILL.md +43 -0
  1228. package/templates/skills/agents/omk-troubleshooting/SKILL.md +14 -0
  1229. package/templates/skills/agents/omk-typescript-strict/SKILL.md +38 -0
  1230. package/templates/skills/agents/omk-worktree-team/SKILL.md +44 -0
  1231. package/templates/skills/agents/react-doctor/SKILL.md +46 -0
  1232. package/templates/skills/kimi/agentmemory/SKILL.md +40 -0
  1233. package/templates/skills/kimi/andrej-karpathy-skills/SKILL.md +41 -0
  1234. package/templates/skills/kimi/awesome-design-md/SKILL.md +54 -0
  1235. package/templates/skills/kimi/claude-for-legal/SKILL.md +63 -0
  1236. package/templates/skills/kimi/claude-for-legal/references/workflow-catalog.md +38 -0
  1237. package/templates/skills/kimi/deepseek-api/SKILL.md +27 -0
  1238. package/templates/skills/kimi/deepseek-disable/SKILL.md +20 -0
  1239. package/templates/skills/kimi/deepseek-enable/SKILL.md +20 -0
  1240. package/templates/skills/kimi/deepseekset/SKILL.md +27 -0
  1241. package/templates/skills/kimi/graph-view/SKILL.md +29 -0
  1242. package/templates/skills/kimi/matt-pocock-skills/SKILL.md +40 -0
  1243. package/templates/skills/kimi/mcp-install/SKILL.md +66 -0
  1244. package/templates/skills/kimi/multica/SKILL.md +40 -0
  1245. package/templates/skills/kimi/omk-adaptorch-orchestration-review/SKILL.md +52 -0
  1246. package/templates/skills/kimi/omk-backend-api-review/SKILL.md +30 -0
  1247. package/templates/skills/kimi/omk-code-review/SKILL.md +34 -0
  1248. package/templates/skills/kimi/omk-context-broker/SKILL.md +57 -0
  1249. package/templates/skills/kimi/omk-control-loop-debugger/SKILL.md +49 -0
  1250. package/templates/skills/kimi/omk-design-md/SKILL.md +55 -0
  1251. package/templates/skills/kimi/omk-design-system/SKILL.md +22 -0
  1252. package/templates/skills/kimi/omk-docs-release/SKILL.md +42 -0
  1253. package/templates/skills/kimi/omk-evidence-contract/SKILL.md +52 -0
  1254. package/templates/skills/kimi/omk-flow-bugfix/SKILL.md +20 -0
  1255. package/templates/skills/kimi/omk-flow-design-to-code/SKILL.md +23 -0
  1256. package/templates/skills/kimi/omk-flow-feature-dev/SKILL.md +24 -0
  1257. package/templates/skills/kimi/omk-flow-pr-review/SKILL.md +17 -0
  1258. package/templates/skills/kimi/omk-flow-refactor/SKILL.md +21 -0
  1259. package/templates/skills/kimi/omk-flow-release/SKILL.md +20 -0
  1260. package/templates/skills/kimi/omk-flow-team-run/SKILL.md +24 -0
  1261. package/templates/skills/kimi/omk-frontend-implementation/SKILL.md +13 -0
  1262. package/templates/skills/kimi/omk-frontend-ui-review/SKILL.md +29 -0
  1263. package/templates/skills/kimi/omk-git-commit-pr/SKILL.md +45 -0
  1264. package/templates/skills/kimi/omk-global-rules/SKILL.md +31 -0
  1265. package/templates/skills/kimi/omk-industrial-control-loop/SKILL.md +33 -0
  1266. package/templates/skills/kimi/omk-kimi-runtime/SKILL.md +46 -0
  1267. package/templates/skills/kimi/omk-multimodal-ui-review/SKILL.md +26 -0
  1268. package/templates/skills/kimi/omk-plan-first/SKILL.md +39 -0
  1269. package/templates/skills/kimi/omk-project-rules/SKILL.md +21 -0
  1270. package/templates/skills/kimi/omk-python-typing/SKILL.md +33 -0
  1271. package/templates/skills/kimi/omk-quality-gate/SKILL.md +36 -0
  1272. package/templates/skills/kimi/omk-repo-explorer/SKILL.md +33 -0
  1273. package/templates/skills/kimi/omk-research-verify/SKILL.md +30 -0
  1274. package/templates/skills/kimi/omk-secret-guard/SKILL.md +23 -0
  1275. package/templates/skills/kimi/omk-security-review/SKILL.md +49 -0
  1276. package/templates/skills/kimi/omk-task-router/SKILL.md +27 -0
  1277. package/templates/skills/kimi/omk-test-debug-loop/SKILL.md +43 -0
  1278. package/templates/skills/kimi/omk-typescript-strict/SKILL.md +38 -0
  1279. package/templates/skills/kimi/omk-worktree-team/SKILL.md +44 -0
  1280. package/templates/skills/kimi/open-design/SKILL.md +56 -0
  1281. package/templates/skills/kimi/provider/SKILL.md +47 -0
  1282. package/templates/skills/kimi/react-doctor/SKILL.md +46 -0
  1283. package/templates/skills/kimi/speckit-analyze/SKILL.md +255 -0
  1284. package/templates/skills/kimi/speckit-checklist/SKILL.md +367 -0
  1285. package/templates/skills/kimi/speckit-clarify/SKILL.md +249 -0
  1286. package/templates/skills/kimi/speckit-constitution/SKILL.md +152 -0
  1287. package/templates/skills/kimi/speckit-implement/SKILL.md +204 -0
  1288. package/templates/skills/kimi/speckit-plan/SKILL.md +147 -0
  1289. package/templates/skills/kimi/speckit-specify/SKILL.md +325 -0
  1290. package/templates/skills/kimi/speckit-tasks/SKILL.md +197 -0
  1291. package/templates/skills/kimi/speckit-taskstoissues/SKILL.md +101 -0
  1292. package/templates/skills/kimi/think/SKILL.md +41 -0
  1293. package/templates/spec-kit-omk-preset/commands/plan.md +21 -0
  1294. package/templates/spec-kit-omk-preset/commands/tasks.md +21 -0
  1295. package/templates/spec-kit-omk-preset/preset.yml +12 -0
  1296. package/templates/spec-kit-omk-preset/templates/plan-template.md +75 -0
  1297. package/templates/spec-kit-omk-preset/templates/spec-template.md +80 -0
  1298. package/templates/spec-kit-omk-preset/templates/tasks-template.md +160 -0
  1299. package/templates/web-bridge/chrome-extension/README.md +18 -0
  1300. package/templates/web-bridge/chrome-extension/background.js +57 -0
  1301. package/templates/web-bridge/chrome-extension/content-script.js +46 -0
  1302. package/templates/web-bridge/chrome-extension/manifest.json +16 -0
  1303. package/templates/web-bridge/chrome-extension/popup.html +21 -0
  1304. package/templates/web-bridge/chrome-extension/popup.js +9 -0
@@ -0,0 +1,1603 @@
1
+ import { chmod, mkdir, readFile, writeFile } from "fs/promises";
2
+ import { dirname, join, isAbsolute } from "path";
3
+ import { runShell, which } from "../util/shell.js";
4
+ import { collectMcpConfigs, diagnoseRuntimeMcpServer, getProjectRoot, pathExists, getUserHome, preflightRuntimeMcpServers, resolveRuntimeMcpPreflightOptions, STALE_PACKAGE_NAMES, } from "../util/fs.js";
5
+ import { getOmkResourceSettings } from "../util/resource-profile.js";
6
+ import { style, header, status, bullet, label } from "../util/theme.js";
7
+ import { maskSensitiveText } from "../util/secret-mask.js";
8
+ import { buildSubprocessEnv } from "../mcp/transports/stdio.js";
9
+ import { McpClientSession } from "../mcp/client.js";
10
+ const RAILWAY_REMOTE_MCP_URL = "https://mcp.railway.com";
11
+ const JSON_RPC_INTERNAL_ERROR_CODE = -32603;
12
+ const AUTO_DISABLE_RUNTIME_BLOCKERS = new Set([
13
+ "missing-command",
14
+ "command-path-not-found",
15
+ "arg-path-not-found",
16
+ "shell-builtin-command",
17
+ "windows-set-inline",
18
+ "inline-script-path-not-found",
19
+ "stale-home-reference",
20
+ "stdio-http-transport",
21
+ "invalid-server",
22
+ ]);
23
+ async function loadConfig(filePath) {
24
+ if (!(await pathExists(filePath))) {
25
+ return { path: filePath, config: {}, exists: false, parsed: true };
26
+ }
27
+ try {
28
+ const content = await readFile(filePath, "utf-8");
29
+ const config = JSON.parse(content);
30
+ return { path: filePath, config, exists: true, parsed: true };
31
+ }
32
+ catch (err) {
33
+ const message = err instanceof Error ? err.message : String(err);
34
+ return { path: filePath, config: {}, exists: true, parsed: false, error: `Invalid JSON: ${message}` };
35
+ }
36
+ }
37
+ async function resolveAllConfigs() {
38
+ const root = getProjectRoot();
39
+ const paths = [
40
+ join(root, ".omk", "mcp.json"),
41
+ join(root, ".kimi", "mcp.json"),
42
+ join(getUserHome(), ".kimi", "mcp.json"),
43
+ join(getUserHome(), ".omk", "mcp.json"),
44
+ ];
45
+ const results = [];
46
+ for (const p of paths) {
47
+ results.push(await loadConfig(p));
48
+ }
49
+ return results;
50
+ }
51
+ async function ensureMcpConfigFile(filePath, config, actions, options = {}) {
52
+ if (await pathExists(filePath))
53
+ return;
54
+ if (options.dryRun) {
55
+ actions.push(`would create MCP config ${filePath}`);
56
+ return;
57
+ }
58
+ await mkdir(dirname(filePath), { recursive: true });
59
+ await writeFile(filePath, JSON.stringify(config, null, 2) + "\n", "utf-8");
60
+ actions.push(`created MCP config ${filePath}`);
61
+ }
62
+ function hasConfiguredMcpServers(config) {
63
+ return Object.keys(config?.mcpServers ?? {}).length > 0;
64
+ }
65
+ async function readParsedMcpConfig(filePath) {
66
+ if (!(await pathExists(filePath)))
67
+ return null;
68
+ try {
69
+ const parsed = JSON.parse(await readFile(filePath, "utf-8"));
70
+ return parsed && typeof parsed === "object" ? parsed : null;
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ }
76
+ async function migrateLegacyOmkMcpBeforeEnsure(omkMcpPath, projectMcpPath, actions, options = {}) {
77
+ const legacyConfig = await readParsedMcpConfig(omkMcpPath);
78
+ if (!hasConfiguredMcpServers(legacyConfig))
79
+ return;
80
+ const projectConfig = await readParsedMcpConfig(projectMcpPath);
81
+ if (projectConfig && hasConfiguredMcpServers(projectConfig))
82
+ return;
83
+ if (options.dryRun) {
84
+ actions.push(`would migrate legacy MCP servers from ${omkMcpPath} to ${projectMcpPath}`);
85
+ return;
86
+ }
87
+ const migratedConfig = {
88
+ ...(projectConfig ?? {}),
89
+ _comment: "Project-local MCP config migrated from legacy .omk/mcp.json; review secrets before sharing.",
90
+ mcpServers: { ...(legacyConfig?.mcpServers ?? {}) },
91
+ };
92
+ if (projectConfig) {
93
+ await createSanitizedMcpBackup(projectMcpPath, projectConfig, options.backups ?? [], actions);
94
+ }
95
+ await mkdir(dirname(projectMcpPath), { recursive: true });
96
+ await writeFile(projectMcpPath, JSON.stringify(migratedConfig, null, 2) + "\n", "utf-8");
97
+ actions.push(`migrated legacy MCP servers from ${omkMcpPath} to ${projectMcpPath}`);
98
+ }
99
+ function cloneMcpConfig(config) {
100
+ return JSON.parse(JSON.stringify(config));
101
+ }
102
+ function timestampForBackup() {
103
+ return new Date().toISOString().replace(/[:.]/g, "-");
104
+ }
105
+ async function createSanitizedMcpBackup(filePath, config, backups, actions) {
106
+ if (!(await pathExists(filePath)))
107
+ return;
108
+ const backupPath = `${filePath}.omk-backup-${timestampForBackup()}-${backups.length + 1}.json`;
109
+ const dir = dirname(filePath);
110
+ await mkdir(dir, { recursive: true, mode: 0o700 });
111
+ await chmod(dir, 0o700).catch(() => undefined);
112
+ await writeFile(backupPath, JSON.stringify(sanitizeMcpConfigForBackup(config), null, 2) + "\n", { encoding: "utf-8", mode: 0o600 });
113
+ await chmod(backupPath, 0o600).catch(() => undefined);
114
+ backups.push(backupPath);
115
+ actions.push(`created sanitized MCP backup ${backupPath}`);
116
+ }
117
+ function sanitizeMcpConfigForBackup(config) {
118
+ const cleaned = cloneMcpConfig(config);
119
+ if (cleaned.mcpServers && typeof cleaned.mcpServers === "object") {
120
+ cleaned.mcpServers = Object.fromEntries(Object.entries(cleaned.mcpServers).map(([name, server]) => [name, sanitizeMcpServerForProject(server)]));
121
+ }
122
+ const disabled = cleaned._omkDisabledMcpServers;
123
+ if (disabled && typeof disabled === "object" && !Array.isArray(disabled)) {
124
+ cleaned._omkDisabledMcpServers = Object.fromEntries(Object.entries(disabled).map(([name, server]) => [
125
+ name,
126
+ server && typeof server === "object" && !Array.isArray(server)
127
+ ? sanitizeMcpServerForProject(server)
128
+ : server,
129
+ ]));
130
+ }
131
+ return cleaned;
132
+ }
133
+ function repairMcpServerConfig(name, server) {
134
+ const actions = [];
135
+ if (server.command && isHttpUrl(server.command) && (!server.args || server.args.length === 0)) {
136
+ server.url = server.command;
137
+ delete server.command;
138
+ delete server.args;
139
+ actions.push(`converted "${name}" command URL to remote url transport`);
140
+ }
141
+ if (!server.url && server.args?.includes("@modelcontextprotocol/server-pdf") && !server.args.includes("--stdio")) {
142
+ server.args = [...server.args, "--stdio"];
143
+ actions.push(`added --stdio to "${name}" PDF MCP server`);
144
+ }
145
+ if (!server.url && server.args) {
146
+ let replaced = false;
147
+ server.args = server.args.map((arg) => {
148
+ const replacement = STALE_PACKAGE_NAMES[arg];
149
+ if (!replacement)
150
+ return arg;
151
+ replaced = true;
152
+ return replacement;
153
+ });
154
+ if (replaced)
155
+ actions.push(`replaced stale MCP package argument for "${name}"`);
156
+ }
157
+ if (!server.url && isNpmLauncherCommand(server.command) && !server.startup_timeout_sec) {
158
+ server.startup_timeout_sec = 15;
159
+ actions.push(`set 15s startup timeout for npm-based MCP "${name}"`);
160
+ }
161
+ return actions;
162
+ }
163
+ function disabledMcpServers(config) {
164
+ const current = config._omkDisabledMcpServers;
165
+ if (current && typeof current === "object" && !Array.isArray(current)) {
166
+ return current;
167
+ }
168
+ const next = {};
169
+ config._omkDisabledMcpServers = next;
170
+ return next;
171
+ }
172
+ function moveMcpServerToDisabled(source, name, server, reason) {
173
+ const disabled = disabledMcpServers(source.config);
174
+ disabled[name] = {
175
+ ...server,
176
+ _omkDisabledAt: new Date().toISOString(),
177
+ _omkDisabledReason: reason,
178
+ };
179
+ delete source.config.mcpServers?.[name];
180
+ source.changed = true;
181
+ }
182
+ function collectServers(sources) {
183
+ const map = new Map();
184
+ for (const src of sources) {
185
+ if (!src.parsed || !src.config.mcpServers)
186
+ continue;
187
+ for (const [name, server] of Object.entries(src.config.mcpServers)) {
188
+ const existing = map.get(name);
189
+ if (existing) {
190
+ existing.sources.push(src.path);
191
+ existing.serversBySource.set(src.path, server);
192
+ }
193
+ else {
194
+ map.set(name, { server, sources: [src.path], serversBySource: new Map([[src.path, server]]) });
195
+ }
196
+ }
197
+ }
198
+ return map;
199
+ }
200
+ function selectEffectiveServer(info, activePathOrder) {
201
+ for (let index = activePathOrder.length - 1; index >= 0; index--) {
202
+ const server = info.serversBySource.get(activePathOrder[index]);
203
+ if (server)
204
+ return server;
205
+ }
206
+ return info.server;
207
+ }
208
+ export async function mcpListCommand() {
209
+ const sources = await resolveAllConfigs();
210
+ const servers = collectServers(sources);
211
+ const resources = await getOmkResourceSettings();
212
+ const activePathOrder = await collectMcpConfigs(resources.mcpScope);
213
+ const activePaths = new Set(activePathOrder);
214
+ console.log(header("MCP Servers"));
215
+ for (const src of sources) {
216
+ const icon = !src.exists ? style.gray("-") : src.parsed ? style.mint("✓") : style.pink("✗");
217
+ const marker = activePaths.has(src.path) ? style.mint(" [active]") : style.gray(" [inactive]");
218
+ const missing = !src.exists ? style.gray(" (not found)") : "";
219
+ console.log(`${icon} ${src.path}${marker}${missing}`);
220
+ if (src.error)
221
+ console.log(` ${style.gray(maskSensitiveText(src.error))}`);
222
+ }
223
+ if (servers.size === 0) {
224
+ console.log("\n" + style.gray("No MCP servers configured."));
225
+ return;
226
+ }
227
+ console.log("");
228
+ let duplicateCount = 0;
229
+ for (const [name, info] of servers) {
230
+ const server = selectEffectiveServer(info, activePathOrder);
231
+ const activeSources = info.sources.filter((source) => activePaths.has(source));
232
+ const dup = info.sources.length > 1 ? style.skin(` [duplicate: ${info.sources.length} sources]`) : "";
233
+ if (info.sources.length > 1)
234
+ duplicateCount++;
235
+ const activeMarker = activeSources.length > 0 ? style.mint(" [active]") : style.gray(" [inactive]");
236
+ console.log(bullet(`${style.purpleBold(name)}${dup}${activeMarker}`, "purple"));
237
+ if (server.url) {
238
+ console.log(` ${style.gray("url:")} ${sanitizeMcpUrlForDisplay(server.url)}`);
239
+ }
240
+ if (server.command || !server.url) {
241
+ console.log(` ${style.gray("command:")} ${server.command ? maskSensitiveText(server.command) : style.pink("missing")}`);
242
+ }
243
+ if (server.args && server.args.length > 0) {
244
+ console.log(` ${style.gray("args:")} ${formatArgsForDisplay(server.args)}`);
245
+ }
246
+ if (server.env && Object.keys(server.env).length > 0) {
247
+ console.log(` ${style.gray("env:")} ${Object.keys(server.env).join(", ")}`);
248
+ }
249
+ console.log(` ${style.gray("from:")} ${info.sources.join(", ")}`);
250
+ if (activeSources.length > 0) {
251
+ console.log(` ${style.gray("active from:")} ${activeSources.join(", ")}`);
252
+ }
253
+ }
254
+ if (duplicateCount > 0) {
255
+ console.log("");
256
+ console.log(style.skin(`⚠ ${duplicateCount} duplicate server(s) detected. Run \`omk mcp doctor\` for details, or \`omk mcp remove <name>\` to delete a local copy.`));
257
+ }
258
+ }
259
+ export async function mcpDoctorCommand(options = {}) {
260
+ const fixes = options.fix
261
+ ? await repairMcpDoctorIssues({
262
+ dryRun: Boolean(options.dryRun),
263
+ global: Boolean(options.global),
264
+ })
265
+ : undefined;
266
+ const report = await buildMcpDoctorReport();
267
+ if (fixes)
268
+ report.fixes = fixes;
269
+ if (options.json) {
270
+ console.log(JSON.stringify(report, null, 2));
271
+ if (!report.ok)
272
+ process.exitCode = 1;
273
+ return;
274
+ }
275
+ emitMcpDoctorText(report);
276
+ if (!report.ok)
277
+ process.exitCode = 1;
278
+ }
279
+ export async function repairMcpDoctorIssues(options = {}) {
280
+ const root = getProjectRoot();
281
+ const projectOmkDir = join(root, ".omk");
282
+ const projectKimiDir = join(root, ".kimi");
283
+ const omkMcpPath = join(projectOmkDir, "mcp.json");
284
+ const projectMcpPath = join(projectKimiDir, "mcp.json");
285
+ const dryRun = Boolean(options.dryRun);
286
+ const includeGlobal = Boolean(options.global);
287
+ const actions = [];
288
+ const skipped = [];
289
+ const backups = [];
290
+ if (!dryRun) {
291
+ await Promise.all([
292
+ mkdir(projectOmkDir, { recursive: true }),
293
+ mkdir(projectKimiDir, { recursive: true }),
294
+ ]);
295
+ }
296
+ await migrateLegacyOmkMcpBeforeEnsure(omkMcpPath, projectMcpPath, actions, { dryRun, backups });
297
+ await ensureMcpConfigFile(omkMcpPath, { mcpServers: {} }, actions, { dryRun });
298
+ await ensureMcpConfigFile(projectMcpPath, {
299
+ _comment: "Project-local MCP config. omk-project is virtual runtime MCP injected; global MCP servers remain in ~/.kimi/mcp.json and must be imported explicitly only after secret review.",
300
+ mcpServers: {},
301
+ }, actions, { dryRun });
302
+ const sources = await resolveAllConfigs();
303
+ const resources = await getOmkResourceSettings();
304
+ const activePathOrder = await collectMcpConfigs(resources.mcpScope);
305
+ const activePaths = new Set(activePathOrder);
306
+ const activePreferredPath = activePathOrder.at(-1);
307
+ const globalMcpPath = join(getUserHome(), ".kimi", "mcp.json");
308
+ const mutableSources = new Map();
309
+ for (const source of sources) {
310
+ if (!source.exists)
311
+ continue;
312
+ if (!source.parsed) {
313
+ skipped.push(`invalid JSON left unchanged: ${source.path}`);
314
+ continue;
315
+ }
316
+ const clonedConfig = cloneMcpConfig(source.config);
317
+ mutableSources.set(source.path, {
318
+ path: source.path,
319
+ config: clonedConfig,
320
+ originalConfig: cloneMcpConfig(source.config),
321
+ changed: false,
322
+ });
323
+ }
324
+ const writableConfigPaths = new Set([omkMcpPath, projectMcpPath]);
325
+ if (includeGlobal)
326
+ writableConfigPaths.add(globalMcpPath);
327
+ const servers = collectServers(sources);
328
+ for (const [name, info] of servers) {
329
+ const activeSources = info.sources.filter((sourcePath) => activePaths.has(sourcePath));
330
+ if (activeSources.length <= 1)
331
+ continue;
332
+ const projectActiveSources = activeSources.filter((sourcePath) => sourcePath !== globalMcpPath);
333
+ if (activeSources.includes(globalMcpPath) && projectActiveSources.length > 0) {
334
+ skipped.push(`duplicate MCP "${name}" spans global/project; kept project override: ${activeSources.join(", ")}`);
335
+ continue;
336
+ }
337
+ const removableSources = activeSources.includes(globalMcpPath)
338
+ ? activeSources.filter((sourcePath) => sourcePath !== globalMcpPath)
339
+ : activeSources.filter((sourcePath) => sourcePath !== activePreferredPath);
340
+ for (const sourcePath of removableSources) {
341
+ if (!writableConfigPaths.has(sourcePath)) {
342
+ skipped.push(`duplicate MCP "${name}" not modified outside requested repair scope: ${sourcePath}`);
343
+ continue;
344
+ }
345
+ const source = mutableSources.get(sourcePath);
346
+ if (!source?.config.mcpServers?.[name])
347
+ continue;
348
+ delete source.config.mcpServers[name];
349
+ source.changed = true;
350
+ actions.push(`removed duplicate MCP "${name}" from ${sourcePath}`);
351
+ }
352
+ if (removableSources.length === 0) {
353
+ skipped.push(`duplicate MCP "${name}" requires manual choice: ${activeSources.join(", ")}`);
354
+ }
355
+ }
356
+ for (const source of mutableSources.values()) {
357
+ if (!writableConfigPaths.has(source.path))
358
+ continue;
359
+ const serversByName = source.config.mcpServers ?? {};
360
+ for (const [name, server] of Object.entries(serversByName)) {
361
+ const serverActions = repairMcpServerConfig(name, server);
362
+ if (serverActions.length > 0) {
363
+ source.changed = true;
364
+ actions.push(...serverActions.map((action) => `${source.path}: ${action}`));
365
+ }
366
+ const diagnostics = await diagnoseRuntimeMcpServer(name, server);
367
+ const blockers = diagnostics.filter((diagnostic) => AUTO_DISABLE_RUNTIME_BLOCKERS.has(diagnostic.kind));
368
+ if (blockers.length > 0) {
369
+ const reason = blockers.map((diagnostic) => diagnostic.message).join("; ");
370
+ moveMcpServerToDisabled(source, name, server, reason);
371
+ actions.push(`${source.path}: disabled MCP "${name}" due to runtime startup blocker: ${reason}`);
372
+ }
373
+ }
374
+ }
375
+ for (const source of mutableSources.values()) {
376
+ if (!source.changed)
377
+ continue;
378
+ if (dryRun)
379
+ continue;
380
+ await createSanitizedMcpBackup(source.path, source.originalConfig, backups, actions);
381
+ await writeFile(source.path, JSON.stringify(source.config, null, 2) + "\n", "utf-8");
382
+ }
383
+ return {
384
+ changed: !dryRun && actions.length > 0,
385
+ dryRun,
386
+ global: includeGlobal,
387
+ actions: actions.map(maskSensitiveText),
388
+ skipped: skipped.map(maskSensitiveText),
389
+ backups,
390
+ };
391
+ }
392
+ export async function buildMcpDoctorReport() {
393
+ const sources = await resolveAllConfigs();
394
+ const servers = collectServers(sources);
395
+ const resources = await getOmkResourceSettings();
396
+ const activePathOrder = await collectMcpConfigs(resources.mcpScope);
397
+ const activePaths = new Set(activePathOrder);
398
+ const globalMcpPath = join(getUserHome(), ".kimi", "mcp.json");
399
+ const preflightEntriesByName = new Map();
400
+ const preflightOptions = resolveRuntimeMcpPreflightOptions();
401
+ if (preflightOptions.mode !== "off") {
402
+ const activeServersForPreflight = {};
403
+ for (const [name, info] of servers) {
404
+ const activeSources = info.sources.filter((source) => activePaths.has(source));
405
+ if (activeSources.length === 0)
406
+ continue;
407
+ activeServersForPreflight[name] = selectEffectiveServer(info, activePathOrder);
408
+ }
409
+ const preflight = await preflightRuntimeMcpServers(activeServersForPreflight, preflightOptions);
410
+ for (const entry of preflight.entries) {
411
+ preflightEntriesByName.set(entry.name, entry);
412
+ }
413
+ }
414
+ const sourceReports = sources.map((src) => {
415
+ const serverCount = src.parsed ? Object.keys(src.config.mcpServers ?? {}).length : 0;
416
+ const sourceReport = {
417
+ path: src.path,
418
+ exists: src.exists,
419
+ active: activePaths.has(src.path),
420
+ parsed: src.parsed,
421
+ status: !src.parsed ? "error" : !src.exists || serverCount === 0 ? "empty" : "ok",
422
+ serverCount,
423
+ error: src.error ? maskSensitiveText(src.error) : undefined,
424
+ };
425
+ return sourceReport;
426
+ });
427
+ const serverReports = [];
428
+ for (const [name, info] of servers) {
429
+ const server = selectEffectiveServer(info, activePathOrder);
430
+ const checks = [];
431
+ const activeSources = info.sources.filter((source) => activePaths.has(source));
432
+ const active = activeSources.length > 0;
433
+ let resolvedCommand;
434
+ if (activeSources.length > 1) {
435
+ if (name === "omk-project") {
436
+ checks.push({
437
+ severity: "info",
438
+ kind: "managed-duplicate",
439
+ message: `managed omk-project mirror duplicate: ${activeSources.join(", ")} (expected; remove one manually if desired)`,
440
+ });
441
+ }
442
+ else if (activeSources.includes(globalMcpPath) && activeSources.some((source) => source !== globalMcpPath)) {
443
+ checks.push({
444
+ severity: "info",
445
+ kind: "project-overrides-global",
446
+ message: `active duplicate spans global/project; project override is effective: ${activeSources.join(", ")}`,
447
+ });
448
+ }
449
+ else {
450
+ checks.push({
451
+ severity: "error",
452
+ kind: "active-duplicate",
453
+ message: `active duplicate definition in: ${activeSources.join(", ")} — run \`omk mcp remove ${name}\` to delete the local copy, or edit the files manually`,
454
+ });
455
+ }
456
+ }
457
+ else if (info.sources.length > 1) {
458
+ checks.push({
459
+ severity: "info",
460
+ kind: "inactive-duplicate",
461
+ message: `duplicate mirror outside active scope: ${info.sources.join(", ")} (only the active scope config is used)`,
462
+ });
463
+ }
464
+ if (!active) {
465
+ serverReports.push({
466
+ name,
467
+ status: "ok",
468
+ active,
469
+ sources: info.sources,
470
+ activeSources,
471
+ transport: server.url ? "remote" : server.command ? "stdio" : "invalid",
472
+ url: server.url ? sanitizeMcpUrlForDisplay(server.url) : undefined,
473
+ command: server.command ? maskSensitiveText(server.command) : undefined,
474
+ resolvedCommand,
475
+ timeoutSec: server.startup_timeout_sec,
476
+ checks,
477
+ });
478
+ continue;
479
+ }
480
+ if (server.url) {
481
+ const urlCheck = validateRemoteMcpUrl(server.url);
482
+ if (urlCheck.ok) {
483
+ checks.push({ severity: "ok", kind: "url", message: `url: ${sanitizeMcpUrlForDisplay(server.url)}` });
484
+ }
485
+ else {
486
+ checks.push({ severity: "error", kind: "invalid-url", message: `invalid url: ${maskSensitiveText(urlCheck.message)}` });
487
+ }
488
+ }
489
+ else if (!server.command) {
490
+ checks.push({ severity: "error", kind: "missing-command", message: "missing command" });
491
+ }
492
+ else {
493
+ const resolved = await which(server.command);
494
+ if (resolved.failed) {
495
+ checks.push({ severity: "error", kind: "command-not-found", message: `command not found: ${maskSensitiveText(server.command)}` });
496
+ }
497
+ else {
498
+ resolvedCommand = resolved.stdout.trim();
499
+ checks.push({ severity: "ok", kind: "command", message: `command: ${maskSensitiveText(resolvedCommand)}` });
500
+ }
501
+ }
502
+ if (!server.url && server.args) {
503
+ for (const [index, arg] of server.args.entries()) {
504
+ if (!shouldValidateArgPath(server, arg, index))
505
+ continue;
506
+ if (!isAbsolute(arg) && !arg.includes("/") && !arg.includes("\\"))
507
+ continue;
508
+ const exists = await pathExists(arg);
509
+ const displayArg = maskSensitiveText(arg);
510
+ checks.push(exists
511
+ ? { severity: "ok", kind: "arg-path", message: `arg path: ${displayArg}` }
512
+ : { severity: "error", kind: "arg-path-not-found", message: `arg path not found: ${displayArg}` });
513
+ }
514
+ }
515
+ if (server.env) {
516
+ for (const [key, value] of Object.entries(server.env)) {
517
+ if (value.startsWith("${") && value.endsWith("}")) {
518
+ const envName = value.slice(2, -1);
519
+ if (!process.env[envName]) {
520
+ checks.push({ severity: "warn", kind: "env-reference-undefined", message: `env reference undefined: ${key} → ${envName}` });
521
+ }
522
+ }
523
+ }
524
+ }
525
+ for (const check of stdioProtocolChecksForServer(server)) {
526
+ checks.push(check);
527
+ }
528
+ const runtimeDiagnostics = await diagnoseRuntimeMcpServer(name, server);
529
+ for (const diagnostic of runtimeDiagnostics) {
530
+ if (["missing-command", "command-path-not-found", "arg-path-not-found"].includes(diagnostic.kind))
531
+ continue;
532
+ checks.push({
533
+ severity: diagnostic.kind === "disabled-server" ? "info" : "error",
534
+ kind: `runtime-${diagnostic.kind}`,
535
+ message: `runtime startup blocker: ${diagnostic.message}`,
536
+ });
537
+ }
538
+ const stabilityHints = stabilityHintsForServer(name, server);
539
+ for (const hint of stabilityHints) {
540
+ checks.push({ severity: "info", kind: "stability", message: `stability: ${hint}` });
541
+ }
542
+ const preflightEntry = preflightEntriesByName.get(name);
543
+ if (preflightEntry?.status === "failed") {
544
+ checks.push(...preflightChecksForDoctor(preflightEntry));
545
+ }
546
+ const hasError = checks.some((check) => check.severity === "error");
547
+ const hasWarn = checks.some((check) => check.severity === "warn");
548
+ serverReports.push({
549
+ name,
550
+ status: hasError ? "error" : hasWarn ? "warn" : "ok",
551
+ active,
552
+ sources: info.sources,
553
+ activeSources,
554
+ transport: server.url ? "remote" : server.command ? "stdio" : "invalid",
555
+ url: server.url ? sanitizeMcpUrlForDisplay(server.url) : undefined,
556
+ command: server.command ? maskSensitiveText(server.command) : undefined,
557
+ resolvedCommand,
558
+ timeoutSec: server.startup_timeout_sec,
559
+ checks,
560
+ });
561
+ }
562
+ if (resources.mcpScope !== "none" && !servers.has("omk-project")) {
563
+ serverReports.push({
564
+ name: "omk-project",
565
+ status: "ok",
566
+ active: true,
567
+ sources: ["runtime:auto-injected"],
568
+ activeSources: ["runtime:auto-injected"],
569
+ transport: "stdio",
570
+ command: "omk mcp serve omk-project",
571
+ checks: [{
572
+ severity: "info",
573
+ kind: "virtual-runtime-injected",
574
+ message: "virtual runtime MCP injected; not stored in .kimi/mcp.json or .omk/mcp.json",
575
+ }],
576
+ });
577
+ }
578
+ const errors = [
579
+ ...sourceReports
580
+ .filter((source) => source.status === "error" && activePaths.has(source.path))
581
+ .map((source) => maskSensitiveText(`${source.path}: ${source.error ?? "invalid MCP config"}`)),
582
+ ...serverReports.flatMap((server) => server.checks
583
+ .filter((check) => check.severity === "error")
584
+ .map((check) => maskSensitiveText(`${server.name}: ${check.message}`))),
585
+ ];
586
+ const warnings = serverReports.flatMap((server) => server.checks
587
+ .filter((check) => check.severity === "warn")
588
+ .map((check) => maskSensitiveText(`${server.name}: ${check.message}`)));
589
+ return {
590
+ ok: errors.length === 0,
591
+ command: "mcp doctor",
592
+ checkedAt: new Date().toISOString(),
593
+ activeScope: resources.mcpScope,
594
+ issueCount: errors.length,
595
+ errors,
596
+ warnings,
597
+ sources: sourceReports,
598
+ servers: serverReports,
599
+ data: {
600
+ activeScope: resources.mcpScope,
601
+ sourceCount: sourceReports.length,
602
+ serverCount: serverReports.length,
603
+ },
604
+ };
605
+ }
606
+ function emitMcpDoctorText(report) {
607
+ console.log(header("MCP Doctor"));
608
+ console.log(style.gray(`Active MCP scope: ${report.activeScope}`));
609
+ for (const src of report.sources) {
610
+ if (src.status === "error") {
611
+ const line = `${src.path}: ${src.error}`;
612
+ console.log(src.active ? status.error(line) : style.gray(`${line} (inactive)`));
613
+ }
614
+ else if (src.status === "empty") {
615
+ const suffix = !src.exists ? "not found" : "no mcpServers defined";
616
+ console.log(style.gray(`${src.path}: ${suffix}${src.active ? "" : " (inactive)"}`));
617
+ }
618
+ else {
619
+ console.log(src.active ? status.ok(`${src.path}`) : style.gray(`${src.path} (inactive)`));
620
+ }
621
+ }
622
+ if (report.servers.length === 0) {
623
+ console.log("\n" + style.gray("No servers to diagnose."));
624
+ }
625
+ else {
626
+ console.log("");
627
+ for (const server of report.servers) {
628
+ console.log(label("Server", server.name));
629
+ for (const check of server.checks) {
630
+ console.log(` ${formatMcpDoctorCheck(check)}`);
631
+ }
632
+ }
633
+ }
634
+ if (report.fixes) {
635
+ console.log("");
636
+ console.log(label("Fix mode", report.fixes.dryRun ? "dry-run" : report.fixes.global ? "project+global" : "project-local"));
637
+ for (const action of report.fixes.actions) {
638
+ console.log(` ${report.fixes.dryRun ? style.skin("•") : style.mint("✓")} ${action}`);
639
+ }
640
+ for (const backup of report.fixes.backups) {
641
+ console.log(` ${style.gray("backup:")} ${backup}`);
642
+ }
643
+ for (const item of report.fixes.skipped) {
644
+ console.log(` ${style.gray("skipped:")} ${item}`);
645
+ }
646
+ }
647
+ console.log("");
648
+ if (report.ok) {
649
+ console.log(status.ok("All checks passed"));
650
+ }
651
+ else {
652
+ console.log(status.error(`${report.issueCount} issue(s) found`));
653
+ console.log(style.gray("To resolve duplicates: run `omk mcp remove <server>` to delete a local copy, or edit the config files directly."));
654
+ }
655
+ }
656
+ function formatMcpDoctorCheck(check) {
657
+ switch (check.severity) {
658
+ case "ok":
659
+ return `${style.mint("✓")} ${check.message}`;
660
+ case "warn":
661
+ return `${style.skin("⚠")} ${check.message}`;
662
+ case "error":
663
+ return `${style.pink("✗")} ${check.message}`;
664
+ default:
665
+ return `${style.gray("ℹ")} ${check.message}`;
666
+ }
667
+ }
668
+ function preflightChecksForDoctor(entry) {
669
+ const packageNote = entry.packageSpec ? ` (${maskSensitiveText(entry.packageSpec)})` : "";
670
+ const detail = entry.detail ? `: ${maskSensitiveText(entry.detail)}` : "";
671
+ const failureKind = entry.reason === "timeout" ? "preflight-timeout" : "preflight-package-unavailable";
672
+ const failureMessage = entry.reason === "timeout"
673
+ ? `warn: handshake-timeout/package preflight timed out${packageNote}; run \`omk mcp check --all\` (or \`omk mcp prewarm --all\`) to check caches`
674
+ : `npm-family package resolution failed${packageNote}${detail}; run \`omk mcp check --all\` (or \`omk mcp prewarm --all\`) to check caches`;
675
+ return [
676
+ { severity: "warn", kind: failureKind, message: failureMessage },
677
+ {
678
+ severity: "warn",
679
+ kind: "prewarm-needed",
680
+ message: "preflight check recommended before chat startup; for one server run `omk mcp check <server-name>`",
681
+ },
682
+ ];
683
+ }
684
+ function stabilityHintsForServer(name, server) {
685
+ if (!server.command && !server.url)
686
+ return [];
687
+ const hints = [];
688
+ const target = serverTargetText(server);
689
+ if ((server.command?.includes("npx") ?? false) || (server.command?.includes("npm") ?? false)) {
690
+ hints.push("npx-based servers may take >10s to start on first run. Consider installing globally or pinning the package.");
691
+ }
692
+ if (isRailwayMcpServer(name, server)) {
693
+ if (server.url?.includes("mcp.railway.com")) {
694
+ hints.push("Railway remote MCP uses OAuth over HTTP and avoids local npx/CLI token files; the first tool call may open browser auth.");
695
+ }
696
+ else if (target.includes("@jasontanswe/railway-mcp")) {
697
+ hints.push("Unofficial Railway MCP uses RAILWAY_API_TOKEN and calls the GraphQL API directly (no CLI needed). If projects return empty, verify your token has project access at https://railway.app/account/tokens.");
698
+ }
699
+ else {
700
+ hints.push("Railway CLI tokens expire periodically. Run railway login to refresh before using this server.");
701
+ if (target.includes("@railway/mcp-server")) {
702
+ hints.push(`Railway local MCP depends on Railway CLI auth and npx cold starts. Prefer the remote OAuth preset: omk mcp install railway or Codex: codex mcp add railway --url ${RAILWAY_REMOTE_MCP_URL}.`);
703
+ }
704
+ else {
705
+ hints.push(`Railway MCP is most stable as a remote OAuth server at ${RAILWAY_REMOTE_MCP_URL}; avoid committing API tokens into MCP JSON.`);
706
+ }
707
+ }
708
+ }
709
+ if (isSupabaseMcpServer(name, server)) {
710
+ hints.push("Supabase MCP requires an access token. Store it in your global MCP env (not committed) and run omk mcp doctor to verify. Tokens expire; refresh them from the Supabase account dashboard.");
711
+ }
712
+ if (name === "promptfoo") {
713
+ hints.push("promptfoo can be slow to initialize. Ensure NODE_OPTIONS does not limit memory, or run 'omk mcp test promptfoo' with a longer timeout.");
714
+ }
715
+ if (name === "obsidian") {
716
+ hints.push("obsidian MCP requires an active Obsidian vault and the Local REST API plugin. If the vault is closed, the server will fail.");
717
+ }
718
+ return hints;
719
+ }
720
+ function stdioProtocolChecksForServer(server) {
721
+ if (server.url)
722
+ return [];
723
+ const args = server.args ?? [];
724
+ if (args.includes("@modelcontextprotocol/server-pdf") && !args.includes("--stdio")) {
725
+ return [{
726
+ severity: "error",
727
+ kind: "stdio-protocol-mismatch",
728
+ message: "@modelcontextprotocol/server-pdf defaults to HTTP and can write 'MCP server listening on .../mcp' to stdout; add --stdio or configure it as a remote URL",
729
+ }];
730
+ }
731
+ return [];
732
+ }
733
+ function shouldValidateArgPath(server, arg, index) {
734
+ if (typeof arg !== "string" || arg.startsWith("-") || arg.startsWith("$"))
735
+ return false;
736
+ if (isShellInlineScript(server, index))
737
+ return false;
738
+ if (isNpxPackageSpecifier(server, arg))
739
+ return false;
740
+ if (isHttpUrl(arg))
741
+ return false;
742
+ // Shell snippets, inline commands, and arguments with whitespace are not
743
+ // standalone filesystem paths. Validating them as paths creates false MCP
744
+ // doctor failures for commands like `bash -lc "exec node /path/server.js"`.
745
+ if (/[\s;"'|&<>]/.test(arg))
746
+ return false;
747
+ return true;
748
+ }
749
+ function isNpxPackageSpecifier(server, arg) {
750
+ const command = basenameOfCommand(server.command ?? "");
751
+ if (!["npx", "npm", "pnpm", "yarn", "bun"].includes(command))
752
+ return false;
753
+ if (arg.startsWith(".") || arg.startsWith("/") || arg.includes("\\") || arg.includes(":"))
754
+ return false;
755
+ return /^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+(?:@[a-z0-9._~+-]+)?$/i.test(arg);
756
+ }
757
+ function isShellInlineScript(server, index) {
758
+ const command = basenameOfCommand(server.command ?? "");
759
+ if (!["bash", "sh", "zsh", "fish", "pwsh", "powershell", "cmd", "cmd.exe"].includes(command)) {
760
+ return false;
761
+ }
762
+ const previous = server.args?.[index - 1];
763
+ return previous === "-c" || previous === "-lc" || previous === "/c" || previous === "--command";
764
+ }
765
+ function basenameOfCommand(command) {
766
+ return command.replace(/\\/g, "/").split("/").pop()?.toLowerCase() ?? command.toLowerCase();
767
+ }
768
+ function isNpmLauncherCommand(command) {
769
+ if (!command)
770
+ return false;
771
+ return ["npm", "npx", "npm.cmd", "npx.cmd", "npm.exe", "npx.exe"].includes(basenameOfCommand(command));
772
+ }
773
+ function validateRemoteMcpUrl(url) {
774
+ try {
775
+ const parsed = new URL(url);
776
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
777
+ return { ok: false, message: "remote MCP URL must use http or https" };
778
+ }
779
+ return { ok: true };
780
+ }
781
+ catch (err) {
782
+ const message = err instanceof Error ? err.message : String(err);
783
+ return { ok: false, message };
784
+ }
785
+ }
786
+ const SECRET_QUERY_KEYS = /^(token|api[-_]?key|key|secret|password|auth|credential|session|bearer|access[-_]?token|refresh[-_]?token|client[-_]?secret|x[-_]?auth[-_]?token|signature|sig|jwt|private[-_]?key|pat|dsn)$/i;
787
+ function sanitizeMcpUrlForDisplay(url) {
788
+ try {
789
+ const parsed = new URL(url);
790
+ let changed = false;
791
+ if (parsed.username || parsed.password) {
792
+ parsed.username = "***";
793
+ parsed.password = "";
794
+ changed = true;
795
+ }
796
+ for (const [key] of parsed.searchParams) {
797
+ if (SECRET_QUERY_KEYS.test(key)) {
798
+ parsed.searchParams.set(key, "***");
799
+ changed = true;
800
+ }
801
+ }
802
+ if (parsed.hash) {
803
+ parsed.hash = "#***";
804
+ changed = true;
805
+ }
806
+ return changed ? parsed.toString() : url;
807
+ }
808
+ catch {
809
+ return url;
810
+ }
811
+ }
812
+ function serverTargetText(server) {
813
+ return [server.url, server.command, ...(server.args ?? [])].filter(Boolean).join(" ");
814
+ }
815
+ function isRailwayMcpServer(name, server) {
816
+ return /railway/i.test(name) || /railway/i.test(serverTargetText(server));
817
+ }
818
+ function isSupabaseMcpServer(name, server) {
819
+ return /supabase/i.test(name) || /supabase/i.test(serverTargetText(server));
820
+ }
821
+ function formatArgsForDisplay(args) {
822
+ return sanitizeMcpArgsForProject(args).join(" ");
823
+ }
824
+ export async function mcpTestCommand(serverName) {
825
+ const sources = await resolveAllConfigs();
826
+ const servers = collectServers(sources);
827
+ const info = servers.get(serverName);
828
+ if (!info) {
829
+ console.error(status.error(`Server not found: ${serverName}`));
830
+ console.error(style.gray("Run `omk mcp list` to see available servers."));
831
+ process.exit(1);
832
+ }
833
+ const resources = await getOmkResourceSettings();
834
+ const activePathOrder = await collectMcpConfigs(resources.mcpScope);
835
+ const activeSources = info.sources.filter((source) => activePathOrder.includes(source));
836
+ if (activeSources.length === 0) {
837
+ console.error(status.error(`Server ${serverName} is not active in MCP scope "${resources.mcpScope}".`));
838
+ console.error(style.gray(`Defined in: ${info.sources.join(", ")}`));
839
+ process.exit(1);
840
+ }
841
+ const server = selectEffectiveServer(info, activePathOrder);
842
+ if (!server.url && !server.command) {
843
+ console.error(status.error(`Server ${serverName} has no command`));
844
+ process.exit(1);
845
+ }
846
+ console.log(header(`MCP Test: ${serverName}`));
847
+ if (server.url) {
848
+ console.log(label("URL", sanitizeMcpUrlForDisplay(server.url)));
849
+ await testRemoteMcpServer(serverName, server);
850
+ return;
851
+ }
852
+ const command = server.command;
853
+ if (!command) {
854
+ console.error(status.error(`Server ${serverName} has no command`));
855
+ process.exit(1);
856
+ }
857
+ console.log(label("Command", maskSensitiveText(command)));
858
+ if (server.args)
859
+ console.log(label("Args", formatArgsForDisplay(server.args)));
860
+ console.log("");
861
+ const testEnv = buildSubprocessEnv(process.env, server.env ?? {});
862
+ // Test 1: executable exists
863
+ const resolved = await which(command);
864
+ if (resolved.failed) {
865
+ console.error(status.error(`Executable not found: ${maskSensitiveText(command)}`));
866
+ process.exit(1);
867
+ }
868
+ console.log(status.ok(`Executable: ${maskSensitiveText(resolved.stdout.trim())}`));
869
+ // Test 2: try to run with a 5s timeout as a basic smoke test
870
+ const smokeArgs = [...(server.args ?? [])];
871
+ console.log(style.gray("Smoke test: starting process (5s timeout)..."));
872
+ const smokeResult = await runShell(command, smokeArgs, {
873
+ cwd: getProjectRoot(),
874
+ timeout: 5000,
875
+ env: testEnv,
876
+ });
877
+ const smokePollution = findNonJsonStdoutLines(smokeResult.stdout);
878
+ if (smokePollution.length > 0) {
879
+ console.error(status.error(`Server wrote non-JSON text to stdout during startup: ${maskSensitiveText(smokePollution[0])}`));
880
+ console.error(style.gray("MCP stdio servers must write only JSON-RPC frames to stdout. Move logs to stderr, remove this server, or configure it as a remote URL if it is an HTTP MCP server."));
881
+ process.exit(1);
882
+ }
883
+ if (!smokeResult.failed) {
884
+ console.log(status.ok(`Process exited with code ${smokeResult.exitCode}`));
885
+ }
886
+ else if (smokeResult.stderr.includes("timeout") || smokeResult.stderr.includes("ETIMEDOUT")) {
887
+ console.log(style.skin("Process is still running after 5s (expected for stdio MCP servers)"));
888
+ }
889
+ else if (!smokeResult.stderr.trim()) {
890
+ console.log(status.ok(`Process started and exited without stderr (code ${smokeResult.exitCode})`));
891
+ }
892
+ else if (smokeResult.stderr.includes("ENOENT")) {
893
+ console.error(status.error(`Failed to start: ${maskSensitiveText(smokeResult.stderr)}`));
894
+ process.exit(1);
895
+ }
896
+ else {
897
+ console.log(style.gray(`Process exited with error (may be OK for stdio servers): ${maskSensitiveText(smokeResult.stderr)}`));
898
+ }
899
+ // Test 3: JSON-RPC initialize handshake
900
+ console.log("");
901
+ console.log(style.gray("JSON-RPC handshake test..."));
902
+ const initializePayload = JSON.stringify({
903
+ jsonrpc: "2.0",
904
+ id: 1,
905
+ method: "initialize",
906
+ params: {
907
+ protocolVersion: "2024-11-05",
908
+ capabilities: {},
909
+ clientInfo: {
910
+ name: "omk-mcp-test",
911
+ version: "0.0.0",
912
+ },
913
+ },
914
+ }) + "\n";
915
+ const handshakeTimeoutMs = Math.max(1000, Math.min((server.startup_timeout_sec ?? 20) * 1000, 20_000));
916
+ const handshakeResult = await runShell(command, smokeArgs, {
917
+ cwd: getProjectRoot(),
918
+ timeout: handshakeTimeoutMs,
919
+ env: testEnv,
920
+ input: initializePayload,
921
+ });
922
+ const stdoutPollution = findNonJsonStdoutLines(handshakeResult.stdout);
923
+ if (stdoutPollution.length > 0) {
924
+ console.error(status.error(`Server wrote non-JSON text to stdout before/during JSON-RPC: ${maskSensitiveText(stdoutPollution[0])}`));
925
+ console.error(style.gray("MCP stdio servers must write only JSON-RPC frames to stdout. Move logs to stderr, remove this server, or configure it as a remote URL if it is an HTTP MCP server."));
926
+ process.exit(1);
927
+ }
928
+ const handshakeResponses = parseJsonRpcResponses(handshakeResult.stdout);
929
+ const internalHandshakeError = findInternalJsonRpcError(handshakeResponses);
930
+ if (internalHandshakeError) {
931
+ console.error(status.error(`JSON-RPC initialize returned Internal error: ${maskSensitiveText(internalHandshakeError.error?.message ?? "unknown")}`));
932
+ process.exit(1);
933
+ }
934
+ const initializeResponse = findJsonRpcResponseById(handshakeResponses, 1);
935
+ const serverInfo = extractInitializeServerInfo(initializeResponse);
936
+ if (serverInfo) {
937
+ console.log(style.mint("JSON-RPC initialize succeeded"));
938
+ }
939
+ else if (!handshakeResult.failed) {
940
+ const detail = initializeResponse ? "initialize response missing serverInfo" : `server exited without initialize response (exit code ${handshakeResult.exitCode})`;
941
+ console.error(status.error(`JSON-RPC initialize failed: ${detail}`));
942
+ process.exit(1);
943
+ }
944
+ else if (/timed?\s*out|timeout|ETIMEDOUT/i.test(handshakeResult.stderr)) {
945
+ console.error(status.error("JSON-RPC initialize timed out before serverInfo was received"));
946
+ if (handshakeResult.stderr.trim())
947
+ console.error(style.gray(maskSensitiveText(handshakeResult.stderr.trim())));
948
+ process.exit(1);
949
+ }
950
+ else {
951
+ console.error(status.error(`JSON-RPC initialize failed: ${maskSensitiveText(handshakeResult.stderr || "unknown error")}`));
952
+ process.exit(1);
953
+ }
954
+ if (shouldRunOmkProjectProbe(serverName, server)) {
955
+ await runOmkProjectToolProbe(command, smokeArgs, server.env);
956
+ }
957
+ }
958
+ export async function mcpPrewarmCommand(serverName, options = {}) {
959
+ const isCheck = options.label === "check";
960
+ if (options.all) {
961
+ console.log(header(isCheck ? "MCP Check All" : "MCP Preflight Check All"));
962
+ console.log(style.gray("Bounded npm-family dependency-resolution check for active MCP servers; this does not force-install packages."));
963
+ const resources = await getOmkResourceSettings();
964
+ const activePathOrder = await collectMcpConfigs(resources.mcpScope);
965
+ const activePaths = new Set(activePathOrder);
966
+ const sources = await resolveAllConfigs();
967
+ const servers = collectServers(sources);
968
+ if (servers.size === 0) {
969
+ console.log(style.gray("No MCP servers configured."));
970
+ return;
971
+ }
972
+ const activeServers = {};
973
+ const inactive = new Set();
974
+ for (const [name, info] of servers) {
975
+ const activeSources = info.sources.filter((source) => activePaths.has(source));
976
+ if (activeSources.length === 0) {
977
+ inactive.add(name);
978
+ continue;
979
+ }
980
+ activeServers[name] = selectEffectiveServer(info, activePathOrder);
981
+ }
982
+ const preflightOptions = resolveRuntimeMcpPreflightOptions();
983
+ const preflight = await preflightRuntimeMcpServers(activeServers, preflightOptions);
984
+ const entriesByName = new Map(preflight.entries.map((entry) => [entry.name, entry]));
985
+ let okCount = 0;
986
+ let failCount = 0;
987
+ let checkedCount = 0;
988
+ let skipCount = inactive.size;
989
+ for (const [name] of servers) {
990
+ if (inactive.has(name)) {
991
+ console.log(`${style.gray("-")} ${style.gray(name)} ${style.gray("[inactive]")}`);
992
+ continue;
993
+ }
994
+ checkedCount++;
995
+ const entry = entriesByName.get(name);
996
+ if (!entry || entry.status === "skipped") {
997
+ skipCount++;
998
+ const reason = entry?.reason === "no-package-spec" ? "no package spec" : "not npm-family";
999
+ console.log(`${style.gray("-")} ${name} ${style.gray(`[skipped: ${reason}]`)}`);
1000
+ continue;
1001
+ }
1002
+ if (entry.status === "ok") {
1003
+ okCount++;
1004
+ const packageNote = entry.packageSpec ? ` (${entry.packageSpec})` : "";
1005
+ console.log(`${style.mint("✓")} ${name}${style.gray(packageNote)}`);
1006
+ continue;
1007
+ }
1008
+ failCount++;
1009
+ console.log(`${style.pink("✗")} ${name}: ${maskSensitiveText(entry.detail ?? "failed")}`);
1010
+ }
1011
+ console.log("");
1012
+ if (failCount === 0) {
1013
+ console.log(status.ok(`Checked ${checkedCount} server(s); ${skipCount} skipped`));
1014
+ }
1015
+ else {
1016
+ process.exitCode = 1;
1017
+ console.log(status.error(`${failCount} failure(s), ${okCount} ok, ${skipCount} skipped`));
1018
+ }
1019
+ return;
1020
+ }
1021
+ if (!serverName) {
1022
+ console.error(status.error("Provide a server name or use --all"));
1023
+ process.exit(1);
1024
+ }
1025
+ console.log(header(`${isCheck ? "MCP Check" : "MCP Prewarm/Check"}: ${serverName}`));
1026
+ console.log(style.gray("Runs the MCP startup probe outside chat; package-manager caches may warm as a side effect."));
1027
+ console.log(style.gray("For a zero-global-noise session, run chat/goal/parallel with `--mcp-scope project` or `--mcp-scope none`."));
1028
+ await mcpTestCommand(serverName);
1029
+ }
1030
+ function shouldRunOmkProjectProbe(serverName, server) {
1031
+ const target = serverTargetText(server);
1032
+ return serverName === "omk-project" || /\bomk-project\b/.test(target);
1033
+ }
1034
+ async function runOmkProjectToolProbe(command, args, env) {
1035
+ console.log("");
1036
+ console.log(style.gray("JSON-RPC OMK tools/call id 3 probe..."));
1037
+ const payload = [
1038
+ {
1039
+ jsonrpc: "2.0",
1040
+ id: 1,
1041
+ method: "initialize",
1042
+ params: {
1043
+ protocolVersion: "2024-11-05",
1044
+ capabilities: {},
1045
+ clientInfo: { name: "omk-mcp-test", version: "0.0.0" },
1046
+ },
1047
+ },
1048
+ {
1049
+ jsonrpc: "2.0",
1050
+ id: 2,
1051
+ method: "tools/list",
1052
+ },
1053
+ {
1054
+ jsonrpc: "2.0",
1055
+ id: 3,
1056
+ method: "tools/call",
1057
+ params: {
1058
+ name: "omk_goal_show",
1059
+ arguments: { goalId: "missing-goal" },
1060
+ },
1061
+ },
1062
+ ].map((message) => JSON.stringify(message)).join("\n") + "\n";
1063
+ const probeResult = await runShell(command, args, {
1064
+ cwd: getProjectRoot(),
1065
+ timeout: 20000,
1066
+ env: buildSubprocessEnv(process.env, env ?? {}),
1067
+ input: payload,
1068
+ });
1069
+ const responses = parseJsonRpcResponses(probeResult.stdout);
1070
+ const internalError = findInternalJsonRpcError(responses);
1071
+ if (internalError) {
1072
+ console.error(status.error(`JSON-RPC id ${String(internalError.id ?? "?")} returned Internal error: ${internalError.error?.message ?? "unknown"}`));
1073
+ if (probeResult.stderr.trim())
1074
+ console.error(style.gray(maskSensitiveText(probeResult.stderr.trim())));
1075
+ process.exit(1);
1076
+ }
1077
+ const toolResponse = responses.find((response) => response.id === 3);
1078
+ if (!toolResponse) {
1079
+ const timeoutHint = probeResult.stderr.includes("timeout") || probeResult.stderr.includes("ETIMEDOUT")
1080
+ ? " before the probe timeout"
1081
+ : "";
1082
+ console.error(status.error(`JSON-RPC tools/call id 3 did not return a response${timeoutHint}`));
1083
+ if (probeResult.stderr.trim())
1084
+ console.error(style.gray(maskSensitiveText(probeResult.stderr.trim())));
1085
+ process.exit(1);
1086
+ }
1087
+ if (toolResponse.error) {
1088
+ console.error(status.error(`JSON-RPC id 3 returned error ${toolResponse.error.code ?? "unknown"}: ${toolResponse.error.message ?? "unknown"}`));
1089
+ process.exit(1);
1090
+ }
1091
+ const toolText = stringifyToolResultContent(toolResponse.result);
1092
+ if (!isRecord(toolResponse.result) || toolResponse.result.isError !== true || !toolText.includes("OMK tool-level failure")) {
1093
+ console.error(status.error("JSON-RPC id 3 did not return an OMK tool-level error result"));
1094
+ process.exit(1);
1095
+ }
1096
+ console.log(status.ok("JSON-RPC tools/call id 3 returned OMK tool-level error without -32603"));
1097
+ }
1098
+ function findNonJsonStdoutLines(stdout) {
1099
+ const invalidLines = [];
1100
+ for (const line of stdout.split(/\r?\n/)) {
1101
+ const trimmed = line.trim();
1102
+ if (!trimmed)
1103
+ continue;
1104
+ try {
1105
+ const parsed = JSON.parse(trimmed);
1106
+ if (!isJsonRpcFrame(parsed))
1107
+ invalidLines.push(trimmed);
1108
+ }
1109
+ catch {
1110
+ invalidLines.push(trimmed);
1111
+ }
1112
+ }
1113
+ return invalidLines;
1114
+ }
1115
+ function isJsonRpcFrame(value) {
1116
+ if (!isRecord(value) || value.jsonrpc !== "2.0")
1117
+ return false;
1118
+ return "id" in value || "method" in value || "result" in value || "error" in value;
1119
+ }
1120
+ function parseJsonRpcResponses(stdout) {
1121
+ const responses = [];
1122
+ for (const line of stdout.split(/\r?\n/)) {
1123
+ const trimmed = line.trim();
1124
+ if (!trimmed.startsWith("{"))
1125
+ continue;
1126
+ try {
1127
+ const parsed = JSON.parse(trimmed);
1128
+ if (isJsonRpcFrame(parsed)) {
1129
+ const response = {};
1130
+ if (typeof parsed.id === "string" || typeof parsed.id === "number")
1131
+ response.id = parsed.id;
1132
+ if ("result" in parsed)
1133
+ response.result = parsed.result;
1134
+ if (isRecord(parsed.error)) {
1135
+ response.error = {};
1136
+ if (typeof parsed.error.code === "number")
1137
+ response.error.code = parsed.error.code;
1138
+ if (typeof parsed.error.message === "string")
1139
+ response.error.message = parsed.error.message;
1140
+ }
1141
+ responses.push(response);
1142
+ }
1143
+ }
1144
+ catch {
1145
+ // Ignore non-JSON logs from MCP child processes.
1146
+ }
1147
+ }
1148
+ return responses;
1149
+ }
1150
+ function findInternalJsonRpcError(responses) {
1151
+ return responses.find((response) => response.error?.code === JSON_RPC_INTERNAL_ERROR_CODE ||
1152
+ /internal error/i.test(response.error?.message ?? ""));
1153
+ }
1154
+ function findJsonRpcResponseById(responses, id) {
1155
+ return responses.find((response) => response.id === id);
1156
+ }
1157
+ function extractInitializeServerInfo(response) {
1158
+ if (!response || !isRecord(response.result))
1159
+ return undefined;
1160
+ const serverInfo = response.result.serverInfo;
1161
+ if (!isRecord(serverInfo))
1162
+ return undefined;
1163
+ return typeof serverInfo.name === "string" && serverInfo.name.trim().length > 0
1164
+ && typeof serverInfo.version === "string" && serverInfo.version.trim().length > 0
1165
+ ? { name: serverInfo.name, version: serverInfo.version }
1166
+ : undefined;
1167
+ }
1168
+ function stringifyToolResultContent(result) {
1169
+ if (!isRecord(result) || !Array.isArray(result.content))
1170
+ return "";
1171
+ return result.content
1172
+ .map((item) => {
1173
+ if (isRecord(item) && typeof item.text === "string")
1174
+ return item.text;
1175
+ return "";
1176
+ })
1177
+ .join("\n");
1178
+ }
1179
+ function isRecord(value) {
1180
+ return typeof value === "object" && value !== null;
1181
+ }
1182
+ async function testRemoteMcpServer(serverName, server) {
1183
+ console.log("");
1184
+ const url = server.url;
1185
+ if (!url) {
1186
+ console.error(status.error(`Remote MCP server ${serverName} has no URL`));
1187
+ process.exit(1);
1188
+ }
1189
+ const urlCheck = validateRemoteMcpUrl(url);
1190
+ if (!urlCheck.ok) {
1191
+ console.error(status.error(`Invalid remote MCP URL for ${serverName}: ${urlCheck.message}`));
1192
+ process.exit(1);
1193
+ }
1194
+ const timeoutMs = Math.max(1000, Math.min((server.startup_timeout_sec ?? 20) * 1000, 20_000));
1195
+ console.log(style.gray(`Remote MCP JSON-RPC initialize test (${timeoutMs}ms timeout)...`));
1196
+ const session = new McpClientSession({
1197
+ name: serverName,
1198
+ transport: "streamable-http",
1199
+ url,
1200
+ headers: server.headers,
1201
+ http_headers: server.http_headers,
1202
+ startupTimeoutMs: timeoutMs,
1203
+ requestTimeoutMs: timeoutMs,
1204
+ });
1205
+ try {
1206
+ await session.connect();
1207
+ const result = await session.initialize({
1208
+ protocolVersion: "2024-11-05",
1209
+ capabilities: {},
1210
+ clientInfo: {
1211
+ name: "omk-mcp-test",
1212
+ version: "0.0.0",
1213
+ },
1214
+ });
1215
+ console.log(status.ok(`Remote MCP initialize succeeded: ${maskSensitiveText(result.serverInfo?.name ?? "unknown")} ${maskSensitiveText(result.serverInfo?.version ?? "")}`.trim()));
1216
+ if (serverName === "railway") {
1217
+ console.log(style.gray("Railway may prompt OAuth on first tool call; no API token is required in MCP config."));
1218
+ }
1219
+ }
1220
+ catch (err) {
1221
+ const message = maskSensitiveText(err instanceof Error ? err.message : String(err));
1222
+ if (/HTTP\s*401|unauthorized/i.test(message)) {
1223
+ console.error(status.error("Remote MCP initialize failed: authentication required (HTTP 401)."));
1224
+ if (serverName === "railway") {
1225
+ console.error(style.gray("Railway OAuth may need re-authentication. Run the server locally or re-authorize via browser."));
1226
+ }
1227
+ else if (serverName === "supabase") {
1228
+ console.error(style.gray("Supabase token may be expired. Generate a new access token in the Supabase account dashboard and update your global MCP env."));
1229
+ }
1230
+ else if (serverName === "github") {
1231
+ console.error(style.gray("GitHub token may be expired or lack required scopes. Check your token at https://github.com/settings/tokens."));
1232
+ }
1233
+ process.exit(1);
1234
+ }
1235
+ if (/HTTP\s*403|forbidden/i.test(message)) {
1236
+ console.error(status.error("Remote MCP initialize failed: forbidden (HTTP 403). Check token permissions."));
1237
+ if (serverName === "railway") {
1238
+ console.error(style.gray("Railway OAuth may need re-authentication. Run the server locally or re-authorize via browser."));
1239
+ }
1240
+ else if (serverName === "supabase") {
1241
+ console.error(style.gray("Supabase token may be expired. Generate a new access token in the Supabase account dashboard and update your global MCP env."));
1242
+ }
1243
+ else if (serverName === "github") {
1244
+ console.error(style.gray("GitHub token may be expired or lack required scopes. Check your token at https://github.com/settings/tokens."));
1245
+ }
1246
+ process.exit(1);
1247
+ }
1248
+ if (/HTTP\s*404|not found/i.test(message)) {
1249
+ console.error(status.error("Remote MCP initialize failed: endpoint not found (HTTP 404)."));
1250
+ process.exit(1);
1251
+ }
1252
+ if (/HTTP\s*405|method not allowed/i.test(message)) {
1253
+ console.error(status.error("Remote MCP initialize failed: method not allowed (HTTP 405). The endpoint may not support MCP over HTTP."));
1254
+ process.exit(1);
1255
+ }
1256
+ if (/HTTP\s*400|bad request/i.test(message)) {
1257
+ console.error(status.error("Remote MCP initialize failed: bad request (HTTP 400). Check URL and headers."));
1258
+ process.exit(1);
1259
+ }
1260
+ if (/timed?\s*out|timeout|ETIMEDOUT|MCP request timed out|MCP transport send timed out|MCP initialize response missing serverInfo/i.test(message)) {
1261
+ console.error(status.error(`Remote MCP initialize failed: ${message}`));
1262
+ console.error(style.gray("The endpoint may not be an MCP server, or it may require different headers or a different URL path."));
1263
+ process.exit(1);
1264
+ }
1265
+ console.error(status.error(`Remote MCP initialize failed: ${message}`));
1266
+ process.exit(1);
1267
+ }
1268
+ finally {
1269
+ await session.close().catch(() => { });
1270
+ }
1271
+ }
1272
+ export async function mcpRemoveCommand(serverName, options = {}) {
1273
+ const root = getProjectRoot();
1274
+ const localPath = join(root, ".kimi", "mcp.json");
1275
+ const omkPath = join(root, ".omk", "mcp.json");
1276
+ const globalPath = join(getUserHome(), ".kimi", "mcp.json");
1277
+ const sources = options.global
1278
+ ? [{ path: globalPath, label: "global" }]
1279
+ : [
1280
+ { path: localPath, label: "project-local" },
1281
+ { path: omkPath, label: "omk-project" },
1282
+ ];
1283
+ let removed = false;
1284
+ for (const src of sources) {
1285
+ const cfg = await loadConfig(src.path);
1286
+ if (!cfg.parsed || !cfg.config.mcpServers || !(serverName in cfg.config.mcpServers)) {
1287
+ continue;
1288
+ }
1289
+ const next = { ...cfg.config.mcpServers };
1290
+ delete next[serverName];
1291
+ await writeFile(src.path, JSON.stringify({ mcpServers: next }, null, 2) + "\n", "utf-8");
1292
+ console.log(status.ok(`Removed "${serverName}" from ${src.label} MCP config: ${src.path}`));
1293
+ removed = true;
1294
+ break;
1295
+ }
1296
+ if (!removed) {
1297
+ console.log(status.error(`Server "${serverName}" not found in ${options.global ? "global" : "project-local"} MCP configs.`));
1298
+ console.log(style.gray(`Checked: ${sources.map((s) => s.path).join(", ")}`));
1299
+ if (!options.global) {
1300
+ console.log(style.gray(`To remove from global config, run \`omk mcp remove ${serverName} --global\`, or edit ~/.kimi/mcp.json manually.`));
1301
+ }
1302
+ else {
1303
+ console.log(style.gray(`To remove from project-local configs, run \`omk mcp remove ${serverName}\`.`));
1304
+ }
1305
+ process.exit(1);
1306
+ }
1307
+ }
1308
+ export async function mcpAddCommand(serverName) {
1309
+ const root = getProjectRoot();
1310
+ const globalPath = join(getUserHome(), ".kimi", "mcp.json");
1311
+ const projectMcpPath = join(root, ".kimi", "mcp.json");
1312
+ const globalSource = await loadConfig(globalPath);
1313
+ if (!globalSource.parsed || !globalSource.config.mcpServers || !(serverName in globalSource.config.mcpServers)) {
1314
+ console.log(status.error(`Server "${serverName}" not found in global MCP config: ${globalPath}`));
1315
+ process.exit(1);
1316
+ }
1317
+ const projectMcpSource = await loadConfig(projectMcpPath);
1318
+ const projectMcpServers = projectMcpSource.parsed && projectMcpSource.config.mcpServers
1319
+ ? { ...projectMcpSource.config.mcpServers }
1320
+ : {};
1321
+ if (serverName in projectMcpServers) {
1322
+ console.log(status.error(`Server "${serverName}" already exists in ${projectMcpPath}`));
1323
+ process.exit(1);
1324
+ }
1325
+ projectMcpServers[serverName] = sanitizeMcpServerForProject(globalSource.config.mcpServers[serverName]);
1326
+ await mkdir(join(root, ".kimi"), { recursive: true });
1327
+ await writeFile(projectMcpPath, JSON.stringify({ mcpServers: projectMcpServers }, null, 2) + "\n", "utf-8");
1328
+ console.log(header("MCP Add"));
1329
+ console.log(status.ok(`Added "${serverName}" to ${projectMcpPath}`));
1330
+ }
1331
+ export async function mcpInstallCommand(name, command, args, options = {}) {
1332
+ const root = getProjectRoot();
1333
+ const projectMcpPath = join(root, ".kimi", "mcp.json");
1334
+ const projectMcpSource = await loadConfig(projectMcpPath);
1335
+ const projectMcpServers = projectMcpSource.parsed && projectMcpSource.config.mcpServers
1336
+ ? { ...projectMcpSource.config.mcpServers }
1337
+ : {};
1338
+ if (name in projectMcpServers) {
1339
+ console.log(status.error(`Server "${name}" already exists in ${projectMcpPath}`));
1340
+ process.exit(1);
1341
+ }
1342
+ const server = sanitizeMcpServerForProject(createInstallServer(name, command, args, options));
1343
+ projectMcpServers[name] = server;
1344
+ await mkdir(join(root, ".kimi"), { recursive: true });
1345
+ await writeFile(projectMcpPath, JSON.stringify({ mcpServers: projectMcpServers }, null, 2) + "\n", "utf-8");
1346
+ console.log(header("MCP Install"));
1347
+ console.log(status.ok(`Installed "${name}" into ${projectMcpPath}`));
1348
+ if (server.url) {
1349
+ console.log(label("URL", sanitizeMcpUrlForDisplay(server.url)));
1350
+ }
1351
+ else {
1352
+ console.log(label("Command", maskSensitiveText(server.command ?? command)));
1353
+ if (args.length > 0)
1354
+ console.log(label("Args", formatArgsForDisplay(server.args ?? args)));
1355
+ }
1356
+ }
1357
+ function createInstallServer(name, command, args, options = {}) {
1358
+ if (isRailwayInstallPreset(name, command, args, options)) {
1359
+ return { url: RAILWAY_REMOTE_MCP_URL };
1360
+ }
1361
+ if (isHttpUrl(command) && args.length === 0) {
1362
+ return { url: sanitizeMcpUrlForDisplay(command) };
1363
+ }
1364
+ const server = { command, args: [...args] };
1365
+ if (options.env) {
1366
+ server.env = {};
1367
+ if (Array.isArray(options.env)) {
1368
+ for (const pair of options.env) {
1369
+ const idx = pair.indexOf("=");
1370
+ if (idx > 0) {
1371
+ const key = pair.slice(0, idx);
1372
+ server.env[key] = sanitizeInstallEnvValue(key, pair.slice(idx + 1));
1373
+ }
1374
+ }
1375
+ }
1376
+ else {
1377
+ for (const [key, value] of Object.entries(options.env)) {
1378
+ server.env[key] = sanitizeInstallEnvValue(key, value);
1379
+ }
1380
+ }
1381
+ }
1382
+ if (Number.isFinite(options.startupTimeoutSec) && options.startupTimeoutSec && options.startupTimeoutSec > 0) {
1383
+ server.startup_timeout_sec = Math.trunc(options.startupTimeoutSec);
1384
+ }
1385
+ return server;
1386
+ }
1387
+ function sanitizeInstallEnvValue(key, value) {
1388
+ if (!isSecretEnvName(key))
1389
+ return value;
1390
+ const trimmed = value.trim();
1391
+ if (/^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/.test(trimmed))
1392
+ return trimmed;
1393
+ return `\${${key}}`;
1394
+ }
1395
+ function sanitizeMcpServerForProject(server) {
1396
+ const cleaned = JSON.parse(JSON.stringify(server));
1397
+ if (typeof cleaned.url === "string") {
1398
+ cleaned.url = sanitizeMcpUrlForDisplay(cleaned.url);
1399
+ }
1400
+ if (typeof cleaned.command === "string") {
1401
+ cleaned.command = maskSensitiveText(cleaned.command);
1402
+ }
1403
+ if (Array.isArray(cleaned.args)) {
1404
+ cleaned.args = sanitizeMcpArgsForProject(cleaned.args);
1405
+ }
1406
+ if (cleaned.env && typeof cleaned.env === "object") {
1407
+ const env = {};
1408
+ for (const [key, value] of Object.entries(cleaned.env)) {
1409
+ env[key] = isSecretEnvName(key) ? `\${${key}}` : value;
1410
+ }
1411
+ cleaned.env = env;
1412
+ }
1413
+ if (cleaned.headers && typeof cleaned.headers === "object") {
1414
+ const headers = {};
1415
+ for (const [key, value] of Object.entries(cleaned.headers)) {
1416
+ headers[key] = isSecretHeaderName(key) ? "[REDACTED]" : value;
1417
+ }
1418
+ cleaned.headers = headers;
1419
+ }
1420
+ if (cleaned.http_headers && typeof cleaned.http_headers === "object") {
1421
+ const headers = {};
1422
+ for (const [key, value] of Object.entries(cleaned.http_headers)) {
1423
+ headers[key] = isSecretHeaderName(key) ? "[REDACTED]" : value;
1424
+ }
1425
+ cleaned.http_headers = headers;
1426
+ }
1427
+ const nestedConfig = cleaned.config;
1428
+ if (nestedConfig && typeof nestedConfig === "object" && !Array.isArray(nestedConfig)) {
1429
+ const config = nestedConfig;
1430
+ if (config.env && typeof config.env === "object" && !Array.isArray(config.env)) {
1431
+ const env = {};
1432
+ for (const [key, value] of Object.entries(config.env)) {
1433
+ env[key] = isSecretEnvName(key) ? `\${${key}}` : value;
1434
+ }
1435
+ config.env = env;
1436
+ }
1437
+ }
1438
+ return cleaned;
1439
+ }
1440
+ function sanitizeMcpArgsForProject(args) {
1441
+ return args.map((arg, index) => {
1442
+ if (typeof arg !== "string")
1443
+ return arg;
1444
+ const previous = index > 0 ? args[index - 1] : "";
1445
+ if (typeof previous === "string" && isSplitSecretCliOption(previous))
1446
+ return "[REDACTED]";
1447
+ if (isSecretCliOption(arg)) {
1448
+ const eq = arg.indexOf("=");
1449
+ return eq > 0 ? `${arg.slice(0, eq + 1)}[REDACTED]` : arg;
1450
+ }
1451
+ return maskSensitiveText(arg);
1452
+ });
1453
+ }
1454
+ function isSplitSecretCliOption(value) {
1455
+ return value.indexOf("=") === -1 && isSecretCliOption(value);
1456
+ }
1457
+ function isSecretCliOption(value) {
1458
+ return /^--?(?:api[-_]?key|api[-_]?token|token|key|secret|password|passwd|client[-_]?secret|x[-_]?auth[-_]?token|auth|authorization|credential|cookie|session|jwt|private[-_]?key)(?:=.*)?$/i.test(value);
1459
+ }
1460
+ function isRailwayInstallPreset(name, command, args, options) {
1461
+ return name.toLowerCase() === "railway"
1462
+ && command === "railway"
1463
+ && args.length === 0
1464
+ && (!options.env || options.env.length === 0);
1465
+ }
1466
+ function isHttpUrl(value) {
1467
+ return /^https?:\/\//i.test(value);
1468
+ }
1469
+ export async function mcpBulkInstallCommand(entries) {
1470
+ const root = getProjectRoot();
1471
+ const projectMcpPath = join(root, ".kimi", "mcp.json");
1472
+ const projectMcpSource = await loadConfig(projectMcpPath);
1473
+ const projectMcpServers = projectMcpSource.parsed && projectMcpSource.config.mcpServers
1474
+ ? { ...projectMcpSource.config.mcpServers }
1475
+ : {};
1476
+ const results = { installed: [], failed: [], skipped: [] };
1477
+ await Promise.all(entries.map(async (entry) => {
1478
+ try {
1479
+ if (entry.name in projectMcpServers) {
1480
+ results.skipped.push(entry.name);
1481
+ return;
1482
+ }
1483
+ const server = sanitizeMcpServerForProject(createInstallServer(entry.name, entry.command, entry.args, {
1484
+ env: entry.env,
1485
+ startupTimeoutSec: entry.startupTimeoutSec,
1486
+ }));
1487
+ projectMcpServers[entry.name] = server;
1488
+ results.installed.push(entry.name);
1489
+ }
1490
+ catch (err) {
1491
+ const message = err instanceof Error ? err.message : String(err);
1492
+ results.failed.push({ name: entry.name, error: message });
1493
+ }
1494
+ }));
1495
+ if (results.installed.length > 0 || results.skipped.length > 0) {
1496
+ await mkdir(join(root, ".kimi"), { recursive: true });
1497
+ await writeFile(projectMcpPath, JSON.stringify({ mcpServers: projectMcpServers }, null, 2) + "\n", "utf-8");
1498
+ }
1499
+ return results;
1500
+ }
1501
+ export async function mcpSyncGlobalCommand(options) {
1502
+ const root = getProjectRoot();
1503
+ const globalPath = join(getUserHome(), ".kimi", "mcp.json");
1504
+ const targetPath = options.omk ? join(root, ".omk", "mcp.json") : join(root, ".kimi", "mcp.json");
1505
+ const globalSource = await loadConfig(globalPath);
1506
+ if (!globalSource.parsed || !globalSource.config.mcpServers) {
1507
+ console.log(status.error(`No global MCP config found at ${globalPath}`));
1508
+ process.exit(1);
1509
+ }
1510
+ const targetSource = await loadConfig(targetPath);
1511
+ const targetServers = targetSource.parsed && targetSource.config.mcpServers ? targetSource.config.mcpServers : {};
1512
+ let imported = 0;
1513
+ let skipped = 0;
1514
+ const merged = options.overwrite ? {} : { ...targetServers };
1515
+ for (const [name, server] of Object.entries(globalSource.config.mcpServers)) {
1516
+ if (name === "omk-project") {
1517
+ skipped++;
1518
+ continue;
1519
+ }
1520
+ if (!options.overwrite && name in merged) {
1521
+ skipped++;
1522
+ continue;
1523
+ }
1524
+ merged[name] = sanitizeMcpServerForProject(server);
1525
+ imported++;
1526
+ }
1527
+ const output = { mcpServers: merged };
1528
+ await writeFile(targetPath, JSON.stringify(output, null, 2) + "\n", "utf-8");
1529
+ console.log(header("MCP Sync Global"));
1530
+ console.log(status.ok(`Imported ${imported} global MCP server(s)`));
1531
+ if (skipped > 0) {
1532
+ console.log(style.gray(`Skipped ${skipped} (omk-project or existing local)`));
1533
+ }
1534
+ console.log(label("Written to", targetPath));
1535
+ }
1536
+ export async function mcpMigrateCommand(options = {}) {
1537
+ const root = getProjectRoot();
1538
+ const globalPath = join(getUserHome(), ".kimi", "mcp.json");
1539
+ const projectPath = join(root, ".kimi", "mcp.json");
1540
+ const omkPath = join(root, ".omk", "mcp.json");
1541
+ const configs = [];
1542
+ if (options.global) {
1543
+ configs.push({ path: globalPath, label: "global" });
1544
+ }
1545
+ else {
1546
+ configs.push({ path: projectPath, label: "project" });
1547
+ if (await pathExists(omkPath)) {
1548
+ configs.push({ path: omkPath, label: "project-omk" });
1549
+ }
1550
+ }
1551
+ let totalFixed = 0;
1552
+ const fixedServers = [];
1553
+ for (const { path: configPath } of configs) {
1554
+ const source = await loadConfig(configPath);
1555
+ if (!source.parsed || !source.config.mcpServers)
1556
+ continue;
1557
+ const servers = source.config.mcpServers;
1558
+ let changed = false;
1559
+ for (const [name, server] of Object.entries(servers)) {
1560
+ const args = server.args ?? [];
1561
+ for (let i = 0; i < args.length; i++) {
1562
+ const arg = args[i];
1563
+ if (typeof arg !== "string")
1564
+ continue;
1565
+ for (const [stale, current] of Object.entries(STALE_PACKAGE_NAMES)) {
1566
+ if (arg.includes(stale)) {
1567
+ const newArg = arg.replace(stale, current);
1568
+ if (!options.dryRun) {
1569
+ args[i] = newArg;
1570
+ changed = true;
1571
+ }
1572
+ totalFixed++;
1573
+ fixedServers.push({ name, file: configPath, from: stale, to: current });
1574
+ }
1575
+ }
1576
+ }
1577
+ }
1578
+ if (changed) {
1579
+ await writeFile(configPath, JSON.stringify(source.config, null, 2) + "\n", "utf-8");
1580
+ }
1581
+ }
1582
+ console.log(header("MCP Migrate"));
1583
+ if (totalFixed === 0) {
1584
+ console.log(status.ok("No stale package names found"));
1585
+ }
1586
+ else {
1587
+ if (options.dryRun) {
1588
+ console.log(style.skin(`${totalFixed} stale package reference(s) would be fixed:`));
1589
+ }
1590
+ else {
1591
+ console.log(status.ok(`Fixed ${totalFixed} stale package reference(s):`));
1592
+ }
1593
+ for (const entry of fixedServers) {
1594
+ console.log(` ${label(entry.name, `${entry.from} → ${entry.to}`)} (${entry.file})`);
1595
+ }
1596
+ }
1597
+ }
1598
+ function isSecretEnvName(name) {
1599
+ return /(?:SECRET|TOKEN|KEY|PASSWORD|PASSWD|CREDENTIAL|AUTH|COOKIE|SESSION|PRIVATE|DATABASE_URL|DATABASE_URI|CONNECTION_STRING|CONNECTION_URI|MONGO(?:DB)?_URI|REDIS_URL|POSTGRES(?:QL)?_URL|MYSQL_URL|DSN|PAT|JWT|BEARER|OAUTH)/i.test(name);
1600
+ }
1601
+ function isSecretHeaderName(name) {
1602
+ return /authorization|x-api-key|api-key|cookie|set-cookie|x-auth-token|token|secret|signature/i.test(name);
1603
+ }