@stage-labs/metro 0.1.0-beta.21 → 0.1.0-beta.211

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 (436) hide show
  1. package/dist/api.js +9 -101
  2. package/dist/claude-settings.js +40 -0
  3. package/dist/claude.js +152 -0
  4. package/dist/cli.js +52 -109
  5. package/dist/control.js +47 -75
  6. package/dist/hold.js +210 -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 +96 -0
  14. package/dist/runtime.js +29 -52
  15. package/dist/serve.js +157 -0
  16. package/dist/service.js +304 -0
  17. package/dist/tail.js +119 -0
  18. package/dist/update.js +13 -1
  19. package/package.json +2 -23
  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 +26 -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 +11 -7
  32. package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/ids.ts +5 -0
  33. package/runtime/node_modules/@metro-labs/core/src/is-record.ts +2 -0
  34. package/runtime/node_modules/@metro-labs/{mcp/src/stations → core/src}/lines.ts +24 -28
  35. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/protocol.ts +7 -4
  36. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/secure-fs.ts +17 -0
  37. package/runtime/node_modules/@metro-labs/core/src/station-names.ts +13 -0
  38. package/runtime/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
  39. package/runtime/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
  40. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/attachments.ts +0 -1
  41. package/runtime/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
  42. package/runtime/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
  43. package/runtime/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
  44. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/station-runtime.ts +6 -11
  45. package/runtime/node_modules/@metro-labs/core/src/stations/train-boot.ts +42 -0
  46. package/runtime/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
  47. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/types.ts +18 -1
  48. package/runtime/node_modules/@metro-labs/core/src/tickets.ts +37 -0
  49. package/runtime/node_modules/@metro-labs/core/src/version.ts +2 -0
  50. package/runtime/node_modules/@metro-labs/daemon/package.json +48 -0
  51. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/agent-fs.ts +134 -0
  52. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files-api.ts +12 -0
  53. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files.ts +89 -0
  54. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/home-fs.ts +113 -0
  55. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/job-env.ts +51 -0
  56. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/provision.ts +80 -0
  57. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedule-detail.ts +99 -0
  58. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules-api.ts +27 -0
  59. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules.ts +144 -0
  60. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/unit-files.ts +37 -0
  61. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/user.ts +89 -0
  62. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/view.ts +87 -0
  63. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-attach.ts +19 -0
  64. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-lookups.ts +55 -0
  65. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-routes.ts +76 -0
  66. package/runtime/node_modules/@metro-labs/daemon/src/agents/accounts-api.ts +357 -0
  67. package/runtime/node_modules/@metro-labs/daemon/src/agents/admin.ts +30 -0
  68. package/runtime/node_modules/@metro-labs/daemon/src/agents/allowlist.ts +59 -0
  69. package/runtime/node_modules/@metro-labs/daemon/src/agents/api.ts +131 -0
  70. package/runtime/node_modules/@metro-labs/daemon/src/agents/bundle.ts +132 -0
  71. package/runtime/node_modules/@metro-labs/daemon/src/agents/file-admin.ts +305 -0
  72. package/runtime/node_modules/@metro-labs/daemon/src/agents/files.ts +142 -0
  73. package/runtime/node_modules/@metro-labs/{mcp/src/db/key-map.ts → daemon/src/agents/keys.ts} +1 -11
  74. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-map.ts → daemon/src/agents/map.ts} +58 -1
  75. package/runtime/node_modules/@metro-labs/daemon/src/agents/policy-route.ts +27 -0
  76. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-scope.ts → daemon/src/agents/scope.ts} +2 -2
  77. package/runtime/node_modules/@metro-labs/daemon/src/agents/sender-cards.ts +94 -0
  78. package/runtime/node_modules/@metro-labs/daemon/src/agents/senders.ts +38 -0
  79. package/runtime/node_modules/@metro-labs/daemon/src/approvals/api.ts +55 -0
  80. package/runtime/node_modules/@metro-labs/daemon/src/approvals/pending.ts +150 -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 +218 -0
  83. package/runtime/node_modules/@metro-labs/daemon/src/boot/connect-hint.ts +36 -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/{mcp → daemon}/src/channels/inbound.ts +70 -45
  89. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/media-note.ts +11 -7
  90. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/pending.ts +4 -1
  91. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +2 -2
  92. package/runtime/node_modules/@metro-labs/daemon/src/claude/api.ts +355 -0
  93. package/runtime/node_modules/@metro-labs/daemon/src/claude/files.ts +359 -0
  94. package/runtime/node_modules/@metro-labs/daemon/src/claude/login.ts +208 -0
  95. package/runtime/node_modules/@metro-labs/daemon/src/claude/memory.ts +32 -0
  96. package/runtime/node_modules/@metro-labs/daemon/src/claude/onboarding.ts +60 -0
  97. package/runtime/node_modules/@metro-labs/daemon/src/claude/plugin-install.ts +149 -0
  98. package/runtime/node_modules/@metro-labs/daemon/src/claude/session-files.ts +75 -0
  99. package/runtime/node_modules/@metro-labs/daemon/src/claude/session.ts +313 -0
  100. package/runtime/node_modules/@metro-labs/daemon/src/claude/settings.ts +109 -0
  101. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup.ts +273 -0
  102. package/runtime/node_modules/@metro-labs/daemon/src/claude/skills.ts +120 -0
  103. package/runtime/node_modules/@metro-labs/daemon/src/claude/version.ts +113 -0
  104. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-api.ts → daemon/src/connectors/api.ts} +79 -113
  105. package/runtime/node_modules/@metro-labs/{mcp/src/db/connector-config.ts → daemon/src/connectors/config.ts} +67 -41
  106. package/runtime/node_modules/@metro-labs/daemon/src/connectors/gates.ts +72 -0
  107. package/runtime/node_modules/@metro-labs/daemon/src/connectors/health.ts +18 -0
  108. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-client.ts +14 -17
  109. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-discovery.ts +33 -20
  110. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth-routes.ts → daemon/src/connectors/oauth-routes.ts} +30 -32
  111. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth.ts → daemon/src/connectors/oauth.ts} +61 -22
  112. package/runtime/node_modules/@metro-labs/daemon/src/connectors/plugin-sync.ts +131 -0
  113. package/runtime/node_modules/@metro-labs/daemon/src/connectors/reach.ts +27 -0
  114. package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-policy.ts +90 -0
  115. package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay.ts +347 -0
  116. package/runtime/node_modules/@metro-labs/daemon/src/connectors/store.ts +385 -0
  117. package/runtime/node_modules/@metro-labs/daemon/src/connectors/tools.ts +81 -0
  118. package/runtime/node_modules/@metro-labs/daemon/src/connectors/url.ts +37 -0
  119. package/runtime/node_modules/@metro-labs/daemon/src/connectors/verify.ts +106 -0
  120. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-grant.ts +4 -4
  121. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-owner.ts +3 -3
  122. package/runtime/node_modules/@metro-labs/daemon/src/files/attach-reaper.ts +174 -0
  123. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-serve.ts +12 -13
  124. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-api.ts +10 -27
  125. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-store.ts +4 -4
  126. package/runtime/node_modules/@metro-labs/daemon/src/gateway/bedrock.ts +233 -0
  127. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-auth.ts +208 -0
  128. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-device.ts +91 -0
  129. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-stream.ts +173 -0
  130. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-translate.ts +195 -0
  131. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-version.ts +44 -0
  132. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex.ts +128 -0
  133. package/runtime/node_modules/@metro-labs/daemon/src/gateway/effort.ts +77 -0
  134. package/runtime/node_modules/@metro-labs/daemon/src/gateway/eventstream.ts +123 -0
  135. package/runtime/node_modules/@metro-labs/daemon/src/gateway/forward.ts +237 -0
  136. package/runtime/node_modules/@metro-labs/daemon/src/gateway/frames.ts +118 -0
  137. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gateway.ts +274 -0
  138. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-auth.ts +160 -0
  139. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-client.ts +46 -0
  140. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-setup.ts +150 -0
  141. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-stream.ts +139 -0
  142. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-translate.ts +224 -0
  143. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini.ts +208 -0
  144. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-api.ts +199 -0
  145. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-config.ts +278 -0
  146. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-signin.ts +193 -0
  147. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-store.ts +70 -0
  148. package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter.ts +90 -0
  149. package/runtime/node_modules/@metro-labs/daemon/src/gateway/pkce.ts +36 -0
  150. package/runtime/node_modules/@metro-labs/daemon/src/gateway/provider-models.ts +66 -0
  151. package/runtime/node_modules/@metro-labs/daemon/src/gateway/served.ts +18 -0
  152. package/runtime/node_modules/@metro-labs/daemon/src/gateway/subscription.ts +120 -0
  153. package/runtime/node_modules/@metro-labs/daemon/src/gateway/text.ts +14 -0
  154. package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage.ts +244 -0
  155. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/accounts.ts +28 -17
  156. package/runtime/node_modules/@metro-labs/daemon/src/mcp/attachment-schema.ts +91 -0
  157. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/call-tools.ts +49 -20
  158. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
  159. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +15 -16
  160. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/group-tools.ts +2 -2
  161. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/index.ts +24 -79
  162. package/runtime/node_modules/@metro-labs/daemon/src/mcp/instructions.ts +19 -0
  163. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/member-tools.ts +2 -2
  164. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-prompt.ts +87 -0
  165. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-relay.ts +79 -0
  166. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-gate.ts +82 -0
  167. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-snapshot.ts +79 -0
  168. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-lookup.ts +60 -0
  169. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-tool.ts +96 -0
  170. package/runtime/node_modules/@metro-labs/daemon/src/mcp/read-tool.ts +87 -0
  171. package/runtime/node_modules/@metro-labs/daemon/src/mcp/request-identity.ts +46 -0
  172. package/runtime/node_modules/@metro-labs/daemon/src/mcp/session-slot.ts +48 -0
  173. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session.ts +33 -42
  174. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-catalog.ts +88 -0
  175. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-def.ts +9 -0
  176. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-dispatch.ts +53 -40
  177. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +68 -119
  178. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +6 -11
  179. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/helper-script.ts +126 -0
  180. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/install.ts +37 -0
  181. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/privilege.ts +48 -0
  182. package/runtime/node_modules/@metro-labs/daemon/src/monitor/api.ts +132 -0
  183. package/runtime/node_modules/@metro-labs/daemon/src/net/tunnel.ts +316 -0
  184. package/runtime/node_modules/@metro-labs/daemon/src/policy/policy.ts +118 -0
  185. package/runtime/node_modules/@metro-labs/daemon/src/routes/bearer.ts +35 -0
  186. package/runtime/node_modules/@metro-labs/daemon/src/routes/body.ts +24 -0
  187. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +59 -51
  188. package/runtime/node_modules/@metro-labs/daemon/src/routes/local-mode.ts +205 -0
  189. package/runtime/node_modules/@metro-labs/daemon/src/routes/session-apis.ts +66 -0
  190. package/runtime/node_modules/@metro-labs/daemon/src/routes/session.ts +29 -0
  191. package/runtime/node_modules/@metro-labs/daemon/src/routes/threema-callback.ts +103 -0
  192. package/runtime/node_modules/@metro-labs/daemon/src/server/control.ts +39 -0
  193. package/runtime/node_modules/@metro-labs/daemon/src/server/machine.ts +58 -0
  194. package/runtime/node_modules/@metro-labs/daemon/src/server/owner.ts +26 -0
  195. package/runtime/node_modules/@metro-labs/daemon/src/server/update.ts +90 -0
  196. package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
  197. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-driver.ts +42 -0
  198. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-inline.ts +29 -1
  199. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-interactive.ts +9 -36
  200. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-outlook.ts +63 -0
  201. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-resolve.ts +38 -13
  202. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/attach-session.ts +32 -22
  203. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-xmtp.ts +8 -9
  204. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach.ts +75 -9
  205. package/runtime/node_modules/@metro-labs/daemon/src/stations/materialize.ts +265 -0
  206. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/registry.ts +22 -6
  207. package/runtime/node_modules/@metro-labs/daemon/src/stations/runtime-deps.ts +82 -0
  208. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor-io.ts +3 -3
  209. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor.ts +6 -9
  210. package/runtime/node_modules/@metro-labs/daemon/src/stations/threema-callbacks.ts +32 -0
  211. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/train-call.ts +1 -1
  212. package/runtime/node_modules/@metro-labs/daemon/src/stations/webhook-endpoints.ts +51 -0
  213. package/runtime/node_modules/@metro-labs/daemon/src/terminal/api.ts +84 -0
  214. package/runtime/node_modules/@metro-labs/daemon/src/terminal/socket.ts +124 -0
  215. package/runtime/node_modules/@metro-labs/daemon/src/terminal/tickets.ts +15 -0
  216. package/runtime/node_modules/@metro-labs/daemon/src/vault/api.ts +45 -0
  217. package/runtime/node_modules/@metro-labs/daemon/src/vault/config.ts +51 -0
  218. package/runtime/node_modules/@metro-labs/daemon/src/vault/firewall.ts +9 -0
  219. package/runtime/node_modules/@metro-labs/daemon/src/vault/index.ts +96 -0
  220. package/runtime/node_modules/@metro-labs/daemon/src/vault/install.ts +56 -0
  221. package/runtime/node_modules/@metro-labs/daemon/src/vault/paths.ts +26 -0
  222. package/runtime/node_modules/@metro-labs/daemon/src/vault/proxy.ts +147 -0
  223. package/runtime/node_modules/@metro-labs/daemon/src/vault/store.ts +129 -0
  224. package/runtime/node_modules/@metro-labs/daemon/src/vault/trust.ts +44 -0
  225. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/package.json +3 -5
  226. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/accounts.ts +8 -28
  227. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/actions.ts +19 -187
  228. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/attachments.ts +3 -3
  229. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/format.ts +31 -72
  230. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/group-actions.ts +2 -2
  231. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/group.ts +2 -2
  232. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/index.ts +15 -21
  233. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/members.ts +2 -2
  234. package/runtime/node_modules/@metro-labs/discord-bot/src/profile.ts +68 -0
  235. package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/send-files.ts +12 -13
  236. package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +23 -0
  237. package/runtime/node_modules/@metro-labs/http/package.json +29 -0
  238. package/runtime/node_modules/@metro-labs/http/src/api-http.ts +135 -0
  239. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-api.ts → http/src/mode-api.ts} +13 -9
  240. package/runtime/node_modules/@metro-labs/http/src/return-to.ts +21 -0
  241. package/runtime/node_modules/@metro-labs/http/src/workos-token.ts +149 -0
  242. package/runtime/node_modules/@metro-labs/{telegram-user → outlook}/package.json +2 -5
  243. package/runtime/node_modules/@metro-labs/outlook/src/accounts.ts +93 -0
  244. package/runtime/node_modules/@metro-labs/outlook/src/actions.ts +14 -0
  245. package/runtime/node_modules/@metro-labs/outlook/src/attachments.ts +97 -0
  246. package/runtime/node_modules/@metro-labs/outlook/src/auth.ts +150 -0
  247. package/runtime/node_modules/@metro-labs/outlook/src/browser.ts +53 -0
  248. package/runtime/node_modules/@metro-labs/outlook/src/config.ts +36 -0
  249. package/runtime/node_modules/@metro-labs/outlook/src/format.ts +140 -0
  250. package/runtime/node_modules/@metro-labs/outlook/src/graph.ts +60 -0
  251. package/runtime/node_modules/@metro-labs/outlook/src/html.ts +72 -0
  252. package/runtime/node_modules/@metro-labs/outlook/src/inbound.ts +104 -0
  253. package/runtime/node_modules/@metro-labs/outlook/src/index.ts +12 -0
  254. package/runtime/node_modules/@metro-labs/outlook/src/login.ts +150 -0
  255. package/runtime/node_modules/@metro-labs/outlook/src/me.ts +41 -0
  256. package/runtime/node_modules/@metro-labs/outlook/src/outbound.ts +116 -0
  257. package/runtime/node_modules/@metro-labs/outlook/src/query.ts +119 -0
  258. package/runtime/node_modules/@metro-labs/outlook/src/state.ts +43 -0
  259. package/runtime/node_modules/@metro-labs/outlook/src/station.ts +15 -0
  260. package/runtime/node_modules/@metro-labs/outlook/src/trust.ts +70 -0
  261. package/runtime/node_modules/@metro-labs/telegram/package.json +3 -2
  262. package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +38 -96
  263. package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +214 -253
  264. package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +67 -108
  265. package/runtime/node_modules/@metro-labs/{telegram-user → telegram}/src/client.ts +6 -6
  266. package/runtime/node_modules/@metro-labs/telegram/src/format.ts +101 -147
  267. package/runtime/node_modules/@metro-labs/{telegram-user → telegram}/src/group.ts +4 -4
  268. package/runtime/node_modules/@metro-labs/{telegram-user → telegram}/src/history.ts +1 -1
  269. package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +57 -0
  270. package/runtime/node_modules/@metro-labs/telegram/src/index.ts +6 -102
  271. package/runtime/node_modules/@metro-labs/{telegram-user → telegram}/src/login.ts +20 -20
  272. package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +64 -151
  273. package/runtime/node_modules/@metro-labs/telegram/src/members.ts +61 -33
  274. package/runtime/node_modules/@metro-labs/telegram/src/profile.ts +70 -0
  275. package/runtime/node_modules/@metro-labs/{telegram-user → telegram}/src/reactions.ts +3 -3
  276. package/runtime/node_modules/@metro-labs/telegram/src/station.ts +11 -1
  277. package/runtime/node_modules/@metro-labs/telegram/src/types.ts +5 -47
  278. package/runtime/node_modules/@metro-labs/telegram-bot/package.json +25 -0
  279. package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +86 -0
  280. package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +240 -0
  281. package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +128 -0
  282. package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +170 -0
  283. package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +103 -0
  284. package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +90 -0
  285. package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +47 -0
  286. package/runtime/node_modules/@metro-labs/telegram-bot/src/profile.ts +85 -0
  287. package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +21 -0
  288. package/runtime/node_modules/@metro-labs/telegram-bot/src/types.ts +56 -0
  289. package/runtime/node_modules/@metro-labs/threema/package.json +26 -0
  290. package/runtime/node_modules/@metro-labs/threema/src/accounts.ts +95 -0
  291. package/runtime/node_modules/@metro-labs/threema/src/actions.ts +124 -0
  292. package/runtime/node_modules/@metro-labs/threema/src/api.ts +152 -0
  293. package/runtime/node_modules/@metro-labs/threema/src/crypto.ts +100 -0
  294. package/runtime/node_modules/@metro-labs/threema/src/files.ts +47 -0
  295. package/runtime/node_modules/@metro-labs/threema/src/format.ts +164 -0
  296. package/runtime/node_modules/@metro-labs/threema/src/groups.ts +96 -0
  297. package/runtime/node_modules/@metro-labs/threema/src/ids.ts +21 -0
  298. package/runtime/node_modules/@metro-labs/threema/src/inbound.ts +89 -0
  299. package/runtime/node_modules/@metro-labs/threema/src/index.ts +24 -0
  300. package/runtime/node_modules/@metro-labs/threema/src/messages.ts +264 -0
  301. package/runtime/node_modules/@metro-labs/threema/src/outbound.ts +160 -0
  302. package/runtime/node_modules/@metro-labs/threema/src/station.ts +13 -0
  303. package/runtime/node_modules/@metro-labs/threema/src/verify.ts +117 -0
  304. package/runtime/node_modules/@metro-labs/webhook/package.json +1 -1
  305. package/runtime/node_modules/@metro-labs/webhook/src/station.ts +5 -8
  306. package/runtime/node_modules/@metro-labs/whatsapp/package.json +2 -5
  307. package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +6 -28
  308. package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +1 -1
  309. package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +54 -11
  310. package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +2 -2
  311. package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +1 -1
  312. package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +86 -4
  313. package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +7 -58
  314. package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +11 -28
  315. package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +4 -37
  316. package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +1 -1
  317. package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +1 -1
  318. package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +1 -1
  319. package/runtime/node_modules/@metro-labs/whatsapp/src/names.ts +75 -0
  320. package/runtime/node_modules/@metro-labs/whatsapp/src/parse.ts +44 -0
  321. package/runtime/node_modules/@metro-labs/whatsapp/src/resolve.ts +52 -0
  322. package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +16 -1
  323. package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +5 -9
  324. package/runtime/node_modules/@metro-labs/whatsapp/src/types.ts +0 -1
  325. package/runtime/node_modules/@metro-labs/xmtp/package.json +3 -2
  326. package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +10 -20
  327. package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +2 -2
  328. package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +15 -204
  329. package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +4 -43
  330. package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +41 -219
  331. package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +3 -3
  332. package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +3 -3
  333. package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +7 -24
  334. package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +8 -18
  335. package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +1 -1
  336. package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +2 -2
  337. package/runtime/node_modules/@metro-labs/xmtp/src/identity.ts +30 -16
  338. package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +12 -20
  339. package/runtime/node_modules/@metro-labs/xmtp/src/labels.ts +1 -19
  340. package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +1 -1
  341. package/runtime/node_modules/@metro-labs/xmtp/src/names.ts +61 -0
  342. package/runtime/node_modules/@metro-labs/xmtp/src/profile.ts +153 -0
  343. package/runtime/node_modules/@metro-labs/xmtp/src/sender.ts +112 -0
  344. package/runtime/node_modules/@metro-labs/xmtp/src/smart.ts +72 -0
  345. package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +5 -1
  346. package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +4 -51
  347. package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +30 -44
  348. package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +4 -6
  349. package/runtime/node_modules/@metro-labs/xmtp/src/verify.ts +19 -5
  350. package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +14 -4
  351. package/runtime/runtime.json +1 -1
  352. package/runtime/server.ts +1 -0
  353. package/runtime/stations.json +37 -0
  354. package/dist/prompt.js +0 -10
  355. package/dist/store.js +0 -70
  356. package/runtime/node_modules/@metro-labs/discord/src/station.ts +0 -19
  357. package/runtime/node_modules/@metro-labs/discord/src/voice-speak.ts +0 -195
  358. package/runtime/node_modules/@metro-labs/discord/src/voice-transcribe.ts +0 -292
  359. package/runtime/node_modules/@metro-labs/discord/src/voice.ts +0 -197
  360. package/runtime/node_modules/@metro-labs/discord/src/wire.ts +0 -5
  361. package/runtime/node_modules/@metro-labs/mcp/package.json +0 -66
  362. package/runtime/node_modules/@metro-labs/mcp/src/channels/dedupe.ts +0 -24
  363. package/runtime/node_modules/@metro-labs/mcp/src/daemon/account-api.ts +0 -311
  364. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-api.ts +0 -335
  365. package/runtime/node_modules/@metro-labs/mcp/src/daemon/api-http.ts +0 -129
  366. package/runtime/node_modules/@metro-labs/mcp/src/daemon/boot.ts +0 -322
  367. package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair-api.ts +0 -111
  368. package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair.ts +0 -20
  369. package/runtime/node_modules/@metro-labs/mcp/src/daemon/collection-api.ts +0 -202
  370. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-json.ts +0 -31
  371. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-tools.ts +0 -100
  372. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-url.ts +0 -57
  373. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-verify.ts +0 -333
  374. package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-auth.ts +0 -164
  375. package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-oauth.ts +0 -208
  376. package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity.ts +0 -79
  377. package/runtime/node_modules/@metro-labs/mcp/src/daemon/oauth-pending.ts +0 -65
  378. package/runtime/node_modules/@metro-labs/mcp/src/daemon/pair-codes.ts +0 -58
  379. package/runtime/node_modules/@metro-labs/mcp/src/daemon/project-api.ts +0 -214
  380. package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-api.ts +0 -125
  381. package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-pair.ts +0 -18
  382. package/runtime/node_modules/@metro-labs/mcp/src/daemon/runtime-source.ts +0 -105
  383. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session-apis.ts +0 -41
  384. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session.ts +0 -218
  385. package/runtime/node_modules/@metro-labs/mcp/src/daemon/tunnel.ts +0 -169
  386. package/runtime/node_modules/@metro-labs/mcp/src/db/account-attach.ts +0 -91
  387. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-admin.ts +0 -215
  388. package/runtime/node_modules/@metro-labs/mcp/src/db/client.ts +0 -37
  389. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-collections.ts +0 -218
  390. package/runtime/node_modules/@metro-labs/mcp/src/db/connectors.ts +0 -329
  391. package/runtime/node_modules/@metro-labs/mcp/src/db/materialize.ts +0 -364
  392. package/runtime/node_modules/@metro-labs/mcp/src/db/projects.ts +0 -300
  393. package/runtime/node_modules/@metro-labs/mcp/src/db/runtime-admin.ts +0 -31
  394. package/runtime/node_modules/@metro-labs/mcp/src/db/runtimes.ts +0 -105
  395. package/runtime/node_modules/@metro-labs/mcp/src/db/schema.ts +0 -131
  396. package/runtime/node_modules/@metro-labs/mcp/src/db/token-carry.ts +0 -45
  397. package/runtime/node_modules/@metro-labs/mcp/src/db/users.ts +0 -57
  398. package/runtime/node_modules/@metro-labs/mcp/src/db/whatsapp-login.ts +0 -18
  399. package/runtime/node_modules/@metro-labs/mcp/src/mcp/channel-owner.ts +0 -29
  400. package/runtime/node_modules/@metro-labs/mcp/src/mcp/frame-scope.ts +0 -21
  401. package/runtime/node_modules/@metro-labs/mcp/src/mcp/permission-relay.ts +0 -66
  402. package/runtime/node_modules/@metro-labs/mcp/src/mcp/request-identity.ts +0 -73
  403. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-registry.ts +0 -172
  404. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-route.ts +0 -43
  405. package/runtime/node_modules/@metro-labs/mcp/src/monitor/api.ts +0 -240
  406. package/runtime/node_modules/@metro-labs/mcp/src/server.ts +0 -2
  407. package/runtime/node_modules/@metro-labs/mcp/src/stations/account-store.ts +0 -80
  408. package/runtime/node_modules/@metro-labs/mcp/src/stations/messaging-normalize.ts +0 -88
  409. package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +0 -3
  410. package/runtime/node_modules/@metro-labs/telegram-user/src/accounts.ts +0 -81
  411. package/runtime/node_modules/@metro-labs/telegram-user/src/actions.ts +0 -254
  412. package/runtime/node_modules/@metro-labs/telegram-user/src/attachments.ts +0 -87
  413. package/runtime/node_modules/@metro-labs/telegram-user/src/format.ts +0 -141
  414. package/runtime/node_modules/@metro-labs/telegram-user/src/inbound.ts +0 -78
  415. package/runtime/node_modules/@metro-labs/telegram-user/src/index.ts +0 -46
  416. package/runtime/node_modules/@metro-labs/telegram-user/src/media-actions.ts +0 -80
  417. package/runtime/node_modules/@metro-labs/telegram-user/src/members.ts +0 -75
  418. package/runtime/node_modules/@metro-labs/telegram-user/src/normalize.ts +0 -22
  419. package/runtime/node_modules/@metro-labs/telegram-user/src/station.ts +0 -24
  420. package/runtime/node_modules/@metro-labs/telegram-user/src/types.ts +0 -7
  421. package/runtime/node_modules/@metro-labs/telegram-user/src/wire.ts +0 -1
  422. package/runtime/node_modules/@metro-labs/whatsapp/src/normalize.ts +0 -22
  423. package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +0 -5
  424. package/runtime/node_modules/@metro-labs/xmtp/src/actions-push.ts +0 -87
  425. package/runtime/node_modules/@metro-labs/xmtp/src/emit-core.ts +0 -55
  426. package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +0 -349
  427. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/log.ts +0 -0
  428. /package/runtime/node_modules/@metro-labs/{mcp/src/mcp → core/src}/str.ts +0 -0
  429. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/train-error.ts +0 -0
  430. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/webhook-note.ts +0 -0
  431. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/raw-get-stream.ts +0 -0
  432. /package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/api-base.ts +0 -0
  433. /package/runtime/node_modules/@metro-labs/{discord → discord-bot}/src/verify.ts +0 -0
  434. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-error.ts +0 -0
  435. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/cors.ts +0 -0
  436. /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
- }