@loompad/cli 0.1.0 → 1.1.1

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 (687) hide show
  1. package/ARCHITECTURE.md +96 -11
  2. package/CHANGELOG.md +1042 -0
  3. package/README.md +1473 -44
  4. package/THIRD_PARTY_NOTICES.md +275 -0
  5. package/dist/adapters/antigravity-cli.d.ts +62 -0
  6. package/dist/adapters/antigravity-cli.js +258 -0
  7. package/dist/adapters/antigravity-cli.js.map +1 -0
  8. package/dist/adapters/base.d.ts +61 -9
  9. package/dist/adapters/base.js +266 -15
  10. package/dist/adapters/base.js.map +1 -1
  11. package/dist/adapters/bridges/antigravity.d.ts +9 -12
  12. package/dist/adapters/bridges/antigravity.js +9 -12
  13. package/dist/adapters/bridges/antigravity.js.map +1 -1
  14. package/dist/adapters/echo.d.ts +1 -0
  15. package/dist/adapters/echo.js +59 -3
  16. package/dist/adapters/echo.js.map +1 -1
  17. package/dist/adapters/grok.d.ts +7 -0
  18. package/dist/adapters/grok.js +20 -10
  19. package/dist/adapters/grok.js.map +1 -1
  20. package/dist/adapters/index.d.ts +5 -1
  21. package/dist/adapters/index.js +53 -7
  22. package/dist/adapters/index.js.map +1 -1
  23. package/dist/adapters/model.d.ts +137 -0
  24. package/dist/adapters/model.js +527 -0
  25. package/dist/adapters/model.js.map +1 -0
  26. package/dist/adapters/opencode.d.ts +101 -1
  27. package/dist/adapters/opencode.js +874 -98
  28. package/dist/adapters/opencode.js.map +1 -1
  29. package/dist/cli/doctor.d.ts +32 -0
  30. package/dist/cli/doctor.js +89 -4
  31. package/dist/cli/doctor.js.map +1 -1
  32. package/dist/cli/index.js +2651 -87
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/tui-model.js +3 -1
  35. package/dist/cli/tui-model.js.map +1 -1
  36. package/dist/cli/tui.js +44 -1
  37. package/dist/cli/tui.js.map +1 -1
  38. package/dist/cli/ui.d.ts +2 -0
  39. package/dist/cli/ui.js +13 -0
  40. package/dist/cli/ui.js.map +1 -1
  41. package/dist/core/ades.d.ts +32 -16
  42. package/dist/core/ades.js +57 -20
  43. package/dist/core/ades.js.map +1 -1
  44. package/dist/core/agent-state.d.ts +14 -0
  45. package/dist/core/agent-state.js +32 -0
  46. package/dist/core/agent-state.js.map +1 -0
  47. package/dist/core/approvals.d.ts +33 -0
  48. package/dist/core/approvals.js +29 -0
  49. package/dist/core/approvals.js.map +1 -0
  50. package/dist/core/backup.d.ts +19 -0
  51. package/dist/core/backup.js +86 -0
  52. package/dist/core/backup.js.map +1 -0
  53. package/dist/core/baton.d.ts +2 -2
  54. package/dist/core/baton.js.map +1 -1
  55. package/dist/core/brain-extract.d.ts +17 -0
  56. package/dist/core/brain-extract.js +28 -2
  57. package/dist/core/brain-extract.js.map +1 -1
  58. package/dist/core/brain-index.d.ts +71 -0
  59. package/dist/core/brain-index.js +204 -5
  60. package/dist/core/brain-index.js.map +1 -1
  61. package/dist/core/brain.d.ts +58 -2
  62. package/dist/core/brain.js +79 -1
  63. package/dist/core/brain.js.map +1 -1
  64. package/dist/core/chat-import.d.ts +71 -0
  65. package/dist/core/chat-import.js +419 -0
  66. package/dist/core/chat-import.js.map +1 -0
  67. package/dist/core/checkpoint.d.ts +107 -0
  68. package/dist/core/checkpoint.js +259 -0
  69. package/dist/core/checkpoint.js.map +1 -0
  70. package/dist/core/claude-cli.js +1 -1
  71. package/dist/core/claude-cli.js.map +1 -1
  72. package/dist/core/continuity/artifacts.d.ts +14 -0
  73. package/dist/core/continuity/artifacts.js +118 -0
  74. package/dist/core/continuity/artifacts.js.map +1 -0
  75. package/dist/core/continuity/capabilities.d.ts +65 -0
  76. package/dist/core/continuity/capabilities.js +129 -0
  77. package/dist/core/continuity/capabilities.js.map +1 -0
  78. package/dist/core/continuity/contracts.d.ts +352 -0
  79. package/dist/core/continuity/contracts.js +117 -0
  80. package/dist/core/continuity/contracts.js.map +1 -0
  81. package/dist/core/continuity/engine.d.ts +55 -0
  82. package/dist/core/continuity/engine.js +504 -0
  83. package/dist/core/continuity/engine.js.map +1 -0
  84. package/dist/core/continuity/store.d.ts +73 -0
  85. package/dist/core/continuity/store.js +438 -0
  86. package/dist/core/continuity/store.js.map +1 -0
  87. package/dist/core/conversations.d.ts +19 -0
  88. package/dist/core/conversations.js +87 -0
  89. package/dist/core/conversations.js.map +1 -0
  90. package/dist/core/crew-coordination.d.ts +6 -0
  91. package/dist/core/crew-coordination.js +24 -0
  92. package/dist/core/crew-coordination.js.map +1 -0
  93. package/dist/core/crew-policy.d.ts +18 -0
  94. package/dist/core/crew-policy.js +40 -0
  95. package/dist/core/crew-policy.js.map +1 -0
  96. package/dist/core/crew-protocol.d.ts +64 -0
  97. package/dist/core/crew-protocol.js +146 -0
  98. package/dist/core/crew-protocol.js.map +1 -0
  99. package/dist/core/crew-requests.d.ts +14 -0
  100. package/dist/core/crew-requests.js +22 -0
  101. package/dist/core/crew-requests.js.map +1 -0
  102. package/dist/core/crew.d.ts +395 -0
  103. package/dist/core/crew.js +1857 -0
  104. package/dist/core/crew.js.map +1 -0
  105. package/dist/core/digest.d.ts +40 -0
  106. package/dist/core/digest.js +94 -0
  107. package/dist/core/digest.js.map +1 -0
  108. package/dist/core/distill.js +3 -5
  109. package/dist/core/distill.js.map +1 -1
  110. package/dist/core/eventlog.d.ts +27 -25
  111. package/dist/core/eventlog.js +97 -150
  112. package/dist/core/eventlog.js.map +1 -1
  113. package/dist/core/events/contracts.d.ts +51 -0
  114. package/dist/core/events/contracts.js +2 -0
  115. package/dist/core/events/contracts.js.map +1 -0
  116. package/dist/core/events/jsonl-store.d.ts +23 -0
  117. package/dist/core/events/jsonl-store.js +90 -0
  118. package/dist/core/events/jsonl-store.js.map +1 -0
  119. package/dist/core/events/sqlite-store.d.ts +37 -0
  120. package/dist/core/events/sqlite-store.js +215 -0
  121. package/dist/core/events/sqlite-store.js.map +1 -0
  122. package/dist/core/forecast.d.ts +44 -0
  123. package/dist/core/forecast.js +46 -0
  124. package/dist/core/forecast.js.map +1 -0
  125. package/dist/core/free-pool.d.ts +65 -0
  126. package/dist/core/free-pool.js +171 -0
  127. package/dist/core/free-pool.js.map +1 -0
  128. package/dist/core/git.d.ts +30 -0
  129. package/dist/core/git.js +50 -2
  130. package/dist/core/git.js.map +1 -1
  131. package/dist/core/github-events.d.ts +53 -0
  132. package/dist/core/github-events.js +227 -0
  133. package/dist/core/github-events.js.map +1 -0
  134. package/dist/core/goal-lanes.d.ts +53 -0
  135. package/dist/core/goal-lanes.js +99 -0
  136. package/dist/core/goal-lanes.js.map +1 -0
  137. package/dist/core/hosted.d.ts +27 -0
  138. package/dist/core/hosted.js +50 -0
  139. package/dist/core/hosted.js.map +1 -0
  140. package/dist/core/http-server.d.ts +5 -0
  141. package/dist/core/http-server.js +8 -0
  142. package/dist/core/http-server.js.map +1 -0
  143. package/dist/core/invite-link.d.ts +31 -0
  144. package/dist/core/invite-link.js +45 -0
  145. package/dist/core/invite-link.js.map +1 -0
  146. package/dist/core/loops.d.ts +37 -0
  147. package/dist/core/loops.js +81 -0
  148. package/dist/core/loops.js.map +1 -0
  149. package/dist/core/mcp-catalog.d.ts +182 -0
  150. package/dist/core/mcp-catalog.js +431 -0
  151. package/dist/core/mcp-catalog.js.map +1 -0
  152. package/dist/core/mcp.d.ts +87 -0
  153. package/dist/core/mcp.js +181 -0
  154. package/dist/core/mcp.js.map +1 -0
  155. package/dist/core/memory.d.ts +1 -0
  156. package/dist/core/memory.js +5 -2
  157. package/dist/core/memory.js.map +1 -1
  158. package/dist/core/model-tools.d.ts +97 -0
  159. package/dist/core/model-tools.js +388 -0
  160. package/dist/core/model-tools.js.map +1 -0
  161. package/dist/core/notify.js +19 -1
  162. package/dist/core/notify.js.map +1 -1
  163. package/dist/core/orchestra.d.ts +635 -0
  164. package/dist/core/orchestra.js +2120 -0
  165. package/dist/core/orchestra.js.map +1 -0
  166. package/dist/core/permissions.d.ts +56 -0
  167. package/dist/core/permissions.js +122 -0
  168. package/dist/core/permissions.js.map +1 -0
  169. package/dist/core/preview-proxy.d.ts +70 -0
  170. package/dist/core/preview-proxy.js +563 -0
  171. package/dist/core/preview-proxy.js.map +1 -0
  172. package/dist/core/preview-shot.d.ts +46 -0
  173. package/dist/core/preview-shot.js +109 -0
  174. package/dist/core/preview-shot.js.map +1 -0
  175. package/dist/core/process.d.ts +36 -0
  176. package/dist/core/process.js +168 -0
  177. package/dist/core/process.js.map +1 -0
  178. package/dist/core/prompt-queue.d.ts +136 -0
  179. package/dist/core/prompt-queue.js +269 -0
  180. package/dist/core/prompt-queue.js.map +1 -0
  181. package/dist/core/prompts.d.ts +53 -0
  182. package/dist/core/prompts.js +127 -0
  183. package/dist/core/prompts.js.map +1 -0
  184. package/dist/core/proof.d.ts +82 -0
  185. package/dist/core/proof.js +216 -0
  186. package/dist/core/proof.js.map +1 -0
  187. package/dist/core/provider-text.d.ts +23 -0
  188. package/dist/core/provider-text.js +66 -0
  189. package/dist/core/provider-text.js.map +1 -0
  190. package/dist/core/providers.d.ts +152 -0
  191. package/dist/core/providers.js +343 -0
  192. package/dist/core/providers.js.map +1 -0
  193. package/dist/core/quota.d.ts +33 -0
  194. package/dist/core/quota.js +74 -0
  195. package/dist/core/quota.js.map +1 -0
  196. package/dist/core/recipes.d.ts +50 -0
  197. package/dist/core/recipes.js +99 -0
  198. package/dist/core/recipes.js.map +1 -0
  199. package/dist/core/registry.d.ts +54 -0
  200. package/dist/core/registry.js +62 -5
  201. package/dist/core/registry.js.map +1 -1
  202. package/dist/core/relay-client.d.ts +67 -0
  203. package/dist/core/relay-client.js +184 -0
  204. package/dist/core/relay-client.js.map +1 -0
  205. package/dist/core/relay-protocol.d.ts +140 -0
  206. package/dist/core/relay-protocol.js +189 -0
  207. package/dist/core/relay-protocol.js.map +1 -0
  208. package/dist/core/replay.d.ts +18 -0
  209. package/dist/core/replay.js +191 -0
  210. package/dist/core/replay.js.map +1 -0
  211. package/dist/core/review-triage.d.ts +41 -0
  212. package/dist/core/review-triage.js +124 -0
  213. package/dist/core/review-triage.js.map +1 -0
  214. package/dist/core/router.js +2 -2
  215. package/dist/core/router.js.map +1 -1
  216. package/dist/core/routes.d.ts +39 -3
  217. package/dist/core/routes.js +137 -4
  218. package/dist/core/routes.js.map +1 -1
  219. package/dist/core/run-command.d.ts +14 -0
  220. package/dist/core/run-command.js +45 -0
  221. package/dist/core/run-command.js.map +1 -0
  222. package/dist/core/runner-setup.d.ts +36 -0
  223. package/dist/core/runner-setup.js +114 -0
  224. package/dist/core/runner-setup.js.map +1 -0
  225. package/dist/core/search.js +0 -0
  226. package/dist/core/search.js.map +1 -1
  227. package/dist/core/semantic.d.ts +92 -0
  228. package/dist/core/semantic.js +227 -0
  229. package/dist/core/semantic.js.map +1 -0
  230. package/dist/core/servers.d.ts +115 -0
  231. package/dist/core/servers.js +305 -0
  232. package/dist/core/servers.js.map +1 -0
  233. package/dist/core/setup.js +64 -6
  234. package/dist/core/setup.js.map +1 -1
  235. package/dist/core/shield.d.ts +17 -0
  236. package/dist/core/shield.js +81 -0
  237. package/dist/core/shield.js.map +1 -0
  238. package/dist/core/shift.d.ts +69 -0
  239. package/dist/core/shift.js +120 -0
  240. package/dist/core/shift.js.map +1 -0
  241. package/dist/core/skill-install.d.ts +125 -0
  242. package/dist/core/skill-install.js +328 -0
  243. package/dist/core/skill-install.js.map +1 -0
  244. package/dist/core/skills.d.ts +116 -0
  245. package/dist/core/skills.js +223 -0
  246. package/dist/core/skills.js.map +1 -0
  247. package/dist/core/step-conditions.d.ts +65 -0
  248. package/dist/core/step-conditions.js +102 -0
  249. package/dist/core/step-conditions.js.map +1 -0
  250. package/dist/core/subagents.d.ts +45 -0
  251. package/dist/core/subagents.js +90 -0
  252. package/dist/core/subagents.js.map +1 -0
  253. package/dist/core/team-canon.d.ts +42 -0
  254. package/dist/core/team-canon.js +121 -0
  255. package/dist/core/team-canon.js.map +1 -0
  256. package/dist/core/team-crypto.d.ts +97 -0
  257. package/dist/core/team-crypto.js +175 -0
  258. package/dist/core/team-crypto.js.map +1 -0
  259. package/dist/core/team-hub.d.ts +514 -0
  260. package/dist/core/team-hub.js +964 -0
  261. package/dist/core/team-hub.js.map +1 -0
  262. package/dist/core/team-landing.d.ts +239 -0
  263. package/dist/core/team-landing.js +504 -0
  264. package/dist/core/team-landing.js.map +1 -0
  265. package/dist/core/team-leases.d.ts +44 -0
  266. package/dist/core/team-leases.js +145 -0
  267. package/dist/core/team-leases.js.map +1 -0
  268. package/dist/core/team-memory.d.ts +42 -0
  269. package/dist/core/team-memory.js +84 -0
  270. package/dist/core/team-memory.js.map +1 -0
  271. package/dist/core/team-policy.d.ts +85 -0
  272. package/dist/core/team-policy.js +191 -0
  273. package/dist/core/team-policy.js.map +1 -0
  274. package/dist/core/thread-md.d.ts +6 -0
  275. package/dist/core/thread-md.js +42 -0
  276. package/dist/core/thread-md.js.map +1 -0
  277. package/dist/core/turn-stats.d.ts +61 -0
  278. package/dist/core/turn-stats.js +124 -0
  279. package/dist/core/turn-stats.js.map +1 -0
  280. package/dist/core/updater.d.ts +73 -0
  281. package/dist/core/updater.js +153 -0
  282. package/dist/core/updater.js.map +1 -0
  283. package/dist/core/usage.d.ts +75 -0
  284. package/dist/core/usage.js +163 -0
  285. package/dist/core/usage.js.map +1 -0
  286. package/dist/core/windows-jobs.d.ts +15 -0
  287. package/dist/core/windows-jobs.js +170 -0
  288. package/dist/core/windows-jobs.js.map +1 -0
  289. package/dist/core/worktree-merge.d.ts +57 -0
  290. package/dist/core/worktree-merge.js +123 -0
  291. package/dist/core/worktree-merge.js.map +1 -0
  292. package/dist/core/worktree.d.ts +5 -0
  293. package/dist/core/worktree.js +45 -5
  294. package/dist/core/worktree.js.map +1 -1
  295. package/dist/core/worktrees.d.ts +6 -0
  296. package/dist/core/worktrees.js +21 -0
  297. package/dist/core/worktrees.js.map +1 -0
  298. package/dist/daemon/app-page.d.ts +0 -17
  299. package/dist/daemon/app-page.js +10 -6346
  300. package/dist/daemon/app-page.js.map +1 -1
  301. package/dist/daemon/auth.d.ts +24 -3
  302. package/dist/daemon/auth.js +66 -7
  303. package/dist/daemon/auth.js.map +1 -1
  304. package/dist/daemon/board.d.ts +7 -0
  305. package/dist/daemon/board.js +12 -1
  306. package/dist/daemon/board.js.map +1 -1
  307. package/dist/daemon/brand-icons.d.ts +6 -1
  308. package/dist/daemon/brand-icons.js +11 -3
  309. package/dist/daemon/brand-icons.js.map +1 -1
  310. package/dist/daemon/client.d.ts +665 -1
  311. package/dist/daemon/client.js +381 -3
  312. package/dist/daemon/client.js.map +1 -1
  313. package/dist/daemon/delivery.d.ts +34 -0
  314. package/dist/daemon/delivery.js +63 -0
  315. package/dist/daemon/delivery.js.map +1 -0
  316. package/dist/daemon/deploys.d.ts +62 -0
  317. package/dist/daemon/deploys.js +159 -0
  318. package/dist/daemon/deploys.js.map +1 -0
  319. package/dist/daemon/landing.d.ts +192 -0
  320. package/dist/daemon/landing.js +992 -0
  321. package/dist/daemon/landing.js.map +1 -0
  322. package/dist/daemon/onboard.d.ts +150 -0
  323. package/dist/daemon/onboard.js +390 -0
  324. package/dist/daemon/onboard.js.map +1 -0
  325. package/dist/daemon/proof.d.ts +70 -0
  326. package/dist/daemon/proof.js +172 -0
  327. package/dist/daemon/proof.js.map +1 -0
  328. package/dist/daemon/push.d.ts +19 -1
  329. package/dist/daemon/push.js +90 -3
  330. package/dist/daemon/push.js.map +1 -1
  331. package/dist/daemon/relay.d.ts +82 -0
  332. package/dist/daemon/relay.js +351 -0
  333. package/dist/daemon/relay.js.map +1 -0
  334. package/dist/daemon/routes/agent-discovery.d.ts +4 -0
  335. package/dist/daemon/routes/agent-discovery.js +29 -0
  336. package/dist/daemon/routes/agent-discovery.js.map +1 -0
  337. package/dist/daemon/routes/agent-settings.d.ts +4 -0
  338. package/dist/daemon/routes/agent-settings.js +94 -0
  339. package/dist/daemon/routes/agent-settings.js.map +1 -0
  340. package/dist/daemon/routes/agents.d.ts +4 -0
  341. package/dist/daemon/routes/agents.js +105 -0
  342. package/dist/daemon/routes/agents.js.map +1 -0
  343. package/dist/daemon/routes/alerts.d.ts +4 -0
  344. package/dist/daemon/routes/alerts.js +137 -0
  345. package/dist/daemon/routes/alerts.js.map +1 -0
  346. package/dist/daemon/routes/approvals.d.ts +4 -0
  347. package/dist/daemon/routes/approvals.js +40 -0
  348. package/dist/daemon/routes/approvals.js.map +1 -0
  349. package/dist/daemon/routes/assets.d.ts +3 -0
  350. package/dist/daemon/routes/assets.js +64 -0
  351. package/dist/daemon/routes/assets.js.map +1 -0
  352. package/dist/daemon/routes/board.d.ts +4 -0
  353. package/dist/daemon/routes/board.js +147 -0
  354. package/dist/daemon/routes/board.js.map +1 -0
  355. package/dist/daemon/routes/brain.d.ts +4 -0
  356. package/dist/daemon/routes/brain.js +270 -0
  357. package/dist/daemon/routes/brain.js.map +1 -0
  358. package/dist/daemon/routes/chats.d.ts +4 -0
  359. package/dist/daemon/routes/chats.js +249 -0
  360. package/dist/daemon/routes/chats.js.map +1 -0
  361. package/dist/daemon/routes/clients.d.ts +4 -0
  362. package/dist/daemon/routes/clients.js +49 -0
  363. package/dist/daemon/routes/clients.js.map +1 -0
  364. package/dist/daemon/routes/cloud.d.ts +4 -0
  365. package/dist/daemon/routes/cloud.js +46 -0
  366. package/dist/daemon/routes/cloud.js.map +1 -0
  367. package/dist/daemon/routes/config.d.ts +4 -0
  368. package/dist/daemon/routes/config.js +35 -0
  369. package/dist/daemon/routes/config.js.map +1 -0
  370. package/dist/daemon/routes/context.d.ts +51 -0
  371. package/dist/daemon/routes/context.js +2 -0
  372. package/dist/daemon/routes/context.js.map +1 -0
  373. package/dist/daemon/routes/crews.d.ts +4 -0
  374. package/dist/daemon/routes/crews.js +149 -0
  375. package/dist/daemon/routes/crews.js.map +1 -0
  376. package/dist/daemon/routes/files.d.ts +3 -0
  377. package/dist/daemon/routes/files.js +253 -0
  378. package/dist/daemon/routes/files.js.map +1 -0
  379. package/dist/daemon/routes/git.d.ts +4 -0
  380. package/dist/daemon/routes/git.js +96 -0
  381. package/dist/daemon/routes/git.js.map +1 -0
  382. package/dist/daemon/routes/history.d.ts +4 -0
  383. package/dist/daemon/routes/history.js +101 -0
  384. package/dist/daemon/routes/history.js.map +1 -0
  385. package/dist/daemon/routes/integrations-project.d.ts +3 -0
  386. package/dist/daemon/routes/integrations-project.js +103 -0
  387. package/dist/daemon/routes/integrations-project.js.map +1 -0
  388. package/dist/daemon/routes/integrations.d.ts +3 -0
  389. package/dist/daemon/routes/integrations.js +111 -0
  390. package/dist/daemon/routes/integrations.js.map +1 -0
  391. package/dist/daemon/routes/logs.d.ts +3 -0
  392. package/dist/daemon/routes/logs.js +40 -0
  393. package/dist/daemon/routes/logs.js.map +1 -0
  394. package/dist/daemon/routes/messages.d.ts +4 -0
  395. package/dist/daemon/routes/messages.js +60 -0
  396. package/dist/daemon/routes/messages.js.map +1 -0
  397. package/dist/daemon/routes/observability.d.ts +4 -0
  398. package/dist/daemon/routes/observability.js +247 -0
  399. package/dist/daemon/routes/observability.js.map +1 -0
  400. package/dist/daemon/routes/onboard.d.ts +12 -0
  401. package/dist/daemon/routes/onboard.js +67 -0
  402. package/dist/daemon/routes/onboard.js.map +1 -0
  403. package/dist/daemon/routes/orchestra.d.ts +4 -0
  404. package/dist/daemon/routes/orchestra.js +110 -0
  405. package/dist/daemon/routes/orchestra.js.map +1 -0
  406. package/dist/daemon/routes/pairing.d.ts +4 -0
  407. package/dist/daemon/routes/pairing.js +155 -0
  408. package/dist/daemon/routes/pairing.js.map +1 -0
  409. package/dist/daemon/routes/preview.d.ts +24 -0
  410. package/dist/daemon/routes/preview.js +122 -0
  411. package/dist/daemon/routes/preview.js.map +1 -0
  412. package/dist/daemon/routes/project-actions.d.ts +4 -0
  413. package/dist/daemon/routes/project-actions.js +53 -0
  414. package/dist/daemon/routes/project-actions.js.map +1 -0
  415. package/dist/daemon/routes/project-team.d.ts +4 -0
  416. package/dist/daemon/routes/project-team.js +201 -0
  417. package/dist/daemon/routes/project-team.js.map +1 -0
  418. package/dist/daemon/routes/projects.d.ts +14 -0
  419. package/dist/daemon/routes/projects.js +138 -0
  420. package/dist/daemon/routes/projects.js.map +1 -0
  421. package/dist/daemon/routes/prompts.d.ts +4 -0
  422. package/dist/daemon/routes/prompts.js +44 -0
  423. package/dist/daemon/routes/prompts.js.map +1 -0
  424. package/dist/daemon/routes/proof.d.ts +4 -0
  425. package/dist/daemon/routes/proof.js +22 -0
  426. package/dist/daemon/routes/proof.js.map +1 -0
  427. package/dist/daemon/routes/providers.d.ts +3 -0
  428. package/dist/daemon/routes/providers.js +60 -0
  429. package/dist/daemon/routes/providers.js.map +1 -0
  430. package/dist/daemon/routes/public.d.ts +4 -0
  431. package/dist/daemon/routes/public.js +64 -0
  432. package/dist/daemon/routes/public.js.map +1 -0
  433. package/dist/daemon/routes/queue.d.ts +4 -0
  434. package/dist/daemon/routes/queue.js +140 -0
  435. package/dist/daemon/routes/queue.js.map +1 -0
  436. package/dist/daemon/routes/routing.d.ts +4 -0
  437. package/dist/daemon/routes/routing.js +61 -0
  438. package/dist/daemon/routes/routing.js.map +1 -0
  439. package/dist/daemon/routes/runtime-handler.d.ts +2 -0
  440. package/dist/daemon/routes/runtime-handler.js +63 -0
  441. package/dist/daemon/routes/runtime-handler.js.map +1 -0
  442. package/dist/daemon/routes/search.d.ts +4 -0
  443. package/dist/daemon/routes/search.js +17 -0
  444. package/dist/daemon/routes/search.js.map +1 -0
  445. package/dist/daemon/routes/servers.d.ts +4 -0
  446. package/dist/daemon/routes/servers.js +133 -0
  447. package/dist/daemon/routes/servers.js.map +1 -0
  448. package/dist/daemon/routes/setup.d.ts +3 -0
  449. package/dist/daemon/routes/setup.js +50 -0
  450. package/dist/daemon/routes/setup.js.map +1 -0
  451. package/dist/daemon/routes/shift.d.ts +4 -0
  452. package/dist/daemon/routes/shift.js +30 -0
  453. package/dist/daemon/routes/shift.js.map +1 -0
  454. package/dist/daemon/routes/specs.d.ts +4 -0
  455. package/dist/daemon/routes/specs.js +57 -0
  456. package/dist/daemon/routes/specs.js.map +1 -0
  457. package/dist/daemon/routes/task-delivery.d.ts +4 -0
  458. package/dist/daemon/routes/task-delivery.js +38 -0
  459. package/dist/daemon/routes/task-delivery.js.map +1 -0
  460. package/dist/daemon/routes/team.d.ts +4 -0
  461. package/dist/daemon/routes/team.js +193 -0
  462. package/dist/daemon/routes/team.js.map +1 -0
  463. package/dist/daemon/routes/terminals.d.ts +4 -0
  464. package/dist/daemon/routes/terminals.js +87 -0
  465. package/dist/daemon/routes/terminals.js.map +1 -0
  466. package/dist/daemon/routes/tools.d.ts +4 -0
  467. package/dist/daemon/routes/tools.js +180 -0
  468. package/dist/daemon/routes/tools.js.map +1 -0
  469. package/dist/daemon/routes/updates.d.ts +4 -0
  470. package/dist/daemon/routes/updates.js +89 -0
  471. package/dist/daemon/routes/updates.js.map +1 -0
  472. package/dist/daemon/routes/voice.d.ts +4 -0
  473. package/dist/daemon/routes/voice.js +53 -0
  474. package/dist/daemon/routes/voice.js.map +1 -0
  475. package/dist/daemon/runner.d.ts +186 -0
  476. package/dist/daemon/runner.js +612 -0
  477. package/dist/daemon/runner.js.map +1 -0
  478. package/dist/daemon/runtime/accounting.d.ts +130 -0
  479. package/dist/daemon/runtime/accounting.js +303 -0
  480. package/dist/daemon/runtime/accounting.js.map +1 -0
  481. package/dist/daemon/runtime/agents.d.ts +16 -0
  482. package/dist/daemon/runtime/agents.js +71 -0
  483. package/dist/daemon/runtime/agents.js.map +1 -0
  484. package/dist/daemon/runtime/briefings.d.ts +134 -0
  485. package/dist/daemon/runtime/briefings.js +329 -0
  486. package/dist/daemon/runtime/briefings.js.map +1 -0
  487. package/dist/daemon/runtime/native-usage.d.ts +21 -0
  488. package/dist/daemon/runtime/native-usage.js +71 -0
  489. package/dist/daemon/runtime/native-usage.js.map +1 -0
  490. package/dist/daemon/runtime/queue.d.ts +94 -0
  491. package/dist/daemon/runtime/queue.js +222 -0
  492. package/dist/daemon/runtime/queue.js.map +1 -0
  493. package/dist/daemon/runtime/relay.d.ts +93 -0
  494. package/dist/daemon/runtime/relay.js +240 -0
  495. package/dist/daemon/runtime/relay.js.map +1 -0
  496. package/dist/daemon/runtime/turns.d.ts +202 -0
  497. package/dist/daemon/runtime/turns.js +663 -0
  498. package/dist/daemon/runtime/turns.js.map +1 -0
  499. package/dist/daemon/runtime-support.d.ts +76 -0
  500. package/dist/daemon/runtime-support.js +134 -0
  501. package/dist/daemon/runtime-support.js.map +1 -0
  502. package/dist/daemon/runtime.d.ts +739 -70
  503. package/dist/daemon/runtime.js +2751 -470
  504. package/dist/daemon/runtime.js.map +1 -1
  505. package/dist/daemon/server.d.ts +82 -55
  506. package/dist/daemon/server.js +674 -1435
  507. package/dist/daemon/server.js.map +1 -1
  508. package/dist/daemon/shift.d.ts +70 -0
  509. package/dist/daemon/shift.js +170 -0
  510. package/dist/daemon/shift.js.map +1 -0
  511. package/dist/daemon/specs.d.ts +92 -0
  512. package/dist/daemon/specs.js +285 -0
  513. package/dist/daemon/specs.js.map +1 -0
  514. package/dist/daemon/system.d.ts +208 -0
  515. package/dist/daemon/system.js +557 -0
  516. package/dist/daemon/system.js.map +1 -0
  517. package/dist/daemon/tasks.js +1 -1
  518. package/dist/daemon/team-brain.d.ts +136 -0
  519. package/dist/daemon/team-brain.js +659 -0
  520. package/dist/daemon/team-brain.js.map +1 -0
  521. package/dist/daemon/team-coordinator.d.ts +78 -0
  522. package/dist/daemon/team-coordinator.js +408 -0
  523. package/dist/daemon/team-coordinator.js.map +1 -0
  524. package/dist/daemon/team.d.ts +339 -0
  525. package/dist/daemon/team.js +1433 -0
  526. package/dist/daemon/team.js.map +1 -0
  527. package/dist/daemon/terminals.d.ts +22 -3
  528. package/dist/daemon/terminals.js +236 -16
  529. package/dist/daemon/terminals.js.map +1 -1
  530. package/dist/hub/client.d.ts +120 -0
  531. package/dist/hub/client.js +228 -0
  532. package/dist/hub/client.js.map +1 -0
  533. package/dist/hub/server.d.ts +32 -0
  534. package/dist/hub/server.js +180 -0
  535. package/dist/hub/server.js.map +1 -0
  536. package/dist/hub/supabase-client.d.ts +220 -0
  537. package/dist/hub/supabase-client.js +843 -0
  538. package/dist/hub/supabase-client.js.map +1 -0
  539. package/dist/observability/ask.d.ts +91 -0
  540. package/dist/observability/ask.js +179 -0
  541. package/dist/observability/ask.js.map +1 -0
  542. package/dist/observability/clickhouse.d.ts +33 -0
  543. package/dist/observability/clickhouse.js +48 -0
  544. package/dist/observability/clickhouse.js.map +1 -0
  545. package/dist/observability/decisions.d.ts +176 -0
  546. package/dist/observability/decisions.js +377 -0
  547. package/dist/observability/decisions.js.map +1 -0
  548. package/dist/observability/index.d.ts +89 -0
  549. package/dist/observability/index.js +348 -0
  550. package/dist/observability/index.js.map +1 -0
  551. package/dist/observability/insights.d.ts +151 -0
  552. package/dist/observability/insights.js +319 -0
  553. package/dist/observability/insights.js.map +1 -0
  554. package/dist/observability/logs-query.d.ts +82 -0
  555. package/dist/observability/logs-query.js +102 -0
  556. package/dist/observability/logs-query.js.map +1 -0
  557. package/dist/observability/logs.d.ts +72 -0
  558. package/dist/observability/logs.js +295 -0
  559. package/dist/observability/logs.js.map +1 -0
  560. package/dist/observability/metrics.d.ts +86 -0
  561. package/dist/observability/metrics.js +303 -0
  562. package/dist/observability/metrics.js.map +1 -0
  563. package/dist/observability/otlp.d.ts +127 -0
  564. package/dist/observability/otlp.js +242 -0
  565. package/dist/observability/otlp.js.map +1 -0
  566. package/dist/observability/snapshots.d.ts +43 -0
  567. package/dist/observability/snapshots.js +129 -0
  568. package/dist/observability/snapshots.js.map +1 -0
  569. package/dist/observability/triage.d.ts +49 -0
  570. package/dist/observability/triage.js +284 -0
  571. package/dist/observability/triage.js.map +1 -0
  572. package/dist/providers/adapter.d.ts +50 -0
  573. package/dist/providers/adapter.js +38 -0
  574. package/dist/providers/adapter.js.map +1 -0
  575. package/dist/providers/agent.d.ts +110 -0
  576. package/dist/providers/agent.js +487 -0
  577. package/dist/providers/agent.js.map +1 -0
  578. package/dist/providers/approvals.d.ts +24 -0
  579. package/dist/providers/approvals.js +78 -0
  580. package/dist/providers/approvals.js.map +1 -0
  581. package/dist/providers/attachments.d.ts +20 -0
  582. package/dist/providers/attachments.js +51 -0
  583. package/dist/providers/attachments.js.map +1 -0
  584. package/dist/providers/claude/adapter.d.ts +99 -0
  585. package/dist/providers/claude/adapter.js +790 -0
  586. package/dist/providers/claude/adapter.js.map +1 -0
  587. package/dist/providers/codex/adapter.d.ts +113 -0
  588. package/dist/providers/codex/adapter.js +881 -0
  589. package/dist/providers/codex/adapter.js.map +1 -0
  590. package/dist/providers/codex/instructions.d.ts +11 -0
  591. package/dist/providers/codex/instructions.js +154 -0
  592. package/dist/providers/codex/instructions.js.map +1 -0
  593. package/dist/providers/codex/rpc.d.ts +36 -0
  594. package/dist/providers/codex/rpc.js +104 -0
  595. package/dist/providers/codex/rpc.js.map +1 -0
  596. package/dist/providers/contracts.d.ts +339 -0
  597. package/dist/providers/contracts.js +19 -0
  598. package/dist/providers/contracts.js.map +1 -0
  599. package/dist/providers/directory.d.ts +70 -0
  600. package/dist/providers/directory.js +95 -0
  601. package/dist/providers/directory.js.map +1 -0
  602. package/dist/providers/errors.d.ts +47 -0
  603. package/dist/providers/errors.js +24 -0
  604. package/dist/providers/errors.js.map +1 -0
  605. package/dist/providers/index.d.ts +18 -0
  606. package/dist/providers/index.js +19 -0
  607. package/dist/providers/index.js.map +1 -0
  608. package/dist/providers/ingestion.d.ts +80 -0
  609. package/dist/providers/ingestion.js +330 -0
  610. package/dist/providers/ingestion.js.map +1 -0
  611. package/dist/providers/live.d.ts +22 -0
  612. package/dist/providers/live.js +56 -0
  613. package/dist/providers/live.js.map +1 -0
  614. package/dist/providers/process.d.ts +29 -0
  615. package/dist/providers/process.js +71 -0
  616. package/dist/providers/process.js.map +1 -0
  617. package/dist/providers/reaper.d.ts +33 -0
  618. package/dist/providers/reaper.js +65 -0
  619. package/dist/providers/reaper.js.map +1 -0
  620. package/dist/providers/service.d.ts +87 -0
  621. package/dist/providers/service.js +256 -0
  622. package/dist/providers/service.js.map +1 -0
  623. package/dist/sdk.d.ts +1 -1
  624. package/dist/sdk.js +1 -1
  625. package/dist/sdk.js.map +1 -1
  626. package/dist/types.d.ts +385 -6
  627. package/dist/types.js +1 -0
  628. package/dist/types.js.map +1 -1
  629. package/dist/version.d.ts +7 -0
  630. package/dist/version.js +16 -0
  631. package/dist/version.js.map +1 -0
  632. package/dist/web/app.css +4643 -0
  633. package/dist/web/app.js +22640 -0
  634. package/dist/web/app.js.map +7 -0
  635. package/dist/web/shell.html +39 -0
  636. package/docs/README.md +21 -0
  637. package/docs/SETUP.md +10 -0
  638. package/docs/adapters.md +21 -8
  639. package/docs/brain-continuity.md +186 -0
  640. package/docs/cloud.md +108 -0
  641. package/docs/crews.md +62 -0
  642. package/docs/design-system.md +31 -2
  643. package/docs/integration-notes.md +128 -20
  644. package/docs/loompad.md +105 -0
  645. package/docs/observability.md +220 -0
  646. package/docs/play-store.md +123 -0
  647. package/docs/proposals/agent-teams.md +249 -0
  648. package/docs/proposals/brain-continuity-implementation.md +468 -0
  649. package/docs/proposals/brain-session-continuity.md +623 -0
  650. package/docs/proposals/t3code-port.md +81 -0
  651. package/docs/proposals/t3code-reference.md +95 -0
  652. package/docs/refactoring/AGENT-TEAMS-PROGRESS.md +88 -0
  653. package/docs/refactoring/BOUNDARIES.md +120 -0
  654. package/docs/refactoring/BRAIN-AUDIT.md +176 -0
  655. package/docs/refactoring/BRAIN-NOTES.md +390 -0
  656. package/docs/refactoring/BRAIN-TODO.md +214 -0
  657. package/docs/refactoring/NOTES.md +129 -0
  658. package/docs/refactoring/T3-PORT-NOTES.md +165 -0
  659. package/docs/refactoring/T3-PORT-TODO.md +123 -0
  660. package/docs/refactoring/TODO.md +46 -0
  661. package/docs/refactoring/brain-benchmark-2026-09-28.json +48 -0
  662. package/docs/refactoring/brain-benchmark-audit-2026-09-28.json +48 -0
  663. package/docs/release-notes/v0.2.0.md +35 -0
  664. package/docs/release-notes/v0.2.1.md +59 -0
  665. package/docs/release-notes/v0.2.3.md +77 -0
  666. package/docs/release-notes/v0.2.4.md +128 -0
  667. package/docs/release-notes/v0.2.5.md +153 -0
  668. package/docs/release-notes/v0.2.6.md +62 -0
  669. package/docs/release-notes/v1.0.0.md +120 -0
  670. package/docs/release-notes/v1.0.1.md +77 -0
  671. package/docs/release-notes/v1.1.0.md +71 -0
  672. package/docs/release-notes/v1.1.1.md +38 -0
  673. package/docs/teams-architecture.md +697 -0
  674. package/docs/teams.md +171 -0
  675. package/docs/windows.md +85 -0
  676. package/package.json +22 -9
  677. package/dist/adapters/claude-code.d.ts +0 -26
  678. package/dist/adapters/claude-code.js +0 -209
  679. package/dist/adapters/claude-code.js.map +0 -1
  680. package/dist/adapters/codex.d.ts +0 -51
  681. package/dist/adapters/codex.js +0 -291
  682. package/dist/adapters/codex.js.map +0 -1
  683. package/docs/img/board-linear.png +0 -0
  684. package/docs/img/board-projects.png +0 -0
  685. package/docs/img/brain.png +0 -0
  686. package/docs/img/settings.png +0 -0
  687. package/docs/img/workspace.png +0 -0
@@ -0,0 +1,431 @@
1
+ /**
2
+ * The MCP catalog — where a server comes from before it is a row in config.
3
+ *
4
+ * core/mcp.ts is the back half of this story: it takes the servers a project has
5
+ * configured and puts them in front of an agent. This is the front half, and it
6
+ * is the half that didn't exist. Until now the only way to add a server was to
7
+ * know its URL and type it into a prompt — so the composer shipped six hardcoded
8
+ * rows with empty urls (GitHub, Slack, Supabase, …) which looked like
9
+ * integrations and were placeholders. A logo is not an integration, and neither
10
+ * is a name with nothing behind it.
11
+ *
12
+ * Two sources, and the difference between them is the whole design:
13
+ *
14
+ * 1. **The official registry** (registry.modelcontextprotocol.io). Thousands
15
+ * of servers, searchable, maintained by somebody else. Everything in here
16
+ * is normalised from what the registry actually returned — nothing is
17
+ * filled in, and an entry that is installable by neither a URL nor a
18
+ * package is dropped rather than shown as a row that can't be clicked.
19
+ *
20
+ * 2. **A curated shortlist** of well-known providers, for the empty state,
21
+ * because "search 4000 servers" is a bad first screen and the registry's
22
+ * ranking is not ours to reinterpret. Every URL and command in that list
23
+ * was verified against the vendor's own documentation and, where it is a
24
+ * remote, probed for a live response. The ones that could NOT be pinned to
25
+ * a single correct endpoint carry `needsUrl` so the UI asks the user
26
+ * instead of us guessing — a hosted telemetry backend whose hostname
27
+ * contains the account's own region is not knowable from here.
28
+ *
29
+ * ## Why the cache exists
30
+ *
31
+ * The catalog modal searches as you type. Without a cache that is one HTTP
32
+ * request per keystroke against somebody else's public service, which is rude
33
+ * at best and rate-limited at worst. A short TTL is enough — the registry does
34
+ * not change between two keystrokes, and 60 seconds of staleness in a browse
35
+ * list costs nothing.
36
+ *
37
+ * ## Why a failed fetch is `degraded` and not an error
38
+ *
39
+ * A laptop on a plane still deserves the curated list. Returning an empty array
40
+ * would read as "there are no MCP servers", which is false; throwing would take
41
+ * the modal down over a network blip. `degraded: true` says exactly what
42
+ * happened — the registry did not answer, this is what we know without it — and
43
+ * the UI can say so out loud.
44
+ */
45
+ // ---------------------------------------------------------------------------
46
+ // The curated shelf
47
+ // ---------------------------------------------------------------------------
48
+ /**
49
+ * Well-known providers, verified against vendor documentation.
50
+ *
51
+ * Each remote below was confirmed twice: it appears in the vendor's own docs (or
52
+ * in the official registry under the vendor's namespace), and a live MCP
53
+ * `initialize` to it answered — 401 for the ones that need auth, which is a
54
+ * server saying "not without credentials" and therefore proof the endpoint is
55
+ * real. A DNS failure or a 404 would have disqualified an entry.
56
+ *
57
+ * Three entries are worth reading the comment on rather than trusting the shape:
58
+ * SigNoz (region in the hostname), Postgres (no official server exists at all),
59
+ * and Cloudflare (sixteen servers, not one).
60
+ */
61
+ export const CURATED_MCPS = [
62
+ {
63
+ slug: "github",
64
+ name: "GitHub",
65
+ description: "Repositories, issues, pull requests, Actions, and code search.",
66
+ homepage: "https://github.com/github/github-mcp-server",
67
+ transport: "http",
68
+ // The trailing slash is what GitHub's own docs and registry entry use.
69
+ url: "https://api.githubcopilot.com/mcp/",
70
+ requires: "a GitHub account; the server authenticates over OAuth on first use",
71
+ maintainer: "official",
72
+ source: "curated",
73
+ },
74
+ {
75
+ slug: "linear",
76
+ name: "Linear",
77
+ description: "Issues, projects, cycles, and comments in Linear.",
78
+ homepage: "https://linear.app/docs/mcp",
79
+ transport: "http",
80
+ // Linear also publishes /sse, but its docs mark that a deprecated fallback.
81
+ url: "https://mcp.linear.app/mcp",
82
+ maintainer: "official",
83
+ source: "curated",
84
+ },
85
+ {
86
+ slug: "slack",
87
+ name: "Slack",
88
+ description: "Search and read Slack messages, channels, and files.",
89
+ homepage: "https://docs.slack.dev/ai/slack-mcp-server/",
90
+ transport: "http",
91
+ url: "https://mcp.slack.com/mcp",
92
+ // Slack's docs say plainly that they do not support Dynamic Client
93
+ // Registration, so the generic "add a remote server and let it OAuth" path
94
+ // does not work here — you need a Slack app declaring the mcp:connect
95
+ // scope. Said out loud because the failure otherwise looks like a bug.
96
+ requires: "a Slack app with the mcp:connect scope — Slack does not support dynamic client registration",
97
+ maintainer: "official",
98
+ source: "curated",
99
+ },
100
+ {
101
+ slug: "notion",
102
+ name: "Notion",
103
+ description: "Search, read, create, and update Notion pages and databases.",
104
+ homepage: "https://developers.notion.com/docs/mcp",
105
+ transport: "http",
106
+ url: "https://mcp.notion.com/mcp",
107
+ maintainer: "official",
108
+ source: "curated",
109
+ },
110
+ {
111
+ slug: "sentry",
112
+ name: "Sentry",
113
+ description: "Query Sentry issues, errors, traces, and releases.",
114
+ homepage: "https://mcp.sentry.dev",
115
+ transport: "http",
116
+ url: "https://mcp.sentry.dev/mcp",
117
+ maintainer: "official",
118
+ source: "curated",
119
+ },
120
+ {
121
+ slug: "stripe",
122
+ name: "Stripe",
123
+ description: "Manage Stripe customers, products, prices, payments, and invoices.",
124
+ homepage: "https://docs.stripe.com/mcp",
125
+ transport: "http",
126
+ url: "https://mcp.stripe.com",
127
+ maintainer: "official",
128
+ source: "curated",
129
+ },
130
+ {
131
+ slug: "supabase",
132
+ name: "Supabase",
133
+ description: "Manage Supabase projects, run SQL, inspect schemas, generate types.",
134
+ homepage: "https://supabase.com/docs/guides/getting-started/mcp",
135
+ transport: "http",
136
+ url: "https://mcp.supabase.com/mcp",
137
+ maintainer: "official",
138
+ source: "curated",
139
+ },
140
+ {
141
+ slug: "figma",
142
+ name: "Figma",
143
+ description: "Pull Figma design context, components, and variables into code.",
144
+ homepage: "https://developers.figma.com/docs/figma-mcp-server/",
145
+ transport: "http",
146
+ url: "https://mcp.figma.com/mcp",
147
+ maintainer: "official",
148
+ source: "curated",
149
+ },
150
+ {
151
+ slug: "cloudflare",
152
+ name: "Cloudflare Docs",
153
+ // Cloudflare publishes sixteen topic servers (bindings, observability,
154
+ // radar, browser, logs, …) at <topic>.mcp.cloudflare.com/mcp, not one
155
+ // "Cloudflare" server. Featuring the docs one is a choice, and the honest
156
+ // way to make it is to name it for what it is and say where the rest are —
157
+ // rather than shipping a row called "Cloudflare" that turns out to only
158
+ // answer documentation questions.
159
+ description: "Search Cloudflare's documentation. Cloudflare's other servers (bindings, observability, radar, browser, logs, …) live at https://<topic>.mcp.cloudflare.com/mcp.",
160
+ homepage: "https://developers.cloudflare.com/agents/model-context-protocol/mcp-servers-for-cloudflare/",
161
+ transport: "http",
162
+ url: "https://docs.mcp.cloudflare.com/mcp",
163
+ maintainer: "official",
164
+ source: "curated",
165
+ },
166
+ {
167
+ slug: "playwright",
168
+ name: "Playwright",
169
+ description: "Drive a browser: navigate, click, fill, snapshot, screenshot.",
170
+ homepage: "https://github.com/microsoft/playwright-mcp",
171
+ transport: "stdio",
172
+ command: "npx",
173
+ args: ["@playwright/mcp@latest"],
174
+ maintainer: "official",
175
+ source: "curated",
176
+ },
177
+ {
178
+ slug: "postgres",
179
+ name: "Postgres",
180
+ // The reference server everyone still links to — @modelcontextprotocol/
181
+ // server-postgres — is deprecated on npm, archived upstream, last released
182
+ // in 2024, and carries a published SQL-injection flaw (it wrapped queries
183
+ // in a read-only transaction but accepted semicolon-delimited statements,
184
+ // so a caller could break out of it). It is not shipped here at any price.
185
+ //
186
+ // The PostgreSQL project publishes no MCP server of its own, so the honest
187
+ // label on the best-maintained alternative is "community", and the default
188
+ // access mode is the restricted one. Someone who wants write access can say
189
+ // so; nobody should get it because a featured row defaulted to it.
190
+ description: "Query a PostgreSQL database: schemas, indexes, health checks, and read-only SQL. Community-maintained — PostgreSQL publishes no official MCP server.",
191
+ homepage: "https://github.com/crystaldba/postgres-mcp",
192
+ transport: "stdio",
193
+ command: "uvx",
194
+ args: ["postgres-mcp", "--access-mode=restricted"],
195
+ requires: "a DATABASE_URI environment variable pointing at your database",
196
+ maintainer: "community",
197
+ source: "curated",
198
+ },
199
+ {
200
+ slug: "filesystem",
201
+ name: "Filesystem",
202
+ // The allowed directories are positional arguments and the server will not
203
+ // start without at least one. They are deliberately NOT defaulted to the
204
+ // project directory here: which files an agent may write is the user's
205
+ // decision, and a default that happens to be right is still a decision
206
+ // nobody made.
207
+ description: "Read and write local files, restricted to directories you allow.",
208
+ homepage: "https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem",
209
+ transport: "stdio",
210
+ command: "npx",
211
+ args: ["-y", "@modelcontextprotocol/server-filesystem"],
212
+ requires: "one or more directories the server may access, appended as arguments",
213
+ maintainer: "official",
214
+ source: "curated",
215
+ },
216
+ {
217
+ slug: "signoz",
218
+ name: "SigNoz",
219
+ // SigNoz Cloud's MCP hostname contains the account's region
220
+ // (mcp.us / mcp.eu / mcp.in …), and their docs are explicit that the wrong
221
+ // region fails authentication. There is no correct value to hardcode, so
222
+ // this asks — with the documented shape prefilled so the user only has to
223
+ // replace the one part we can't know. Self-hosted SigNoz is a different
224
+ // endpoint entirely, which is another reason not to guess.
225
+ description: "Query SigNoz metrics, traces, logs, alerts, and dashboards.",
226
+ homepage: "https://signoz.io/docs/ai/signoz-mcp-server/",
227
+ transport: "http",
228
+ needsUrl: true,
229
+ urlTemplate: "https://mcp.<region>.signoz.cloud/mcp",
230
+ requires: "your SigNoz Cloud region, or the URL of your self-hosted deployment",
231
+ maintainer: "official",
232
+ source: "curated",
233
+ },
234
+ ];
235
+ // ---------------------------------------------------------------------------
236
+ // The registry
237
+ // ---------------------------------------------------------------------------
238
+ const DEFAULT_REGISTRY_URL = "https://registry.modelcontextprotocol.io/v0/servers";
239
+ /**
240
+ * Which registry to ask.
241
+ *
242
+ * Read per call rather than captured at import, so a test can point it at a
243
+ * local stub without a module-load dance — and so anyone running one of the
244
+ * private subregistries the MCP spec allows can point Loom at theirs. Reading
245
+ * it live is also what keeps the test suite off the public registry entirely: a
246
+ * unit test that quietly makes a real network request is slow, flaky under
247
+ * load, and fails on a plane.
248
+ */
249
+ function registryUrl() {
250
+ return process.env.LOOM_MCP_REGISTRY?.trim() || DEFAULT_REGISTRY_URL;
251
+ }
252
+ /**
253
+ * How long a search stays fresh. Short, because the point is to survive a burst
254
+ * of keystrokes rather than to avoid the network — a browse list that is a
255
+ * minute stale is indistinguishable from a live one.
256
+ */
257
+ const TTL_MS = 60_000;
258
+ /**
259
+ * A failure is cached too, briefly. Otherwise every keystroke while offline
260
+ * costs a full 8-second timeout, and the modal becomes unusable in exactly the
261
+ * situation the curated fallback exists to handle. Ten seconds is long enough
262
+ * to stop the storm and short enough that reconnecting feels immediate.
263
+ */
264
+ const FAILURE_TTL_MS = 10_000;
265
+ const DEFAULT_LIMIT = 30;
266
+ const MAX_LIMIT = 100;
267
+ const cache = new Map();
268
+ /** Drop everything cached. Exported for tests, which must not inherit a result. */
269
+ export function clearCatalogCache() {
270
+ cache.clear();
271
+ }
272
+ /**
273
+ * Search the official registry, falling back to the curated shelf.
274
+ *
275
+ * `query` is passed through as the registry's own `search` parameter — its
276
+ * matching is its business, and reimplementing it here would give different
277
+ * answers than the registry's website for the same words.
278
+ */
279
+ export async function searchCatalog(query, limit) {
280
+ const q = String(query ?? "").trim();
281
+ const n = Math.min(Math.max(Math.trunc(Number(limit) || DEFAULT_LIMIT), 1), MAX_LIMIT);
282
+ const key = `${n}\0${q}`;
283
+ const hit = cache.get(key);
284
+ if (hit && Date.now() - hit.at < hit.ttl)
285
+ return hit.value;
286
+ const featured = CURATED_MCPS;
287
+ let result;
288
+ try {
289
+ const url = new URL(registryUrl());
290
+ url.searchParams.set("limit", String(n));
291
+ if (q)
292
+ url.searchParams.set("search", q);
293
+ const res = await fetch(url, {
294
+ signal: AbortSignal.timeout(8_000),
295
+ headers: { accept: "application/json" },
296
+ });
297
+ if (!res.ok)
298
+ throw new Error(`registry responded ${res.status}`);
299
+ const body = (await res.json());
300
+ result = { servers: normalizeRegistry(body), featured, degraded: false };
301
+ }
302
+ catch {
303
+ // Offline, timed out, rate-limited, or the registry changed shape under us.
304
+ // All four have the same honest answer: here is what we know for certain,
305
+ // and a flag saying the rest is missing. Nothing is invented to fill it.
306
+ result = { servers: [], featured, degraded: true };
307
+ }
308
+ cache.set(key, { at: Date.now(), ttl: result.degraded ? FAILURE_TTL_MS : TTL_MS, value: result });
309
+ // The cache is a keystroke buffer, not a store. A bound keeps a long typing
310
+ // session from retaining every prefix of every query for the process's life.
311
+ if (cache.size > 200) {
312
+ const oldest = [...cache.entries()].sort((a, b) => a[1].at - b[1].at)[0];
313
+ if (oldest)
314
+ cache.delete(oldest[0]);
315
+ }
316
+ return result;
317
+ }
318
+ /**
319
+ * Registry entries → installable rows.
320
+ *
321
+ * Two things happen here that the raw response doesn't do for you:
322
+ *
323
+ * - **Deduplication.** The registry returns every published version of a
324
+ * server as its own entry, so an unfiltered list shows "inference.sh" three
325
+ * times. Entries are collapsed by name, preferring the one the registry
326
+ * marks `isLatest` and otherwise the last seen (the list is version-ordered).
327
+ *
328
+ * - **Dropping the uninstallable.** `remotes` and `packages` are both nullable
329
+ * and an entry can have neither — it is a name in a directory, not something
330
+ * you can connect to. Those are removed rather than rendered as a row whose
331
+ * Install button would have nothing to write.
332
+ */
333
+ export function normalizeRegistry(body) {
334
+ const byName = new Map();
335
+ const pinned = new Set();
336
+ for (const item of body?.servers ?? []) {
337
+ const server = item?.server;
338
+ const name = String(server?.name ?? "").trim();
339
+ if (!server || !name)
340
+ continue;
341
+ const normalized = normalizeServer(server);
342
+ if (!normalized)
343
+ continue;
344
+ const isLatest = Object.values(item?._meta ?? {}).some((m) => m?.isLatest === true);
345
+ // A version the registry marks latest wins and holds; otherwise later
346
+ // entries overwrite earlier ones, which for a version-ordered list is the
347
+ // newest one we saw.
348
+ if (pinned.has(name) && !isLatest)
349
+ continue;
350
+ byName.set(name, normalized);
351
+ if (isLatest)
352
+ pinned.add(name);
353
+ }
354
+ return [...byName.values()];
355
+ }
356
+ /** One entry, or null when it is installable by neither a remote nor a package. */
357
+ function normalizeServer(server) {
358
+ const name = String(server.name ?? "").trim();
359
+ const base = {
360
+ id: name,
361
+ name,
362
+ title: String(server.title ?? "").trim() || humanize(name),
363
+ description: String(server.description ?? "").trim(),
364
+ ...(server.repository?.url ? { homepage: String(server.repository.url) } : {}),
365
+ ...(server.version ? { version: String(server.version) } : {}),
366
+ source: "registry",
367
+ };
368
+ // A remote wins over a package every time: it is a URL the user can connect
369
+ // to now, against a package that has to be downloaded and run locally with
370
+ // whatever credentials it wants in its environment.
371
+ const remote = pickRemote(server.remotes);
372
+ if (remote)
373
+ return { ...base, transport: remote.transport, url: remote.url };
374
+ const pkg = pickPackage(server.packages);
375
+ if (pkg)
376
+ return { ...base, transport: "stdio", command: pkg.command, args: pkg.args };
377
+ return null;
378
+ }
379
+ /** The best remote: streamable-http if offered, else sse. */
380
+ function pickRemote(remotes) {
381
+ const usable = (remotes ?? []).filter((r) => /^https?:\/\//i.test(String(r?.url ?? "").trim()));
382
+ const http = usable.find((r) => String(r.type ?? "").toLowerCase() === "streamable-http" || String(r.type ?? "").toLowerCase() === "http");
383
+ if (http)
384
+ return { transport: "http", url: String(http.url).trim() };
385
+ const sse = usable.find((r) => String(r.type ?? "").toLowerCase() === "sse");
386
+ if (sse)
387
+ return { transport: "sse", url: String(sse.url).trim() };
388
+ // A remote with a URL but an unfamiliar `type`. It is still a URL, and
389
+ // core/mcp.ts guesses http-vs-sse from the path the same way — so honour it
390
+ // rather than dropping a server over a spelling we haven't seen.
391
+ const other = usable[0];
392
+ return other ? { transport: /\/sse\/?$/i.test(String(other.url)) ? "sse" : "http", url: String(other.url).trim() } : null;
393
+ }
394
+ /**
395
+ * A package → the command that runs it.
396
+ *
397
+ * Only the two ecosystems with a standard zero-install runner: npm via `npx -y`
398
+ * and PyPI via `uvx`, both of which take `name@version`. Anything else (OCI,
399
+ * NuGet, a bare binary) needs a decision about a runtime that isn't ours to
400
+ * make, so those entries are left uninstallable rather than given a command
401
+ * that probably doesn't exist on the machine.
402
+ *
403
+ * The registry's `runtimeArguments` are deliberately ignored: they encode
404
+ * per-package placeholders that the user is expected to fill in, and splicing
405
+ * them in unfilled produces a command line that looks complete and isn't.
406
+ */
407
+ function pickPackage(packages) {
408
+ for (const pkg of packages ?? []) {
409
+ const id = String(pkg?.identifier ?? "").trim();
410
+ if (!id)
411
+ continue;
412
+ const version = String(pkg?.version ?? "").trim();
413
+ const spec = version ? `${id}@${version}` : id;
414
+ const type = String(pkg?.registryType ?? "").toLowerCase();
415
+ const hint = String(pkg?.runtimeHint ?? "").toLowerCase();
416
+ if (type === "npm" || hint === "npx")
417
+ return { command: "npx", args: ["-y", spec] };
418
+ if (type === "pypi" || hint === "uvx")
419
+ return { command: "uvx", args: [spec] };
420
+ }
421
+ return null;
422
+ }
423
+ /** `ai.smithery/smithery-ai-github` → `Smithery Ai Github`, for an entry with no title. */
424
+ function humanize(name) {
425
+ const tail = name.split("/").pop() ?? name;
426
+ return tail
427
+ .replace(/[-_.]+/g, " ")
428
+ .trim()
429
+ .replace(/\b\w/g, (c) => c.toUpperCase()) || name;
430
+ }
431
+ //# sourceMappingURL=mcp-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-catalog.js","sourceRoot":"","sources":["../../src/core/mcp-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AA6EH,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,YAAY,GAAsB;IAC7C;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gEAAgE;QAC7E,QAAQ,EAAE,6CAA6C;QACvD,SAAS,EAAE,MAAM;QACjB,uEAAuE;QACvE,GAAG,EAAE,oCAAoC;QACzC,QAAQ,EAAE,oEAAoE;QAC9E,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mDAAmD;QAChE,QAAQ,EAAE,6BAA6B;QACvC,SAAS,EAAE,MAAM;QACjB,4EAA4E;QAC5E,GAAG,EAAE,4BAA4B;QACjC,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,sDAAsD;QACnE,QAAQ,EAAE,6CAA6C;QACvD,SAAS,EAAE,MAAM;QACjB,GAAG,EAAE,2BAA2B;QAChC,mEAAmE;QACnE,2EAA2E;QAC3E,sEAAsE;QACtE,uEAAuE;QACvE,QAAQ,EAAE,6FAA6F;QACvG,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,8DAA8D;QAC3E,QAAQ,EAAE,wCAAwC;QAClD,SAAS,EAAE,MAAM;QACjB,GAAG,EAAE,4BAA4B;QACjC,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,oDAAoD;QACjE,QAAQ,EAAE,wBAAwB;QAClC,SAAS,EAAE,MAAM;QACjB,GAAG,EAAE,4BAA4B;QACjC,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,oEAAoE;QACjF,QAAQ,EAAE,6BAA6B;QACvC,SAAS,EAAE,MAAM;QACjB,GAAG,EAAE,wBAAwB;QAC7B,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,qEAAqE;QAClF,QAAQ,EAAE,sDAAsD;QAChE,SAAS,EAAE,MAAM;QACjB,GAAG,EAAE,8BAA8B;QACnC,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,iEAAiE;QAC9E,QAAQ,EAAE,qDAAqD;QAC/D,SAAS,EAAE,MAAM;QACjB,GAAG,EAAE,2BAA2B;QAChC,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,iBAAiB;QACvB,uEAAuE;QACvE,sEAAsE;QACtE,0EAA0E;QAC1E,2EAA2E;QAC3E,wEAAwE;QACxE,kCAAkC;QAClC,WAAW,EACT,kKAAkK;QACpK,QAAQ,EAAE,6FAA6F;QACvG,SAAS,EAAE,MAAM;QACjB,GAAG,EAAE,qCAAqC;QAC1C,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,+DAA+D;QAC5E,QAAQ,EAAE,6CAA6C;QACvD,SAAS,EAAE,OAAO;QAClB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,wBAAwB,CAAC;QAChC,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,wEAAwE;QACxE,2EAA2E;QAC3E,0EAA0E;QAC1E,0EAA0E;QAC1E,2EAA2E;QAC3E,EAAE;QACF,2EAA2E;QAC3E,2EAA2E;QAC3E,4EAA4E;QAC5E,mEAAmE;QACnE,WAAW,EACT,sJAAsJ;QACxJ,QAAQ,EAAE,4CAA4C;QACtD,SAAS,EAAE,OAAO;QAClB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,cAAc,EAAE,0BAA0B,CAAC;QAClD,QAAQ,EAAE,+DAA+D;QACzE,UAAU,EAAE,WAAW;QACvB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,2EAA2E;QAC3E,yEAAyE;QACzE,uEAAuE;QACvE,uEAAuE;QACvE,eAAe;QACf,WAAW,EAAE,kEAAkE;QAC/E,QAAQ,EAAE,0EAA0E;QACpF,SAAS,EAAE,OAAO;QAClB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,IAAI,EAAE,yCAAyC,CAAC;QACvD,QAAQ,EAAE,sEAAsE;QAChF,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,4DAA4D;QAC5D,2EAA2E;QAC3E,yEAAyE;QACzE,0EAA0E;QAC1E,wEAAwE;QACxE,2DAA2D;QAC3D,WAAW,EAAE,6DAA6D;QAC1E,QAAQ,EAAE,8CAA8C;QACxD,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,uCAAuC;QACpD,QAAQ,EAAE,qEAAqE;QAC/E,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,SAAS;KAClB;CACF,CAAC;AAEF,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,oBAAoB,GAAG,qDAAqD,CAAC;AAEnF;;;;;;;;;GASG;AACH,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,oBAAoB,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,MAAM,GAAG,MAAM,CAAC;AAEtB;;;;;GAKG;AACH,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,SAAS,GAAG,GAAG,CAAC;AAQtB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE5C,mFAAmF;AACnF,MAAM,UAAU,iBAAiB;IAC/B,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AA0BD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAc,EAAE,KAAc;IAChE,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACvF,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;IAEzB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC;IAE3D,MAAM,QAAQ,GAAG,YAAY,CAAC;IAC9B,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACnC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;YAClC,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqB,CAAC;QACpD,MAAM,GAAG,EAAE,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;QAC5E,0EAA0E;QAC1E,yEAAyE;QACzE,MAAM,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAClG,4EAA4E;IAC5E,6EAA6E;IAC7E,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,MAAM;YAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAsB;IACtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI;YAAE,SAAS;QAC/B,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC;QACpF,sEAAsE;QACtE,0EAA0E;QAC1E,qBAAqB;QACrB,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,SAAS;QAC5C,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC7B,IAAI,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,mFAAmF;AACnF,SAAS,eAAe,CAAC,MAAsB;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG;QACX,EAAE,EAAE,IAAI;QACR,IAAI;QACJ,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC;QAC1D,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACpD,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,EAAE,UAAmB;KAC5B,CAAC;IAEF,4EAA4E;IAC5E,2EAA2E;IAC3E,oDAAoD;IACpD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,MAAM;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;IAE7E,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,GAAG;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAEtF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6DAA6D;AAC7D,SAAS,UAAU,CAAC,OAA4C;IAC9D,MAAM,MAAM,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,iBAAiB,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC;IAC3I,IAAI,IAAI;QAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACrE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;IAC7E,IAAI,GAAG;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IAClE,uEAAuE;IACvE,4EAA4E;IAC5E,iEAAiE;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5H,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,WAAW,CAAC,QAA8C;IACjE,KAAK,MAAM,GAAG,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,EAAE;YAAE,SAAS;QAClB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1D,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACpF,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2FAA2F;AAC3F,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAC3C,OAAO,IAAI;SACR,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,IAAI,EAAE;SACN,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AACtD,CAAC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * MCP servers — turning the project's configured list into something the agents
3
+ * actually receive.
4
+ *
5
+ * Until this existed, `config.mcps` was a list you could edit and nothing else:
6
+ * it was written by the composer, read back by GET /mcps, and never once handed
7
+ * to an agent. A row said "connected" because it had a URL typed into it, which
8
+ * is not the same claim at all. Both halves of that are fixed here.
9
+ *
10
+ * 1. `writeMcpSession` renders the enabled servers into the standard
11
+ * `{"mcpServers": {…}}` document, in a temp file the adapter passes to its
12
+ * CLI for one turn and which is deleted afterwards. Nothing is left behind
13
+ * in the project, and nothing survives a turn it wasn't meant for.
14
+ *
15
+ * 2. `probeMcpServer` asks the server whether it is there. A bounded HTTP
16
+ * round-trip is a weak signal — it proves an endpoint answered, not that it
17
+ * speaks MCP — but it is a *measurement*, and the alternative on offer was
18
+ * `!!url`. A server that refuses the connection is reported as unreachable,
19
+ * which is the honest reading.
20
+ *
21
+ * Two adapters consume this, each through its harness's own API: the Claude
22
+ * adapter passes the servers as the Agent SDK's `mcpServers` option, and the
23
+ * Codex adapter as `mcp_servers.<key>` config on app-server `thread/start`.
24
+ * The config file itself is what `claude -p` callers (Insights) read.
25
+ */
26
+ import type { McpServerConfig, McpServerEntry, ResolvedMcpServer } from "../types.js";
27
+ export type { McpServerEntry, ResolvedMcpServer };
28
+ /** A generated config file plus the servers in it. Alive for exactly one turn. */
29
+ export interface McpSession {
30
+ /** Absolute path to the `{"mcpServers": …}` document. */
31
+ configPath: string;
32
+ servers: ResolvedMcpServer[];
33
+ /** Delete the temp file (and its directory). Idempotent, never throws. */
34
+ cleanup: () => void;
35
+ }
36
+ /**
37
+ * MCP config keys land in a TOML dotted path (`mcp_servers.<key>` for codex),
38
+ * so a display name like "My Server / prod" can't be used raw. Lower-cased and
39
+ * reduced to word characters, which is stable across turns and collision-free
40
+ * for any two names that differ by more than punctuation.
41
+ */
42
+ export declare function mcpKey(name: string): string;
43
+ /**
44
+ * Which configured servers are real enough to hand to an agent.
45
+ *
46
+ * A server counts when it has somewhere to connect to — a URL, or a command to
47
+ * run — and hasn't been switched off for the session. The built-in suggestion
48
+ * rows (GitHub, Slack, … with an empty url) are exactly the rows that fail this,
49
+ * which is the point: they're placeholders, and shipping a placeholder to a CLI
50
+ * as if it were a server is how you get an agent that reports a tool it doesn't
51
+ * have.
52
+ */
53
+ export declare function resolveMcpServers(mcps: McpServerConfig[] | undefined): ResolvedMcpServer[];
54
+ /** The config document itself — the shape every MCP client reads. */
55
+ export declare function mcpConfigDocument(servers: ResolvedMcpServer[]): {
56
+ mcpServers: Record<string, McpServerEntry>;
57
+ };
58
+ /**
59
+ * Write the enabled servers to a temp config file for one turn.
60
+ *
61
+ * Returns null when there is nothing to write — callers use that to decide
62
+ * whether the CLI gets the flag at all, because passing an empty config is not
63
+ * the same as passing none (with `--strict-mcp-config` it would *suppress* the
64
+ * user's own servers).
65
+ */
66
+ export declare function writeMcpSession(mcps: McpServerConfig[] | undefined): McpSession | null;
67
+ /**
68
+ * Is the server actually there?
69
+ *
70
+ * HEAD first (cheapest thing that proves a listener answered), then GET for the
71
+ * servers that only implement the methods MCP uses. ANY HTTP status counts as
72
+ * reachable — a 405 or a 401 is a server saying "not like that", which is still
73
+ * a server. A connection refused, a DNS failure or a timeout is not.
74
+ *
75
+ * Bounded hard: this sits behind an HTTP handler that renders a list, and a
76
+ * hanging endpoint must cost that request two seconds, not forever. The body is
77
+ * cancelled immediately because an MCP endpoint may answer GET with an open SSE
78
+ * stream that never ends.
79
+ */
80
+ export declare function probeMcpServer(url: string, timeoutMs?: number): Promise<boolean>;
81
+ /**
82
+ * Probe every configured server that has a URL, in parallel, and report which
83
+ * ones answered. Servers with no URL aren't probed and aren't reachable —
84
+ * including the command-based ones, whose liveness is "does the process start",
85
+ * a question this can't answer without spawning it.
86
+ */
87
+ export declare function probeMcpServers(mcps: McpServerConfig[], timeoutMs?: number): Promise<Record<string, boolean>>;