@stage-labs/metro 0.1.0-beta.20 → 0.1.0-beta.201

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 (442) hide show
  1. package/dist/api.js +9 -101
  2. package/dist/claude-settings.js +40 -0
  3. package/dist/claude.js +163 -0
  4. package/dist/cli.js +50 -109
  5. package/dist/control.js +47 -75
  6. package/dist/hold.js +211 -0
  7. package/dist/local.js +43 -0
  8. package/dist/mcp-config.js +25 -0
  9. package/dist/node-name.js +71 -0
  10. package/dist/onboarding.js +44 -0
  11. package/dist/provider-flags.js +9 -0
  12. package/dist/route.js +58 -0
  13. package/dist/runtime-install.js +97 -0
  14. package/dist/runtime.js +32 -52
  15. package/dist/serve.js +158 -0
  16. package/dist/service.js +243 -0
  17. package/dist/tail.js +119 -0
  18. package/dist/update.js +13 -1
  19. package/package.json +1 -22
  20. package/runtime/marketplace/.claude-plugin/marketplace.json +12 -0
  21. package/runtime/marketplace/plugin/.claude-plugin/plugin.json +17 -0
  22. package/runtime/marketplace/plugin/.mcp.json +1 -0
  23. package/runtime/marketplace/plugin/bin/guard.mjs +71 -0
  24. package/runtime/marketplace/plugin/bin/metro-plugin.mjs +30 -0
  25. package/runtime/marketplace/plugin/bin/policy.mjs +97 -0
  26. package/runtime/marketplace/plugin/bin/session-start.mjs +31 -0
  27. package/runtime/marketplace/plugin/hooks/hooks.json +25 -0
  28. package/runtime/marketplace/plugin/orchestrator.md +24 -0
  29. package/runtime/node_modules/@metro-labs/core/package.json +47 -0
  30. package/runtime/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  31. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/events.ts +8 -6
  32. package/runtime/node_modules/@metro-labs/core/src/identity.ts +7 -0
  33. package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/ids.ts +5 -0
  34. package/runtime/node_modules/@metro-labs/core/src/is-record.ts +2 -0
  35. package/runtime/node_modules/@metro-labs/{mcp/src/stations → core/src}/lines.ts +12 -3
  36. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/protocol.ts +7 -4
  37. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/secure-fs.ts +17 -0
  38. package/runtime/node_modules/@metro-labs/core/src/station-names.ts +13 -0
  39. package/runtime/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
  40. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/account-store.ts +4 -24
  41. package/runtime/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
  42. package/runtime/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
  43. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/station-runtime.ts +3 -6
  44. package/runtime/node_modules/@metro-labs/core/src/stations/train-boot.ts +42 -0
  45. package/runtime/node_modules/@metro-labs/core/src/stations/train-events.ts +89 -0
  46. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/types.ts +16 -0
  47. package/runtime/node_modules/@metro-labs/core/src/tickets.ts +37 -0
  48. package/runtime/node_modules/@metro-labs/core/src/version.ts +2 -0
  49. package/runtime/node_modules/@metro-labs/daemon/package.json +48 -0
  50. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/agent-fs.ts +134 -0
  51. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files-api.ts +12 -0
  52. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files.ts +119 -0
  53. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/home-fs.ts +113 -0
  54. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/job-env.ts +51 -0
  55. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/provision.ts +99 -0
  56. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedule-detail.ts +100 -0
  57. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules-api.ts +27 -0
  58. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules.ts +252 -0
  59. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/unit-files.ts +61 -0
  60. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/user.ts +91 -0
  61. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/view.ts +87 -0
  62. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-attach.ts +19 -0
  63. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-lookups.ts +55 -0
  64. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-routes.ts +76 -0
  65. package/runtime/node_modules/@metro-labs/daemon/src/agents/accounts-api.ts +357 -0
  66. package/runtime/node_modules/@metro-labs/daemon/src/agents/admin.ts +30 -0
  67. package/runtime/node_modules/@metro-labs/daemon/src/agents/allowlist.ts +59 -0
  68. package/runtime/node_modules/@metro-labs/daemon/src/agents/api.ts +131 -0
  69. package/runtime/node_modules/@metro-labs/daemon/src/agents/bundle.ts +132 -0
  70. package/runtime/node_modules/@metro-labs/daemon/src/agents/file-admin.ts +305 -0
  71. package/runtime/node_modules/@metro-labs/daemon/src/agents/files.ts +168 -0
  72. package/runtime/node_modules/@metro-labs/{mcp/src/db/key-map.ts → daemon/src/agents/keys.ts} +1 -11
  73. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-map.ts → daemon/src/agents/map.ts} +58 -1
  74. package/runtime/node_modules/@metro-labs/daemon/src/agents/policy-route.ts +27 -0
  75. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-scope.ts → daemon/src/agents/scope.ts} +2 -2
  76. package/runtime/node_modules/@metro-labs/daemon/src/agents/sender-cards.ts +86 -0
  77. package/runtime/node_modules/@metro-labs/daemon/src/agents/senders.ts +38 -0
  78. package/runtime/node_modules/@metro-labs/daemon/src/approvals/api.ts +55 -0
  79. package/runtime/node_modules/@metro-labs/daemon/src/approvals/needs.ts +2 -0
  80. package/runtime/node_modules/@metro-labs/daemon/src/approvals/pending.ts +149 -0
  81. package/runtime/node_modules/@metro-labs/daemon/src/approvals/preview.ts +66 -0
  82. package/runtime/node_modules/@metro-labs/daemon/src/boot/boot.ts +221 -0
  83. package/runtime/node_modules/@metro-labs/daemon/src/boot/connect-hint.ts +39 -0
  84. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/crash-guard.ts +1 -1
  85. package/runtime/node_modules/@metro-labs/daemon/src/boot/local-owner.ts +21 -0
  86. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/paths.ts +6 -34
  87. package/runtime/node_modules/@metro-labs/daemon/src/channels/addressed.ts +26 -0
  88. package/runtime/node_modules/@metro-labs/daemon/src/channels/dedupe.ts +12 -0
  89. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/inbound.ts +47 -44
  90. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/media-note.ts +9 -4
  91. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/pending.ts +4 -1
  92. package/runtime/node_modules/@metro-labs/daemon/src/channels/react-note.ts +13 -0
  93. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +2 -2
  94. package/runtime/node_modules/@metro-labs/daemon/src/channels/reply-id.ts +1 -0
  95. package/runtime/node_modules/@metro-labs/daemon/src/claude/api.ts +355 -0
  96. package/runtime/node_modules/@metro-labs/daemon/src/claude/files.ts +359 -0
  97. package/runtime/node_modules/@metro-labs/daemon/src/claude/login.ts +208 -0
  98. package/runtime/node_modules/@metro-labs/daemon/src/claude/memory.ts +82 -0
  99. package/runtime/node_modules/@metro-labs/daemon/src/claude/onboarding.ts +60 -0
  100. package/runtime/node_modules/@metro-labs/daemon/src/claude/plugin-install.ts +149 -0
  101. package/runtime/node_modules/@metro-labs/daemon/src/claude/session-files.ts +75 -0
  102. package/runtime/node_modules/@metro-labs/daemon/src/claude/session.ts +283 -0
  103. package/runtime/node_modules/@metro-labs/daemon/src/claude/settings.ts +109 -0
  104. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup.ts +271 -0
  105. package/runtime/node_modules/@metro-labs/daemon/src/claude/skills.ts +120 -0
  106. package/runtime/node_modules/@metro-labs/daemon/src/claude/version.ts +113 -0
  107. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-api.ts → daemon/src/connectors/api.ts} +77 -109
  108. package/runtime/node_modules/@metro-labs/{mcp/src/db/connector-config.ts → daemon/src/connectors/config.ts} +55 -26
  109. package/runtime/node_modules/@metro-labs/daemon/src/connectors/gates.ts +72 -0
  110. package/runtime/node_modules/@metro-labs/daemon/src/connectors/health.ts +18 -0
  111. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-client.ts +14 -17
  112. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-discovery.ts +28 -13
  113. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth-routes.ts → daemon/src/connectors/oauth-routes.ts} +30 -29
  114. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth.ts → daemon/src/connectors/oauth.ts} +61 -22
  115. package/runtime/node_modules/@metro-labs/daemon/src/connectors/plugin-sync.ts +131 -0
  116. package/runtime/node_modules/@metro-labs/daemon/src/connectors/reach.ts +27 -0
  117. package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-policy.ts +90 -0
  118. package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-target.ts +29 -0
  119. package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay.ts +348 -0
  120. package/runtime/node_modules/@metro-labs/daemon/src/connectors/store.ts +358 -0
  121. package/runtime/node_modules/@metro-labs/daemon/src/connectors/tools.ts +81 -0
  122. package/runtime/node_modules/@metro-labs/daemon/src/connectors/url.ts +37 -0
  123. package/runtime/node_modules/@metro-labs/daemon/src/connectors/verify.ts +106 -0
  124. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-grant.ts +4 -4
  125. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-owner.ts +3 -3
  126. package/runtime/node_modules/@metro-labs/daemon/src/files/attach-reaper.ts +174 -0
  127. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-serve.ts +11 -12
  128. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-api.ts +10 -27
  129. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-store.ts +2 -2
  130. package/runtime/node_modules/@metro-labs/daemon/src/gateway/bedrock.ts +233 -0
  131. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-auth.ts +208 -0
  132. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-device.ts +91 -0
  133. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-stream.ts +173 -0
  134. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-translate.ts +194 -0
  135. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex.ts +137 -0
  136. package/runtime/node_modules/@metro-labs/daemon/src/gateway/effort.ts +77 -0
  137. package/runtime/node_modules/@metro-labs/daemon/src/gateway/eventstream.ts +123 -0
  138. package/runtime/node_modules/@metro-labs/daemon/src/gateway/forward.ts +237 -0
  139. package/runtime/node_modules/@metro-labs/daemon/src/gateway/frames.ts +118 -0
  140. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gateway.ts +274 -0
  141. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-auth.ts +160 -0
  142. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-client.ts +46 -0
  143. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-setup.ts +150 -0
  144. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-stream.ts +139 -0
  145. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-translate.ts +223 -0
  146. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini.ts +208 -0
  147. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-api.ts +199 -0
  148. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-config.ts +299 -0
  149. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-signin.ts +193 -0
  150. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-store.ts +70 -0
  151. package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter.ts +90 -0
  152. package/runtime/node_modules/@metro-labs/daemon/src/gateway/pkce.ts +36 -0
  153. package/runtime/node_modules/@metro-labs/daemon/src/gateway/provider-models.ts +66 -0
  154. package/runtime/node_modules/@metro-labs/daemon/src/gateway/served.ts +18 -0
  155. package/runtime/node_modules/@metro-labs/daemon/src/gateway/subscription.ts +120 -0
  156. package/runtime/node_modules/@metro-labs/daemon/src/gateway/text.ts +15 -0
  157. package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage.ts +244 -0
  158. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/accounts.ts +59 -18
  159. package/runtime/node_modules/@metro-labs/daemon/src/mcp/attachment-schema.ts +91 -0
  160. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/call-tools.ts +43 -20
  161. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
  162. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +15 -16
  163. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/group-tools.ts +2 -2
  164. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/index.ts +24 -79
  165. package/runtime/node_modules/@metro-labs/daemon/src/mcp/instructions.ts +19 -0
  166. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/member-tools.ts +2 -2
  167. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-prompt.ts +87 -0
  168. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-relay.ts +79 -0
  169. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-gate.ts +83 -0
  170. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-snapshot.ts +79 -0
  171. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-lookup.ts +60 -0
  172. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-tool.ts +96 -0
  173. package/runtime/node_modules/@metro-labs/daemon/src/mcp/read-tool.ts +87 -0
  174. package/runtime/node_modules/@metro-labs/daemon/src/mcp/request-identity.ts +46 -0
  175. package/runtime/node_modules/@metro-labs/daemon/src/mcp/session-slot.ts +48 -0
  176. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session.ts +33 -42
  177. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-catalog.ts +88 -0
  178. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-def.ts +9 -0
  179. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-dispatch.ts +53 -40
  180. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +55 -119
  181. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +6 -11
  182. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/api.ts +43 -0
  183. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/helper-script.ts +126 -0
  184. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/move.ts +165 -0
  185. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/privilege.ts +48 -0
  186. package/runtime/node_modules/@metro-labs/daemon/src/monitor/api.ts +132 -0
  187. package/runtime/node_modules/@metro-labs/daemon/src/net/tunnel.ts +316 -0
  188. package/runtime/node_modules/@metro-labs/daemon/src/policy/policy.ts +118 -0
  189. package/runtime/node_modules/@metro-labs/daemon/src/routes/bearer.ts +35 -0
  190. package/runtime/node_modules/@metro-labs/daemon/src/routes/body.ts +24 -0
  191. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +59 -51
  192. package/runtime/node_modules/@metro-labs/daemon/src/routes/local-mode.ts +208 -0
  193. package/runtime/node_modules/@metro-labs/daemon/src/routes/session-apis.ts +71 -0
  194. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-api.ts → daemon/src/routes/session.ts} +9 -7
  195. package/runtime/node_modules/@metro-labs/daemon/src/routes/threema-callback.ts +103 -0
  196. package/runtime/node_modules/@metro-labs/daemon/src/server/control.ts +39 -0
  197. package/runtime/node_modules/@metro-labs/daemon/src/server/machine.ts +58 -0
  198. package/runtime/node_modules/@metro-labs/daemon/src/server/owner.ts +26 -0
  199. package/runtime/node_modules/@metro-labs/daemon/src/server/update.ts +90 -0
  200. package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
  201. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-driver.ts +42 -0
  202. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-inline.ts +29 -1
  203. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-interactive.ts +9 -36
  204. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-outlook.ts +63 -0
  205. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-resolve.ts +38 -13
  206. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/attach-session.ts +30 -20
  207. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-xmtp.ts +2 -2
  208. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach.ts +75 -9
  209. package/runtime/node_modules/@metro-labs/daemon/src/stations/materialize.ts +265 -0
  210. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/registry.ts +22 -6
  211. package/runtime/node_modules/@metro-labs/daemon/src/stations/runtime-deps.ts +82 -0
  212. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor-io.ts +2 -2
  213. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor.ts +5 -8
  214. package/runtime/node_modules/@metro-labs/daemon/src/stations/threema-callbacks.ts +32 -0
  215. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/train-call.ts +1 -1
  216. package/runtime/node_modules/@metro-labs/daemon/src/stations/webhook-endpoints.ts +51 -0
  217. package/runtime/node_modules/@metro-labs/daemon/src/terminal/api.ts +84 -0
  218. package/runtime/node_modules/@metro-labs/daemon/src/terminal/socket.ts +124 -0
  219. package/runtime/node_modules/@metro-labs/daemon/src/terminal/tickets.ts +15 -0
  220. package/runtime/node_modules/@metro-labs/daemon/src/vault/api.ts +45 -0
  221. package/runtime/node_modules/@metro-labs/daemon/src/vault/config.ts +51 -0
  222. package/runtime/node_modules/@metro-labs/daemon/src/vault/firewall.ts +48 -0
  223. package/runtime/node_modules/@metro-labs/daemon/src/vault/index.ts +96 -0
  224. package/runtime/node_modules/@metro-labs/daemon/src/vault/install.ts +56 -0
  225. package/runtime/node_modules/@metro-labs/daemon/src/vault/paths.ts +26 -0
  226. package/runtime/node_modules/@metro-labs/daemon/src/vault/proxy.ts +148 -0
  227. package/runtime/node_modules/@metro-labs/daemon/src/vault/store.ts +130 -0
  228. package/runtime/node_modules/@metro-labs/daemon/src/vault/trust.ts +61 -0
  229. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/package.json +3 -5
  230. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/accounts.ts +11 -13
  231. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/actions.ts +6 -154
  232. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/attachments.ts +3 -3
  233. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/format.ts +28 -64
  234. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/group-actions.ts +1 -1
  235. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/group.ts +2 -2
  236. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/index.ts +14 -19
  237. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/members.ts +2 -2
  238. package/runtime/node_modules/@metro-labs/discord-bot/src/profile.ts +68 -0
  239. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/send-files.ts +1 -1
  240. package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +22 -0
  241. package/runtime/node_modules/@metro-labs/discord-bot/src/wire.ts +1 -0
  242. package/runtime/node_modules/@metro-labs/http/package.json +29 -0
  243. package/runtime/node_modules/@metro-labs/http/src/api-http.ts +138 -0
  244. package/runtime/node_modules/@metro-labs/http/src/mode-api.ts +32 -0
  245. package/runtime/node_modules/@metro-labs/http/src/return-to.ts +21 -0
  246. package/runtime/node_modules/@metro-labs/http/src/workos-token.ts +149 -0
  247. package/runtime/node_modules/@metro-labs/{telegram-user → outlook}/package.json +2 -5
  248. package/runtime/node_modules/@metro-labs/outlook/src/accounts.ts +107 -0
  249. package/runtime/node_modules/@metro-labs/outlook/src/actions.ts +20 -0
  250. package/runtime/node_modules/@metro-labs/outlook/src/attachments.ts +97 -0
  251. package/runtime/node_modules/@metro-labs/outlook/src/auth.ts +150 -0
  252. package/runtime/node_modules/@metro-labs/outlook/src/browser.ts +53 -0
  253. package/runtime/node_modules/@metro-labs/outlook/src/config.ts +36 -0
  254. package/runtime/node_modules/@metro-labs/outlook/src/format.ts +141 -0
  255. package/runtime/node_modules/@metro-labs/outlook/src/graph.ts +60 -0
  256. package/runtime/node_modules/@metro-labs/outlook/src/html.ts +72 -0
  257. package/runtime/node_modules/@metro-labs/outlook/src/inbound.ts +104 -0
  258. package/runtime/node_modules/@metro-labs/outlook/src/index.ts +12 -0
  259. package/runtime/node_modules/@metro-labs/outlook/src/login.ts +150 -0
  260. package/runtime/node_modules/@metro-labs/outlook/src/me.ts +41 -0
  261. package/runtime/node_modules/@metro-labs/outlook/src/outbound.ts +116 -0
  262. package/runtime/node_modules/@metro-labs/outlook/src/query.ts +119 -0
  263. package/runtime/node_modules/@metro-labs/outlook/src/state.ts +43 -0
  264. package/runtime/node_modules/@metro-labs/outlook/src/station.ts +15 -0
  265. package/runtime/node_modules/@metro-labs/outlook/src/trust.ts +70 -0
  266. package/runtime/node_modules/@metro-labs/telegram/package.json +3 -2
  267. package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +48 -88
  268. package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +214 -253
  269. package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +67 -108
  270. package/runtime/node_modules/@metro-labs/{telegram-user → telegram}/src/client.ts +6 -6
  271. package/runtime/node_modules/@metro-labs/telegram/src/format.ts +102 -146
  272. package/runtime/node_modules/@metro-labs/{telegram-user → telegram}/src/group.ts +4 -4
  273. package/runtime/node_modules/@metro-labs/{telegram-user → telegram}/src/history.ts +1 -1
  274. package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +57 -0
  275. package/runtime/node_modules/@metro-labs/telegram/src/index.ts +6 -102
  276. package/runtime/node_modules/@metro-labs/{telegram-user → telegram}/src/login.ts +20 -20
  277. package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +65 -151
  278. package/runtime/node_modules/@metro-labs/telegram/src/members.ts +61 -33
  279. package/runtime/node_modules/@metro-labs/{telegram-user → telegram}/src/normalize.ts +1 -1
  280. package/runtime/node_modules/@metro-labs/telegram/src/profile.ts +70 -0
  281. package/runtime/node_modules/@metro-labs/{telegram-user → telegram}/src/reactions.ts +2 -2
  282. package/runtime/node_modules/@metro-labs/telegram/src/station.ts +11 -1
  283. package/runtime/node_modules/@metro-labs/telegram/src/types.ts +5 -47
  284. package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +1 -3
  285. package/runtime/node_modules/@metro-labs/telegram-bot/package.json +25 -0
  286. package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +119 -0
  287. package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +246 -0
  288. package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +128 -0
  289. package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +173 -0
  290. package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +103 -0
  291. package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +95 -0
  292. package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +47 -0
  293. package/runtime/node_modules/@metro-labs/telegram-bot/src/profile.ts +65 -0
  294. package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +20 -0
  295. package/runtime/node_modules/@metro-labs/telegram-bot/src/types.ts +56 -0
  296. package/runtime/node_modules/@metro-labs/telegram-bot/src/wire.ts +1 -0
  297. package/runtime/node_modules/@metro-labs/threema/package.json +26 -0
  298. package/runtime/node_modules/@metro-labs/threema/src/accounts.ts +106 -0
  299. package/runtime/node_modules/@metro-labs/threema/src/actions.ts +134 -0
  300. package/runtime/node_modules/@metro-labs/threema/src/api.ts +152 -0
  301. package/runtime/node_modules/@metro-labs/threema/src/crypto.ts +100 -0
  302. package/runtime/node_modules/@metro-labs/threema/src/files.ts +58 -0
  303. package/runtime/node_modules/@metro-labs/threema/src/format.ts +169 -0
  304. package/runtime/node_modules/@metro-labs/threema/src/groups.ts +96 -0
  305. package/runtime/node_modules/@metro-labs/threema/src/ids.ts +21 -0
  306. package/runtime/node_modules/@metro-labs/threema/src/inbound.ts +89 -0
  307. package/runtime/node_modules/@metro-labs/threema/src/index.ts +24 -0
  308. package/runtime/node_modules/@metro-labs/threema/src/messages.ts +264 -0
  309. package/runtime/node_modules/@metro-labs/threema/src/outbound.ts +160 -0
  310. package/runtime/node_modules/@metro-labs/threema/src/station.ts +13 -0
  311. package/runtime/node_modules/@metro-labs/threema/src/verify.ts +117 -0
  312. package/runtime/node_modules/@metro-labs/webhook/package.json +1 -1
  313. package/runtime/node_modules/@metro-labs/webhook/src/station.ts +5 -8
  314. package/runtime/node_modules/@metro-labs/whatsapp/package.json +1 -3
  315. package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +1 -2
  316. package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +1 -1
  317. package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +40 -5
  318. package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +2 -2
  319. package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +1 -1
  320. package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +74 -4
  321. package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +7 -56
  322. package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +10 -27
  323. package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +4 -37
  324. package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +1 -1
  325. package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +1 -1
  326. package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +1 -1
  327. package/runtime/node_modules/@metro-labs/whatsapp/src/names.ts +28 -0
  328. package/runtime/node_modules/@metro-labs/whatsapp/src/normalize.ts +1 -1
  329. package/runtime/node_modules/@metro-labs/whatsapp/src/parse.ts +44 -0
  330. package/runtime/node_modules/@metro-labs/whatsapp/src/resolve.ts +52 -0
  331. package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +8 -1
  332. package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +5 -9
  333. package/runtime/node_modules/@metro-labs/whatsapp/src/types.ts +0 -1
  334. package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +1 -5
  335. package/runtime/node_modules/@metro-labs/xmtp/package.json +3 -2
  336. package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +9 -8
  337. package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +1 -1
  338. package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +3 -201
  339. package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +3 -42
  340. package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +12 -143
  341. package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +3 -3
  342. package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +3 -3
  343. package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +7 -24
  344. package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +7 -16
  345. package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +1 -1
  346. package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +2 -2
  347. package/runtime/node_modules/@metro-labs/xmtp/src/identity.ts +30 -16
  348. package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +11 -14
  349. package/runtime/node_modules/@metro-labs/xmtp/src/labels.ts +1 -19
  350. package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +1 -1
  351. package/runtime/node_modules/@metro-labs/xmtp/src/names.ts +61 -0
  352. package/runtime/node_modules/@metro-labs/xmtp/src/profile.ts +153 -0
  353. package/runtime/node_modules/@metro-labs/xmtp/src/sender.ts +112 -0
  354. package/runtime/node_modules/@metro-labs/xmtp/src/smart.ts +72 -0
  355. package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +5 -1
  356. package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +3 -50
  357. package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +30 -44
  358. package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +4 -6
  359. package/runtime/node_modules/@metro-labs/xmtp/src/verify.ts +19 -5
  360. package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +15 -3
  361. package/runtime/runtime.json +1 -1
  362. package/runtime/server.ts +1 -0
  363. package/runtime/stations.json +37 -0
  364. package/dist/prompt.js +0 -10
  365. package/dist/store.js +0 -70
  366. package/runtime/node_modules/@metro-labs/discord/src/station.ts +0 -19
  367. package/runtime/node_modules/@metro-labs/discord/src/voice-speak.ts +0 -195
  368. package/runtime/node_modules/@metro-labs/discord/src/voice-transcribe.ts +0 -292
  369. package/runtime/node_modules/@metro-labs/discord/src/voice.ts +0 -197
  370. package/runtime/node_modules/@metro-labs/discord/src/wire.ts +0 -5
  371. package/runtime/node_modules/@metro-labs/mcp/package.json +0 -66
  372. package/runtime/node_modules/@metro-labs/mcp/src/channels/dedupe.ts +0 -24
  373. package/runtime/node_modules/@metro-labs/mcp/src/daemon/account-api.ts +0 -311
  374. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-api.ts +0 -335
  375. package/runtime/node_modules/@metro-labs/mcp/src/daemon/api-http.ts +0 -129
  376. package/runtime/node_modules/@metro-labs/mcp/src/daemon/boot.ts +0 -322
  377. package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair-api.ts +0 -111
  378. package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair.ts +0 -20
  379. package/runtime/node_modules/@metro-labs/mcp/src/daemon/collection-api.ts +0 -202
  380. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-json.ts +0 -31
  381. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-tools.ts +0 -100
  382. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-url.ts +0 -57
  383. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-verify.ts +0 -333
  384. package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-auth.ts +0 -164
  385. package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-oauth.ts +0 -208
  386. package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity.ts +0 -79
  387. package/runtime/node_modules/@metro-labs/mcp/src/daemon/oauth-pending.ts +0 -65
  388. package/runtime/node_modules/@metro-labs/mcp/src/daemon/pair-codes.ts +0 -58
  389. package/runtime/node_modules/@metro-labs/mcp/src/daemon/project-api.ts +0 -214
  390. package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-api.ts +0 -125
  391. package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-pair.ts +0 -18
  392. package/runtime/node_modules/@metro-labs/mcp/src/daemon/runtime-source.ts +0 -105
  393. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session-apis.ts +0 -41
  394. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session.ts +0 -218
  395. package/runtime/node_modules/@metro-labs/mcp/src/daemon/tunnel.ts +0 -169
  396. package/runtime/node_modules/@metro-labs/mcp/src/db/account-attach.ts +0 -91
  397. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-admin.ts +0 -215
  398. package/runtime/node_modules/@metro-labs/mcp/src/db/client.ts +0 -37
  399. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-collections.ts +0 -218
  400. package/runtime/node_modules/@metro-labs/mcp/src/db/connectors.ts +0 -329
  401. package/runtime/node_modules/@metro-labs/mcp/src/db/materialize.ts +0 -340
  402. package/runtime/node_modules/@metro-labs/mcp/src/db/projects.ts +0 -300
  403. package/runtime/node_modules/@metro-labs/mcp/src/db/runtime-admin.ts +0 -28
  404. package/runtime/node_modules/@metro-labs/mcp/src/db/runtimes.ts +0 -105
  405. package/runtime/node_modules/@metro-labs/mcp/src/db/schema.ts +0 -131
  406. package/runtime/node_modules/@metro-labs/mcp/src/db/token-carry.ts +0 -45
  407. package/runtime/node_modules/@metro-labs/mcp/src/db/users.ts +0 -57
  408. package/runtime/node_modules/@metro-labs/mcp/src/db/whatsapp-login.ts +0 -18
  409. package/runtime/node_modules/@metro-labs/mcp/src/mcp/channel-owner.ts +0 -29
  410. package/runtime/node_modules/@metro-labs/mcp/src/mcp/frame-scope.ts +0 -21
  411. package/runtime/node_modules/@metro-labs/mcp/src/mcp/permission-relay.ts +0 -66
  412. package/runtime/node_modules/@metro-labs/mcp/src/mcp/request-identity.ts +0 -73
  413. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-registry.ts +0 -172
  414. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-route.ts +0 -43
  415. package/runtime/node_modules/@metro-labs/mcp/src/monitor/api.ts +0 -240
  416. package/runtime/node_modules/@metro-labs/mcp/src/server.ts +0 -2
  417. package/runtime/node_modules/@metro-labs/telegram-user/src/accounts.ts +0 -81
  418. package/runtime/node_modules/@metro-labs/telegram-user/src/actions.ts +0 -254
  419. package/runtime/node_modules/@metro-labs/telegram-user/src/attachments.ts +0 -87
  420. package/runtime/node_modules/@metro-labs/telegram-user/src/format.ts +0 -141
  421. package/runtime/node_modules/@metro-labs/telegram-user/src/inbound.ts +0 -78
  422. package/runtime/node_modules/@metro-labs/telegram-user/src/index.ts +0 -46
  423. package/runtime/node_modules/@metro-labs/telegram-user/src/media-actions.ts +0 -80
  424. package/runtime/node_modules/@metro-labs/telegram-user/src/members.ts +0 -75
  425. package/runtime/node_modules/@metro-labs/telegram-user/src/station.ts +0 -24
  426. package/runtime/node_modules/@metro-labs/telegram-user/src/types.ts +0 -7
  427. package/runtime/node_modules/@metro-labs/telegram-user/src/wire.ts +0 -1
  428. package/runtime/node_modules/@metro-labs/xmtp/src/actions-push.ts +0 -87
  429. package/runtime/node_modules/@metro-labs/xmtp/src/emit-core.ts +0 -55
  430. package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +0 -349
  431. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/log.ts +0 -0
  432. /package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/attachments.ts +0 -0
  433. /package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/messaging-normalize.ts +0 -0
  434. /package/runtime/node_modules/@metro-labs/{mcp/src/mcp → core/src}/str.ts +0 -0
  435. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/train-error.ts +0 -0
  436. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/webhook-note.ts +0 -0
  437. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/raw-get-stream.ts +0 -0
  438. /package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/api-base.ts +0 -0
  439. /package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/verify.ts +0 -0
  440. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-error.ts +0 -0
  441. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/cors.ts +0 -0
  442. /package/runtime/node_modules/@metro-labs/{telegram → telegram-bot}/src/verify.ts +0 -0
@@ -1,37 +0,0 @@
1
- import { drizzle, type PostgresJsDatabase } from 'drizzle-orm/postgres-js';
2
- import postgres from 'postgres';
3
- import { log } from '../daemon/log.js';
4
- import * as schema from './schema.js';
5
-
6
- export type Db = PostgresJsDatabase<typeof schema>;
7
-
8
- let sql: ReturnType<typeof postgres> | null = null;
9
- let db: Db | null = null;
10
-
11
- export function databaseUrl(): string | undefined {
12
- const url = process.env.DATABASE_URL?.trim();
13
- if (!url) return undefined;
14
- return url;
15
- }
16
-
17
- export function getDb(): Db {
18
- const url = databaseUrl();
19
- if (!url) throw new Error('DATABASE_URL is not set');
20
- if (!db) {
21
- sql = postgres(url, {
22
- max: 4,
23
- prepare: false,
24
- onnotice: (notice) => {
25
- log.debug({ notice: notice.message }, 'postgres notice');
26
- },
27
- });
28
- db = drizzle(sql, { schema });
29
- }
30
- return db;
31
- }
32
-
33
- export async function closeDb(): Promise<void> {
34
- if (sql) await sql.end({ timeout: 5 });
35
- sql = null;
36
- db = null;
37
- }
@@ -1,218 +0,0 @@
1
- import { isUniqueViolation } from './users.js';
2
- import { projectIdOrThrow } from './projects.js';
3
- import { and, asc, eq, inArray, ne } from 'drizzle-orm';
4
- import { getDb } from './client.js';
5
- import { newId } from './ids.js';
6
- import { ConnectorError, connectorName } from './connector-config.js';
7
- import { collectionItems, collections, connectors } from './schema.js';
8
-
9
- export interface ConnectorCollectionRow {
10
- id: string;
11
- name: string;
12
- connectorIds: string[];
13
- }
14
-
15
- interface CollectionRow {
16
- id: string;
17
- projectId: string;
18
- name: string;
19
- }
20
-
21
- const missing = (): ConnectorError =>
22
- new ConnectorError('no such collection', 404);
23
-
24
- const duplicate = (name: string): ConnectorError =>
25
- new ConnectorError(`you already have a collection named '${name}'`, 409);
26
-
27
- const nameClash = (name: string, collection: string): ConnectorError =>
28
- new ConnectorError(
29
- `the collection '${collection}' already has a connector named '${name}'`,
30
- 409,
31
- );
32
-
33
- async function collidingCollection(
34
- collectionIds: string[],
35
- name: string,
36
- exceptConnectorId: string,
37
- ): Promise<string | null> {
38
- if (collectionIds.length === 0) return null;
39
- const rows = await getDb()
40
- .select({ collection: collections.name })
41
- .from(collectionItems)
42
- .innerJoin(connectors, eq(connectors.id, collectionItems.connectorId))
43
- .innerJoin(collections, eq(collections.id, collectionItems.collectionId))
44
- .where(
45
- and(
46
- inArray(collectionItems.collectionId, collectionIds),
47
- eq(connectors.name, name),
48
- ne(connectors.id, exceptConnectorId),
49
- ),
50
- )
51
- .limit(1);
52
- return rows[0]?.collection ?? null;
53
- }
54
-
55
- export async function assertRenameFreeOfClash(
56
- connectorId: string,
57
- name: string,
58
- ): Promise<void> {
59
- const rows = await getDb()
60
- .select({ collectionId: collectionItems.collectionId })
61
- .from(collectionItems)
62
- .where(eq(collectionItems.connectorId, connectorId));
63
- const clash = await collidingCollection(
64
- rows.map((r) => r.collectionId),
65
- name,
66
- connectorId,
67
- );
68
- if (clash !== null) throw nameClash(name, clash);
69
- }
70
-
71
- async function ownedCollectionOrThrow(
72
- email: string,
73
- id: string,
74
- ): Promise<CollectionRow> {
75
- const rows = await getDb()
76
- .select()
77
- .from(collections)
78
- .where(eq(collections.id, id));
79
- const row = rows[0];
80
- if (row === undefined) throw missing();
81
- try {
82
- await projectIdOrThrow(email, row.projectId);
83
- } catch {
84
- throw missing();
85
- }
86
- return row;
87
- }
88
-
89
- async function itemsOf(collectionId: string): Promise<string[]> {
90
- const rows = await getDb()
91
- .select({ connectorId: collectionItems.connectorId })
92
- .from(collectionItems)
93
- .where(eq(collectionItems.collectionId, collectionId))
94
- .orderBy(asc(collectionItems.id));
95
- return rows.map((r) => r.connectorId);
96
- }
97
-
98
- async function withItems(row: CollectionRow): Promise<ConnectorCollectionRow> {
99
- return { id: row.id, name: row.name, connectorIds: await itemsOf(row.id) };
100
- }
101
-
102
- export async function listCollectionsForEmail(
103
- email: string,
104
- project: string,
105
- ): Promise<ConnectorCollectionRow[]> {
106
- const projectId = await projectIdOrThrow(email, project);
107
- const rows = await getDb()
108
- .select()
109
- .from(collections)
110
- .where(eq(collections.projectId, projectId))
111
- .orderBy(asc(collections.id));
112
- return Promise.all(rows.map(withItems));
113
- }
114
-
115
- export async function getCollectionForEmail(
116
- email: string,
117
- id: string,
118
- ): Promise<ConnectorCollectionRow> {
119
- return withItems(await ownedCollectionOrThrow(email, id));
120
- }
121
-
122
- export async function createCollectionForEmail(
123
- email: string,
124
- project: string,
125
- raw: string,
126
- ): Promise<ConnectorCollectionRow> {
127
- const name = connectorName(raw);
128
- const projectId = await projectIdOrThrow(email, project);
129
- try {
130
- const rows = await getDb()
131
- .insert(collections)
132
- .values({ id: newId(), projectId, name })
133
- .returning();
134
- const row = rows[0];
135
- if (row === undefined)
136
- throw new ConnectorError('collection insert returned no row', 500);
137
- return { id: row.id, name: row.name, connectorIds: [] };
138
- } catch (err) {
139
- if (!isUniqueViolation(err)) throw err;
140
- throw duplicate(name);
141
- }
142
- }
143
-
144
- export async function renameCollectionForEmail(
145
- email: string,
146
- id: string,
147
- raw: string,
148
- ): Promise<ConnectorCollectionRow> {
149
- const name = connectorName(raw);
150
- const row = await ownedCollectionOrThrow(email, id);
151
- try {
152
- await getDb()
153
- .update(collections)
154
- .set({ name })
155
- .where(eq(collections.id, row.id));
156
- } catch (err) {
157
- if (!isUniqueViolation(err)) throw err;
158
- throw duplicate(name);
159
- }
160
- return withItems({ ...row, name });
161
- }
162
-
163
- export async function deleteCollectionForEmail(
164
- email: string,
165
- id: string,
166
- ): Promise<{ id: string; name: string }> {
167
- const row = await ownedCollectionOrThrow(email, id);
168
- await getDb().delete(collections).where(eq(collections.id, row.id));
169
- return { id: row.id, name: row.name };
170
- }
171
-
172
- async function connectorNameIn(
173
- projectId: string,
174
- connectorId: string,
175
- ): Promise<string | null> {
176
- const rows = await getDb()
177
- .select({ name: connectors.name })
178
- .from(connectors)
179
- .where(and(eq(connectors.id, connectorId), eq(connectors.projectId, projectId)));
180
- return rows[0]?.name ?? null;
181
- }
182
-
183
- export async function addToCollectionForEmail(
184
- email: string,
185
- id: string,
186
- connectorId: string,
187
- ): Promise<ConnectorCollectionRow> {
188
- const row = await ownedCollectionOrThrow(email, id);
189
- const name = await connectorNameIn(row.projectId, connectorId);
190
- if (name === null) throw new ConnectorError('no such connector', 404);
191
- const clash = await collidingCollection([row.id], name, connectorId);
192
- if (clash !== null) throw nameClash(name, clash);
193
- try {
194
- await getDb()
195
- .insert(collectionItems)
196
- .values({ id: newId(), collectionId: row.id, connectorId });
197
- } catch (err) {
198
- if (!isUniqueViolation(err)) throw err;
199
- }
200
- return withItems(row);
201
- }
202
-
203
- export async function removeFromCollectionForEmail(
204
- email: string,
205
- id: string,
206
- connectorId: string,
207
- ): Promise<ConnectorCollectionRow> {
208
- const row = await ownedCollectionOrThrow(email, id);
209
- await getDb()
210
- .delete(collectionItems)
211
- .where(
212
- and(
213
- eq(collectionItems.collectionId, row.id),
214
- eq(collectionItems.connectorId, connectorId),
215
- ),
216
- );
217
- return withItems(row);
218
- }
@@ -1,329 +0,0 @@
1
- import { assertRenameFreeOfClash } from './connector-collections.js';
2
- import { projectIdOrThrow } from './projects.js';
3
- import { and, asc, eq, inArray } from 'drizzle-orm';
4
- import {
5
- connectorUrlText,
6
- ConnectorVerifyError,
7
- parseConnectorUrl,
8
- verifyRemoteMcp,
9
- type ConnectorAuth,
10
- type OAuthAuth,
11
- type VerifiedRecord,
12
- } from '../daemon/connector-verify.js';
13
- import { oauthExpired, refreshOAuth } from '../daemon/connector-oauth.js';
14
- import { advertisesOAuth } from '../daemon/oauth-discovery.js';
15
- import {
16
- ConnectorError,
17
- connectorAuth,
18
- connectorName,
19
- readConfig,
20
- signInState,
21
- stamp,
22
- type ConnectorConfig,
23
- type ConnectorSignIn,
24
- } from './connector-config.js';
25
- import { errMsg, log } from '../daemon/log.js';
26
- import { newId } from './ids.js';
27
- import { getDb } from './client.js';
28
- import { connectors, type ConnectorTransport } from './schema.js';
29
-
30
- export interface Connector {
31
- id: string;
32
- name: string;
33
- url: string;
34
- transport: ConnectorTransport;
35
- auth: ConnectorAuth['kind'];
36
- header: string | null;
37
- secret: string | null;
38
- bearer: string | null;
39
- expiresAt: number | null;
40
- signIn: ConnectorSignIn;
41
- verified: VerifiedRecord;
42
- }
43
-
44
- export interface ConnectorInput {
45
- name: unknown;
46
- url: unknown;
47
- header: unknown;
48
- value: unknown;
49
- }
50
-
51
- export type ConnectorCheck =
52
- | { id: string; name: string; ok: true; verified: VerifiedRecord }
53
- | { id: string; name: string; ok: false; reason: string };
54
-
55
- export interface DeletedConnector {
56
- id: string;
57
- name: string;
58
- }
59
-
60
- type ConnectorRow = typeof connectors.$inferSelect;
61
-
62
- function toConnector(row: ConnectorRow): Connector {
63
- const config = readConfig(row.config);
64
- const auth = config.auth;
65
- return {
66
- id: row.id,
67
- name: row.name,
68
- url: row.url,
69
- transport: row.transport,
70
- auth: auth.kind,
71
- header: auth.kind === 'header' ? auth.name : null,
72
- secret: auth.kind === 'header' ? auth.value : null,
73
- bearer: auth.kind === 'oauth' ? auth.accessToken : null,
74
- expiresAt: auth.kind === 'oauth' ? (auth.expiresAt ?? null) : null,
75
- signIn: signInState(config),
76
- verified: config.verified,
77
- };
78
- }
79
-
80
- const missing = (): ConnectorError =>
81
- new ConnectorError('no such connector', 404);
82
-
83
- async function ownedConnectorOrThrow(
84
- email: string,
85
- id: string,
86
- ): Promise<ConnectorRow> {
87
- const rows = await getDb()
88
- .select()
89
- .from(connectors)
90
- .where(eq(connectors.id, id));
91
- const row = rows[0];
92
- if (row === undefined) throw missing();
93
- try {
94
- await projectIdOrThrow(email, row.projectId);
95
- } catch {
96
- throw missing();
97
- }
98
- return row;
99
- }
100
-
101
- async function saveConfig(
102
- row: ConnectorRow,
103
- config: ConnectorConfig,
104
- ): Promise<Connector> {
105
- const rows = await getDb()
106
- .update(connectors)
107
- .set({ config })
108
- .where(and(eq(connectors.id, row.id), eq(connectors.projectId, row.projectId)))
109
- .returning();
110
- const saved = rows[0];
111
- if (saved === undefined) throw missing();
112
- return toConnector(saved);
113
- }
114
-
115
- async function connectorRowsFor(
116
- email: string,
117
- project: string,
118
- ): Promise<ConnectorRow[]> {
119
- const projectId = await projectIdOrThrow(email, project);
120
- return getDb()
121
- .select()
122
- .from(connectors)
123
- .where(eq(connectors.projectId, projectId))
124
- .orderBy(asc(connectors.id));
125
- }
126
-
127
- export async function listConnectorsForEmail(
128
- email: string,
129
- project: string,
130
- ): Promise<Connector[]> {
131
- return (await connectorRowsFor(email, project)).map(toConnector);
132
- }
133
-
134
- async function withFreshToken(row: ConnectorRow): Promise<Connector> {
135
- const config = readConfig(row.config);
136
- if (config.auth.kind !== 'oauth' || !oauthExpired(config.auth))
137
- return toConnector(row);
138
- const url = parseConnectorUrl(row.url);
139
- const auth = await refreshOAuth(config.auth, url.toString());
140
- return saveConfig(row, { ...config, auth });
141
- }
142
-
143
- async function rowsByIds(ids: string[]): Promise<ConnectorRow[]> {
144
- if (ids.length === 0) return [];
145
- return getDb()
146
- .select()
147
- .from(connectors)
148
- .where(inArray(connectors.id, ids))
149
- .orderBy(asc(connectors.id));
150
- }
151
-
152
- export async function listFreshConnectorsByIds(
153
- ids: string[],
154
- ): Promise<Connector[]> {
155
- const rows = await rowsByIds(ids);
156
- return Promise.all(
157
- rows.map(async (row) =>
158
- withFreshToken(row).catch((err: unknown) => {
159
- log.warn(
160
- { id: row.id, err: errMsg(err) },
161
- 'connectors: could not refresh the access token',
162
- );
163
- return toConnector(row);
164
- }),
165
- ),
166
- );
167
- }
168
-
169
- export async function getConnectorForEmail(
170
- email: string,
171
- id: string,
172
- ): Promise<Connector> {
173
- return toConnector(await ownedConnectorOrThrow(email, id));
174
- }
175
-
176
- async function insertConnector(
177
- projectId: string,
178
- name: string,
179
- url: URL,
180
- config: ConnectorConfig,
181
- ): Promise<Connector> {
182
- const rows = await getDb()
183
- .insert(connectors)
184
- .values({
185
- id: newId(),
186
- projectId,
187
- name,
188
- url: connectorUrlText(url),
189
- transport: 'http',
190
- config,
191
- })
192
- .returning();
193
- const row = rows[0];
194
- if (row === undefined)
195
- throw new ConnectorError('connector insert returned no row', 500);
196
- return toConnector(row);
197
- }
198
-
199
- const UNVERIFIED = {
200
- at: '',
201
- server: '',
202
- version: '',
203
- protocol: '',
204
- icon: '',
205
- tools: 0,
206
- catalog: [],
207
- };
208
-
209
- export async function createPendingConnectorForEmail(
210
- email: string,
211
- project: string,
212
- input: { name: unknown; url: unknown },
213
- ): Promise<Connector> {
214
- const name = connectorName(input.name);
215
- const url = parseConnectorUrl(input.url);
216
- const projectId = await projectIdOrThrow(email, project);
217
- return insertConnector(projectId, name, url, {
218
- auth: { kind: 'none' },
219
- createdAt: new Date().toISOString(),
220
- verified: UNVERIFIED,
221
- oauth: true,
222
- });
223
- }
224
-
225
- export async function createConnectorForEmail(
226
- email: string,
227
- project: string,
228
- input: ConnectorInput,
229
- ): Promise<Connector> {
230
- const name = connectorName(input.name);
231
- const url = parseConnectorUrl(input.url);
232
- const auth = connectorAuth(input.header, input.value);
233
- const projectId = await projectIdOrThrow(email, project);
234
- const verified = stamp(await verifyRemoteMcp(url, auth));
235
- return insertConnector(projectId, name, url, {
236
- auth,
237
- createdAt: new Date().toISOString(),
238
- verified,
239
- oauth: await oauthCapable(url, auth),
240
- });
241
- }
242
-
243
- async function oauthCapable(url: URL, auth: ConnectorAuth): Promise<boolean> {
244
- if (auth.kind === 'oauth') return true;
245
- if (auth.kind === 'header') return false;
246
- return advertisesOAuth(url);
247
- }
248
-
249
- async function freshAuth(
250
- auth: ConnectorAuth,
251
- resource: string,
252
- ): Promise<ConnectorAuth> {
253
- if (auth.kind !== 'oauth' || !oauthExpired(auth)) return auth;
254
- return refreshOAuth(auth, resource);
255
- }
256
-
257
- export async function reconnectConnectorForEmail(
258
- email: string,
259
- id: string,
260
- auth: OAuthAuth,
261
- ): Promise<Connector> {
262
- const row = await ownedConnectorOrThrow(email, id);
263
- const config = readConfig(row.config);
264
- const url = parseConnectorUrl(row.url);
265
- const verified = stamp(await verifyRemoteMcp(url, auth));
266
- return saveConfig(row, { ...config, auth, verified, oauth: true });
267
- }
268
-
269
- export async function disconnectConnectorForEmail(
270
- email: string,
271
- id: string,
272
- ): Promise<Connector> {
273
- const row = await ownedConnectorOrThrow(email, id);
274
- const config = readConfig(row.config);
275
- if (config.auth.kind !== 'oauth')
276
- throw new ConnectorError('that connector is not signed in', 400);
277
- return saveConfig(row, { ...config, auth: { kind: 'none' }, oauth: true });
278
- }
279
-
280
- export async function verifyConnectorForEmail(
281
- email: string,
282
- id: string,
283
- ): Promise<ConnectorCheck> {
284
- const row = await ownedConnectorOrThrow(email, id);
285
- const config = readConfig(row.config);
286
- try {
287
- const url = parseConnectorUrl(row.url);
288
- const auth = await freshAuth(config.auth, url.toString());
289
- const verified = stamp(await verifyRemoteMcp(url, auth));
290
- const oauth = config.oauth || (await oauthCapable(url, auth));
291
- await saveConfig(row, { ...config, auth, verified, oauth });
292
- return { id: row.id, name: row.name, ok: true, verified };
293
- } catch (err) {
294
- if (!(err instanceof ConnectorVerifyError)) throw err;
295
- return { id: row.id, name: row.name, ok: false, reason: err.message };
296
- }
297
- }
298
-
299
- export async function renameConnectorForEmail(
300
- email: string,
301
- id: string,
302
- raw: string,
303
- ): Promise<Connector> {
304
- const name = connectorName(raw);
305
- const row = await ownedConnectorOrThrow(email, id);
306
- await assertRenameFreeOfClash(row.id, name);
307
- const rows = await getDb()
308
- .update(connectors)
309
- .set({ name })
310
- .where(and(eq(connectors.id, row.id), eq(connectors.projectId, row.projectId)))
311
- .returning();
312
- const saved = rows[0];
313
- if (saved === undefined) throw missing();
314
- return toConnector(saved);
315
- }
316
-
317
- export async function deleteConnectorForEmail(
318
- email: string,
319
- id: string,
320
- ): Promise<DeletedConnector> {
321
- const row = await ownedConnectorOrThrow(email, id);
322
- const gone = await getDb()
323
- .delete(connectors)
324
- .where(eq(connectors.id, row.id))
325
- .returning({ id: connectors.id, name: connectors.name });
326
- const deleted = gone[0];
327
- if (deleted === undefined) throw missing();
328
- return deleted;
329
- }