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,1757 @@
1
+ import { mkdir, writeFile, readFile, access, chmod, constants, readdir, stat, symlink, rm, unlink, lstat, copyFile, realpath, } from "fs/promises";
2
+ import { rmSync } from "fs";
3
+ import { dirname, extname, isAbsolute, join, relative, resolve } from "path";
4
+ import { homedir } from "os";
5
+ import { execa } from "execa";
6
+ import { GLOBAL_MEMORY_CONFIG_TOML, getGlobalMemoryConfigPath } from "../memory/memory-config.js";
7
+ import { sha256, simpleDiff } from "./sync-manifest.js";
8
+ import { getOmkResourceSettings } from "./resource-profile.js";
9
+ import { resolveRuntimeProfile, buildProfileArgs } from "./runtime-profile.js";
10
+ import { getProjectRoot as resolveProjectRootSync, getProjectRootAsync as resolveProjectRootAsyncPath, getProjectRootDiagnostics, resolveProjectRoot, resolveProjectRootAsync, displayProjectRootPath, } from "./project-root.js";
11
+ export { getProjectRootDiagnostics, resolveProjectRoot, resolveProjectRootAsync, displayProjectRootPath, };
12
+ export async function ensureDir(path) {
13
+ await mkdir(path, { recursive: true });
14
+ }
15
+ export async function writeFileSafe(path, content) {
16
+ await ensureDir(dirname(path));
17
+ await writeFile(path, content, "utf-8");
18
+ }
19
+ export async function pathExists(path) {
20
+ try {
21
+ await access(path, constants.F_OK);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ function isGlobalWriteAllowed() {
29
+ return /^(?:1|true|yes|on)$/i.test(process.env.OMK_MCP_ALLOW_WRITE_CONFIG ?? "");
30
+ }
31
+ function shouldRewriteMcpArgPath(server, arg, index) {
32
+ if (typeof arg !== "string")
33
+ return false;
34
+ if (arg.startsWith("/") || arg.startsWith("http") || arg.startsWith("-"))
35
+ return false;
36
+ if (isShellInlineMcpArg(server, index))
37
+ return false;
38
+ if (/[\s;"'|&<>]/.test(arg))
39
+ return false;
40
+ if (isPackageManagerMcpServer(server) && isNpmPackageSpecifierArg(arg))
41
+ return false;
42
+ return isExplicitRelativeMcpPathArg(arg, server, index);
43
+ }
44
+ function isShellInlineMcpArg(server, index) {
45
+ const command = typeof server.command === "string" ? server.command : "";
46
+ const commandName = command.replace(/\\/g, "/").split("/").pop()?.toLowerCase() ?? command.toLowerCase();
47
+ if (!["bash", "sh", "zsh", "fish", "pwsh", "powershell", "cmd", "cmd.exe"].includes(commandName)) {
48
+ return false;
49
+ }
50
+ const args = Array.isArray(server.args) ? server.args : [];
51
+ const previous = args[index - 1];
52
+ return previous === "-c" || previous === "-lc" || previous === "/c" || previous === "--command";
53
+ }
54
+ function isPackageManagerMcpServer(server) {
55
+ const command = typeof server.command === "string" ? server.command : "";
56
+ const commandName = command.replace(/\\/g, "/").split("/").pop()?.toLowerCase() ?? command.toLowerCase();
57
+ return PACKAGE_MANAGER_COMMANDS.has(commandName);
58
+ }
59
+ function isNpmPackageSpecifierArg(arg) {
60
+ if (arg.startsWith(".") || arg.startsWith("/") || arg.includes("\\") || arg.includes(":"))
61
+ return false;
62
+ return /^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+(?:@[a-z0-9._~+-]+)?$/i.test(arg);
63
+ }
64
+ function isExplicitRelativeMcpPathArg(arg, server, index) {
65
+ const args = Array.isArray(server.args) ? server.args : [];
66
+ const previous = args[index - 1];
67
+ if (typeof previous === "string" && /^(?:--?(?:config|file|path|root|dir|directory|cwd|database|db|schema|mount|workspace)|--(?:config|file|path|root|dir|directory|cwd|database|db|schema|mount|workspace)=)$/i.test(previous)) {
68
+ return true;
69
+ }
70
+ if (arg.startsWith("./") || arg.startsWith("../"))
71
+ return true;
72
+ if (arg.includes("/") || arg.includes("\\"))
73
+ return true;
74
+ return /\.(?:[cm]?[jt]s|json|toml|ya?ml|py|sh|db|sqlite3?|wasm|bin)$/i.test(arg);
75
+ }
76
+ export function getManifestPath() {
77
+ return getOmkPath("sync-manifest.json");
78
+ }
79
+ export function getBackupDir(timestamp) {
80
+ return getOmkPath(join("sync-backups", sanitizeBackupTimestamp(timestamp)));
81
+ }
82
+ function sanitizeBackupTimestamp(timestamp) {
83
+ const sanitized = timestamp.replace(/[^a-zA-Z0-9._-]/g, "-").replace(/-+/g, "-");
84
+ return sanitized.replace(/^-|-$/g, "") || "backup";
85
+ }
86
+ export async function readManifest() {
87
+ const path = getManifestPath();
88
+ if (!(await pathExists(path)))
89
+ return [];
90
+ try {
91
+ const content = await readFile(path, "utf-8");
92
+ const parsed = JSON.parse(content);
93
+ if (Array.isArray(parsed))
94
+ return parsed;
95
+ }
96
+ catch {
97
+ // ignore invalid manifest
98
+ }
99
+ return [];
100
+ }
101
+ export async function writeManifest(entries) {
102
+ const path = getManifestPath();
103
+ await ensureDir(dirname(path));
104
+ await writeFile(path, JSON.stringify(entries, null, 2) + "\n", "utf-8");
105
+ }
106
+ export async function backupFile(sourcePath, backupDir, relativePath) {
107
+ const dest = join(backupDir, relativePath);
108
+ await ensureDir(dirname(dest));
109
+ await copyFile(sourcePath, dest);
110
+ return dest;
111
+ }
112
+ export async function isDirectory(path) {
113
+ try {
114
+ await readdir(path);
115
+ return true;
116
+ }
117
+ catch {
118
+ return false;
119
+ }
120
+ }
121
+ export async function readTextFile(path, defaultValue = "") {
122
+ try {
123
+ return await readFile(path, "utf-8");
124
+ }
125
+ catch {
126
+ return defaultValue;
127
+ }
128
+ }
129
+ export function getProjectRoot() {
130
+ return resolveProjectRootSync();
131
+ }
132
+ export async function getProjectRootAsync() {
133
+ return resolveProjectRootAsyncPath();
134
+ }
135
+ export function getUserHome(env = process.env) {
136
+ return (normalizeUserHomePath(env.OMK_ORIGINAL_HOME)
137
+ ?? normalizeUserHomePath(env.HOME)
138
+ ?? normalizeUserHomePath(env.USERPROFILE)
139
+ ?? normalizeUserHomePath(homedir())
140
+ ?? homedir());
141
+ }
142
+ export function normalizeUserHomePath(value) {
143
+ if (value === undefined)
144
+ return undefined;
145
+ const trimmed = stripWrappingQuotes(value.trim());
146
+ if (!trimmed)
147
+ return undefined;
148
+ const wslPath = normalizeWslUncPath(trimmed);
149
+ return stripKimiConfigSuffix(wslPath ?? trimmed);
150
+ }
151
+ function stripWrappingQuotes(value) {
152
+ if (value.length < 2)
153
+ return value;
154
+ const first = value[0];
155
+ const last = value[value.length - 1];
156
+ if ((first === "\"" && last === "\"") || (first === "'" && last === "'")) {
157
+ return value.slice(1, -1);
158
+ }
159
+ return value;
160
+ }
161
+ function normalizeWslUncPath(value) {
162
+ const slashPath = value.replace(/\\/g, "/");
163
+ const match = slashPath.match(/^\/\/wsl(?:\.localhost|\$)\/[^/]+(?:\/(.*))?$/i);
164
+ if (!match)
165
+ return undefined;
166
+ const distroRelative = match[1] ?? "";
167
+ return `/${distroRelative}`.replace(/\/+/g, "/");
168
+ }
169
+ function stripKimiConfigSuffix(value) {
170
+ const slashPath = value.replace(/\\/g, "/");
171
+ const lower = slashPath.toLowerCase();
172
+ for (const suffix of ["/.kimi/mcp.json", "/.kimi/config.toml", "/.kimi/skills"]) {
173
+ if (lower.endsWith(suffix)) {
174
+ return value.slice(0, value.length - suffix.length);
175
+ }
176
+ }
177
+ if (lower.endsWith("/.kimi")) {
178
+ return value.slice(0, value.length - "/.kimi".length);
179
+ }
180
+ return value;
181
+ }
182
+ export function getOmkPath(subPath) {
183
+ const root = getProjectRoot();
184
+ return subPath ? join(root, ".omk", subPath) : join(root, ".omk");
185
+ }
186
+ export { validateRunId, sanitizeRunId, validateRunArtifactPath, getRunsDir, getRunPath, getRunArtifactPath, listValidRunIds, } from "./run-store.js";
187
+ export function getKimiConfigPath() {
188
+ return join(getUserHome(), ".kimi", "config.toml");
189
+ }
190
+ const OMK_START_MARKER = "# >>> omk managed hooks — do not edit manually";
191
+ const OMK_END_MARKER = "# >>> end omk managed hooks";
192
+ /**
193
+ * .omk/kimi.config.toml 의 hooks 를 ~/.kimi/config.toml 에 병합.
194
+ * 상대 경로를 절대 경로로 변환하여 어디서 실행돼도 작동하도록 함.
195
+ */
196
+ export async function mergeKimiHooks(omkConfigPath, options = {}) {
197
+ const manifest = options.manifest ?? [];
198
+ const timestamp = options.timestamp ?? new Date().toISOString();
199
+ const kimiConfigPath = getKimiConfigPath();
200
+ const omkContent = await readTextFile(omkConfigPath, "");
201
+ if (!omkContent.trim())
202
+ return false;
203
+ const root = await getProjectRootAsync();
204
+ const resolvedContent = resolveHookPaths(omkContent, root);
205
+ const hooksContent = extractHooksBlocks(resolvedContent);
206
+ if (!hooksContent)
207
+ return false;
208
+ let kimiContent = await readTextFile(kimiConfigPath, "");
209
+ const previousContent = kimiContent;
210
+ // 기존 omk 섹션 제거
211
+ const startIdx = kimiContent.indexOf(OMK_START_MARKER);
212
+ if (startIdx !== -1) {
213
+ const endIdx = kimiContent.indexOf(OMK_END_MARKER, startIdx);
214
+ if (endIdx !== -1) {
215
+ const before = kimiContent.slice(0, startIdx).trimEnd();
216
+ const after = kimiContent.slice(endIdx + OMK_END_MARKER.length).trimStart();
217
+ kimiContent = before + (before && after ? "\n\n" : before ? "\n" : "") + after;
218
+ }
219
+ }
220
+ const omkSection = `${OMK_START_MARKER}\n${hooksContent}\n${OMK_END_MARKER}\n`;
221
+ if (!kimiContent.trim()) {
222
+ kimiContent = omkSection;
223
+ }
224
+ else {
225
+ kimiContent = kimiContent.trimEnd() + "\n\n" + omkSection;
226
+ }
227
+ if (previousContent === kimiContent)
228
+ return false;
229
+ if (!isGlobalWriteAllowed()) {
230
+ if (!options.quiet) {
231
+ console.warn(`⚠️ Skipping global write to ${kimiConfigPath} (set OMK_MCP_ALLOW_WRITE_CONFIG=1 to allow)`);
232
+ }
233
+ manifest.push({
234
+ path: kimiConfigPath,
235
+ scope: "global",
236
+ action: "blocked",
237
+ previousHash: previousContent.trim() ? sha256(previousContent) : null,
238
+ newHash: sha256(kimiContent),
239
+ backupPath: null,
240
+ timestamp,
241
+ });
242
+ return true;
243
+ }
244
+ if (options.diff && previousContent.trim()) {
245
+ console.log(`--- ${kimiConfigPath}`);
246
+ console.log(`+++ ${kimiConfigPath}`);
247
+ console.log(simpleDiff(previousContent, kimiContent));
248
+ }
249
+ if (!options.dryRun) {
250
+ let backupPath = null;
251
+ if (await pathExists(kimiConfigPath)) {
252
+ const backupDir = getBackupDir(timestamp);
253
+ backupPath = await backupFile(kimiConfigPath, backupDir, relative(getUserHome(), kimiConfigPath));
254
+ }
255
+ await writeFileSafe(kimiConfigPath, kimiContent);
256
+ manifest.push({
257
+ path: kimiConfigPath,
258
+ scope: "global",
259
+ action: previousContent.trim() ? "update" : "create",
260
+ previousHash: previousContent.trim() ? sha256(previousContent) : null,
261
+ newHash: sha256(kimiContent),
262
+ backupPath,
263
+ timestamp,
264
+ });
265
+ }
266
+ else {
267
+ manifest.push({
268
+ path: kimiConfigPath,
269
+ scope: "global",
270
+ action: previousContent.trim() ? "update" : "create",
271
+ previousHash: previousContent.trim() ? sha256(previousContent) : null,
272
+ newHash: sha256(kimiContent),
273
+ backupPath: null,
274
+ timestamp,
275
+ });
276
+ }
277
+ return true;
278
+ }
279
+ function resolveHookPaths(content, root) {
280
+ return content.replace(/command\s*=\s*["'](\.omk\/hooks\/[^"']+)["']/g, (_match, p1) => {
281
+ const absPath = join(root, p1).replace(/\\/g, "/");
282
+ return `command = "${absPath}"`;
283
+ });
284
+ }
285
+ export function extractHooksBlocks(content) {
286
+ const lines = content.split("\n");
287
+ const result = [];
288
+ let foundHooks = false;
289
+ for (const line of lines) {
290
+ if (line.trim().startsWith("[[hooks]]"))
291
+ foundHooks = true;
292
+ if (foundHooks)
293
+ result.push(line);
294
+ }
295
+ return result.join("\n").trim();
296
+ }
297
+ /* ──────────────────────────────────────────────
298
+ * Global sync: .kimi/ → ~/.kimi/
299
+ * ────────────────────────────────────────────── */
300
+ /** 프로젝트의 .omk/mcp.json + .kimi/mcp.json → ~/.kimi/mcp.json 병합 */
301
+ export async function syncKimiMcpGlobal(options = {}) {
302
+ const manifest = options.manifest ?? [];
303
+ const timestamp = options.timestamp ?? new Date().toISOString();
304
+ const globalMcpPath = join(getUserHome(), ".kimi", "mcp.json");
305
+ const root = await getProjectRootAsync();
306
+ const projectConfigs = [join(root, ".omk", "mcp.json"), join(root, ".kimi", "mcp.json")];
307
+ const mergedServers = {};
308
+ let hasAny = false;
309
+ for (const p of projectConfigs) {
310
+ if (!(await pathExists(p)))
311
+ continue;
312
+ try {
313
+ const content = await readTextFile(p, "{}");
314
+ const parsed = JSON.parse(content);
315
+ if (parsed.mcpServers && typeof parsed.mcpServers === "object") {
316
+ const root = await getProjectRootAsync();
317
+ for (const [name, server] of Object.entries(parsed.mcpServers)) {
318
+ const s = server;
319
+ // args의 상대 경로를 MCP 설정 파일 기준 절대 경로로 변환.
320
+ // Shell snippets such as `set -a; source ...; exec npx ...` must
321
+ // remain untouched or MCP configs become broken Windows/WSL paths.
322
+ if (Array.isArray(s.args)) {
323
+ s.args = s.args.map((arg, index) => {
324
+ if (shouldRewriteMcpArgPath(s, arg, index)) {
325
+ return join(root, arg);
326
+ }
327
+ return arg;
328
+ });
329
+ }
330
+ mergedServers[name] = s;
331
+ }
332
+ hasAny = true;
333
+ }
334
+ }
335
+ catch {
336
+ // ignore invalid JSON
337
+ }
338
+ }
339
+ if (!hasAny)
340
+ return false;
341
+ // 기존 글로벌 mcp.json 읽기
342
+ let globalParsed = {};
343
+ let previousContent = "";
344
+ if (await pathExists(globalMcpPath)) {
345
+ try {
346
+ previousContent = await readTextFile(globalMcpPath, "{}");
347
+ globalParsed = JSON.parse(previousContent);
348
+ }
349
+ catch {
350
+ // ignore
351
+ }
352
+ }
353
+ // 병합: 글로벌 먼저, 프로젝트가 같은 키 덮어씀
354
+ const finalServers = { ...(globalParsed.mcpServers ?? {}), ...mergedServers };
355
+ const newContent = JSON.stringify({ mcpServers: finalServers }, null, 2) + "\n";
356
+ if (previousContent === newContent)
357
+ return false;
358
+ if (!isGlobalWriteAllowed()) {
359
+ if (!options.quiet) {
360
+ console.warn(`⚠️ Skipping global write to ${globalMcpPath} (set OMK_MCP_ALLOW_WRITE_CONFIG=1 to allow)`);
361
+ }
362
+ manifest.push({
363
+ path: globalMcpPath,
364
+ scope: "global",
365
+ action: "blocked",
366
+ previousHash: previousContent ? sha256(previousContent) : null,
367
+ newHash: sha256(newContent),
368
+ backupPath: null,
369
+ timestamp,
370
+ });
371
+ return true;
372
+ }
373
+ if (options.diff && previousContent) {
374
+ console.log(`--- ${globalMcpPath}`);
375
+ console.log(`+++ ${globalMcpPath}`);
376
+ console.log(simpleDiff(previousContent, newContent));
377
+ }
378
+ if (!options.dryRun) {
379
+ let backupPath = null;
380
+ if (await pathExists(globalMcpPath)) {
381
+ const backupDir = getBackupDir(timestamp);
382
+ backupPath = await backupFile(globalMcpPath, backupDir, relative(getUserHome(), globalMcpPath));
383
+ }
384
+ await writeFileSafe(globalMcpPath, newContent);
385
+ manifest.push({
386
+ path: globalMcpPath,
387
+ scope: "global",
388
+ action: previousContent ? "update" : "create",
389
+ previousHash: previousContent ? sha256(previousContent) : null,
390
+ newHash: sha256(newContent),
391
+ backupPath,
392
+ timestamp,
393
+ });
394
+ }
395
+ else {
396
+ manifest.push({
397
+ path: globalMcpPath,
398
+ scope: "global",
399
+ action: previousContent ? "update" : "create",
400
+ previousHash: previousContent ? sha256(previousContent) : null,
401
+ newHash: sha256(newContent),
402
+ backupPath: null,
403
+ timestamp,
404
+ });
405
+ }
406
+ return true;
407
+ }
408
+ /** 프로젝트의 .kimi/skills/* → ~/.kimi/skills/ 심링크 */
409
+ export async function syncKimiSkillsGlobal(options = {}) {
410
+ const root = await getProjectRootAsync();
411
+ const projectSkillsDir = join(root, ".kimi", "skills");
412
+ const globalSkillsDir = join(getUserHome(), ".kimi", "skills");
413
+ if (!(await pathExists(projectSkillsDir)))
414
+ return false;
415
+ const entries = await readdir(projectSkillsDir, { withFileTypes: true });
416
+ const skillDirs = entries.filter((e) => e.isDirectory());
417
+ if (skillDirs.length === 0)
418
+ return false;
419
+ if (options.dryRun) {
420
+ for (const dir of skillDirs) {
421
+ options.manifest?.push({
422
+ path: join(globalSkillsDir, dir.name),
423
+ scope: "global",
424
+ action: "symlink",
425
+ previousHash: null,
426
+ newHash: null,
427
+ backupPath: null,
428
+ timestamp: options.timestamp ?? new Date().toISOString(),
429
+ });
430
+ }
431
+ return true;
432
+ }
433
+ if (!isGlobalWriteAllowed()) {
434
+ if (!options.quiet) {
435
+ console.warn(`⚠️ Skipping global skills sync to ${globalSkillsDir} (set OMK_MCP_ALLOW_WRITE_CONFIG=1 to allow)`);
436
+ }
437
+ for (const dir of skillDirs) {
438
+ options.manifest?.push({
439
+ path: join(globalSkillsDir, dir.name),
440
+ scope: "global",
441
+ action: "blocked",
442
+ previousHash: null,
443
+ newHash: null,
444
+ backupPath: null,
445
+ timestamp: options.timestamp ?? new Date().toISOString(),
446
+ });
447
+ }
448
+ return true;
449
+ }
450
+ await ensureDir(globalSkillsDir);
451
+ // 깨진 심링크 정리
452
+ try {
453
+ const globalEntries = await readdir(globalSkillsDir, { withFileTypes: true });
454
+ for (const e of globalEntries) {
455
+ if (!e.isSymbolicLink())
456
+ continue;
457
+ const linkPath = join(globalSkillsDir, e.name);
458
+ try {
459
+ await access(linkPath, constants.F_OK);
460
+ }
461
+ catch {
462
+ await unlink(linkPath);
463
+ }
464
+ }
465
+ }
466
+ catch {
467
+ // ignore
468
+ }
469
+ for (const dir of skillDirs) {
470
+ const src = resolve(join(projectSkillsDir, dir.name));
471
+ const dest = join(globalSkillsDir, dir.name);
472
+ // 사용자가 직접 설치한 폴더(심링크 아님)는 건드리지 않음
473
+ try {
474
+ const destStat = await lstat(dest);
475
+ if (!destStat.isSymbolicLink())
476
+ continue;
477
+ await unlink(dest);
478
+ }
479
+ catch {
480
+ // dest 없음 → OK
481
+ }
482
+ try {
483
+ await symlink(src, dest, "dir");
484
+ }
485
+ catch {
486
+ // 심링크 실패 시 복사 fallback — dest 가 실제 사용자 디렉토리가 아닌지 재확인
487
+ try {
488
+ const st = await lstat(dest);
489
+ if (!st.isSymbolicLink())
490
+ continue; // 사용자 데이터 보호
491
+ await rm(dest, { recursive: true, force: true });
492
+ }
493
+ catch {
494
+ // dest 없음 → 복사만 진행
495
+ }
496
+ await copyDir(src, dest);
497
+ }
498
+ }
499
+ return true;
500
+ }
501
+ async function copyDir(src, dest) {
502
+ await ensureDir(dest);
503
+ const entries = await readdir(src, { withFileTypes: true });
504
+ for (const entry of entries) {
505
+ const srcPath = join(src, entry.name);
506
+ const destPath = join(dest, entry.name);
507
+ if (entry.isDirectory()) {
508
+ await copyDir(srcPath, destPath);
509
+ }
510
+ else {
511
+ await copyFile(srcPath, destPath);
512
+ }
513
+ }
514
+ }
515
+ /** local graph memory policy를 ~/.kimi/omk.memory.toml 에 동기화 */
516
+ export async function syncKimiMemoryGlobal(options = {}) {
517
+ const manifest = options.manifest ?? [];
518
+ const timestamp = options.timestamp ?? new Date().toISOString();
519
+ const memoryPath = getGlobalMemoryConfigPath();
520
+ const previousContent = await readTextFile(memoryPath, "");
521
+ const newContent = GLOBAL_MEMORY_CONFIG_TOML;
522
+ if (previousContent === newContent)
523
+ return false;
524
+ if (!isGlobalWriteAllowed()) {
525
+ if (!options.quiet) {
526
+ console.warn(`⚠️ Skipping global write to ${memoryPath} (set OMK_MCP_ALLOW_WRITE_CONFIG=1 to allow)`);
527
+ }
528
+ manifest.push({
529
+ path: memoryPath,
530
+ scope: "global",
531
+ action: "blocked",
532
+ previousHash: previousContent.trim() ? sha256(previousContent) : null,
533
+ newHash: sha256(newContent),
534
+ backupPath: null,
535
+ timestamp,
536
+ });
537
+ return true;
538
+ }
539
+ if (options.diff && previousContent.trim()) {
540
+ console.log(`--- ${memoryPath}`);
541
+ console.log(`+++ ${memoryPath}`);
542
+ console.log(simpleDiff(previousContent, newContent));
543
+ }
544
+ if (!options.dryRun) {
545
+ let backupPath = null;
546
+ if (await pathExists(memoryPath)) {
547
+ const backupDir = getBackupDir(timestamp);
548
+ backupPath = await backupFile(memoryPath, backupDir, relative(getUserHome(), memoryPath));
549
+ }
550
+ await writeFileSafe(memoryPath, newContent);
551
+ manifest.push({
552
+ path: memoryPath,
553
+ scope: "global",
554
+ action: previousContent.trim() ? "update" : "create",
555
+ previousHash: previousContent.trim() ? sha256(previousContent) : null,
556
+ newHash: sha256(newContent),
557
+ backupPath,
558
+ timestamp,
559
+ });
560
+ }
561
+ else {
562
+ manifest.push({
563
+ path: memoryPath,
564
+ scope: "global",
565
+ action: previousContent.trim() ? "update" : "create",
566
+ previousHash: previousContent.trim() ? sha256(previousContent) : null,
567
+ newHash: sha256(newContent),
568
+ backupPath: null,
569
+ timestamp,
570
+ });
571
+ }
572
+ return true;
573
+ }
574
+ /** Sync hooks + MCP + skills to ~/.kimi/ at once */
575
+ export async function syncAllKimiGlobals(options = {}) {
576
+ const manifest = options.manifest ?? [];
577
+ const steps = [];
578
+ const actions = [];
579
+ const skipped = [];
580
+ const errors = [];
581
+ async function runStep(name, fn) {
582
+ const before = manifest.length;
583
+ try {
584
+ const changed = await fn();
585
+ const stepManifest = manifest.slice(before);
586
+ const blockedEntries = stepManifest.filter((entry) => entry.action === "blocked");
587
+ const blocked = blockedEntries.length > 0;
588
+ const step = {
589
+ name,
590
+ changed: changed && !blocked,
591
+ blocked,
592
+ skipped: !changed,
593
+ manifest: stepManifest,
594
+ };
595
+ steps.push(step);
596
+ if (blocked) {
597
+ skipped.push(`${name}: global write blocked for ${blockedEntries.map((entry) => entry.path).join(", ")}`);
598
+ }
599
+ else if (changed) {
600
+ actions.push(`${name}: synced`);
601
+ }
602
+ }
603
+ catch (err) {
604
+ const message = err instanceof Error ? err.message : String(err);
605
+ if (!options.quiet) {
606
+ console.warn(`⚠️ ${name} global sync failed:`, message);
607
+ }
608
+ errors.push(`${name}: ${message}`);
609
+ steps.push({
610
+ name,
611
+ changed: false,
612
+ blocked: false,
613
+ skipped: true,
614
+ error: message,
615
+ manifest: manifest.slice(before),
616
+ });
617
+ }
618
+ }
619
+ const configFile = getOmkPath("kimi.config.toml");
620
+ if (await pathExists(configFile)) {
621
+ await runStep("hooks", () => mergeKimiHooks(configFile, { ...options, manifest }));
622
+ }
623
+ else {
624
+ steps.push({ name: "hooks", changed: false, blocked: false, skipped: true, manifest: [] });
625
+ }
626
+ await runStep("mcp", () => syncKimiMcpGlobal({ ...options, manifest }));
627
+ await runStep("skills", () => syncKimiSkillsGlobal({ ...options, manifest }));
628
+ await runStep("memory", () => syncKimiMemoryGlobal({ ...options, manifest }));
629
+ return {
630
+ changed: actions.length > 0,
631
+ blocked: steps.some((step) => step.blocked),
632
+ steps,
633
+ actions,
634
+ skipped,
635
+ errors,
636
+ manifest,
637
+ };
638
+ }
639
+ /** Canonical OMK MCP config collection with project `.kimi/mcp.json` compatibility. */
640
+ export async function collectMcpConfigs(scope = "project") {
641
+ const configs = [];
642
+ if (scope === "none")
643
+ return configs;
644
+ const root = await getProjectRootAsync();
645
+ const home = getUserHome();
646
+ const projectOmkMcp = join(root, ".omk", "mcp.json");
647
+ const projectKimiMcp = join(root, ".kimi", "mcp.json");
648
+ const globalOmkMcp = join(home, ".omk", "mcp.json");
649
+ const globalKimiMcp = join(home, ".kimi", "mcp.json");
650
+ // Precedence is left-to-right with later files winning during runtime merge:
651
+ // global first, project second. Project `.kimi/mcp.json` is the active
652
+ // compatibility surface; `.omk/mcp.json` is used only as a project fallback
653
+ // when the `.kimi` companion does not exist.
654
+ if (scope === "all") {
655
+ for (const candidate of [globalOmkMcp, globalKimiMcp]) {
656
+ if (await pathExists(candidate))
657
+ configs.push(candidate);
658
+ }
659
+ }
660
+ if (await pathExists(projectKimiMcp)) {
661
+ configs.push(projectKimiMcp);
662
+ }
663
+ else if (await pathExists(projectOmkMcp)) {
664
+ configs.push(projectOmkMcp);
665
+ }
666
+ return [...new Set(configs)];
667
+ }
668
+ async function readMcpServersForRuntime(configPath) {
669
+ try {
670
+ const content = await readFile(configPath, "utf-8");
671
+ const parsed = JSON.parse(content);
672
+ const servers = parsed.mcpServers ?? parsed.mcp_servers;
673
+ if (servers && typeof servers === "object" && !Array.isArray(servers)) {
674
+ return normalizeRuntimeMcpRelativePaths(servers, configPath);
675
+ }
676
+ }
677
+ catch {
678
+ // Existing doctor/preflight paths report invalid config details. Runtime merge
679
+ // skips unreadable files so Kimi does not receive partial/broken JSON.
680
+ }
681
+ return {};
682
+ }
683
+ function normalizeRuntimeMcpRelativePaths(servers, configPath) {
684
+ const baseDir = runtimeMcpPathBase(configPath);
685
+ return Object.fromEntries(Object.entries(servers).map(([name, server]) => [name, normalizeRuntimeMcpRelativePathServer(server, baseDir)]));
686
+ }
687
+ function runtimeMcpPathBase(configPath) {
688
+ const root = resolve(getProjectRoot());
689
+ const resolvedConfig = resolve(configPath);
690
+ const relativeToRoot = relative(root, resolvedConfig);
691
+ if (relativeToRoot === "" || (!relativeToRoot.startsWith("..") && !isAbsolute(relativeToRoot))) {
692
+ return root;
693
+ }
694
+ return dirname(resolvedConfig);
695
+ }
696
+ function normalizeRuntimeMcpRelativePathServer(server, baseDir) {
697
+ if (!isRecord(server) || typeof server.url === "string")
698
+ return server;
699
+ let changed = false;
700
+ const next = { ...server };
701
+ if (typeof next.command === "string" && isRelativeRuntimeMcpPathLike(next.command)) {
702
+ next.command = resolve(baseDir, next.command);
703
+ changed = true;
704
+ }
705
+ if (Array.isArray(next.args)) {
706
+ const args = next.args.map((arg, index) => {
707
+ if (typeof arg === "string" && isShellInlineMcpArg(server, index)) {
708
+ const normalized = normalizeRuntimeMcpInlineScript(arg, baseDir);
709
+ if (normalized.changed)
710
+ changed = true;
711
+ return normalized.script;
712
+ }
713
+ if (!shouldNormalizeRuntimeMcpRelativeArg(server, arg, index))
714
+ return arg;
715
+ changed = true;
716
+ return resolve(baseDir, arg);
717
+ });
718
+ next.args = args;
719
+ }
720
+ return changed ? next : server;
721
+ }
722
+ function isRelativeRuntimeMcpPathLike(value) {
723
+ return value.startsWith("./") || value.startsWith("../") || value.startsWith(".\\") || value.startsWith("..\\");
724
+ }
725
+ function shouldNormalizeRuntimeMcpRelativeArg(server, arg, index) {
726
+ if (typeof arg !== "string" || !isRelativeRuntimeMcpPathLike(arg))
727
+ return false;
728
+ if (isShellInlineMcpArg(server, index))
729
+ return false;
730
+ if (/[ \t\r\n;"'|&<>]/.test(arg))
731
+ return false;
732
+ return true;
733
+ }
734
+ function normalizeRuntimeMcpInlineScript(script, baseDir) {
735
+ let changed = false;
736
+ const nextScript = script.replace(/(^|[\s"'`=:(])((?:\.{1,2}[\\/])[^ \t\r\n"'`|&;<>:)]+)/g, (match, prefix, relativePath) => {
737
+ if (/[$*?[\]{}]/.test(relativePath))
738
+ return match;
739
+ const absolutePath = resolve(baseDir, relativePath);
740
+ if (/[ \t\r\n"'`]/.test(absolutePath))
741
+ return match;
742
+ changed = true;
743
+ return `${prefix}${absolutePath}`;
744
+ });
745
+ return { script: nextScript, changed };
746
+ }
747
+ const SHELL_BUILTIN_MCP_COMMANDS = new Set([
748
+ "set",
749
+ "source",
750
+ "export",
751
+ "alias",
752
+ "cd",
753
+ "copy",
754
+ "del",
755
+ "dir",
756
+ "move",
757
+ "start",
758
+ ]);
759
+ const WINDOWS_SYSTEM32_SET_RE = /(?:^|\/)mnt\/[a-z]\/windows\/system32\/set(?:\.exe)?(?:\s|$|[;&|])/i;
760
+ const POSIX_HOME_REF_RE = /\/home\/([A-Za-z0-9._-]+)(?:\/|$)/g;
761
+ const NODE_PACKAGE_MANAGER_COMMANDS = new Set([
762
+ "npm",
763
+ "npx",
764
+ "pnpm",
765
+ "yarn",
766
+ "bun",
767
+ "bunx",
768
+ "npm.cmd",
769
+ "npx.cmd",
770
+ "pnpm.cmd",
771
+ "yarn.cmd",
772
+ "bun.cmd",
773
+ "bunx.cmd",
774
+ "npm.exe",
775
+ "npx.exe",
776
+ "pnpm.exe",
777
+ "yarn.exe",
778
+ "bun.exe",
779
+ "bunx.exe",
780
+ ]);
781
+ const PYTHON_PACKAGE_MANAGER_COMMANDS = new Set([
782
+ "uv",
783
+ "uvx",
784
+ "pip",
785
+ "pip3",
786
+ "pipx",
787
+ "poetry",
788
+ "rye",
789
+ "uv.exe",
790
+ "uvx.exe",
791
+ "pip.exe",
792
+ "pip3.exe",
793
+ "pipx.exe",
794
+ "poetry.exe",
795
+ "rye.exe",
796
+ ]);
797
+ const PACKAGE_MANAGER_COMMANDS = new Set([
798
+ ...NODE_PACKAGE_MANAGER_COMMANDS,
799
+ ...PYTHON_PACKAGE_MANAGER_COMMANDS,
800
+ ]);
801
+ const PYTHON_RUNTIME_COMMANDS = new Set(["python", "python3", "py", "python.exe", "python3.exe", "py.exe"]);
802
+ const INLINE_PACKAGE_MANAGER_RE = /(?:^|[\s/])(npm|npx|pnpm|yarn|bun|bunx|uv|uvx|pip|pip3|pipx|poetry|rye)(?:\.(?:cmd|exe))?(?:\s|$)/i;
803
+ const INLINE_PYTHON_PACKAGE_MANAGER_RE = /(?:^|[\s/])(?:python(?:3)?|py)(?:\.exe)?\s+-m\s+(?:pip|pip3|uv)(?:\s|$)/i;
804
+ const STDIO_INCOMPATIBLE_HTTP_MCP_COMMANDS = new Set(["page-design-guide", "mcp-pdf-server"]);
805
+ const PDF_MCP_SERVER_RE = /(?:^|\s)(?:@modelcontextprotocol\/server-pdf|mcp-pdf-server)(?:\s|$)/i;
806
+ const EXPLICIT_STDIO_TRANSPORT_RE = /(?:^|\s)(?:--stdio|--transport(?:=|\s+)stdio)(?:\s|$)/i;
807
+ const EXPLICIT_HTTP_TRANSPORT_RE = /(?:^|\s)--transport(?:=|\s+)(?:http|sse|streamable-http)(?:\s|$)/i;
808
+ const HOST_HOME = homedir();
809
+ export const STALE_PACKAGE_NAMES = {
810
+ "@supabase/mcp-server@latest": "@supabase/mcp-server-supabase@latest",
811
+ };
812
+ const QUIET_PACKAGE_MANAGER_ENV = {
813
+ npm_config_loglevel: "error",
814
+ NPM_CONFIG_LOGLEVEL: "error",
815
+ npm_config_progress: "false",
816
+ NPM_CONFIG_PROGRESS: "false",
817
+ npm_config_audit: "false",
818
+ NPM_CONFIG_AUDIT: "false",
819
+ npm_config_fund: "false",
820
+ NPM_CONFIG_FUND: "false",
821
+ npm_config_prefer_offline: "true",
822
+ NPM_CONFIG_PREFER_OFFLINE: "true",
823
+ npm_config_fetch_retries: "0",
824
+ NPM_CONFIG_FETCH_RETRIES: "0",
825
+ npm_config_fetch_retry_mintimeout: "1000",
826
+ NPM_CONFIG_FETCH_RETRY_MINTIMEOUT: "1000",
827
+ npm_config_fetch_retry_maxtimeout: "1000",
828
+ NPM_CONFIG_FETCH_RETRY_MAXTIMEOUT: "1000",
829
+ npm_config_maxsockets: "3",
830
+ NPM_CONFIG_MAXSOCKETS: "3",
831
+ npm_config_update_notifier: "false",
832
+ NPM_CONFIG_UPDATE_NOTIFIER: "false",
833
+ NO_UPDATE_NOTIFIER: "1",
834
+ NODE_NO_WARNINGS: "1",
835
+ UV_NO_PROGRESS: "1",
836
+ PIP_DISABLE_PIP_VERSION_CHECK: "1",
837
+ PIP_NO_INPUT: "1",
838
+ PIP_NO_PYTHON_VERSION_WARNING: "1",
839
+ PIP_PROGRESS_BAR: "off",
840
+ };
841
+ function isRecord(value) {
842
+ return typeof value === "object" && value !== null && !Array.isArray(value);
843
+ }
844
+ function basenameOfRuntimeCommand(command) {
845
+ return command.replace(/\\/g, "/").split("/").pop()?.toLowerCase() ?? command.toLowerCase();
846
+ }
847
+ function isRuntimePathLike(value) {
848
+ return value.startsWith("/")
849
+ || value.startsWith("~/")
850
+ || /^[A-Za-z]:[\\/]/.test(value)
851
+ || value.startsWith("\\\\");
852
+ }
853
+ function expandRuntimeUserPath(value) {
854
+ if (value === "~")
855
+ return getUserHome();
856
+ if (value.startsWith("~/"))
857
+ return join(getUserHome(), value.slice(2));
858
+ return value;
859
+ }
860
+ function allowedRuntimeHomes() {
861
+ return [
862
+ getUserHome(),
863
+ HOST_HOME,
864
+ homedir(),
865
+ posixHomeRoot(process.execPath),
866
+ posixHomeRoot(process.argv[1]),
867
+ posixHomeRoot(getProjectRoot()),
868
+ ]
869
+ .map((home) => home.replace(/\\/g, "/").replace(/\/+$/, ""))
870
+ .filter((home, index, homes) => home.length > 0 && homes.indexOf(home) === index);
871
+ }
872
+ function posixHomeRoot(value) {
873
+ const match = value?.replace(/\\/g, "/").match(/^\/home\/[A-Za-z0-9._-]+(?:\/|$)/);
874
+ return match ? match[0].replace(/\/$/, "") : "";
875
+ }
876
+ function containsStaleHomeReference(value) {
877
+ const normalized = value.replace(/\\/g, "/");
878
+ for (const match of normalized.matchAll(POSIX_HOME_REF_RE)) {
879
+ const referencedHome = `/home/${match[1]}`;
880
+ const allowed = allowedRuntimeHomes().some((home) => {
881
+ const normalizedHome = home.replace(/\\/g, "/").replace(/\/+$/, "");
882
+ return normalizedHome === referencedHome || normalizedHome.startsWith(`${referencedHome}/`);
883
+ });
884
+ if (!allowed)
885
+ return true;
886
+ }
887
+ return false;
888
+ }
889
+ function shouldValidateRuntimeMcpArgPath(server, arg, index) {
890
+ if (typeof arg !== "string")
891
+ return false;
892
+ if (!arg || arg.startsWith("-") || arg.startsWith("$") || /^https?:\/\//i.test(arg))
893
+ return false;
894
+ if (isShellInlineMcpArg(server, index))
895
+ return false;
896
+ if (/[ \t\r\n;"'|&<>]/.test(arg))
897
+ return false;
898
+ return isRuntimePathLike(arg);
899
+ }
900
+ function runtimeShellInlineScripts(server) {
901
+ const args = Array.isArray(server.args) ? server.args : [];
902
+ return args.filter((arg, index) => typeof arg === "string" && isShellInlineMcpArg(server, index));
903
+ }
904
+ function runtimeCommandText(server) {
905
+ const command = typeof server.command === "string" ? server.command : "";
906
+ const args = Array.isArray(server.args)
907
+ ? server.args.filter((arg) => typeof arg === "string")
908
+ : [];
909
+ return [command, ...args, ...runtimeShellInlineScripts(server)].join(" ");
910
+ }
911
+ function hasExplicitStdioTransport(server) {
912
+ return EXPLICIT_STDIO_TRANSPORT_RE.test(runtimeCommandText(server));
913
+ }
914
+ function hasHttpTransportMismatch(name, server) {
915
+ if (hasExplicitStdioTransport(server))
916
+ return false;
917
+ const command = typeof server.command === "string" ? basenameOfRuntimeCommand(server.command) : "";
918
+ const targetText = runtimeCommandText(server);
919
+ if (PDF_MCP_SERVER_RE.test(targetText))
920
+ return true;
921
+ if (STDIO_INCOMPATIBLE_HTTP_MCP_COMMANDS.has(command) || STDIO_INCOMPATIBLE_HTTP_MCP_COMMANDS.has(name)) {
922
+ return true;
923
+ }
924
+ return EXPLICIT_HTTP_TRANSPORT_RE.test(targetText);
925
+ }
926
+ function findInlineScriptPaths(script) {
927
+ const paths = new Set();
928
+ const re = /(?:^|[\s"'`=:(])((?:~|\/)[^\s"'`|&;<>:]+?\.(?:cjs|mjs|js|py))(?:$|[\s"'`),;|&<>:])/gi;
929
+ for (const match of script.matchAll(re)) {
930
+ const candidate = match[1];
931
+ if (!candidate || /[*?[\]{}$]/.test(candidate))
932
+ continue;
933
+ paths.add(candidate);
934
+ }
935
+ return [...paths];
936
+ }
937
+ export async function diagnoseRuntimeMcpServer(name, server) {
938
+ const diagnostics = [];
939
+ if (!isRecord(server)) {
940
+ return [{ name, kind: "invalid-server", message: "server definition must be an object" }];
941
+ }
942
+ if (server.enabled === false) {
943
+ return [{ name, kind: "disabled-server", message: "server is disabled" }];
944
+ }
945
+ if (typeof server.url === "string" && server.url.trim()) {
946
+ return diagnostics;
947
+ }
948
+ const command = typeof server.command === "string" ? server.command.trim() : "";
949
+ if (!command) {
950
+ return [{ name, kind: "missing-command", message: "stdio server has no command" }];
951
+ }
952
+ const commandName = basenameOfRuntimeCommand(command);
953
+ if (SHELL_BUILTIN_MCP_COMMANDS.has(commandName)) {
954
+ diagnostics.push({
955
+ name,
956
+ kind: "shell-builtin-command",
957
+ message: "shell built-in was configured as the MCP command; wrap it in a shell or move values to env",
958
+ });
959
+ }
960
+ if (hasHttpTransportMismatch(name, server)) {
961
+ diagnostics.push({
962
+ name,
963
+ kind: "stdio-http-transport",
964
+ message: "stdio MCP config starts an HTTP MCP server that writes startup logs to stdout; configure it as a remote url or use stdio transport",
965
+ });
966
+ }
967
+ if (isRuntimePathLike(command)) {
968
+ const commandPath = expandRuntimeUserPath(command);
969
+ if (containsStaleHomeReference(commandPath)) {
970
+ diagnostics.push({ name, kind: "stale-home-reference", message: "MCP config references a different user home path" });
971
+ }
972
+ if (!(await pathExists(commandPath))) {
973
+ diagnostics.push({ name, kind: "command-path-not-found", message: "configured command path does not exist" });
974
+ }
975
+ }
976
+ for (const script of runtimeShellInlineScripts(server)) {
977
+ if (containsStaleHomeReference(script)) {
978
+ diagnostics.push({ name, kind: "stale-home-reference", message: "MCP config references a different user home path" });
979
+ }
980
+ if (WINDOWS_SYSTEM32_SET_RE.test(script.replace(/\\/g, "/"))) {
981
+ diagnostics.push({
982
+ name,
983
+ kind: "windows-set-inline",
984
+ message: "Windows System32 set was embedded in a shell MCP command and cannot be launched from WSL",
985
+ });
986
+ }
987
+ for (const candidate of findInlineScriptPaths(script)) {
988
+ const expanded = expandRuntimeUserPath(candidate);
989
+ if (containsStaleHomeReference(expanded)) {
990
+ diagnostics.push({ name, kind: "stale-home-reference", message: "MCP config references a different user home path" });
991
+ }
992
+ if (!(await pathExists(expanded))) {
993
+ diagnostics.push({ name, kind: "inline-script-path-not-found", message: "inline MCP script references a missing local script" });
994
+ }
995
+ }
996
+ }
997
+ const args = Array.isArray(server.args) ? server.args : [];
998
+ for (const [index, arg] of args.entries()) {
999
+ if (!shouldValidateRuntimeMcpArgPath(server, arg, index))
1000
+ continue;
1001
+ const argPath = expandRuntimeUserPath(arg);
1002
+ if (containsStaleHomeReference(argPath)) {
1003
+ diagnostics.push({ name, kind: "stale-home-reference", message: "MCP config references a different user home path" });
1004
+ }
1005
+ if (!(await pathExists(argPath))) {
1006
+ diagnostics.push({ name, kind: "arg-path-not-found", message: "MCP argument path does not exist" });
1007
+ }
1008
+ }
1009
+ // Detect known renamed/broken npm package names in MCP server args
1010
+ for (const arg of args) {
1011
+ if (typeof arg !== "string")
1012
+ continue;
1013
+ for (const [stale, current] of Object.entries(STALE_PACKAGE_NAMES)) {
1014
+ if (arg.includes(stale)) {
1015
+ diagnostics.push({
1016
+ name,
1017
+ kind: "stale-package-name",
1018
+ message: `MCP server package was renamed: ${stale} → ${current}. Run \`omk mcp migrate\` to auto-fix, or update the config manually.`,
1019
+ });
1020
+ }
1021
+ }
1022
+ }
1023
+ return diagnostics;
1024
+ }
1025
+ function isPackageManagerRuntimeServer(server) {
1026
+ const command = typeof server.command === "string" ? basenameOfRuntimeCommand(server.command) : "";
1027
+ if (PACKAGE_MANAGER_COMMANDS.has(command))
1028
+ return true;
1029
+ if (PYTHON_RUNTIME_COMMANDS.has(command)) {
1030
+ const args = Array.isArray(server.args)
1031
+ ? server.args.filter((arg) => typeof arg === "string")
1032
+ : [];
1033
+ for (let index = 0; index < args.length - 1; index += 1) {
1034
+ if (args[index] === "-m" && PYTHON_PACKAGE_MANAGER_COMMANDS.has(basenameOfRuntimeCommand(args[index + 1]))) {
1035
+ return true;
1036
+ }
1037
+ }
1038
+ }
1039
+ return runtimeShellInlineScripts(server).some((script) => {
1040
+ const normalized = script.replace(/\\/g, "/");
1041
+ return INLINE_PACKAGE_MANAGER_RE.test(normalized) || INLINE_PYTHON_PACKAGE_MANAGER_RE.test(normalized);
1042
+ });
1043
+ }
1044
+ export function resolveRuntimeMcpPreflightMode(env = process.env) {
1045
+ const raw = env.OMK_MCP_PREFLIGHT?.trim();
1046
+ if (!raw)
1047
+ return "warn-skip";
1048
+ if (raw === "strict" || raw === "warn-skip")
1049
+ return raw;
1050
+ return "off";
1051
+ }
1052
+ function resolvePreflightTimeout(env = process.env) {
1053
+ const raw = env.OMK_MCP_PREFLIGHT_TIMEOUT_MS;
1054
+ if (!raw)
1055
+ return 5000;
1056
+ const n = Number.parseInt(raw, 10);
1057
+ return Number.isFinite(n) && n > 0 ? n : 5000;
1058
+ }
1059
+ function resolvePreflightConcurrency(env = process.env) {
1060
+ const raw = env.OMK_MCP_PREFLIGHT_CONCURRENCY;
1061
+ if (!raw)
1062
+ return 3;
1063
+ const n = Number.parseInt(raw, 10);
1064
+ return Number.isFinite(n) && n > 0 ? n : 3;
1065
+ }
1066
+ export function resolveRuntimeMcpPreflightOptions(env = process.env) {
1067
+ return {
1068
+ mode: resolveRuntimeMcpPreflightMode(env),
1069
+ timeoutMs: resolvePreflightTimeout(env),
1070
+ concurrency: resolvePreflightConcurrency(env),
1071
+ };
1072
+ }
1073
+ const NPM_FAMILY_RUNTIME_COMMANDS = new Set([
1074
+ "npm",
1075
+ "npx",
1076
+ "pnpm",
1077
+ "yarn",
1078
+ "bun",
1079
+ "bunx",
1080
+ "npm.cmd",
1081
+ "npx.cmd",
1082
+ "pnpm.cmd",
1083
+ "yarn.cmd",
1084
+ "bun.cmd",
1085
+ "bunx.cmd",
1086
+ "npm.exe",
1087
+ "npx.exe",
1088
+ "pnpm.exe",
1089
+ "yarn.exe",
1090
+ "bun.exe",
1091
+ "bunx.exe",
1092
+ ]);
1093
+ const PACKAGE_ARG_OPTIONS_WITH_VALUE = new Set([
1094
+ "-p",
1095
+ "--package",
1096
+ "--package-name",
1097
+ "--registry",
1098
+ "--cache",
1099
+ "--userconfig",
1100
+ "--prefix",
1101
+ ]);
1102
+ const PACKAGE_ARG_FLAGS = new Set([
1103
+ "-y",
1104
+ "--yes",
1105
+ "--quiet",
1106
+ "--silent",
1107
+ "--no",
1108
+ "--no-install",
1109
+ "--ignore-existing",
1110
+ "--prefer-offline",
1111
+ "--offline",
1112
+ ]);
1113
+ function isRuntimePackageSpecifier(value) {
1114
+ if (!value || value.startsWith("-") || value === "--")
1115
+ return false;
1116
+ if (/^(?:https?|git\+ssh|git\+https?):/i.test(value))
1117
+ return false;
1118
+ if (value.startsWith(".") || value.startsWith("/") || value.startsWith("~") || value.includes("\\") || value.includes(":"))
1119
+ return false;
1120
+ return /^(?:@[a-z0-9._~-]+\/)?[a-z0-9._~-]+(?:@[a-z0-9._~+-]+)?$/i.test(value);
1121
+ }
1122
+ function findPackageSpecifier(args, commandName) {
1123
+ let start = 0;
1124
+ if (commandName === "npm" && ["exec", "x", "dlx"].includes(args[0] ?? ""))
1125
+ start = 1;
1126
+ if (commandName === "pnpm" && ["dlx", "exec"].includes(args[0] ?? ""))
1127
+ start = 1;
1128
+ if (commandName === "yarn" && ["dlx", "exec"].includes(args[0] ?? ""))
1129
+ start = 1;
1130
+ if (commandName === "bun" && ["x", "runx"].includes(args[0] ?? ""))
1131
+ start = 1;
1132
+ for (let i = start; i < args.length; i += 1) {
1133
+ const arg = args[i];
1134
+ if (!arg || arg === "--")
1135
+ break;
1136
+ if (arg.startsWith("--package=")) {
1137
+ const value = arg.slice("--package=".length);
1138
+ return isRuntimePackageSpecifier(value) ? value : null;
1139
+ }
1140
+ if (PACKAGE_ARG_OPTIONS_WITH_VALUE.has(arg)) {
1141
+ const value = args[i + 1];
1142
+ if (arg === "-p" || arg === "--package" || arg === "--package-name") {
1143
+ return value && isRuntimePackageSpecifier(value) ? value : null;
1144
+ }
1145
+ i += 1;
1146
+ continue;
1147
+ }
1148
+ if (PACKAGE_ARG_FLAGS.has(arg))
1149
+ continue;
1150
+ if (arg.startsWith("-"))
1151
+ continue;
1152
+ return isRuntimePackageSpecifier(arg) ? arg : null;
1153
+ }
1154
+ return null;
1155
+ }
1156
+ function runtimeNpmPreflightEnv(concurrency) {
1157
+ const maxSockets = String(Math.max(1, Math.min(16, concurrency)));
1158
+ return {
1159
+ ...QUIET_PACKAGE_MANAGER_ENV,
1160
+ npm_config_maxsockets: maxSockets,
1161
+ NPM_CONFIG_MAXSOCKETS: maxSockets,
1162
+ };
1163
+ }
1164
+ function isSafeNpmPreflightEnvKey(key) {
1165
+ const lower = key.toLowerCase();
1166
+ if (/(?:token|secret|password|passwd|credential|auth|cookie|key)/i.test(key))
1167
+ return false;
1168
+ if (["http_proxy", "https_proxy", "no_proxy"].includes(lower))
1169
+ return true;
1170
+ if (!lower.startsWith("npm_config_"))
1171
+ return false;
1172
+ const npmKey = lower.slice("npm_config_".length).replace(/-/g, "_");
1173
+ return [
1174
+ "registry",
1175
+ "proxy",
1176
+ "https_proxy",
1177
+ "http_proxy",
1178
+ "noproxy",
1179
+ "no_proxy",
1180
+ "strict_ssl",
1181
+ "cafile",
1182
+ "userconfig",
1183
+ "cache",
1184
+ ].includes(npmKey);
1185
+ }
1186
+ function runtimeNpmPreflightServerEnv(server) {
1187
+ const env = isRecord(server.env) ? server.env : {};
1188
+ const safe = {};
1189
+ for (const [key, value] of Object.entries(env)) {
1190
+ if (!isSafeNpmPreflightEnvKey(key))
1191
+ continue;
1192
+ if (typeof value === "string") {
1193
+ safe[key] = value;
1194
+ }
1195
+ }
1196
+ return safe;
1197
+ }
1198
+ function isNpmFamilyRuntimeServer(server) {
1199
+ const command = typeof server.command === "string" ? basenameOfRuntimeCommand(server.command) : "";
1200
+ return NPM_FAMILY_RUNTIME_COMMANDS.has(command);
1201
+ }
1202
+ function buildPreflightProbeCommand(server, concurrency) {
1203
+ const command = typeof server.command === "string" ? server.command : "";
1204
+ if (!command)
1205
+ return null;
1206
+ const commandName = basenameOfRuntimeCommand(command);
1207
+ if (!NPM_FAMILY_RUNTIME_COMMANDS.has(commandName))
1208
+ return null;
1209
+ if (runtimeShellInlineScripts(server).length > 0)
1210
+ return null;
1211
+ const args = Array.isArray(server.args)
1212
+ ? server.args.filter((arg) => typeof arg === "string")
1213
+ : [];
1214
+ const packageSpec = findPackageSpecifier(args, commandName);
1215
+ if (!packageSpec)
1216
+ return null;
1217
+ return {
1218
+ command: "npm",
1219
+ args: [
1220
+ "view",
1221
+ packageSpec,
1222
+ "version",
1223
+ "--json",
1224
+ "--prefer-offline",
1225
+ "--no-audit",
1226
+ "--no-fund",
1227
+ "--progress=false",
1228
+ "--loglevel=error",
1229
+ "--fetch-retries=0",
1230
+ "--fetch-retry-mintimeout=1000",
1231
+ "--fetch-retry-maxtimeout=1000",
1232
+ `--maxsockets=${Math.max(1, Math.min(16, concurrency))}`,
1233
+ ],
1234
+ env: {
1235
+ ...runtimeNpmPreflightEnv(concurrency),
1236
+ ...runtimeNpmPreflightServerEnv(server),
1237
+ },
1238
+ packageSpec,
1239
+ };
1240
+ }
1241
+ function sanitizeRuntimeMcpPreflightText(value) {
1242
+ return value
1243
+ .replace(/(Bearer\s+)[A-Za-z0-9._~+/=-]+/gi, "$1***")
1244
+ .replace(/(--(?:api-)?(?:token|key|secret|password)(?:=|\s+))[^"'`\s;]+/gi, "$1***")
1245
+ .replace(/([A-Za-z_][A-Za-z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|CREDENTIAL|AUTH)[A-Za-z0-9_]*\s*=\s*)[^"'`\s;]+/gi, "$1***")
1246
+ .replace(/([?&](?:token|api[-_]?key|key|secret|password|auth|credential|session|bearer|access[-_]?token|refresh[-_]?token|client[-_]?secret|x[-_]?auth[-_]?token|signature|sig)=)[^&#\s]+/gi, "$1***");
1247
+ }
1248
+ function formatPreflightFailureDetail(reason, detail) {
1249
+ if (reason === "timeout")
1250
+ return "timeout";
1251
+ return sanitizeRuntimeMcpPreflightText(detail ?? "failed");
1252
+ }
1253
+ function safePreflightProcessEnv() {
1254
+ const safe = {};
1255
+ for (const key of ["PATH", "Path", "HOME", "USERPROFILE", "TMP", "TMPDIR", "TEMP", "SystemRoot", "ComSpec"]) {
1256
+ const value = process.env[key];
1257
+ if (value !== undefined)
1258
+ safe[key] = value;
1259
+ }
1260
+ return safe;
1261
+ }
1262
+ async function runPreflightProbe(probe, timeoutMs) {
1263
+ try {
1264
+ const result = await execa(probe.command, probe.args, {
1265
+ env: { ...safePreflightProcessEnv(), ...probe.env },
1266
+ extendEnv: false,
1267
+ timeout: timeoutMs,
1268
+ reject: false,
1269
+ stdio: "pipe",
1270
+ });
1271
+ if (result.timedOut) {
1272
+ return { failed: true, reason: "timeout", detail: `timeout after ${timeoutMs}ms` };
1273
+ }
1274
+ if (result.exitCode !== 0) {
1275
+ return { failed: true, reason: "exit", detail: `exit ${result.exitCode}` };
1276
+ }
1277
+ return { failed: false };
1278
+ }
1279
+ catch (err) {
1280
+ const code = err.code;
1281
+ return { failed: true, reason: "exit", detail: code ? `spawn failed (${code})` : "spawn failed" };
1282
+ }
1283
+ }
1284
+ export async function preflightRuntimeMcpServers(servers, options) {
1285
+ const entries = Object.entries(servers);
1286
+ const failed = new Set();
1287
+ const details = new Map();
1288
+ const results = [];
1289
+ async function probeOne([name, server]) {
1290
+ if (!isRecord(server) || typeof server.url === "string" || !isNpmFamilyRuntimeServer(server)) {
1291
+ results.push({ name, status: "skipped", reason: "not-npm-family" });
1292
+ return;
1293
+ }
1294
+ const probe = buildPreflightProbeCommand(server, options.concurrency);
1295
+ if (!probe) {
1296
+ results.push({ name, status: "skipped", reason: "no-package-spec" });
1297
+ return;
1298
+ }
1299
+ const result = await runPreflightProbe(probe, options.timeoutMs);
1300
+ if (result.failed) {
1301
+ failed.add(name);
1302
+ if (result.reason && result.detail) {
1303
+ details.set(name, { reason: result.reason, detail: result.detail });
1304
+ }
1305
+ results.push({
1306
+ name,
1307
+ status: "failed",
1308
+ reason: result.reason ?? "exit",
1309
+ detail: formatPreflightFailureDetail(result.reason, result.detail),
1310
+ packageSpec: probe.packageSpec,
1311
+ });
1312
+ return;
1313
+ }
1314
+ results.push({ name, status: "ok", packageSpec: probe.packageSpec });
1315
+ }
1316
+ const concurrency = Math.max(1, options.concurrency);
1317
+ for (let i = 0; i < entries.length; i += concurrency) {
1318
+ const batch = entries.slice(i, i + concurrency);
1319
+ await Promise.all(batch.map(probeOne));
1320
+ }
1321
+ const order = new Map(entries.map(([name], index) => [name, index]));
1322
+ results.sort((a, b) => (order.get(a.name) ?? 0) - (order.get(b.name) ?? 0));
1323
+ return { failed, details, entries: results };
1324
+ }
1325
+ function emitPreflightSummary(result, removedNames = result.failed) {
1326
+ if (result.failed.size === 0 || process.env.OMK_MCP_SUPPRESS_PRUNE_WARNINGS === "1")
1327
+ return;
1328
+ const parts = [];
1329
+ for (const name of result.failed) {
1330
+ const detail = result.details.get(name);
1331
+ if (detail) {
1332
+ parts.push(`${sanitizeRuntimeMcpPreflightText(name)} (${formatPreflightFailureDetail(detail.reason, detail.detail)})`);
1333
+ }
1334
+ else {
1335
+ parts.push(sanitizeRuntimeMcpPreflightText(name));
1336
+ }
1337
+ }
1338
+ const shown = parts.slice(0, 5).join(", ");
1339
+ const suffix = parts.length > 5 ? `, +${parts.length - 5} more` : "";
1340
+ const removedCount = removedNames.size;
1341
+ const keptCount = Math.max(0, result.failed.size - removedCount);
1342
+ const action = removedCount > 0
1343
+ ? `Removed ${removedCount} failed server(s)`
1344
+ : "No servers were removed";
1345
+ const kept = keptCount > 0
1346
+ ? ` Kept ${keptCount} timeout server(s) as prewarm-needed.`
1347
+ : "";
1348
+ console.warn(`[omk] MCP preflight found ${result.failed.size} issue(s) in npm-family servers: ${shown}${suffix}. ` +
1349
+ `${action}.${kept} Run \`omk mcp check --all\` (or \`omk mcp prewarm --all\`) to check caches, ` +
1350
+ "or `omk mcp doctor --fix` for durable repairs.");
1351
+ }
1352
+ function normalizeRuntimeMcpServer(name, server) {
1353
+ if (!isRecord(server) || typeof server.url === "string" || !hasHttpTransportMismatch(name, server)) {
1354
+ return { server, normalizations: [] };
1355
+ }
1356
+ const args = Array.isArray(server.args) ? [...server.args] : [];
1357
+ let changed = false;
1358
+ for (const [index, arg] of args.entries()) {
1359
+ if (typeof arg !== "string" || !isShellInlineMcpArg(server, index) || !PDF_MCP_SERVER_RE.test(arg))
1360
+ continue;
1361
+ args[index] = `${arg.trimEnd()} --stdio`;
1362
+ changed = true;
1363
+ }
1364
+ if (!changed && PDF_MCP_SERVER_RE.test(runtimeCommandText(server))) {
1365
+ args.push("--stdio");
1366
+ changed = true;
1367
+ }
1368
+ if (!changed)
1369
+ return { server, normalizations: [] };
1370
+ return {
1371
+ server: { ...server, args },
1372
+ normalizations: [{
1373
+ name,
1374
+ kind: "runtime-stdio-normalized",
1375
+ message: "runtime MCP config was normalized to stdio transport before startup; run `omk mcp doctor --fix` to persist the repair",
1376
+ }],
1377
+ };
1378
+ }
1379
+ function prepareRuntimeMcpServer(server) {
1380
+ if (!isRecord(server) || typeof server.url === "string" || !isPackageManagerRuntimeServer(server)) {
1381
+ return server;
1382
+ }
1383
+ const existingEnv = isRecord(server.env) ? server.env : {};
1384
+ const env = { ...QUIET_PACKAGE_MANAGER_ENV, ...existingEnv };
1385
+ return { ...server, env };
1386
+ }
1387
+ export async function pruneRuntimeMcpServers(servers) {
1388
+ const pruned = {};
1389
+ const diagnostics = [];
1390
+ const normalizations = [];
1391
+ for (const [name, server] of Object.entries(servers)) {
1392
+ const normalized = normalizeRuntimeMcpServer(name, server);
1393
+ const normalizedServer = normalized.server;
1394
+ const serverDiagnostics = await diagnoseRuntimeMcpServer(name, normalizedServer);
1395
+ if (serverDiagnostics.length > 0) {
1396
+ diagnostics.push(...serverDiagnostics);
1397
+ continue;
1398
+ }
1399
+ normalizations.push(...normalized.normalizations);
1400
+ pruned[name] = prepareRuntimeMcpServer(normalizedServer);
1401
+ }
1402
+ return { servers: pruned, diagnostics, normalizations };
1403
+ }
1404
+ function emitRuntimeMcpNormalizationNotice(normalizations) {
1405
+ if (normalizations.length === 0 || process.env.OMK_MCP_SUPPRESS_PRUNE_WARNINGS === "1")
1406
+ return;
1407
+ const names = [...new Set(normalizations.map((diagnostic) => diagnostic.name))];
1408
+ const shown = names.slice(0, 5).join(", ");
1409
+ const suffix = names.length > 5 ? `, +${names.length - 5} more` : "";
1410
+ console.warn(`[omk] normalized ${names.length} MCP server(s) for Kimi startup: ${shown}${suffix}. `
1411
+ + "Run `omk mcp doctor --fix` to persist the repair.");
1412
+ }
1413
+ function emitRuntimeMcpPruneWarning(diagnostics) {
1414
+ if (diagnostics.length === 0 || process.env.OMK_MCP_SUPPRESS_PRUNE_WARNINGS === "1")
1415
+ return;
1416
+ const names = [...new Set(diagnostics.map((diagnostic) => diagnostic.name))];
1417
+ const shown = names.slice(0, 5).join(", ");
1418
+ const suffix = names.length > 5 ? `, +${names.length - 5} more` : "";
1419
+ console.warn(`[omk] skipped ${names.length} broken MCP server(s) before Kimi startup: ${shown}${suffix}. `
1420
+ + "Run `omk mcp doctor` to repair stale global MCP config.");
1421
+ }
1422
+ export async function writeRuntimeMcpConfig(configPaths, allowlist) {
1423
+ const uniquePaths = [...new Set(configPaths)];
1424
+ const mergedServers = {};
1425
+ for (const configPath of uniquePaths) {
1426
+ Object.assign(mergedServers, await readMcpServersForRuntime(configPath));
1427
+ }
1428
+ let targetServers = mergedServers;
1429
+ if (allowlist !== undefined && allowlist.length === 0) {
1430
+ targetServers = {};
1431
+ }
1432
+ else if (allowlist && allowlist.length > 0) {
1433
+ const allowed = new Set(allowlist);
1434
+ const missing = allowlist.filter((name) => !mergedServers[name]);
1435
+ if (missing.length > 0) {
1436
+ console.warn(`[omk] MCP allowlist contains servers not found in config: ${missing.join(", ")}`);
1437
+ }
1438
+ targetServers = Object.fromEntries(Object.entries(mergedServers).filter(([name]) => allowed.has(name)));
1439
+ }
1440
+ const { servers: runtimeServers, diagnostics, normalizations } = await pruneRuntimeMcpServers(targetServers);
1441
+ emitRuntimeMcpPruneWarning(diagnostics);
1442
+ emitRuntimeMcpNormalizationNotice(normalizations);
1443
+ const preflightOptions = resolveRuntimeMcpPreflightOptions();
1444
+ const preflightMode = preflightOptions.mode;
1445
+ if (preflightMode !== "off") {
1446
+ const preflightResult = await preflightRuntimeMcpServers(runtimeServers, preflightOptions);
1447
+ const removedByPreflight = new Set();
1448
+ for (const name of Object.keys(runtimeServers)) {
1449
+ if (preflightResult.failed.has(name)) {
1450
+ if (preflightMode === "strict") {
1451
+ const parts = [];
1452
+ for (const failedName of preflightResult.failed) {
1453
+ const detail = preflightResult.details.get(failedName);
1454
+ parts.push(`${sanitizeRuntimeMcpPreflightText(failedName)} (${formatPreflightFailureDetail(detail?.reason, detail?.detail)})`);
1455
+ }
1456
+ throw new Error(`[omk] MCP preflight strict mode: server "${name}" failed probe. ` +
1457
+ parts.join(", "));
1458
+ }
1459
+ const detail = preflightResult.details.get(name);
1460
+ if (detail?.reason === "timeout") {
1461
+ // Timeout-only failures are kept as prewarm-needed; do not delete.
1462
+ continue;
1463
+ }
1464
+ delete runtimeServers[name];
1465
+ removedByPreflight.add(name);
1466
+ }
1467
+ }
1468
+ if (preflightResult.failed.size > 0) {
1469
+ emitPreflightSummary(preflightResult, removedByPreflight);
1470
+ }
1471
+ }
1472
+ if (Object.keys(runtimeServers).length === 0)
1473
+ return null;
1474
+ const root = await getProjectRootAsync();
1475
+ const cacheDir = join(root, ".omk", "cache");
1476
+ await ensureDir(cacheDir);
1477
+ await chmod(cacheDir, 0o700).catch(() => undefined);
1478
+ // Eagerly remove stale runtime configs left by prior crashed/killed processes
1479
+ await cleanupStaleRuntimeMcpConfigs(cacheDir);
1480
+ const runtimeConfigPath = join(cacheDir, `mcp-runtime-merged-${process.pid}-${Date.now()}.json`);
1481
+ await writeFile(runtimeConfigPath, JSON.stringify({ mcpServers: runtimeServers }, null, 2) + "\n", { mode: 0o600 });
1482
+ registerRuntimeMcpCleanupPath(runtimeConfigPath);
1483
+ return runtimeConfigPath;
1484
+ }
1485
+ async function cleanupStaleRuntimeMcpConfigs(cacheDir) {
1486
+ const now = Date.now();
1487
+ try {
1488
+ const entries = await readdir(cacheDir);
1489
+ const stale = entries.filter((name) => name.startsWith("mcp-runtime-merged-") && name.endsWith(".json"));
1490
+ for (const name of stale) {
1491
+ const fullPath = join(cacheDir, name);
1492
+ if (!(await shouldCleanupRuntimeMcpConfig(fullPath, name, now)))
1493
+ continue;
1494
+ try {
1495
+ await rm(fullPath, { force: true });
1496
+ }
1497
+ catch {
1498
+ // Best-effort cleanup
1499
+ }
1500
+ }
1501
+ }
1502
+ catch {
1503
+ // Directory may not exist or be unreadable
1504
+ }
1505
+ }
1506
+ async function shouldCleanupRuntimeMcpConfig(fullPath, fileName, now) {
1507
+ const match = /^mcp-runtime-merged-(\d+)-(\d+)\.json$/.exec(fileName);
1508
+ if (match) {
1509
+ const ownerPid = Number.parseInt(match[1], 10);
1510
+ if (Number.isFinite(ownerPid) && ownerPid > 0 && isProcessAlive(ownerPid)) {
1511
+ return false;
1512
+ }
1513
+ return true;
1514
+ }
1515
+ try {
1516
+ const info = await stat(fullPath);
1517
+ return now - info.mtimeMs > 24 * 60 * 60 * 1000;
1518
+ }
1519
+ catch {
1520
+ return false;
1521
+ }
1522
+ }
1523
+ function isProcessAlive(pid) {
1524
+ try {
1525
+ process.kill(pid, 0);
1526
+ return true;
1527
+ }
1528
+ catch (err) {
1529
+ return err.code === "EPERM";
1530
+ }
1531
+ }
1532
+ const runtimeMcpCleanupPaths = new Set();
1533
+ let runtimeMcpCleanupRegistered = false;
1534
+ function cleanupRuntimeMcpFiles() {
1535
+ for (const path of runtimeMcpCleanupPaths) {
1536
+ try {
1537
+ rmSync(path, { force: true });
1538
+ }
1539
+ catch {
1540
+ // Best-effort cleanup for a local runtime cache that may contain MCP env.
1541
+ }
1542
+ }
1543
+ }
1544
+ function registerRuntimeMcpCleanupPath(runtimeConfigPath) {
1545
+ runtimeMcpCleanupPaths.add(runtimeConfigPath);
1546
+ if (!runtimeMcpCleanupRegistered) {
1547
+ runtimeMcpCleanupRegistered = true;
1548
+ process.once("exit", cleanupRuntimeMcpFiles);
1549
+ }
1550
+ }
1551
+ /** 프로젝트의 .kimi/skills 디렉토리 경로 */
1552
+ export function getKimiSkillsDir() {
1553
+ return join(getProjectRoot(), ".kimi", "skills");
1554
+ }
1555
+ /** ~/.kimi/config.toml 에서 default_model 읽기 */
1556
+ export async function getKimiDefaultModel() {
1557
+ const configPath = getKimiConfigPath();
1558
+ try {
1559
+ const content = await readFile(configPath, "utf-8");
1560
+ const match = content.match(/^default_model\s*=\s*["']([^"']+)["']/m);
1561
+ return match?.[1] ?? null;
1562
+ }
1563
+ catch {
1564
+ return null;
1565
+ }
1566
+ }
1567
+ const MAX_LOGO_IMAGE_BYTES = 4 * 1024 * 1024;
1568
+ const ALLOWED_LOGO_EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".gif", ".webp"]);
1569
+ /** .omk/config.toml 에서 안전한 logo_image 경로 읽기 (상대경로는 프로젝트 루트 기준) */
1570
+ export async function getOmkLogoImagePath() {
1571
+ const configPath = getOmkPath("config.toml");
1572
+ try {
1573
+ const content = await readTextFile(configPath, "");
1574
+ const match = content.match(/^\s*logo_image\s*=\s*["']([^"']+)["']/m);
1575
+ if (!match)
1576
+ return null;
1577
+ const p = match[1].trim();
1578
+ const root = await getProjectRootAsync();
1579
+ const absoluteInput = isAbsolute(p) || p.startsWith("\\") || /^[A-Za-z]:/.test(p);
1580
+ if (absoluteInput && !isTrustedLocalFlag(process.env.OMK_TRUST_ABSOLUTE_LOGO_PATH)) {
1581
+ return null;
1582
+ }
1583
+ const candidate = absoluteInput ? resolve(p) : resolve(root, p);
1584
+ if (!absoluteInput && isOutsideRoot(root, candidate)) {
1585
+ return null;
1586
+ }
1587
+ return await isSafeLogoImage(candidate) ? candidate : null;
1588
+ }
1589
+ catch {
1590
+ return null;
1591
+ }
1592
+ }
1593
+ function isTrustedLocalFlag(value) {
1594
+ return value === "1" || value === "true" || value === "yes";
1595
+ }
1596
+ function isOutsideRoot(root, candidate) {
1597
+ const rel = relative(root, candidate);
1598
+ return rel === ".." || rel.startsWith(`..${"/"}`) || rel.startsWith(`..${"\\"}`) || isAbsolute(rel);
1599
+ }
1600
+ async function isSafeLogoImage(path) {
1601
+ const ext = extname(path).toLowerCase();
1602
+ if (!ALLOWED_LOGO_EXTENSIONS.has(ext))
1603
+ return false;
1604
+ const info = await lstat(path);
1605
+ if (!info.isFile() || info.isSymbolicLink() || info.size <= 0 || info.size > MAX_LOGO_IMAGE_BYTES) {
1606
+ return false;
1607
+ }
1608
+ const bytes = await readFile(path);
1609
+ return hasAllowedImageMagic(bytes);
1610
+ }
1611
+ function hasAllowedImageMagic(bytes) {
1612
+ return isPng(bytes) || isJpeg(bytes) || isGif(bytes) || isWebp(bytes);
1613
+ }
1614
+ function isPng(bytes) {
1615
+ return bytes.length >= 8
1616
+ && bytes[0] === 0x89
1617
+ && bytes[1] === 0x50
1618
+ && bytes[2] === 0x4e
1619
+ && bytes[3] === 0x47
1620
+ && bytes[4] === 0x0d
1621
+ && bytes[5] === 0x0a
1622
+ && bytes[6] === 0x1a
1623
+ && bytes[7] === 0x0a;
1624
+ }
1625
+ function isJpeg(bytes) {
1626
+ return bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff;
1627
+ }
1628
+ function isGif(bytes) {
1629
+ if (bytes.length < 6)
1630
+ return false;
1631
+ const header = String.fromCharCode(...bytes.slice(0, 6));
1632
+ return header === "GIF87a" || header === "GIF89a";
1633
+ }
1634
+ function isWebp(bytes) {
1635
+ if (bytes.length < 12)
1636
+ return false;
1637
+ const riff = String.fromCharCode(...bytes.slice(0, 4));
1638
+ const webp = String.fromCharCode(...bytes.slice(8, 12));
1639
+ return riff === "RIFF" && webp === "WEBP";
1640
+ }
1641
+ /**
1642
+ * Auto-generate a built-in omk-project MCP config so users never need to
1643
+ * define it manually in ~/.kimi/mcp.json or .kimi/mcp.json.
1644
+ * The config uses the currently-running omk CLI path and sets OMK_PROJECT_ROOT
1645
+ * to the current project root.
1646
+ */
1647
+ export async function writeBuiltinMcpConfig() {
1648
+ const root = getProjectRoot();
1649
+ const cacheDir = join(root, ".omk", "cache");
1650
+ await ensureDir(cacheDir);
1651
+ await chmod(cacheDir, 0o700).catch(() => undefined);
1652
+ let omkCliPath;
1653
+ try {
1654
+ omkCliPath = await realpath(process.argv[1] ?? "");
1655
+ }
1656
+ catch {
1657
+ omkCliPath = process.argv[1] ?? "omk";
1658
+ }
1659
+ const autoConfigPath = join(cacheDir, `mcp-auto-omk-project-${process.pid}-${Date.now()}.json`);
1660
+ const config = {
1661
+ mcpServers: {
1662
+ "omk-project": {
1663
+ command: process.argv[0] || "node",
1664
+ args: [omkCliPath, "mcp", "serve", "omk-project"],
1665
+ env: {
1666
+ OMK_PROJECT_ROOT: root,
1667
+ npm_config_loglevel: "error",
1668
+ NODE_NO_WARNINGS: "1",
1669
+ },
1670
+ },
1671
+ },
1672
+ };
1673
+ await writeFile(autoConfigPath, JSON.stringify(config, null, 2) + "\n", { mode: 0o600 });
1674
+ registerRuntimeMcpCleanupPath(autoConfigPath);
1675
+ return autoConfigPath;
1676
+ }
1677
+ /** Kimi CLI 실행 인자에 model + MCP + Skills 주입 (전역 동기화는 별도) */
1678
+ export async function injectKimiGlobals(args, options = {}) {
1679
+ const resources = await getOmkResourceSettings();
1680
+ const mcpScope = options.mcpScope ?? resources.mcpScope;
1681
+ const skillsScope = options.skillsScope ?? resources.skillsScope;
1682
+ const hooksScope = options.hooksScope ?? resources.hooksScope;
1683
+ // Resolve role-based runtime profile and inject supported flags
1684
+ let injectedModel;
1685
+ if (options.role) {
1686
+ const profile = await resolveRuntimeProfile(options.role);
1687
+ const { getKimiCapabilities } = await import("../kimi/capability.js");
1688
+ const caps = getKimiCapabilities();
1689
+ const profileArgs = buildProfileArgs(profile, caps);
1690
+ args.push(...profileArgs);
1691
+ injectedModel = profile.model;
1692
+ // maxOutputMb is not a native CLI flag; map to env hint if present
1693
+ if (profile.maxOutputMb !== undefined && !process.env.OMK_MAX_OUTPUT_MB) {
1694
+ // Handled downstream by resource-profile.ts / shell runners
1695
+ }
1696
+ }
1697
+ // default_model이 있으면 주입 (agent-file 사용 시 model이 unset 될 수 있음)
1698
+ // Profile model takes precedence; skip duplicate injection.
1699
+ if (!injectedModel) {
1700
+ const defaultModel = await getKimiDefaultModel();
1701
+ if (defaultModel) {
1702
+ args.push("--model", defaultModel);
1703
+ }
1704
+ }
1705
+ if (mcpScope !== "none") {
1706
+ const mcpConfigs = await collectMcpConfigs(mcpScope);
1707
+ // Auto-inject built-in omk-project MCP server so it never needs user config.
1708
+ // Merge runtime configs before passing them to Kimi: Kimi warns on duplicate
1709
+ // server names across multiple --mcp-config-file values and then overrides
1710
+ // silently. A single merged config preserves the same precedence (global first,
1711
+ // project second, built-in omk-project last) without duplicate startup noise.
1712
+ const builtinMcp = await writeBuiltinMcpConfig();
1713
+ const allowlist = options.mcpAllowlist !== undefined
1714
+ ? [...new Set([...options.mcpAllowlist, "omk-project"].map((name) => name.trim()).filter(Boolean))]
1715
+ : undefined;
1716
+ const runtimeMcp = await writeRuntimeMcpConfig(builtinMcp ? [...mcpConfigs, builtinMcp] : mcpConfigs, allowlist);
1717
+ if (runtimeMcp) {
1718
+ args.push("--mcp-config-file", runtimeMcp);
1719
+ }
1720
+ else if (allowlist && allowlist.length > 0) {
1721
+ console.warn(`[omk] MCP allowlist resulted in zero available servers. ` +
1722
+ `Allowed: ${allowlist.join(", ")}. ` +
1723
+ `Check that the allowlist matches actual MCP server names in your config. ` +
1724
+ `MCP config will not be passed to Kimi.`);
1725
+ }
1726
+ }
1727
+ const globalSkillsDir = join(getUserHome(), ".kimi", "skills");
1728
+ const projectSkillsDir = getKimiSkillsDir();
1729
+ const [globalSkillsExists, projectSkillsExists] = await Promise.all([
1730
+ skillsScope === "all" ? pathExists(globalSkillsDir) : Promise.resolve(false),
1731
+ skillsScope !== "none" ? pathExists(projectSkillsDir) : Promise.resolve(false),
1732
+ ]);
1733
+ if (globalSkillsExists)
1734
+ args.push("--skills-dir", globalSkillsDir);
1735
+ if (projectSkillsExists)
1736
+ args.push("--skills-dir", projectSkillsDir);
1737
+ if (process.env.OMK_DEBUG === "1") {
1738
+ const mcpFiles = await collectMcpConfigs(mcpScope);
1739
+ const skillDirs = [];
1740
+ if (globalSkillsExists)
1741
+ skillDirs.push(globalSkillsDir);
1742
+ if (projectSkillsExists)
1743
+ skillDirs.push(projectSkillsDir);
1744
+ const modelIdx = args.indexOf("--model");
1745
+ const effectiveModel = modelIdx >= 0 ? args[modelIdx + 1] : null;
1746
+ console.error("[OMK_DEBUG] injectKimiGlobals:", {
1747
+ role: options.role ?? null,
1748
+ model: effectiveModel,
1749
+ mcpFiles,
1750
+ skillDirs,
1751
+ mcpScope,
1752
+ skillsScope,
1753
+ hooksScope,
1754
+ mcpAllowlist: options.mcpAllowlist ?? null,
1755
+ });
1756
+ }
1757
+ }