@edwardlee5423/magi 0.1.0-alpha.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 (531) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -0
  3. package/dist/agent/headless-agent.d.ts +15 -0
  4. package/dist/agent/headless-agent.js +105 -0
  5. package/dist/agent/headless-agent.js.map +1 -0
  6. package/dist/agent/local-plan.d.ts +20 -0
  7. package/dist/agent/local-plan.js +30 -0
  8. package/dist/agent/local-plan.js.map +1 -0
  9. package/dist/agent/query-engine.d.ts +71 -0
  10. package/dist/agent/query-engine.js +938 -0
  11. package/dist/agent/query-engine.js.map +1 -0
  12. package/dist/agent/query.d.ts +128 -0
  13. package/dist/agent/query.js +674 -0
  14. package/dist/agent/query.js.map +1 -0
  15. package/dist/agent/system-prompt.d.ts +12 -0
  16. package/dist/agent/system-prompt.js +104 -0
  17. package/dist/agent/system-prompt.js.map +1 -0
  18. package/dist/agent/tools.d.ts +71 -0
  19. package/dist/agent/tools.js +37 -0
  20. package/dist/agent/tools.js.map +1 -0
  21. package/dist/agents/roles.d.ts +9 -0
  22. package/dist/agents/roles.js +18 -0
  23. package/dist/agents/roles.js.map +1 -0
  24. package/dist/agents/task-queue.d.ts +13 -0
  25. package/dist/agents/task-queue.js +50 -0
  26. package/dist/agents/task-queue.js.map +1 -0
  27. package/dist/cli.d.ts +7 -0
  28. package/dist/cli.js +1540 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/colors.d.ts +20 -0
  31. package/dist/colors.js +92 -0
  32. package/dist/colors.js.map +1 -0
  33. package/dist/commands/agents.d.ts +9 -0
  34. package/dist/commands/agents.js +37 -0
  35. package/dist/commands/agents.js.map +1 -0
  36. package/dist/commands/clear.d.ts +9 -0
  37. package/dist/commands/clear.js +20 -0
  38. package/dist/commands/clear.js.map +1 -0
  39. package/dist/commands/commit.d.ts +8 -0
  40. package/dist/commands/commit.js +35 -0
  41. package/dist/commands/commit.js.map +1 -0
  42. package/dist/commands/compact.d.ts +8 -0
  43. package/dist/commands/compact.js +29 -0
  44. package/dist/commands/compact.js.map +1 -0
  45. package/dist/commands/copy.d.ts +8 -0
  46. package/dist/commands/copy.js +49 -0
  47. package/dist/commands/copy.js.map +1 -0
  48. package/dist/commands/cost.d.ts +8 -0
  49. package/dist/commands/cost.js +94 -0
  50. package/dist/commands/cost.js.map +1 -0
  51. package/dist/commands/diff.d.ts +8 -0
  52. package/dist/commands/diff.js +38 -0
  53. package/dist/commands/diff.js.map +1 -0
  54. package/dist/commands/doctor.d.ts +8 -0
  55. package/dist/commands/doctor.js +23 -0
  56. package/dist/commands/doctor.js.map +1 -0
  57. package/dist/commands/export.d.ts +8 -0
  58. package/dist/commands/export.js +42 -0
  59. package/dist/commands/export.js.map +1 -0
  60. package/dist/commands/fork.d.ts +8 -0
  61. package/dist/commands/fork.js +20 -0
  62. package/dist/commands/fork.js.map +1 -0
  63. package/dist/commands/goal.d.ts +9 -0
  64. package/dist/commands/goal.js +54 -0
  65. package/dist/commands/goal.js.map +1 -0
  66. package/dist/commands/help.d.ts +8 -0
  67. package/dist/commands/help.js +65 -0
  68. package/dist/commands/help.js.map +1 -0
  69. package/dist/commands/hooks.d.ts +8 -0
  70. package/dist/commands/hooks.js +56 -0
  71. package/dist/commands/hooks.js.map +1 -0
  72. package/dist/commands/image.d.ts +17 -0
  73. package/dist/commands/image.js +74 -0
  74. package/dist/commands/image.js.map +1 -0
  75. package/dist/commands/init.d.ts +26 -0
  76. package/dist/commands/init.js +214 -0
  77. package/dist/commands/init.js.map +1 -0
  78. package/dist/commands/mcp.d.ts +8 -0
  79. package/dist/commands/mcp.js +217 -0
  80. package/dist/commands/mcp.js.map +1 -0
  81. package/dist/commands/memory.d.ts +8 -0
  82. package/dist/commands/memory.js +79 -0
  83. package/dist/commands/memory.js.map +1 -0
  84. package/dist/commands/model.d.ts +8 -0
  85. package/dist/commands/model.js +21 -0
  86. package/dist/commands/model.js.map +1 -0
  87. package/dist/commands/permissions.d.ts +9 -0
  88. package/dist/commands/permissions.js +30 -0
  89. package/dist/commands/permissions.js.map +1 -0
  90. package/dist/commands/proactive.d.ts +9 -0
  91. package/dist/commands/proactive.js +24 -0
  92. package/dist/commands/proactive.js.map +1 -0
  93. package/dist/commands/register-all.d.ts +1 -0
  94. package/dist/commands/register-all.js +68 -0
  95. package/dist/commands/register-all.js.map +1 -0
  96. package/dist/commands/registry.d.ts +64 -0
  97. package/dist/commands/registry.js +235 -0
  98. package/dist/commands/registry.js.map +1 -0
  99. package/dist/commands/rename.d.ts +8 -0
  100. package/dist/commands/rename.js +16 -0
  101. package/dist/commands/rename.js.map +1 -0
  102. package/dist/commands/review.d.ts +8 -0
  103. package/dist/commands/review.js +13 -0
  104. package/dist/commands/review.js.map +1 -0
  105. package/dist/commands/rewind.d.ts +8 -0
  106. package/dist/commands/rewind.js +45 -0
  107. package/dist/commands/rewind.js.map +1 -0
  108. package/dist/commands/route.d.ts +9 -0
  109. package/dist/commands/route.js +83 -0
  110. package/dist/commands/route.js.map +1 -0
  111. package/dist/commands/sessions.d.ts +9 -0
  112. package/dist/commands/sessions.js +25 -0
  113. package/dist/commands/sessions.js.map +1 -0
  114. package/dist/commands/skill.d.ts +9 -0
  115. package/dist/commands/skill.js +46 -0
  116. package/dist/commands/skill.js.map +1 -0
  117. package/dist/commands/status.d.ts +8 -0
  118. package/dist/commands/status.js +41 -0
  119. package/dist/commands/status.js.map +1 -0
  120. package/dist/commands/summary.d.ts +8 -0
  121. package/dist/commands/summary.js +39 -0
  122. package/dist/commands/summary.js.map +1 -0
  123. package/dist/commands/tasks.d.ts +9 -0
  124. package/dist/commands/tasks.js +70 -0
  125. package/dist/commands/tasks.js.map +1 -0
  126. package/dist/commands/todos.d.ts +9 -0
  127. package/dist/commands/todos.js +27 -0
  128. package/dist/commands/todos.js.map +1 -0
  129. package/dist/commands/tutorial.d.ts +8 -0
  130. package/dist/commands/tutorial.js +159 -0
  131. package/dist/commands/tutorial.js.map +1 -0
  132. package/dist/commands/upgrade.d.ts +9 -0
  133. package/dist/commands/upgrade.js +73 -0
  134. package/dist/commands/upgrade.js.map +1 -0
  135. package/dist/commands/usage.d.ts +8 -0
  136. package/dist/commands/usage.js +54 -0
  137. package/dist/commands/usage.js.map +1 -0
  138. package/dist/commands/vim.d.ts +10 -0
  139. package/dist/commands/vim.js +34 -0
  140. package/dist/commands/vim.js.map +1 -0
  141. package/dist/config.d.ts +104 -0
  142. package/dist/config.js +533 -0
  143. package/dist/config.js.map +1 -0
  144. package/dist/context/compaction.d.ts +66 -0
  145. package/dist/context/compaction.js +353 -0
  146. package/dist/context/compaction.js.map +1 -0
  147. package/dist/context/layers.d.ts +32 -0
  148. package/dist/context/layers.js +114 -0
  149. package/dist/context/layers.js.map +1 -0
  150. package/dist/context/token-budget.d.ts +21 -0
  151. package/dist/context/token-budget.js +70 -0
  152. package/dist/context/token-budget.js.map +1 -0
  153. package/dist/control/auth.d.ts +17 -0
  154. package/dist/control/auth.js +31 -0
  155. package/dist/control/auth.js.map +1 -0
  156. package/dist/control/daemon.d.ts +38 -0
  157. package/dist/control/daemon.js +135 -0
  158. package/dist/control/daemon.js.map +1 -0
  159. package/dist/control/mdns.d.ts +51 -0
  160. package/dist/control/mdns.js +344 -0
  161. package/dist/control/mdns.js.map +1 -0
  162. package/dist/control/peer-client.d.ts +49 -0
  163. package/dist/control/peer-client.js +170 -0
  164. package/dist/control/peer-client.js.map +1 -0
  165. package/dist/control/server.d.ts +30 -0
  166. package/dist/control/server.js +887 -0
  167. package/dist/control/server.js.map +1 -0
  168. package/dist/cost.d.ts +23 -0
  169. package/dist/cost.js +80 -0
  170. package/dist/cost.js.map +1 -0
  171. package/dist/doctor.d.ts +8 -0
  172. package/dist/doctor.js +22 -0
  173. package/dist/doctor.js.map +1 -0
  174. package/dist/env.d.ts +7 -0
  175. package/dist/env.js +70 -0
  176. package/dist/env.js.map +1 -0
  177. package/dist/errors.d.ts +6 -0
  178. package/dist/errors.js +13 -0
  179. package/dist/errors.js.map +1 -0
  180. package/dist/events.d.ts +19 -0
  181. package/dist/events.js +236 -0
  182. package/dist/events.js.map +1 -0
  183. package/dist/fs-utils.d.ts +21 -0
  184. package/dist/fs-utils.js +48 -0
  185. package/dist/fs-utils.js.map +1 -0
  186. package/dist/goal.d.ts +32 -0
  187. package/dist/goal.js +172 -0
  188. package/dist/goal.js.map +1 -0
  189. package/dist/headless.d.ts +38 -0
  190. package/dist/headless.js +547 -0
  191. package/dist/headless.js.map +1 -0
  192. package/dist/history.d.ts +8 -0
  193. package/dist/history.js +77 -0
  194. package/dist/history.js.map +1 -0
  195. package/dist/hooks/events.d.ts +14 -0
  196. package/dist/hooks/events.js +37 -0
  197. package/dist/hooks/events.js.map +1 -0
  198. package/dist/hooks/runner.d.ts +73 -0
  199. package/dist/hooks/runner.js +256 -0
  200. package/dist/hooks/runner.js.map +1 -0
  201. package/dist/hooks/trigger.d.ts +9 -0
  202. package/dist/hooks/trigger.js +18 -0
  203. package/dist/hooks/trigger.js.map +1 -0
  204. package/dist/index.d.ts +61 -0
  205. package/dist/index.js +62 -0
  206. package/dist/index.js.map +1 -0
  207. package/dist/interactions.d.ts +102 -0
  208. package/dist/interactions.js +250 -0
  209. package/dist/interactions.js.map +1 -0
  210. package/dist/logger.d.ts +32 -0
  211. package/dist/logger.js +115 -0
  212. package/dist/logger.js.map +1 -0
  213. package/dist/markdown.d.ts +18 -0
  214. package/dist/markdown.js +293 -0
  215. package/dist/markdown.js.map +1 -0
  216. package/dist/mcp/approval.d.ts +9 -0
  217. package/dist/mcp/approval.js +27 -0
  218. package/dist/mcp/approval.js.map +1 -0
  219. package/dist/mcp/client.d.ts +61 -0
  220. package/dist/mcp/client.js +276 -0
  221. package/dist/mcp/client.js.map +1 -0
  222. package/dist/mcp/connection-manager.d.ts +30 -0
  223. package/dist/mcp/connection-manager.js +126 -0
  224. package/dist/mcp/connection-manager.js.map +1 -0
  225. package/dist/mcp/oauth-callback.d.ts +23 -0
  226. package/dist/mcp/oauth-callback.js +108 -0
  227. package/dist/mcp/oauth-callback.js.map +1 -0
  228. package/dist/mcp/oauth-flow.d.ts +45 -0
  229. package/dist/mcp/oauth-flow.js +145 -0
  230. package/dist/mcp/oauth-flow.js.map +1 -0
  231. package/dist/mcp/oauth.d.ts +82 -0
  232. package/dist/mcp/oauth.js +169 -0
  233. package/dist/mcp/oauth.js.map +1 -0
  234. package/dist/mcp/tool-registry.d.ts +29 -0
  235. package/dist/mcp/tool-registry.js +207 -0
  236. package/dist/mcp/tool-registry.js.map +1 -0
  237. package/dist/mcp/transport.d.ts +33 -0
  238. package/dist/mcp/transport.js +493 -0
  239. package/dist/mcp/transport.js.map +1 -0
  240. package/dist/mcp/types.d.ts +57 -0
  241. package/dist/mcp/types.js +2 -0
  242. package/dist/mcp/types.js.map +1 -0
  243. package/dist/memdir.d.ts +58 -0
  244. package/dist/memdir.js +219 -0
  245. package/dist/memdir.js.map +1 -0
  246. package/dist/memory-selection.d.ts +30 -0
  247. package/dist/memory-selection.js +102 -0
  248. package/dist/memory-selection.js.map +1 -0
  249. package/dist/memory.d.ts +85 -0
  250. package/dist/memory.js +259 -0
  251. package/dist/memory.js.map +1 -0
  252. package/dist/paths.d.ts +25 -0
  253. package/dist/paths.js +99 -0
  254. package/dist/paths.js.map +1 -0
  255. package/dist/permissions.d.ts +17 -0
  256. package/dist/permissions.js +72 -0
  257. package/dist/permissions.js.map +1 -0
  258. package/dist/plugins/manifest.d.ts +17 -0
  259. package/dist/plugins/manifest.js +98 -0
  260. package/dist/plugins/manifest.js.map +1 -0
  261. package/dist/plugins/marketplace.d.ts +22 -0
  262. package/dist/plugins/marketplace.js +98 -0
  263. package/dist/plugins/marketplace.js.map +1 -0
  264. package/dist/proactive.d.ts +15 -0
  265. package/dist/proactive.js +49 -0
  266. package/dist/proactive.js.map +1 -0
  267. package/dist/providers/errors.d.ts +14 -0
  268. package/dist/providers/errors.js +66 -0
  269. package/dist/providers/errors.js.map +1 -0
  270. package/dist/providers/format-proxy.d.ts +100 -0
  271. package/dist/providers/format-proxy.js +235 -0
  272. package/dist/providers/format-proxy.js.map +1 -0
  273. package/dist/providers/http.d.ts +4 -0
  274. package/dist/providers/http.js +21 -0
  275. package/dist/providers/http.js.map +1 -0
  276. package/dist/providers/ir.d.ts +84 -0
  277. package/dist/providers/ir.js +76 -0
  278. package/dist/providers/ir.js.map +1 -0
  279. package/dist/providers/messages-compatible.d.ts +19 -0
  280. package/dist/providers/messages-compatible.js +592 -0
  281. package/dist/providers/messages-compatible.js.map +1 -0
  282. package/dist/providers/openai.d.ts +18 -0
  283. package/dist/providers/openai.js +430 -0
  284. package/dist/providers/openai.js.map +1 -0
  285. package/dist/providers/registry.d.ts +10 -0
  286. package/dist/providers/registry.js +16 -0
  287. package/dist/providers/registry.js.map +1 -0
  288. package/dist/providers/sse.d.ts +6 -0
  289. package/dist/providers/sse.js +104 -0
  290. package/dist/providers/sse.js.map +1 -0
  291. package/dist/routing/model-alias.d.ts +8 -0
  292. package/dist/routing/model-alias.js +23 -0
  293. package/dist/routing/model-alias.js.map +1 -0
  294. package/dist/routing/model-router.d.ts +55 -0
  295. package/dist/routing/model-router.js +233 -0
  296. package/dist/routing/model-router.js.map +1 -0
  297. package/dist/routing/router.d.ts +26 -0
  298. package/dist/routing/router.js +63 -0
  299. package/dist/routing/router.js.map +1 -0
  300. package/dist/rules/agents-loader.d.ts +12 -0
  301. package/dist/rules/agents-loader.js +61 -0
  302. package/dist/rules/agents-loader.js.map +1 -0
  303. package/dist/runner/client.d.ts +67 -0
  304. package/dist/runner/client.js +175 -0
  305. package/dist/runner/client.js.map +1 -0
  306. package/dist/session-store.d.ts +250 -0
  307. package/dist/session-store.js +629 -0
  308. package/dist/session-store.js.map +1 -0
  309. package/dist/skills/bundled.d.ts +14 -0
  310. package/dist/skills/bundled.js +148 -0
  311. package/dist/skills/bundled.js.map +1 -0
  312. package/dist/skills/loader.d.ts +11 -0
  313. package/dist/skills/loader.js +73 -0
  314. package/dist/skills/loader.js.map +1 -0
  315. package/dist/slash-menu.d.ts +14 -0
  316. package/dist/slash-menu.js +166 -0
  317. package/dist/slash-menu.js.map +1 -0
  318. package/dist/slash.d.ts +75 -0
  319. package/dist/slash.js +126 -0
  320. package/dist/slash.js.map +1 -0
  321. package/dist/spinner.d.ts +27 -0
  322. package/dist/spinner.js +68 -0
  323. package/dist/spinner.js.map +1 -0
  324. package/dist/ssh/exec.d.ts +20 -0
  325. package/dist/ssh/exec.js +39 -0
  326. package/dist/ssh/exec.js.map +1 -0
  327. package/dist/ssh/file.d.ts +32 -0
  328. package/dist/ssh/file.js +60 -0
  329. package/dist/ssh/file.js.map +1 -0
  330. package/dist/syntax-highlight.d.ts +19 -0
  331. package/dist/syntax-highlight.js +181 -0
  332. package/dist/syntax-highlight.js.map +1 -0
  333. package/dist/tools/agent-tool.d.ts +53 -0
  334. package/dist/tools/agent-tool.js +62 -0
  335. package/dist/tools/agent-tool.js.map +1 -0
  336. package/dist/tools/archive-create.d.ts +35 -0
  337. package/dist/tools/archive-create.js +37 -0
  338. package/dist/tools/archive-create.js.map +1 -0
  339. package/dist/tools/archive-extract.d.ts +28 -0
  340. package/dist/tools/archive-extract.js +36 -0
  341. package/dist/tools/archive-extract.js.map +1 -0
  342. package/dist/tools/base64.d.ts +27 -0
  343. package/dist/tools/base64.js +19 -0
  344. package/dist/tools/base64.js.map +1 -0
  345. package/dist/tools/browser.d.ts +125 -0
  346. package/dist/tools/browser.js +241 -0
  347. package/dist/tools/browser.js.map +1 -0
  348. package/dist/tools/config-tool.d.ts +31 -0
  349. package/dist/tools/config-tool.js +167 -0
  350. package/dist/tools/config-tool.js.map +1 -0
  351. package/dist/tools/cron.d.ts +110 -0
  352. package/dist/tools/cron.js +299 -0
  353. package/dist/tools/cron.js.map +1 -0
  354. package/dist/tools/date.d.ts +24 -0
  355. package/dist/tools/date.js +26 -0
  356. package/dist/tools/date.js.map +1 -0
  357. package/dist/tools/dir-create.d.ts +21 -0
  358. package/dist/tools/dir-create.js +19 -0
  359. package/dist/tools/dir-create.js.map +1 -0
  360. package/dist/tools/dir-list.d.ts +36 -0
  361. package/dist/tools/dir-list.js +47 -0
  362. package/dist/tools/dir-list.js.map +1 -0
  363. package/dist/tools/disk-usage.d.ts +30 -0
  364. package/dist/tools/disk-usage.js +22 -0
  365. package/dist/tools/disk-usage.js.map +1 -0
  366. package/dist/tools/download-file.d.ts +28 -0
  367. package/dist/tools/download-file.js +42 -0
  368. package/dist/tools/download-file.js.map +1 -0
  369. package/dist/tools/environment.d.ts +31 -0
  370. package/dist/tools/environment.js +33 -0
  371. package/dist/tools/environment.js.map +1 -0
  372. package/dist/tools/errors.d.ts +5 -0
  373. package/dist/tools/errors.js +9 -0
  374. package/dist/tools/errors.js.map +1 -0
  375. package/dist/tools/file-copy.d.ts +34 -0
  376. package/dist/tools/file-copy.js +45 -0
  377. package/dist/tools/file-copy.js.map +1 -0
  378. package/dist/tools/file-delete.d.ts +34 -0
  379. package/dist/tools/file-delete.js +42 -0
  380. package/dist/tools/file-delete.js.map +1 -0
  381. package/dist/tools/file-find.d.ts +46 -0
  382. package/dist/tools/file-find.js +33 -0
  383. package/dist/tools/file-find.js.map +1 -0
  384. package/dist/tools/file-move.d.ts +33 -0
  385. package/dist/tools/file-move.js +32 -0
  386. package/dist/tools/file-move.js.map +1 -0
  387. package/dist/tools/files.d.ts +38 -0
  388. package/dist/tools/files.js +123 -0
  389. package/dist/tools/files.js.map +1 -0
  390. package/dist/tools/git-branch-delete.d.ts +27 -0
  391. package/dist/tools/git-branch-delete.js +25 -0
  392. package/dist/tools/git-branch-delete.js.map +1 -0
  393. package/dist/tools/git-reset.d.ts +30 -0
  394. package/dist/tools/git-reset.js +28 -0
  395. package/dist/tools/git-reset.js.map +1 -0
  396. package/dist/tools/git-stash.d.ts +28 -0
  397. package/dist/tools/git-stash.js +24 -0
  398. package/dist/tools/git-stash.js.map +1 -0
  399. package/dist/tools/git.d.ts +77 -0
  400. package/dist/tools/git.js +300 -0
  401. package/dist/tools/git.js.map +1 -0
  402. package/dist/tools/github.d.ts +68 -0
  403. package/dist/tools/github.js +77 -0
  404. package/dist/tools/github.js.map +1 -0
  405. package/dist/tools/head-tail.d.ts +34 -0
  406. package/dist/tools/head-tail.js +23 -0
  407. package/dist/tools/head-tail.js.map +1 -0
  408. package/dist/tools/http-request.d.ts +44 -0
  409. package/dist/tools/http-request.js +57 -0
  410. package/dist/tools/http-request.js.map +1 -0
  411. package/dist/tools/json-query.d.ts +27 -0
  412. package/dist/tools/json-query.js +90 -0
  413. package/dist/tools/json-query.js.map +1 -0
  414. package/dist/tools/kill-process.d.ts +32 -0
  415. package/dist/tools/kill-process.js +51 -0
  416. package/dist/tools/kill-process.js.map +1 -0
  417. package/dist/tools/lsp.d.ts +98 -0
  418. package/dist/tools/lsp.js +398 -0
  419. package/dist/tools/lsp.js.map +1 -0
  420. package/dist/tools/monitor.d.ts +29 -0
  421. package/dist/tools/monitor.js +78 -0
  422. package/dist/tools/monitor.js.map +1 -0
  423. package/dist/tools/network-check.d.ts +34 -0
  424. package/dist/tools/network-check.js +57 -0
  425. package/dist/tools/network-check.js.map +1 -0
  426. package/dist/tools/notebook.d.ts +63 -0
  427. package/dist/tools/notebook.js +158 -0
  428. package/dist/tools/notebook.js.map +1 -0
  429. package/dist/tools/plan-mode.d.ts +48 -0
  430. package/dist/tools/plan-mode.js +57 -0
  431. package/dist/tools/plan-mode.js.map +1 -0
  432. package/dist/tools/process-list.d.ts +35 -0
  433. package/dist/tools/process-list.js +42 -0
  434. package/dist/tools/process-list.js.map +1 -0
  435. package/dist/tools/registry.d.ts +132 -0
  436. package/dist/tools/registry.js +2262 -0
  437. package/dist/tools/registry.js.map +1 -0
  438. package/dist/tools/search.d.ts +38 -0
  439. package/dist/tools/search.js +327 -0
  440. package/dist/tools/search.js.map +1 -0
  441. package/dist/tools/shell.d.ts +18 -0
  442. package/dist/tools/shell.js +249 -0
  443. package/dist/tools/shell.js.map +1 -0
  444. package/dist/tools/skill-tool.d.ts +22 -0
  445. package/dist/tools/skill-tool.js +66 -0
  446. package/dist/tools/skill-tool.js.map +1 -0
  447. package/dist/tools/sleep.d.ts +16 -0
  448. package/dist/tools/sleep.js +24 -0
  449. package/dist/tools/sleep.js.map +1 -0
  450. package/dist/tools/snip.d.ts +26 -0
  451. package/dist/tools/snip.js +95 -0
  452. package/dist/tools/snip.js.map +1 -0
  453. package/dist/tools/system-info.d.ts +17 -0
  454. package/dist/tools/system-info.js +33 -0
  455. package/dist/tools/system-info.js.map +1 -0
  456. package/dist/tools/tasks.d.ts +191 -0
  457. package/dist/tools/tasks.js +348 -0
  458. package/dist/tools/tasks.js.map +1 -0
  459. package/dist/tools/text-stats.d.ts +25 -0
  460. package/dist/tools/text-stats.js +25 -0
  461. package/dist/tools/text-stats.js.map +1 -0
  462. package/dist/tools/todo.d.ts +69 -0
  463. package/dist/tools/todo.js +197 -0
  464. package/dist/tools/todo.js.map +1 -0
  465. package/dist/tools/tool-search.d.ts +29 -0
  466. package/dist/tools/tool-search.js +114 -0
  467. package/dist/tools/tool-search.js.map +1 -0
  468. package/dist/tools/tree-view.d.ts +34 -0
  469. package/dist/tools/tree-view.js +39 -0
  470. package/dist/tools/tree-view.js.map +1 -0
  471. package/dist/tools/user-message.d.ts +39 -0
  472. package/dist/tools/user-message.js +70 -0
  473. package/dist/tools/user-message.js.map +1 -0
  474. package/dist/tools/user-question.d.ts +88 -0
  475. package/dist/tools/user-question.js +236 -0
  476. package/dist/tools/user-question.js.map +1 -0
  477. package/dist/tools/web-browser.d.ts +53 -0
  478. package/dist/tools/web-browser.js +373 -0
  479. package/dist/tools/web-browser.js.map +1 -0
  480. package/dist/tools/web-fetch.d.ts +22 -0
  481. package/dist/tools/web-fetch.js +146 -0
  482. package/dist/tools/web-fetch.js.map +1 -0
  483. package/dist/tools/web-search.d.ts +51 -0
  484. package/dist/tools/web-search.js +198 -0
  485. package/dist/tools/web-search.js.map +1 -0
  486. package/dist/tools/which.d.ts +22 -0
  487. package/dist/tools/which.js +21 -0
  488. package/dist/tools/which.js.map +1 -0
  489. package/dist/tools/whoami.d.ts +17 -0
  490. package/dist/tools/whoami.js +24 -0
  491. package/dist/tools/whoami.js.map +1 -0
  492. package/dist/tools/workspace-diagnostics.d.ts +62 -0
  493. package/dist/tools/workspace-diagnostics.js +421 -0
  494. package/dist/tools/workspace-diagnostics.js.map +1 -0
  495. package/dist/tools/workspace.d.ts +14 -0
  496. package/dist/tools/workspace.js +65 -0
  497. package/dist/tools/workspace.js.map +1 -0
  498. package/dist/tools/worktree.d.ts +70 -0
  499. package/dist/tools/worktree.js +150 -0
  500. package/dist/tools/worktree.js.map +1 -0
  501. package/dist/tui/interactions.d.ts +25 -0
  502. package/dist/tui/interactions.js +232 -0
  503. package/dist/tui/interactions.js.map +1 -0
  504. package/dist/tui/multiline-input.d.ts +14 -0
  505. package/dist/tui/multiline-input.js +550 -0
  506. package/dist/tui/multiline-input.js.map +1 -0
  507. package/dist/tui/paste.d.ts +40 -0
  508. package/dist/tui/paste.js +113 -0
  509. package/dist/tui/paste.js.map +1 -0
  510. package/dist/tui/prompt-reader.d.ts +26 -0
  511. package/dist/tui/prompt-reader.js +553 -0
  512. package/dist/tui/prompt-reader.js.map +1 -0
  513. package/dist/tui/transcript.d.ts +34 -0
  514. package/dist/tui/transcript.js +275 -0
  515. package/dist/tui/transcript.js.map +1 -0
  516. package/dist/tui.d.ts +53 -0
  517. package/dist/tui.js +669 -0
  518. package/dist/tui.js.map +1 -0
  519. package/dist/version.d.ts +1 -0
  520. package/dist/version.js +2 -0
  521. package/dist/version.js.map +1 -0
  522. package/dist/vim/lineEditor.d.ts +18 -0
  523. package/dist/vim/lineEditor.js +420 -0
  524. package/dist/vim/lineEditor.js.map +1 -0
  525. package/dist/web/panel-html.d.ts +1 -0
  526. package/dist/web/panel-html.js +532 -0
  527. package/dist/web/panel-html.js.map +1 -0
  528. package/dist/web/panel.d.ts +4 -0
  529. package/dist/web/panel.js +121 -0
  530. package/dist/web/panel.js.map +1 -0
  531. package/package.json +42 -0
@@ -0,0 +1,145 @@
1
+ /**
2
+ * High-level OAuth orchestrator: glues the OAuth client, callback server,
3
+ * and SessionStore token persistence together.
4
+ *
5
+ * Usage:
6
+ *
7
+ * const result = await runOAuthFlow({
8
+ * serverName: "linear",
9
+ * authServerUrl: "https://auth.linear.app",
10
+ * scope: "read",
11
+ * store
12
+ * });
13
+ *
14
+ * // Browser opens, user authorizes, control returns here with the token saved.
15
+ */
16
+ import { spawn } from "node:child_process";
17
+ import { platform } from "node:os";
18
+ import { buildAuthorizationRequest, discoverOAuthMetadata, exchangeCodeForToken, refreshAccessToken, registerOAuthClient } from "./oauth.js";
19
+ import { startOAuthCallbackServer } from "./oauth-callback.js";
20
+ export async function runOAuthFlow(input) {
21
+ const metadata = await discoverOAuthMetadata(input.authServerUrl);
22
+ // Start the local callback server first so we know the redirect URI
23
+ const callback = await startOAuthCallbackServer({});
24
+ try {
25
+ let clientId = input.clientId;
26
+ let clientSecret = input.clientSecret;
27
+ if (!clientId) {
28
+ if (!metadata.registration_endpoint) {
29
+ throw new Error(`OAuth server at ${input.authServerUrl} does not support Dynamic Client Registration. ` +
30
+ `Configure a static client_id in mcp.servers.${input.serverName}.oauth.clientId`);
31
+ }
32
+ const registered = await registerOAuthClient({
33
+ registrationEndpoint: metadata.registration_endpoint,
34
+ redirectUri: callback.redirectUri,
35
+ clientName: `Magi Next (${input.serverName})`,
36
+ scope: input.scope
37
+ });
38
+ clientId = registered.clientId;
39
+ clientSecret = registered.clientSecret;
40
+ }
41
+ const auth = buildAuthorizationRequest({
42
+ metadata,
43
+ client: {
44
+ clientId: clientId,
45
+ clientSecret,
46
+ redirectUri: callback.redirectUri,
47
+ scope: input.scope
48
+ }
49
+ });
50
+ input.onAuthorizationUrl?.(auth.authorizationUrl);
51
+ if (!input.noBrowser) {
52
+ openBrowser(auth.authorizationUrl);
53
+ }
54
+ const callbackResult = await callback.result;
55
+ if (callbackResult.state !== auth.state) {
56
+ throw new Error("OAuth callback state mismatch (possible CSRF attempt)");
57
+ }
58
+ const token = await exchangeCodeForToken({
59
+ metadata,
60
+ client: {
61
+ clientId: clientId,
62
+ clientSecret,
63
+ redirectUri: callback.redirectUri,
64
+ scope: input.scope
65
+ },
66
+ code: callbackResult.code,
67
+ codeVerifier: auth.codeVerifier
68
+ });
69
+ const expiresAt = token.expires_in
70
+ ? new Date(Date.now() + token.expires_in * 1000).toISOString()
71
+ : undefined;
72
+ input.store.upsertMcpOAuthToken({
73
+ serverName: input.serverName,
74
+ accessToken: token.access_token,
75
+ refreshToken: token.refresh_token,
76
+ tokenType: token.token_type,
77
+ expiresAt,
78
+ scope: token.scope ?? input.scope,
79
+ authServerUrl: input.authServerUrl,
80
+ clientId,
81
+ metadata: { clientSecret: clientSecret ? "[REDACTED]" : undefined }
82
+ });
83
+ return {
84
+ serverName: input.serverName,
85
+ accessToken: token.access_token,
86
+ refreshToken: token.refresh_token,
87
+ expiresAt,
88
+ scope: token.scope ?? input.scope
89
+ };
90
+ }
91
+ finally {
92
+ callback.close();
93
+ }
94
+ }
95
+ /**
96
+ * Refresh a stored token if it has a refresh_token. Updates the stored record.
97
+ * Returns the new access token, or undefined if refresh is not possible.
98
+ */
99
+ export async function refreshStoredToken(input) {
100
+ const stored = input.store.getMcpOAuthToken(input.serverName);
101
+ if (!stored || !stored.refreshToken || !stored.authServerUrl || !stored.clientId) {
102
+ return undefined;
103
+ }
104
+ const metadata = await discoverOAuthMetadata(stored.authServerUrl);
105
+ const token = await refreshAccessToken({
106
+ metadata,
107
+ client: {
108
+ clientId: stored.clientId,
109
+ redirectUri: "http://127.0.0.1/oauth/callback",
110
+ scope: stored.scope
111
+ },
112
+ refreshToken: stored.refreshToken
113
+ });
114
+ const expiresAt = token.expires_in
115
+ ? new Date(Date.now() + token.expires_in * 1000).toISOString()
116
+ : undefined;
117
+ input.store.upsertMcpOAuthToken({
118
+ serverName: input.serverName,
119
+ accessToken: token.access_token,
120
+ refreshToken: token.refresh_token ?? stored.refreshToken,
121
+ tokenType: token.token_type,
122
+ expiresAt,
123
+ scope: token.scope ?? stored.scope,
124
+ authServerUrl: stored.authServerUrl,
125
+ clientId: stored.clientId
126
+ });
127
+ return token.access_token;
128
+ }
129
+ function openBrowser(url) {
130
+ const cmd = platform() === "darwin" ? "open" :
131
+ platform() === "win32" ? "start" :
132
+ "xdg-open";
133
+ try {
134
+ const child = spawn(cmd, platform() === "win32" ? ["", url] : [url], {
135
+ detached: true,
136
+ stdio: "ignore",
137
+ shell: platform() === "win32"
138
+ });
139
+ child.unref();
140
+ }
141
+ catch {
142
+ // Browser launch is best-effort; user can copy URL manually
143
+ }
144
+ }
145
+ //# sourceMappingURL=oauth-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-flow.js","sourceRoot":"","sources":["../../src/mcp/oauth-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * OAuth 2.0 Authorization Code flow with PKCE for MCP servers.
3
+ *
4
+ * MCP-spec OAuth: https://modelcontextprotocol.io/specification/draft/basic/authorization
5
+ * The MCP server returns 401 with `WWW-Authenticate: Bearer realm="<auth-server-url>"`
6
+ * pointing to an OAuth 2.0 Authorization Server. Discovery is via
7
+ * `/.well-known/oauth-authorization-server`.
8
+ */
9
+ export interface OAuthMetadata {
10
+ /** Authorization Server endpoint */
11
+ issuer: string;
12
+ authorization_endpoint: string;
13
+ token_endpoint: string;
14
+ /** Optional Dynamic Client Registration endpoint (RFC 7591) */
15
+ registration_endpoint?: string;
16
+ scopes_supported?: string[];
17
+ response_types_supported?: string[];
18
+ grant_types_supported?: string[];
19
+ code_challenge_methods_supported?: string[];
20
+ }
21
+ export interface OAuthClientConfig {
22
+ clientId: string;
23
+ clientSecret?: string;
24
+ redirectUri: string;
25
+ scope?: string;
26
+ }
27
+ export interface OAuthAuthorizationRequest {
28
+ authorizationUrl: string;
29
+ state: string;
30
+ codeVerifier: string;
31
+ }
32
+ export interface OAuthTokenResponse {
33
+ access_token: string;
34
+ token_type: string;
35
+ expires_in?: number;
36
+ refresh_token?: string;
37
+ scope?: string;
38
+ }
39
+ /** Discover OAuth metadata from the Authorization Server. */
40
+ export declare function discoverOAuthMetadata(authServerUrl: string): Promise<OAuthMetadata>;
41
+ /**
42
+ * Dynamic Client Registration (RFC 7591) — register this client with the
43
+ * Authorization Server when no static client_id is provided.
44
+ */
45
+ export declare function registerOAuthClient(input: {
46
+ registrationEndpoint: string;
47
+ redirectUri: string;
48
+ clientName?: string;
49
+ scope?: string;
50
+ }): Promise<{
51
+ clientId: string;
52
+ clientSecret?: string;
53
+ }>;
54
+ /**
55
+ * Build an authorization URL with PKCE.
56
+ * Caller must persist `state` and `codeVerifier` and pass them back when
57
+ * exchanging the code for a token.
58
+ */
59
+ export declare function buildAuthorizationRequest(input: {
60
+ metadata: OAuthMetadata;
61
+ client: OAuthClientConfig;
62
+ }): OAuthAuthorizationRequest;
63
+ /** Exchange the authorization code for an access token using PKCE. */
64
+ export declare function exchangeCodeForToken(input: {
65
+ metadata: OAuthMetadata;
66
+ client: OAuthClientConfig;
67
+ code: string;
68
+ codeVerifier: string;
69
+ }): Promise<OAuthTokenResponse>;
70
+ /** Refresh an access token using the refresh_token. */
71
+ export declare function refreshAccessToken(input: {
72
+ metadata: OAuthMetadata;
73
+ client: OAuthClientConfig;
74
+ refreshToken: string;
75
+ }): Promise<OAuthTokenResponse>;
76
+ /**
77
+ * Parse the WWW-Authenticate header from an MCP server 401 response.
78
+ * Returns the auth server URL ("realm" or "authorization_uri" parameter).
79
+ */
80
+ export declare function parseWwwAuthenticate(header: string | null): {
81
+ authServerUrl: string;
82
+ } | undefined;
@@ -0,0 +1,169 @@
1
+ /**
2
+ * OAuth 2.0 Authorization Code flow with PKCE for MCP servers.
3
+ *
4
+ * MCP-spec OAuth: https://modelcontextprotocol.io/specification/draft/basic/authorization
5
+ * The MCP server returns 401 with `WWW-Authenticate: Bearer realm="<auth-server-url>"`
6
+ * pointing to an OAuth 2.0 Authorization Server. Discovery is via
7
+ * `/.well-known/oauth-authorization-server`.
8
+ */
9
+ import { createHash, randomBytes } from "node:crypto";
10
+ /** Discover OAuth metadata from the Authorization Server. */
11
+ export async function discoverOAuthMetadata(authServerUrl) {
12
+ const base = authServerUrl.replace(/\/+$/, "");
13
+ const candidates = [
14
+ `${base}/.well-known/oauth-authorization-server`,
15
+ `${base}/.well-known/openid-configuration`
16
+ ];
17
+ for (const url of candidates) {
18
+ try {
19
+ const response = await fetch(url, { headers: { Accept: "application/json" } });
20
+ if (!response.ok)
21
+ continue;
22
+ const data = await response.json();
23
+ if (data.authorization_endpoint && data.token_endpoint) {
24
+ return {
25
+ issuer: data.issuer ?? base,
26
+ authorization_endpoint: data.authorization_endpoint,
27
+ token_endpoint: data.token_endpoint,
28
+ registration_endpoint: data.registration_endpoint,
29
+ scopes_supported: data.scopes_supported,
30
+ response_types_supported: data.response_types_supported,
31
+ grant_types_supported: data.grant_types_supported,
32
+ code_challenge_methods_supported: data.code_challenge_methods_supported
33
+ };
34
+ }
35
+ }
36
+ catch {
37
+ // Try next candidate
38
+ }
39
+ }
40
+ throw new Error(`Could not discover OAuth metadata at ${authServerUrl}`);
41
+ }
42
+ /**
43
+ * Dynamic Client Registration (RFC 7591) — register this client with the
44
+ * Authorization Server when no static client_id is provided.
45
+ */
46
+ export async function registerOAuthClient(input) {
47
+ const body = {
48
+ client_name: input.clientName ?? "Magi Next",
49
+ redirect_uris: [input.redirectUri],
50
+ grant_types: ["authorization_code", "refresh_token"],
51
+ response_types: ["code"],
52
+ token_endpoint_auth_method: "none",
53
+ scope: input.scope ?? ""
54
+ };
55
+ const response = await fetch(input.registrationEndpoint, {
56
+ method: "POST",
57
+ headers: { "Content-Type": "application/json", Accept: "application/json" },
58
+ body: JSON.stringify(body)
59
+ });
60
+ if (!response.ok) {
61
+ const text = await response.text();
62
+ throw new Error(`Dynamic Client Registration failed (${response.status}): ${text.slice(0, 200)}`);
63
+ }
64
+ const data = await response.json();
65
+ if (!data.client_id) {
66
+ throw new Error("Dynamic Client Registration response missing client_id");
67
+ }
68
+ return { clientId: data.client_id, clientSecret: data.client_secret };
69
+ }
70
+ /**
71
+ * Build an authorization URL with PKCE.
72
+ * Caller must persist `state` and `codeVerifier` and pass them back when
73
+ * exchanging the code for a token.
74
+ */
75
+ export function buildAuthorizationRequest(input) {
76
+ const codeVerifier = base64UrlEncode(randomBytes(32));
77
+ const codeChallenge = base64UrlEncode(createHash("sha256").update(codeVerifier).digest());
78
+ const state = base64UrlEncode(randomBytes(16));
79
+ const params = new URLSearchParams({
80
+ response_type: "code",
81
+ client_id: input.client.clientId,
82
+ redirect_uri: input.client.redirectUri,
83
+ state,
84
+ code_challenge: codeChallenge,
85
+ code_challenge_method: "S256"
86
+ });
87
+ if (input.client.scope) {
88
+ params.set("scope", input.client.scope);
89
+ }
90
+ const authorizationUrl = `${input.metadata.authorization_endpoint}?${params.toString()}`;
91
+ return { authorizationUrl, state, codeVerifier };
92
+ }
93
+ /** Exchange the authorization code for an access token using PKCE. */
94
+ export async function exchangeCodeForToken(input) {
95
+ const params = new URLSearchParams({
96
+ grant_type: "authorization_code",
97
+ code: input.code,
98
+ redirect_uri: input.client.redirectUri,
99
+ client_id: input.client.clientId,
100
+ code_verifier: input.codeVerifier
101
+ });
102
+ if (input.client.clientSecret) {
103
+ params.set("client_secret", input.client.clientSecret);
104
+ }
105
+ return performTokenRequest(input.metadata.token_endpoint, params);
106
+ }
107
+ /** Refresh an access token using the refresh_token. */
108
+ export async function refreshAccessToken(input) {
109
+ const params = new URLSearchParams({
110
+ grant_type: "refresh_token",
111
+ refresh_token: input.refreshToken,
112
+ client_id: input.client.clientId
113
+ });
114
+ if (input.client.clientSecret) {
115
+ params.set("client_secret", input.client.clientSecret);
116
+ }
117
+ return performTokenRequest(input.metadata.token_endpoint, params);
118
+ }
119
+ /**
120
+ * Parse the WWW-Authenticate header from an MCP server 401 response.
121
+ * Returns the auth server URL ("realm" or "authorization_uri" parameter).
122
+ */
123
+ export function parseWwwAuthenticate(header) {
124
+ if (!header)
125
+ return undefined;
126
+ // e.g. Bearer realm="https://auth.example.com", scope="mcp.read"
127
+ const bearer = /^\s*Bearer\b/i.test(header);
128
+ if (!bearer)
129
+ return undefined;
130
+ const match = /(?:realm|resource|authorization_uri|as_uri)="([^"]+)"/i.exec(header);
131
+ if (!match)
132
+ return undefined;
133
+ try {
134
+ new URL(match[1]);
135
+ return { authServerUrl: match[1] };
136
+ }
137
+ catch {
138
+ return undefined;
139
+ }
140
+ }
141
+ async function performTokenRequest(endpoint, params) {
142
+ const response = await fetch(endpoint, {
143
+ method: "POST",
144
+ headers: {
145
+ "Content-Type": "application/x-www-form-urlencoded",
146
+ Accept: "application/json"
147
+ },
148
+ body: params.toString()
149
+ });
150
+ const text = await response.text();
151
+ if (!response.ok) {
152
+ throw new Error(`Token endpoint returned ${response.status}: ${text.slice(0, 200)}`);
153
+ }
154
+ let data;
155
+ try {
156
+ data = JSON.parse(text);
157
+ }
158
+ catch {
159
+ throw new Error(`Token endpoint returned non-JSON: ${text.slice(0, 200)}`);
160
+ }
161
+ if (!data.access_token) {
162
+ throw new Error("Token endpoint response missing access_token");
163
+ }
164
+ return data;
165
+ }
166
+ function base64UrlEncode(buffer) {
167
+ return buffer.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
168
+ }
169
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/mcp/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAoCtD,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,aAAqB;IAC/D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG;QACjB,GAAG,IAAI,yCAAyC;QAChD,GAAG,IAAI,mCAAmC;KAC3C,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAC/E,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,SAAS;YAC3B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA4B,CAAC;YAC7D,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACvD,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;oBAC3B,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;oBACnD,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;oBACjD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;oBACvC,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;oBACvD,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;oBACjD,gCAAgC,EAAE,IAAI,CAAC,gCAAgC;iBACxE,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,aAAa,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAKzC;IACC,MAAM,IAAI,GAAG;QACX,WAAW,EAAE,KAAK,CAAC,UAAU,IAAI,WAAW;QAC5C,aAAa,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC;QAClC,WAAW,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;QACpD,cAAc,EAAE,CAAC,MAAM,CAAC;QACxB,0BAA0B,EAAE,MAAM;QAClC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;KACzB,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,oBAAoB,EAAE;QACvD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,EAAE;QAC3E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,CAAC,MAAM,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAoD,CAAC;IACrF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACxE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAGzC;IACC,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;QAChC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;QACtC,KAAK;QACL,cAAc,EAAE,aAAa;QAC7B,qBAAqB,EAAE,MAAM;KAC9B,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,gBAAgB,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,sBAAsB,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IACzF,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AACnD,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAK1C;IACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,UAAU,EAAE,oBAAoB;QAChC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;QACtC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;QAChC,aAAa,EAAE,KAAK,CAAC,YAAY;KAClC,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAIxC;IACC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,UAAU,EAAE,eAAe;QAC3B,aAAa,EAAE,KAAK,CAAC,YAAY;QACjC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;KACjC,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAqB;IACxD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,iEAAiE;IACjE,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,KAAK,GAAG,wDAAwD,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpF,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,QAAgB,EAAE,MAAuB;IAC1E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QACrC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,mCAAmC;YACnD,MAAM,EAAE,kBAAkB;SAC3B;QACD,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;KACxB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,IAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { McpServerConfig } from "../config.js";
2
+ import { MagiToolDefinition, MagiToolUsePart } from "../providers/ir.js";
3
+ import { AgentToolResult } from "../agent/tools.js";
4
+ export interface McpToolRegistryInput {
5
+ servers: Record<string, McpServerConfig>;
6
+ env?: NodeJS.ProcessEnv;
7
+ healthCheckIntervalMs?: number;
8
+ tokenLookup?: (serverName: string) => string | undefined;
9
+ tokenRefresh?: (serverName: string) => Promise<string | undefined>;
10
+ }
11
+ export declare class McpToolRegistry {
12
+ private readonly input;
13
+ private readonly manager;
14
+ private readonly toolsByName;
15
+ private discovered;
16
+ constructor(input: McpToolRegistryInput);
17
+ getToolDefinitions(): Promise<MagiToolDefinition[]>;
18
+ hasTool(name: string): boolean;
19
+ executeTool(input: {
20
+ toolUse: MagiToolUsePart;
21
+ approved?: boolean;
22
+ }): Promise<AgentToolResult>;
23
+ private listResources;
24
+ private readResource;
25
+ close(): void;
26
+ private discover;
27
+ private client;
28
+ }
29
+ export declare function toMcpToolName(serverName: string, toolName: string): string;
@@ -0,0 +1,207 @@
1
+ import { McpApprovalRequiredError, McpJsonRpcError } from "./client.js";
2
+ import { McpConnectionManager } from "./connection-manager.js";
3
+ export class McpToolRegistry {
4
+ input;
5
+ manager;
6
+ toolsByName = new Map();
7
+ discovered = false;
8
+ constructor(input) {
9
+ this.input = input;
10
+ this.manager = new McpConnectionManager({
11
+ servers: input.servers,
12
+ env: input.env,
13
+ healthCheckIntervalMs: input.healthCheckIntervalMs ?? 60_000,
14
+ tokenLookup: input.tokenLookup,
15
+ tokenRefresh: input.tokenRefresh
16
+ });
17
+ }
18
+ async getToolDefinitions() {
19
+ await this.discover();
20
+ return [
21
+ ...MCP_RESOURCE_TOOLS,
22
+ ...[...this.toolsByName.entries()].map(([name, record]) => ({
23
+ name,
24
+ description: record.tool.description,
25
+ inputSchema: record.tool.inputSchema ?? { type: "object" }
26
+ }))
27
+ ];
28
+ }
29
+ hasTool(name) {
30
+ return name === "ListMcpResources" || name === "ReadMcpResource" || this.toolsByName.has(name);
31
+ }
32
+ async executeTool(input) {
33
+ await this.discover();
34
+ if (input.toolUse.name === "ListMcpResources") {
35
+ return this.listResources(input.toolUse);
36
+ }
37
+ if (input.toolUse.name === "ReadMcpResource") {
38
+ return this.readResource(input.toolUse);
39
+ }
40
+ const record = this.toolsByName.get(input.toolUse.name);
41
+ if (!record) {
42
+ return {
43
+ toolCallId: input.toolUse.id,
44
+ toolName: input.toolUse.name,
45
+ content: `Unknown MCP tool: ${input.toolUse.name}`,
46
+ isError: true
47
+ };
48
+ }
49
+ const client = await this.client(record.serverName);
50
+ try {
51
+ const result = await client.callTool({
52
+ toolName: record.originalName,
53
+ params: input.toolUse.input,
54
+ approved: input.approved
55
+ });
56
+ return {
57
+ toolCallId: input.toolUse.id,
58
+ toolName: input.toolUse.name,
59
+ content: formatMcpToolContent(result.content)
60
+ };
61
+ }
62
+ catch (error) {
63
+ if (error instanceof McpApprovalRequiredError) {
64
+ return {
65
+ toolCallId: input.toolUse.id,
66
+ toolName: input.toolUse.name,
67
+ content: error.message,
68
+ isError: true,
69
+ permission: { decision: "ask", reason: error.approval.reason }
70
+ };
71
+ }
72
+ if (error instanceof McpJsonRpcError && error.code === -32042) {
73
+ return {
74
+ toolCallId: input.toolUse.id,
75
+ toolName: input.toolUse.name,
76
+ content: `MCP auth required for ${record.serverName}/${record.originalName}`,
77
+ isError: true,
78
+ retryable: true
79
+ };
80
+ }
81
+ return {
82
+ toolCallId: input.toolUse.id,
83
+ toolName: input.toolUse.name,
84
+ content: error instanceof Error ? error.message : String(error),
85
+ isError: true
86
+ };
87
+ }
88
+ }
89
+ async listResources(toolUse) {
90
+ const servers = readOptionalString(toolUse.input.server)
91
+ ? [readString(toolUse.input.server, "server")]
92
+ : Object.keys(this.input.servers);
93
+ const lines = [];
94
+ for (const serverName of servers) {
95
+ const client = await this.client(serverName);
96
+ const resources = await client.listResources();
97
+ for (const resource of resources) {
98
+ lines.push([
99
+ `${serverName}: ${resource.uri}`,
100
+ resource.name ? `name=${resource.name}` : undefined,
101
+ resource.mimeType ? `mime=${resource.mimeType}` : undefined,
102
+ resource.description ? `description=${resource.description}` : undefined
103
+ ].filter((part) => Boolean(part)).join(" | "));
104
+ }
105
+ }
106
+ return {
107
+ toolCallId: toolUse.id,
108
+ toolName: toolUse.name,
109
+ content: lines.length === 0 ? "No MCP resources" : lines.join("\n")
110
+ };
111
+ }
112
+ async readResource(toolUse) {
113
+ const serverName = readString(toolUse.input.server, "server");
114
+ const uri = readString(toolUse.input.uri, "uri");
115
+ const client = await this.client(serverName);
116
+ const result = await client.readResource(uri);
117
+ return {
118
+ toolCallId: toolUse.id,
119
+ toolName: toolUse.name,
120
+ content: result.contents.length === 0
121
+ ? `No content for ${uri}`
122
+ : result.contents.map((content) => [
123
+ content.uri ? `uri: ${content.uri}` : undefined,
124
+ content.mimeType ? `mime: ${content.mimeType}` : undefined,
125
+ content.text ?? content.blob ?? ""
126
+ ].filter((part) => Boolean(part)).join("\n")).join("\n\n")
127
+ };
128
+ }
129
+ close() {
130
+ this.manager.disconnectAll();
131
+ }
132
+ async discover() {
133
+ if (this.discovered) {
134
+ return;
135
+ }
136
+ for (const [serverName] of Object.entries(this.input.servers)) {
137
+ const client = await this.client(serverName);
138
+ const tools = await client.listTools();
139
+ for (const tool of tools) {
140
+ this.toolsByName.set(toMcpToolName(serverName, tool.name), {
141
+ serverName,
142
+ originalName: tool.name,
143
+ tool
144
+ });
145
+ }
146
+ }
147
+ this.discovered = true;
148
+ }
149
+ async client(serverName) {
150
+ return this.manager.connect(serverName);
151
+ }
152
+ }
153
+ export function toMcpToolName(serverName, toolName) {
154
+ return `mcp__${serverName}__${toolName}`;
155
+ }
156
+ const MCP_RESOURCE_TOOLS = [
157
+ {
158
+ name: "ListMcpResources",
159
+ description: "List resources exposed by configured MCP servers.",
160
+ inputSchema: {
161
+ type: "object",
162
+ properties: {
163
+ server: { type: "string", description: "Optional MCP server name to filter resources." }
164
+ },
165
+ additionalProperties: false
166
+ }
167
+ },
168
+ {
169
+ name: "ReadMcpResource",
170
+ description: "Read a resource by URI from a configured MCP server.",
171
+ inputSchema: {
172
+ type: "object",
173
+ properties: {
174
+ server: { type: "string" },
175
+ uri: { type: "string" }
176
+ },
177
+ required: ["server", "uri"],
178
+ additionalProperties: false
179
+ }
180
+ }
181
+ ];
182
+ function formatMcpToolContent(value) {
183
+ if (typeof value === "string") {
184
+ return value;
185
+ }
186
+ if (isRecord(value) && Array.isArray(value.content)) {
187
+ const text = value.content
188
+ .filter(isRecord)
189
+ .map((part) => typeof part.text === "string" ? part.text : JSON.stringify(part))
190
+ .join("\n");
191
+ return text || JSON.stringify(value);
192
+ }
193
+ return JSON.stringify(value);
194
+ }
195
+ function isRecord(value) {
196
+ return typeof value === "object" && value !== null && !Array.isArray(value);
197
+ }
198
+ function readString(value, field) {
199
+ if (typeof value !== "string" || !value.trim()) {
200
+ throw new Error(`MCP tool input ${field} must be a non-empty string`);
201
+ }
202
+ return value;
203
+ }
204
+ function readOptionalString(value) {
205
+ return typeof value === "string" && value.trim() ? value : undefined;
206
+ }
207
+ //# sourceMappingURL=tool-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/mcp/tool-registry.ts"],"names":[],"mappings":"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"}