@stage-labs/metro 0.1.0-beta.29 → 0.1.0-beta.290

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 (659) hide show
  1. package/dist/agent.js +128 -0
  2. package/dist/api.js +9 -129
  3. package/dist/automation.js +56 -0
  4. package/dist/background.js +141 -0
  5. package/dist/claude-settings.js +40 -0
  6. package/dist/claude.js +199 -10
  7. package/dist/cli.js +73 -126
  8. package/dist/control.js +19 -103
  9. package/dist/hold.js +210 -0
  10. package/dist/local.js +43 -0
  11. package/dist/mcp-config.js +27 -0
  12. package/dist/memory.js +222 -0
  13. package/dist/native-recovery-scan.js +246 -0
  14. package/dist/native-recovery-state.js +154 -0
  15. package/dist/native-recovery.js +164 -0
  16. package/dist/node-name.js +71 -0
  17. package/dist/onboarding.js +44 -0
  18. package/dist/provider-flags.js +9 -0
  19. package/dist/root-release-io.js +161 -0
  20. package/dist/root-release.js +74 -0
  21. package/dist/route.js +66 -0
  22. package/dist/runtime-install.js +114 -0
  23. package/dist/runtime.js +29 -52
  24. package/dist/serve.js +157 -0
  25. package/dist/service.js +328 -0
  26. package/dist/tail.js +10 -11
  27. package/dist/update.js +13 -1
  28. package/dist/voice.js +56 -0
  29. package/package.json +3 -24
  30. package/runtime/marketplace/.claude-plugin/marketplace.json +12 -0
  31. package/runtime/marketplace/plugin/.claude-plugin/plugin.json +17 -0
  32. package/runtime/marketplace/plugin/.mcp.json +1 -0
  33. package/runtime/marketplace/plugin/MEMORY.md +78 -0
  34. package/runtime/marketplace/plugin/METRO.md +26 -0
  35. package/runtime/marketplace/plugin/STAGE.md +109 -0
  36. package/runtime/marketplace/plugin/bin/guard.mjs +75 -0
  37. package/runtime/marketplace/plugin/bin/metro-plugin.mjs +30 -0
  38. package/runtime/marketplace/plugin/bin/policy.mjs +102 -0
  39. package/runtime/marketplace/plugin/bin/session-start.mjs +31 -0
  40. package/runtime/marketplace/plugin/hooks/hooks.json +25 -0
  41. package/runtime/node_modules/@metro-labs/core/package.json +59 -0
  42. package/runtime/node_modules/@metro-labs/core/src/automation-files.ts +216 -0
  43. package/runtime/node_modules/@metro-labs/core/src/automation-store.ts +171 -0
  44. package/runtime/node_modules/@metro-labs/core/src/automation-types.ts +141 -0
  45. package/runtime/node_modules/@metro-labs/core/src/call.ts +81 -0
  46. package/runtime/node_modules/@metro-labs/core/src/connector-sync.ts +17 -0
  47. package/runtime/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  48. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/events.ts +54 -6
  49. package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/ids.ts +10 -1
  50. package/runtime/node_modules/@metro-labs/core/src/is-record.ts +2 -0
  51. package/runtime/node_modules/@metro-labs/{mcp/src/stations → core/src}/lines.ts +22 -26
  52. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/protocol.ts +7 -4
  53. package/runtime/node_modules/@metro-labs/core/src/runner-activity.ts +226 -0
  54. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/secure-fs.ts +17 -0
  55. package/runtime/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
  56. package/runtime/node_modules/@metro-labs/core/src/station-names.ts +14 -0
  57. package/runtime/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
  58. package/runtime/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
  59. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/attachments.ts +9 -3
  60. package/runtime/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
  61. package/runtime/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
  62. package/runtime/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
  63. package/runtime/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
  64. package/runtime/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
  65. package/runtime/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
  66. package/runtime/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
  67. package/runtime/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
  68. package/runtime/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
  69. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/station-runtime.ts +6 -11
  70. package/runtime/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
  71. package/runtime/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
  72. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/types.ts +20 -1
  73. package/runtime/node_modules/@metro-labs/core/src/tickets.ts +44 -0
  74. package/runtime/node_modules/@metro-labs/core/src/version.ts +2 -0
  75. package/runtime/node_modules/@metro-labs/daemon/package.json +51 -0
  76. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/agent-fs.ts +246 -0
  77. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/crontab.ts +44 -0
  78. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files-api.ts +12 -0
  79. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files.ts +89 -0
  80. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/home-fs.ts +113 -0
  81. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/job-env.ts +39 -0
  82. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/metro-home.ts +42 -0
  83. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/provision.ts +81 -0
  84. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedule-detail.ts +93 -0
  85. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules-api.ts +27 -0
  86. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules.ts +144 -0
  87. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/unit-files.ts +43 -0
  88. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/user.ts +91 -0
  89. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/view.ts +93 -0
  90. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-attach.ts +19 -0
  91. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-lookups.ts +55 -0
  92. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-routes.ts +76 -0
  93. package/runtime/node_modules/@metro-labs/daemon/src/agents/accounts-api.ts +362 -0
  94. package/runtime/node_modules/@metro-labs/daemon/src/agents/admin.ts +30 -0
  95. package/runtime/node_modules/@metro-labs/daemon/src/agents/allowlist.ts +59 -0
  96. package/runtime/node_modules/@metro-labs/daemon/src/agents/api.ts +133 -0
  97. package/runtime/node_modules/@metro-labs/daemon/src/agents/bundle.ts +132 -0
  98. package/runtime/node_modules/@metro-labs/daemon/src/agents/file-admin.ts +317 -0
  99. package/runtime/node_modules/@metro-labs/daemon/src/agents/files.ts +142 -0
  100. package/runtime/node_modules/@metro-labs/{mcp/src/db/key-map.ts → daemon/src/agents/keys.ts} +1 -11
  101. package/runtime/node_modules/@metro-labs/daemon/src/agents/map.ts +135 -0
  102. package/runtime/node_modules/@metro-labs/daemon/src/agents/policy-route.ts +27 -0
  103. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-scope.ts → daemon/src/agents/scope.ts} +2 -2
  104. package/runtime/node_modules/@metro-labs/daemon/src/agents/sender-cards.ts +94 -0
  105. package/runtime/node_modules/@metro-labs/daemon/src/agents/senders.ts +38 -0
  106. package/runtime/node_modules/@metro-labs/daemon/src/approvals/api.ts +55 -0
  107. package/runtime/node_modules/@metro-labs/daemon/src/approvals/owner-line.ts +45 -0
  108. package/runtime/node_modules/@metro-labs/daemon/src/approvals/pending.ts +189 -0
  109. package/runtime/node_modules/@metro-labs/daemon/src/approvals/preview.ts +66 -0
  110. package/runtime/node_modules/@metro-labs/daemon/src/boot/boot.ts +250 -0
  111. package/runtime/node_modules/@metro-labs/daemon/src/boot/connect-hint.ts +36 -0
  112. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/crash-guard.ts +1 -1
  113. package/runtime/node_modules/@metro-labs/daemon/src/boot/local-owner.ts +21 -0
  114. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/paths.ts +8 -36
  115. package/runtime/node_modules/@metro-labs/daemon/src/channels/addressed.ts +26 -0
  116. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/inbound.ts +95 -72
  117. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/media-note.ts +11 -7
  118. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/pending.ts +13 -1
  119. package/runtime/node_modules/@metro-labs/daemon/src/channels/react-note.ts +13 -0
  120. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +2 -2
  121. package/runtime/node_modules/@metro-labs/daemon/src/claude/api.ts +316 -0
  122. package/runtime/node_modules/@metro-labs/daemon/src/claude/files.ts +359 -0
  123. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-api.ts +12 -0
  124. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-fetch.ts +160 -0
  125. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-skills.ts +259 -0
  126. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-validate.ts +53 -0
  127. package/runtime/node_modules/@metro-labs/daemon/src/claude/login.ts +242 -0
  128. package/runtime/node_modules/@metro-labs/daemon/src/claude/memory-routine.ts +123 -0
  129. package/runtime/node_modules/@metro-labs/daemon/src/claude/memory.ts +32 -0
  130. package/runtime/node_modules/@metro-labs/daemon/src/claude/onboarding.ts +60 -0
  131. package/runtime/node_modules/@metro-labs/daemon/src/claude/plugin-install.ts +149 -0
  132. package/runtime/node_modules/@metro-labs/daemon/src/claude/runner-activity.ts +17 -0
  133. package/runtime/node_modules/@metro-labs/daemon/src/claude/runner-process.ts +52 -0
  134. package/runtime/node_modules/@metro-labs/daemon/src/claude/runner.ts +45 -0
  135. package/runtime/node_modules/@metro-labs/daemon/src/claude/session-continuity.ts +57 -0
  136. package/runtime/node_modules/@metro-labs/daemon/src/claude/session-files.ts +75 -0
  137. package/runtime/node_modules/@metro-labs/daemon/src/claude/session.ts +375 -0
  138. package/runtime/node_modules/@metro-labs/daemon/src/claude/settings.ts +109 -0
  139. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup-api.ts +161 -0
  140. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup-state.ts +18 -0
  141. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup.ts +346 -0
  142. package/runtime/node_modules/@metro-labs/daemon/src/claude/skills.ts +123 -0
  143. package/runtime/node_modules/@metro-labs/daemon/src/claude/usage-probe.ts +128 -0
  144. package/runtime/node_modules/@metro-labs/daemon/src/claude/version.ts +113 -0
  145. package/runtime/node_modules/@metro-labs/daemon/src/connectors/agent-key.ts +148 -0
  146. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-api.ts → daemon/src/connectors/api.ts} +91 -114
  147. package/runtime/node_modules/@metro-labs/daemon/src/connectors/config.ts +103 -0
  148. package/runtime/node_modules/@metro-labs/daemon/src/connectors/enroll-api.ts +101 -0
  149. package/runtime/node_modules/@metro-labs/daemon/src/connectors/gates.ts +110 -0
  150. package/runtime/node_modules/@metro-labs/daemon/src/connectors/health.ts +18 -0
  151. package/runtime/node_modules/@metro-labs/daemon/src/connectors/metro-api.ts +93 -0
  152. package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-api.ts +55 -0
  153. package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-control.ts +269 -0
  154. package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-guard.ts +90 -0
  155. package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-operations.ts +196 -0
  156. package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-preview.ts +236 -0
  157. package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-source.ts +23 -0
  158. package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-state.ts +122 -0
  159. package/runtime/node_modules/@metro-labs/daemon/src/connectors/migration-url.ts +32 -0
  160. package/runtime/node_modules/@metro-labs/daemon/src/connectors/oauth-routes.ts +178 -0
  161. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth.ts → daemon/src/connectors/oauth.ts} +69 -26
  162. package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-relay.ts +61 -0
  163. package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-runtime-discovery.ts +114 -0
  164. package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-runtime.ts +300 -0
  165. package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-sync-api.ts +25 -0
  166. package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-sync-control.ts +172 -0
  167. package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-sync-setting.ts +60 -0
  168. package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-sync-watch.ts +53 -0
  169. package/runtime/node_modules/@metro-labs/daemon/src/connectors/org-sync.ts +187 -0
  170. package/runtime/node_modules/@metro-labs/daemon/src/connectors/plugin-sync.ts +143 -0
  171. package/runtime/node_modules/@metro-labs/daemon/src/connectors/publication.ts +48 -0
  172. package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-id.ts +2 -0
  173. package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-policy.ts +90 -0
  174. package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-session.ts +11 -0
  175. package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-target.ts +4 -0
  176. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/relay.ts +120 -39
  177. package/runtime/node_modules/@metro-labs/daemon/src/connectors/store.ts +396 -0
  178. package/runtime/node_modules/@metro-labs/daemon/src/connectors/tools.ts +85 -0
  179. package/runtime/node_modules/@metro-labs/daemon/src/connectors/transfer-api.ts +116 -0
  180. package/runtime/node_modules/@metro-labs/daemon/src/connectors/transfer-crypto.ts +44 -0
  181. package/runtime/node_modules/@metro-labs/daemon/src/connectors/transfer-store.ts +49 -0
  182. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-grant.ts +4 -4
  183. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-owner.ts +3 -3
  184. package/runtime/node_modules/@metro-labs/daemon/src/files/attach-reaper.ts +174 -0
  185. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-serve.ts +11 -17
  186. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-api.ts +10 -27
  187. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-store.ts +4 -4
  188. package/runtime/node_modules/@metro-labs/daemon/src/gateway/bedrock.ts +233 -0
  189. package/runtime/node_modules/@metro-labs/daemon/src/gateway/claude-logins.ts +168 -0
  190. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-auth.ts +219 -0
  191. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-device.ts +119 -0
  192. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-stream.ts +179 -0
  193. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-translate.ts +209 -0
  194. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-version.ts +44 -0
  195. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex.ts +143 -0
  196. package/runtime/node_modules/@metro-labs/daemon/src/gateway/effort.ts +103 -0
  197. package/runtime/node_modules/@metro-labs/daemon/src/gateway/eventstream.ts +123 -0
  198. package/runtime/node_modules/@metro-labs/daemon/src/gateway/fallback.ts +147 -0
  199. package/runtime/node_modules/@metro-labs/daemon/src/gateway/forward.ts +285 -0
  200. package/runtime/node_modules/@metro-labs/daemon/src/gateway/frames.ts +118 -0
  201. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gateway.ts +396 -0
  202. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-auth.ts +160 -0
  203. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-client.ts +46 -0
  204. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-setup.ts +150 -0
  205. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-stream.ts +139 -0
  206. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini-translate.ts +236 -0
  207. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gemini.ts +208 -0
  208. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-api.ts +259 -0
  209. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-config.ts +362 -0
  210. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-lists.ts +57 -0
  211. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-signin.ts +157 -0
  212. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-store.ts +83 -0
  213. package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter-login.ts +192 -0
  214. package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter-signin.ts +64 -0
  215. package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter.ts +104 -0
  216. package/runtime/node_modules/@metro-labs/daemon/src/gateway/pkce.ts +36 -0
  217. package/runtime/node_modules/@metro-labs/daemon/src/gateway/provider-models.ts +117 -0
  218. package/runtime/node_modules/@metro-labs/daemon/src/gateway/served.ts +18 -0
  219. package/runtime/node_modules/@metro-labs/daemon/src/gateway/subscription.ts +120 -0
  220. package/runtime/node_modules/@metro-labs/daemon/src/gateway/text.ts +35 -0
  221. package/runtime/node_modules/@metro-labs/daemon/src/gateway/tool-search.ts +126 -0
  222. package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage-refresh.ts +115 -0
  223. package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage.ts +343 -0
  224. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/accounts.ts +38 -18
  225. package/runtime/node_modules/@metro-labs/daemon/src/mcp/attachment-schema.ts +91 -0
  226. package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-bridge.ts +45 -0
  227. package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-permission.ts +25 -0
  228. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/call-tools.ts +88 -38
  229. package/runtime/node_modules/@metro-labs/daemon/src/mcp/channel-tool.ts +80 -0
  230. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
  231. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +24 -18
  232. package/runtime/node_modules/@metro-labs/daemon/src/mcp/frame-schema.ts +44 -0
  233. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/group-tools.ts +2 -2
  234. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/index.ts +51 -77
  235. package/runtime/node_modules/@metro-labs/daemon/src/mcp/instructions.ts +30 -0
  236. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/member-tools.ts +2 -2
  237. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-prompt.ts +104 -0
  238. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-relay.ts +109 -0
  239. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-gate.ts +88 -0
  240. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-snapshot.ts +79 -0
  241. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-lookup.ts +60 -0
  242. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-tool.ts +96 -0
  243. package/runtime/node_modules/@metro-labs/daemon/src/mcp/read-tool.ts +87 -0
  244. package/runtime/node_modules/@metro-labs/daemon/src/mcp/request-identity.ts +48 -0
  245. package/runtime/node_modules/@metro-labs/daemon/src/mcp/session-slot.ts +75 -0
  246. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session.ts +84 -55
  247. package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-schema.ts +11 -0
  248. package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-send.ts +15 -0
  249. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-catalog.ts +96 -0
  250. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-def.ts +9 -0
  251. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-dispatch.ts +60 -40
  252. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +87 -114
  253. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +6 -11
  254. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/helper-script.ts +183 -0
  255. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/imds.ts +16 -0
  256. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/install.ts +78 -0
  257. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/privilege.ts +50 -0
  258. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/root-follow.ts +16 -0
  259. package/runtime/node_modules/@metro-labs/daemon/src/monitor/api.ts +132 -0
  260. package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-event.ts +139 -0
  261. package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-events.ts +101 -0
  262. package/runtime/node_modules/@metro-labs/daemon/src/net/tunnel.ts +323 -0
  263. package/runtime/node_modules/@metro-labs/daemon/src/policy/policy.ts +119 -0
  264. package/runtime/node_modules/@metro-labs/daemon/src/routes/bearer.ts +38 -0
  265. package/runtime/node_modules/@metro-labs/daemon/src/routes/body.ts +24 -0
  266. package/runtime/node_modules/@metro-labs/daemon/src/routes/gmail-attach.ts +67 -0
  267. package/runtime/node_modules/@metro-labs/daemon/src/routes/gmail-detach.ts +37 -0
  268. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +64 -53
  269. package/runtime/node_modules/@metro-labs/daemon/src/routes/local-mode.ts +229 -0
  270. package/runtime/node_modules/@metro-labs/daemon/src/routes/session-apis.ts +82 -0
  271. package/runtime/node_modules/@metro-labs/daemon/src/routes/session.ts +29 -0
  272. package/runtime/node_modules/@metro-labs/daemon/src/routes/threema-callback.ts +103 -0
  273. package/runtime/node_modules/@metro-labs/daemon/src/server/cloudwatch.ts +178 -0
  274. package/runtime/node_modules/@metro-labs/daemon/src/server/control.ts +39 -0
  275. package/runtime/node_modules/@metro-labs/daemon/src/server/machine.ts +58 -0
  276. package/runtime/node_modules/@metro-labs/daemon/src/server/owner.ts +26 -0
  277. package/runtime/node_modules/@metro-labs/daemon/src/server/update.ts +90 -0
  278. package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
  279. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-browser.ts +107 -0
  280. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-driver.ts +42 -0
  281. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-gmail.ts +78 -0
  282. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-inline.ts +29 -1
  283. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-interactive.ts +5 -31
  284. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-resolve.ts +84 -13
  285. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/attach-session.ts +61 -25
  286. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-xmtp.ts +8 -9
  287. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach.ts +69 -3
  288. package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/stations}/materialize.ts +60 -175
  289. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/registry.ts +20 -2
  290. package/runtime/node_modules/@metro-labs/daemon/src/stations/runtime-deps.ts +135 -0
  291. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor-io.ts +3 -3
  292. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor.ts +6 -9
  293. package/runtime/node_modules/@metro-labs/daemon/src/stations/threema-callbacks.ts +32 -0
  294. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/train-call.ts +1 -1
  295. package/runtime/node_modules/@metro-labs/daemon/src/stations/webhook-endpoints.ts +51 -0
  296. package/runtime/node_modules/@metro-labs/daemon/src/terminal/api.ts +84 -0
  297. package/runtime/node_modules/@metro-labs/daemon/src/terminal/socket.ts +124 -0
  298. package/runtime/node_modules/@metro-labs/daemon/src/terminal/tickets.ts +15 -0
  299. package/runtime/node_modules/@metro-labs/daemon/src/vault/api.ts +45 -0
  300. package/runtime/node_modules/@metro-labs/daemon/src/vault/config.ts +51 -0
  301. package/runtime/node_modules/@metro-labs/daemon/src/vault/firewall.ts +9 -0
  302. package/runtime/node_modules/@metro-labs/daemon/src/vault/index.ts +96 -0
  303. package/runtime/node_modules/@metro-labs/daemon/src/vault/install.ts +56 -0
  304. package/runtime/node_modules/@metro-labs/daemon/src/vault/paths.ts +26 -0
  305. package/runtime/node_modules/@metro-labs/daemon/src/vault/proxy.ts +147 -0
  306. package/runtime/node_modules/@metro-labs/daemon/src/vault/store.ts +129 -0
  307. package/runtime/node_modules/@metro-labs/daemon/src/vault/trust.ts +44 -0
  308. package/runtime/node_modules/@metro-labs/daemon/src/voice/api.ts +14 -0
  309. package/runtime/node_modules/@metro-labs/daemon/src/voice/approvals.ts +38 -0
  310. package/runtime/node_modules/@metro-labs/daemon/src/voice/audio.ts +193 -0
  311. package/runtime/node_modules/@metro-labs/daemon/src/voice/brain.ts +146 -0
  312. package/runtime/node_modules/@metro-labs/daemon/src/voice/call.ts +274 -0
  313. package/runtime/node_modules/@metro-labs/daemon/src/voice/calls.ts +156 -0
  314. package/runtime/node_modules/@metro-labs/daemon/src/voice/peer.ts +85 -0
  315. package/runtime/node_modules/@metro-labs/daemon/src/voice/scribe.ts +115 -0
  316. package/runtime/node_modules/@metro-labs/daemon/src/voice/shared-talk.ts +85 -0
  317. package/runtime/node_modules/@metro-labs/daemon/src/voice/shared.ts +200 -0
  318. package/runtime/node_modules/@metro-labs/daemon/src/voice/speakable.ts +54 -0
  319. package/runtime/node_modules/@metro-labs/daemon/src/voice/speech-queue.ts +200 -0
  320. package/runtime/node_modules/@metro-labs/daemon/src/voice/speech.ts +129 -0
  321. package/runtime/node_modules/@metro-labs/daemon/src/voice/store.ts +116 -0
  322. package/runtime/node_modules/@metro-labs/daemon/src/voice/talk.ts +264 -0
  323. package/runtime/node_modules/@metro-labs/discord-bot/package.json +3 -5
  324. package/runtime/node_modules/@metro-labs/discord-bot/src/accounts.ts +3 -23
  325. package/runtime/node_modules/@metro-labs/discord-bot/src/actions.ts +21 -187
  326. package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +2 -2
  327. package/runtime/node_modules/@metro-labs/discord-bot/src/channel-source.ts +79 -0
  328. package/runtime/node_modules/@metro-labs/discord-bot/src/channels.ts +186 -0
  329. package/runtime/node_modules/@metro-labs/discord-bot/src/format.ts +26 -67
  330. package/runtime/node_modules/@metro-labs/discord-bot/src/group-actions.ts +1 -1
  331. package/runtime/node_modules/@metro-labs/discord-bot/src/group.ts +2 -2
  332. package/runtime/node_modules/@metro-labs/discord-bot/src/index.ts +8 -14
  333. package/runtime/node_modules/@metro-labs/discord-bot/src/members.ts +2 -2
  334. package/runtime/node_modules/@metro-labs/discord-bot/src/profile.ts +68 -0
  335. package/runtime/node_modules/@metro-labs/discord-bot/src/send-files.ts +12 -13
  336. package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +6 -1
  337. package/runtime/node_modules/@metro-labs/gmail/package.json +27 -0
  338. package/runtime/node_modules/@metro-labs/gmail/src/accounts.ts +133 -0
  339. package/runtime/node_modules/@metro-labs/gmail/src/actions.ts +20 -0
  340. package/runtime/node_modules/@metro-labs/gmail/src/api.ts +34 -0
  341. package/runtime/node_modules/@metro-labs/gmail/src/attachments.ts +38 -0
  342. package/runtime/node_modules/@metro-labs/gmail/src/auth.ts +115 -0
  343. package/runtime/node_modules/@metro-labs/gmail/src/channels.ts +66 -0
  344. package/runtime/node_modules/@metro-labs/gmail/src/config.ts +15 -0
  345. package/runtime/node_modules/@metro-labs/gmail/src/inbound.ts +97 -0
  346. package/runtime/node_modules/@metro-labs/gmail/src/index.ts +12 -0
  347. package/runtime/node_modules/@metro-labs/gmail/src/login.ts +39 -0
  348. package/runtime/node_modules/@metro-labs/gmail/src/managed-binding.ts +33 -0
  349. package/runtime/node_modules/@metro-labs/gmail/src/managed.ts +45 -0
  350. package/runtime/node_modules/@metro-labs/gmail/src/message.ts +125 -0
  351. package/runtime/node_modules/@metro-labs/gmail/src/mime.ts +70 -0
  352. package/runtime/node_modules/@metro-labs/gmail/src/outbound.ts +125 -0
  353. package/runtime/node_modules/@metro-labs/gmail/src/query.ts +101 -0
  354. package/runtime/node_modules/@metro-labs/gmail/src/state.ts +30 -0
  355. package/runtime/node_modules/@metro-labs/gmail/src/station.ts +16 -0
  356. package/runtime/node_modules/@metro-labs/gmail/src/trust.ts +42 -0
  357. package/runtime/node_modules/@metro-labs/http/package.json +39 -0
  358. package/runtime/node_modules/@metro-labs/http/src/agent-signature.ts +110 -0
  359. package/runtime/node_modules/@metro-labs/http/src/api-http.ts +147 -0
  360. package/runtime/node_modules/@metro-labs/http/src/connector-delivery-validation.ts +115 -0
  361. package/runtime/node_modules/@metro-labs/http/src/connector-delivery.ts +19 -0
  362. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-discovery.ts → http/src/connector-discovery.ts} +57 -27
  363. package/runtime/node_modules/@metro-labs/http/src/connector-input.ts +73 -0
  364. package/runtime/node_modules/@metro-labs/http/src/connector-mcp.ts +106 -0
  365. package/runtime/node_modules/@metro-labs/http/src/connector-migration.ts +176 -0
  366. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-client.ts → http/src/connector-oauth.ts} +48 -28
  367. package/runtime/node_modules/@metro-labs/http/src/connector-policy.ts +56 -0
  368. package/runtime/node_modules/@metro-labs/http/src/connector-reach.ts +27 -0
  369. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/connector-url.ts +8 -28
  370. package/runtime/node_modules/@metro-labs/http/src/ed25519.ts +56 -0
  371. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-api.ts → http/src/mode-api.ts} +13 -9
  372. package/runtime/node_modules/@metro-labs/http/src/return-to.ts +25 -0
  373. package/runtime/node_modules/@metro-labs/http/src/sigv4.ts +90 -0
  374. package/runtime/node_modules/@metro-labs/http/src/transfer-crypto.ts +44 -0
  375. package/runtime/node_modules/@metro-labs/http/src/workos-token.ts +149 -0
  376. package/runtime/node_modules/@metro-labs/outlook/package.json +25 -0
  377. package/runtime/node_modules/@metro-labs/outlook/src/accounts.ts +78 -0
  378. package/runtime/node_modules/@metro-labs/outlook/src/actions.ts +15 -0
  379. package/runtime/node_modules/@metro-labs/outlook/src/attachments.ts +81 -0
  380. package/runtime/node_modules/@metro-labs/outlook/src/auth.ts +120 -0
  381. package/runtime/node_modules/@metro-labs/outlook/src/browser.ts +42 -0
  382. package/runtime/node_modules/@metro-labs/outlook/src/channels.ts +60 -0
  383. package/runtime/node_modules/@metro-labs/outlook/src/config.ts +23 -0
  384. package/runtime/node_modules/@metro-labs/outlook/src/format.ts +59 -0
  385. package/runtime/node_modules/@metro-labs/outlook/src/graph.ts +55 -0
  386. package/runtime/node_modules/@metro-labs/outlook/src/inbound.ts +96 -0
  387. package/runtime/node_modules/@metro-labs/outlook/src/index.ts +12 -0
  388. package/runtime/node_modules/@metro-labs/outlook/src/login.ts +129 -0
  389. package/runtime/node_modules/@metro-labs/outlook/src/me.ts +31 -0
  390. package/runtime/node_modules/@metro-labs/outlook/src/outbound.ts +103 -0
  391. package/runtime/node_modules/@metro-labs/outlook/src/query.ts +84 -0
  392. package/runtime/node_modules/@metro-labs/outlook/src/state.ts +28 -0
  393. package/runtime/node_modules/@metro-labs/outlook/src/station.ts +16 -0
  394. package/runtime/node_modules/@metro-labs/outlook/src/trust.ts +41 -0
  395. package/runtime/node_modules/@metro-labs/telegram/package.json +2 -4
  396. package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +5 -24
  397. package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +27 -6
  398. package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +1 -1
  399. package/runtime/node_modules/@metro-labs/telegram/src/channels.ts +58 -0
  400. package/runtime/node_modules/@metro-labs/telegram/src/client.ts +4 -4
  401. package/runtime/node_modules/@metro-labs/telegram/src/format.ts +19 -34
  402. package/runtime/node_modules/@metro-labs/telegram/src/group.ts +3 -3
  403. package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +13 -34
  404. package/runtime/node_modules/@metro-labs/telegram/src/index.ts +4 -43
  405. package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +2 -3
  406. package/runtime/node_modules/@metro-labs/telegram/src/members.ts +1 -1
  407. package/runtime/node_modules/@metro-labs/telegram/src/profile.ts +70 -0
  408. package/runtime/node_modules/@metro-labs/telegram/src/reactions.ts +2 -2
  409. package/runtime/node_modules/@metro-labs/telegram/src/station.ts +5 -1
  410. package/runtime/node_modules/@metro-labs/telegram/src/types.ts +0 -1
  411. package/runtime/node_modules/@metro-labs/telegram-bot/package.json +2 -2
  412. package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +7 -41
  413. package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +24 -77
  414. package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +2 -2
  415. package/runtime/node_modules/@metro-labs/telegram-bot/src/channel-files.ts +3 -0
  416. package/runtime/node_modules/@metro-labs/telegram-bot/src/channels.ts +43 -0
  417. package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +46 -48
  418. package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +15 -44
  419. package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +6 -82
  420. package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +1 -1
  421. package/runtime/node_modules/@metro-labs/telegram-bot/src/observed-chats.ts +172 -0
  422. package/runtime/node_modules/@metro-labs/telegram-bot/src/profile.ts +85 -0
  423. package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +9 -1
  424. package/runtime/node_modules/@metro-labs/telegram-bot/src/types.ts +50 -15
  425. package/runtime/node_modules/@metro-labs/telegram-bot/src/updates.ts +26 -0
  426. package/runtime/node_modules/@metro-labs/threema/package.json +26 -0
  427. package/runtime/node_modules/@metro-labs/threema/src/accounts.ts +108 -0
  428. package/runtime/node_modules/@metro-labs/threema/src/actions.ts +130 -0
  429. package/runtime/node_modules/@metro-labs/threema/src/api.ts +152 -0
  430. package/runtime/node_modules/@metro-labs/threema/src/channels.ts +37 -0
  431. package/runtime/node_modules/@metro-labs/threema/src/chats.ts +88 -0
  432. package/runtime/node_modules/@metro-labs/threema/src/crypto.ts +100 -0
  433. package/runtime/node_modules/@metro-labs/threema/src/files.ts +47 -0
  434. package/runtime/node_modules/@metro-labs/threema/src/format.ts +164 -0
  435. package/runtime/node_modules/@metro-labs/threema/src/groups.ts +96 -0
  436. package/runtime/node_modules/@metro-labs/threema/src/ids.ts +21 -0
  437. package/runtime/node_modules/@metro-labs/threema/src/inbound.ts +92 -0
  438. package/runtime/node_modules/@metro-labs/threema/src/index.ts +24 -0
  439. package/runtime/node_modules/@metro-labs/threema/src/messages.ts +264 -0
  440. package/runtime/node_modules/@metro-labs/threema/src/outbound.ts +161 -0
  441. package/runtime/node_modules/@metro-labs/threema/src/station.ts +21 -0
  442. package/runtime/node_modules/@metro-labs/threema/src/verify.ts +117 -0
  443. package/runtime/node_modules/@metro-labs/webhook/package.json +2 -2
  444. package/runtime/node_modules/@metro-labs/webhook/src/station.ts +5 -8
  445. package/runtime/node_modules/@metro-labs/whatsapp/package.json +3 -6
  446. package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +6 -28
  447. package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +1 -1
  448. package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +97 -12
  449. package/runtime/node_modules/@metro-labs/whatsapp/src/app-state.ts +49 -0
  450. package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +2 -2
  451. package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +1 -1
  452. package/runtime/node_modules/@metro-labs/whatsapp/src/channel-chats.ts +137 -0
  453. package/runtime/node_modules/@metro-labs/whatsapp/src/channels.ts +48 -0
  454. package/runtime/node_modules/@metro-labs/whatsapp/src/client-history.ts +31 -0
  455. package/runtime/node_modules/@metro-labs/whatsapp/src/client-types.ts +48 -0
  456. package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +145 -63
  457. package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +7 -58
  458. package/runtime/node_modules/@metro-labs/whatsapp/src/history-events.ts +127 -0
  459. package/runtime/node_modules/@metro-labs/whatsapp/src/history-files.ts +39 -0
  460. package/runtime/node_modules/@metro-labs/whatsapp/src/history-identity.ts +58 -0
  461. package/runtime/node_modules/@metro-labs/whatsapp/src/history-message.ts +161 -0
  462. package/runtime/node_modules/@metro-labs/whatsapp/src/history-state.ts +344 -0
  463. package/runtime/node_modules/@metro-labs/whatsapp/src/history-types.ts +91 -0
  464. package/runtime/node_modules/@metro-labs/whatsapp/src/history.ts +195 -0
  465. package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +11 -28
  466. package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +4 -37
  467. package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +1 -1
  468. package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +1 -1
  469. package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +1 -1
  470. package/runtime/node_modules/@metro-labs/whatsapp/src/members.ts +94 -0
  471. package/runtime/node_modules/@metro-labs/whatsapp/src/messages.ts +70 -0
  472. package/runtime/node_modules/@metro-labs/whatsapp/src/names.ts +75 -0
  473. package/runtime/node_modules/@metro-labs/whatsapp/src/parse.ts +44 -0
  474. package/runtime/node_modules/@metro-labs/whatsapp/src/resolve.ts +52 -0
  475. package/runtime/node_modules/@metro-labs/whatsapp/src/send-expiry.ts +65 -0
  476. package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +24 -1
  477. package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +5 -9
  478. package/runtime/node_modules/@metro-labs/whatsapp/src/types.ts +0 -1
  479. package/runtime/node_modules/@metro-labs/xmtp/package.json +4 -3
  480. package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +10 -20
  481. package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +2 -2
  482. package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +55 -224
  483. package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +47 -53
  484. package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +114 -223
  485. package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +58 -15
  486. package/runtime/node_modules/@metro-labs/xmtp/src/call-leftovers.ts +48 -0
  487. package/runtime/node_modules/@metro-labs/xmtp/src/channels.ts +56 -0
  488. package/runtime/node_modules/@metro-labs/xmtp/src/codecs.ts +114 -3
  489. package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +35 -20
  490. package/runtime/node_modules/@metro-labs/xmtp/src/delete-requests.ts +34 -0
  491. package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +38 -25
  492. package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +8 -18
  493. package/runtime/node_modules/@metro-labs/xmtp/src/frames.ts +190 -0
  494. package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +1 -1
  495. package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +2 -2
  496. package/runtime/node_modules/@metro-labs/xmtp/src/identity.ts +30 -16
  497. package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +18 -70
  498. package/runtime/node_modules/@metro-labs/xmtp/src/labels.ts +102 -50
  499. package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +1 -1
  500. package/runtime/node_modules/@metro-labs/xmtp/src/names.ts +61 -0
  501. package/runtime/node_modules/@metro-labs/xmtp/src/network.ts +114 -0
  502. package/runtime/node_modules/@metro-labs/xmtp/src/profile.ts +160 -0
  503. package/runtime/node_modules/@metro-labs/xmtp/src/read-attachments.ts +37 -0
  504. package/runtime/node_modules/@metro-labs/xmtp/src/resolve.ts +44 -0
  505. package/runtime/node_modules/@metro-labs/xmtp/src/sender.ts +112 -0
  506. package/runtime/node_modules/@metro-labs/xmtp/src/smart.ts +79 -0
  507. package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +10 -2
  508. package/runtime/node_modules/@metro-labs/xmtp/src/stream.ts +66 -0
  509. package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +22 -58
  510. package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +72 -49
  511. package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +4 -6
  512. package/runtime/node_modules/@metro-labs/xmtp/src/verify.ts +19 -5
  513. package/runtime/node_modules/@metro-labs/xmtp/src/wallet.ts +28 -0
  514. package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +14 -4
  515. package/runtime/patches/5bca2c07d5852d3f58453cff0448dd85da13d3665b61e3d758905b298d432d7c.patch +31 -0
  516. package/runtime/runtime.json +1 -1
  517. package/runtime/sdk-runner/node_modules/@metro-labs/core/package.json +59 -0
  518. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-files.ts +216 -0
  519. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-store.ts +171 -0
  520. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-types.ts +141 -0
  521. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/call.ts +81 -0
  522. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/connector-sync.ts +17 -0
  523. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  524. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/events.ts +165 -0
  525. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/ids.ts +28 -0
  526. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/is-record.ts +2 -0
  527. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/lines.ts +78 -0
  528. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/log.ts +42 -0
  529. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/protocol.ts +227 -0
  530. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/runner-activity.ts +226 -0
  531. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/secure-fs.ts +74 -0
  532. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
  533. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/station-names.ts +14 -0
  534. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
  535. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
  536. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/attachments.ts +202 -0
  537. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
  538. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
  539. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
  540. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
  541. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
  542. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
  543. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
  544. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
  545. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
  546. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/station-runtime.ts +59 -0
  547. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
  548. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
  549. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/types.ts +126 -0
  550. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/str.ts +5 -0
  551. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/tickets.ts +44 -0
  552. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/train-error.ts +53 -0
  553. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/version.ts +2 -0
  554. package/runtime/sdk-runner/runner.json +10 -0
  555. package/runtime/sdk-runner/src/activity-tasks.ts +194 -0
  556. package/runtime/sdk-runner/src/activity.ts +397 -0
  557. package/runtime/sdk-runner/src/app.ts +87 -0
  558. package/runtime/sdk-runner/src/approvals.ts +37 -0
  559. package/runtime/sdk-runner/src/automation-cli.ts +10 -0
  560. package/runtime/sdk-runner/src/automation-command.ts +151 -0
  561. package/runtime/sdk-runner/src/automation.ts +145 -0
  562. package/runtime/sdk-runner/src/calls.ts +133 -0
  563. package/runtime/sdk-runner/src/channel-text.ts +26 -0
  564. package/runtime/sdk-runner/src/config.ts +50 -0
  565. package/runtime/sdk-runner/src/inbox.ts +168 -0
  566. package/runtime/sdk-runner/src/input-queue.ts +77 -0
  567. package/runtime/sdk-runner/src/input-timing.ts +68 -0
  568. package/runtime/sdk-runner/src/link.ts +154 -0
  569. package/runtime/sdk-runner/src/main.ts +53 -0
  570. package/runtime/sdk-runner/src/recovery.ts +46 -0
  571. package/runtime/sdk-runner/src/rules.ts +28 -0
  572. package/runtime/sdk-runner/src/runner.ts +343 -0
  573. package/runtime/sdk-runner/src/session-store.ts +129 -0
  574. package/runtime/sdk-runner/src/session-watch.ts +158 -0
  575. package/runtime/sdk-runner/src/singleton.ts +15 -0
  576. package/runtime/sdk-runner/src/skill-work.ts +76 -0
  577. package/runtime/sdk-runner/src/skills-files.ts +169 -0
  578. package/runtime/sdk-runner/src/skills.ts +150 -0
  579. package/runtime/sdk-runner/src/task-ledger.ts +229 -0
  580. package/runtime/sdk-runner/src/task-recovery.ts +203 -0
  581. package/runtime/sdk-runner/src/task-state.ts +71 -0
  582. package/runtime/sdk-runner/src/tool-proxy.ts +40 -0
  583. package/runtime/server.ts +1 -0
  584. package/runtime/stations.json +43 -0
  585. package/dist/bedrock-eventstream.js +0 -120
  586. package/dist/bedrock-proxy.js +0 -296
  587. package/dist/bedrock.js +0 -99
  588. package/dist/plugin.js +0 -82
  589. package/dist/prompt.js +0 -61
  590. package/dist/store.js +0 -70
  591. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-speak.ts +0 -195
  592. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-transcribe.ts +0 -292
  593. package/runtime/node_modules/@metro-labs/discord-bot/src/voice.ts +0 -197
  594. package/runtime/node_modules/@metro-labs/discord-bot/src/wire.ts +0 -5
  595. package/runtime/node_modules/@metro-labs/mcp/package.json +0 -66
  596. package/runtime/node_modules/@metro-labs/mcp/src/channels/dedupe.ts +0 -24
  597. package/runtime/node_modules/@metro-labs/mcp/src/daemon/account-api.ts +0 -311
  598. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-api.ts +0 -337
  599. package/runtime/node_modules/@metro-labs/mcp/src/daemon/api-http.ts +0 -129
  600. package/runtime/node_modules/@metro-labs/mcp/src/daemon/boot.ts +0 -321
  601. package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair-api.ts +0 -123
  602. package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair.ts +0 -20
  603. package/runtime/node_modules/@metro-labs/mcp/src/daemon/collection-api.ts +0 -202
  604. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-json.ts +0 -21
  605. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-oauth-routes.ts +0 -157
  606. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-tools.ts +0 -100
  607. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-verify.ts +0 -333
  608. package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-auth.ts +0 -164
  609. package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-oauth.ts +0 -208
  610. package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity.ts +0 -79
  611. package/runtime/node_modules/@metro-labs/mcp/src/daemon/oauth-pending.ts +0 -65
  612. package/runtime/node_modules/@metro-labs/mcp/src/daemon/pair-codes.ts +0 -58
  613. package/runtime/node_modules/@metro-labs/mcp/src/daemon/project-api.ts +0 -214
  614. package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-api.ts +0 -130
  615. package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-pair.ts +0 -18
  616. package/runtime/node_modules/@metro-labs/mcp/src/daemon/runtime-source.ts +0 -105
  617. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session-apis.ts +0 -43
  618. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session.ts +0 -218
  619. package/runtime/node_modules/@metro-labs/mcp/src/daemon/tunnel.ts +0 -169
  620. package/runtime/node_modules/@metro-labs/mcp/src/db/account-attach.ts +0 -91
  621. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-admin.ts +0 -215
  622. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-map.ts +0 -71
  623. package/runtime/node_modules/@metro-labs/mcp/src/db/client.ts +0 -37
  624. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-collections.ts +0 -218
  625. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-config.ts +0 -147
  626. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-relay.ts +0 -126
  627. package/runtime/node_modules/@metro-labs/mcp/src/db/connectors.ts +0 -308
  628. package/runtime/node_modules/@metro-labs/mcp/src/db/projects.ts +0 -300
  629. package/runtime/node_modules/@metro-labs/mcp/src/db/runtime-admin.ts +0 -31
  630. package/runtime/node_modules/@metro-labs/mcp/src/db/runtimes.ts +0 -105
  631. package/runtime/node_modules/@metro-labs/mcp/src/db/schema.ts +0 -131
  632. package/runtime/node_modules/@metro-labs/mcp/src/db/token-carry.ts +0 -45
  633. package/runtime/node_modules/@metro-labs/mcp/src/db/users.ts +0 -57
  634. package/runtime/node_modules/@metro-labs/mcp/src/db/whatsapp-login.ts +0 -18
  635. package/runtime/node_modules/@metro-labs/mcp/src/mcp/channel-owner.ts +0 -29
  636. package/runtime/node_modules/@metro-labs/mcp/src/mcp/frame-scope.ts +0 -21
  637. package/runtime/node_modules/@metro-labs/mcp/src/mcp/permission-relay.ts +0 -66
  638. package/runtime/node_modules/@metro-labs/mcp/src/mcp/request-identity.ts +0 -73
  639. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-registry.ts +0 -172
  640. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-route.ts +0 -43
  641. package/runtime/node_modules/@metro-labs/mcp/src/monitor/api.ts +0 -240
  642. package/runtime/node_modules/@metro-labs/mcp/src/server.ts +0 -2
  643. package/runtime/node_modules/@metro-labs/mcp/src/stations/account-store.ts +0 -80
  644. package/runtime/node_modules/@metro-labs/mcp/src/stations/messaging-normalize.ts +0 -88
  645. package/runtime/node_modules/@metro-labs/telegram/src/normalize.ts +0 -22
  646. package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +0 -1
  647. package/runtime/node_modules/@metro-labs/telegram-bot/src/wire.ts +0 -3
  648. package/runtime/node_modules/@metro-labs/whatsapp/src/normalize.ts +0 -22
  649. package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +0 -5
  650. package/runtime/node_modules/@metro-labs/xmtp/src/actions-push.ts +0 -87
  651. package/runtime/node_modules/@metro-labs/xmtp/src/emit-core.ts +0 -55
  652. package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +0 -349
  653. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/log.ts +0 -0
  654. /package/runtime/node_modules/@metro-labs/{mcp/src/mcp → core/src}/str.ts +0 -0
  655. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/train-error.ts +0 -0
  656. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/webhook-note.ts +0 -0
  657. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/raw-get-stream.ts +0 -0
  658. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-error.ts +0 -0
  659. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/cors.ts +0 -0
@@ -0,0 +1,115 @@
1
+ import { parseId } from '@metro-labs/core/ids';
2
+ import { isRecord } from '@metro-labs/core/is-record';
3
+ import { connectorName } from './connector-input.js';
4
+ import { connectorPolicyOf, type ConnectorPolicy } from './connector-policy.js';
5
+ import { parseConnectorUrl } from './connector-url.js';
6
+ import { isOrganizationId } from './workos-token.js';
7
+
8
+ export const CONNECTOR_DELIVERY_LEASE_MS = 90_000;
9
+ export const CONNECTOR_DELIVERY_MAX_BYTES = 1024 * 1024;
10
+ export const DELIVERY_PLAINTEXT_MAX = Math.floor((CONNECTOR_DELIVERY_MAX_BYTES - 1024) * 3 / 4);
11
+
12
+ export interface DeliveryContext {
13
+ owner: string;
14
+ agent: string;
15
+ keyId: string;
16
+ requestId: string;
17
+ }
18
+
19
+ export interface DeliveredConnector {
20
+ id: string;
21
+ name: string;
22
+ url: string;
23
+ auth: 'none' | 'header' | 'oauth';
24
+ headers: Record<string, string>;
25
+ policy: ConnectorPolicy;
26
+ revision: string;
27
+ state: 'ready' | 'signin' | 'unavailable';
28
+ expiresAt?: number;
29
+ }
30
+
31
+ export interface DeliverySnapshot {
32
+ version: 1;
33
+ issuedAt: number;
34
+ expiresAt: number;
35
+ connectors: DeliveredConnector[];
36
+ }
37
+
38
+ export function deliveryBytes(value: unknown, length?: number): Buffer {
39
+ if (typeof value !== 'string' || !/^[A-Za-z0-9_-]+$/.test(value)) throw new Error('Invalid connector delivery encoding.');
40
+ const bytes = Buffer.from(value, 'base64url');
41
+ if (bytes.toString('base64url') !== value || (length !== undefined && bytes.length !== length)) throw new Error('Invalid connector delivery encoding.');
42
+ return bytes;
43
+ }
44
+
45
+ export function deliveryRecord(value: unknown, fields: string[]): Record<string, unknown> {
46
+ if (!isRecord(value) || Object.keys(value).some((key) => !fields.includes(key))) throw new Error('Invalid connector delivery.');
47
+ return value;
48
+ }
49
+
50
+ export function deliveryContextBytes(context: DeliveryContext): Buffer {
51
+ const value = deliveryRecord(context, ['owner', 'agent', 'keyId', 'requestId']);
52
+ if (typeof value.owner !== 'string' || !isOrganizationId(value.owner) || parseId(value.agent) === null) throw new Error('Invalid connector delivery context.');
53
+ deliveryBytes(value.keyId, 32);
54
+ deliveryBytes(value.requestId, 32);
55
+ return Buffer.from(JSON.stringify(['metro-connector-delivery/v1', value.owner, value.agent, value.keyId, value.requestId]));
56
+ }
57
+
58
+ const timestamp = (value: unknown): value is number => typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
59
+
60
+ function headerValue(name: string, text: unknown, auth: DeliveredConnector['auth']): string {
61
+ if (!/^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,64}$/.test(name) || ['__proto__', 'constructor', 'prototype'].includes(name) || typeof text !== 'string' || !/^[\x20-\x7e]{1,16384}$/.test(text)) throw new Error('Invalid connector delivery headers.');
62
+ if (auth === 'oauth' && (name !== 'Authorization' || !/^Bearer [\x21-\x7e]+$/.test(text))) throw new Error('Invalid connector delivery access token.');
63
+ return text;
64
+ }
65
+
66
+ function headersOf(value: unknown, auth: DeliveredConnector['auth'], state: DeliveredConnector['state']): Record<string, string> {
67
+ if (!isRecord(value)) throw new Error('Invalid connector delivery headers.');
68
+ const entries = Object.entries(value);
69
+ const expected = auth !== 'none' && state === 'ready' ? 1 : 0;
70
+ if (entries.length !== expected) throw new Error('Invalid connector delivery headers.');
71
+ const out: Record<string, string> = {};
72
+ for (const [name, text] of entries) out[name] = headerValue(name, text, auth);
73
+ return out;
74
+ }
75
+
76
+ function authenticationOf(value: unknown): DeliveredConnector['auth'] {
77
+ if (value !== 'none' && value !== 'header' && value !== 'oauth') throw new Error('Invalid delivered connector authentication.');
78
+ return value;
79
+ }
80
+
81
+ function stateOf(value: unknown, auth: DeliveredConnector['auth']): DeliveredConnector['state'] {
82
+ if (value !== 'ready' && value !== 'signin' && value !== 'unavailable') throw new Error('Invalid delivered connector state.');
83
+ if (value === 'signin' && auth !== 'oauth') throw new Error('Invalid delivered connector state.');
84
+ return value;
85
+ }
86
+
87
+ function urlOf(value: unknown): string {
88
+ const url = parseConnectorUrl(value);
89
+ if (url.protocol !== 'https:' || url.toString().length > 2048 || typeof value !== 'string') throw new Error('Invalid delivered connector URL.');
90
+ return value;
91
+ }
92
+
93
+ function connectorOf(raw: unknown): DeliveredConnector {
94
+ const value = deliveryRecord(raw, ['id', 'name', 'url', 'auth', 'headers', 'policy', 'revision', 'state', 'expiresAt']);
95
+ const id = parseId(value.id);
96
+ if (id === null || typeof value.name !== 'string' || connectorName(value.name) !== value.name) throw new Error('Invalid delivered connector.');
97
+ const url = urlOf(value.url);
98
+ const auth = authenticationOf(value.auth);
99
+ const state = stateOf(value.state, auth);
100
+ deliveryBytes(value.revision, 32);
101
+ if (Object.hasOwn(value, 'expiresAt') && !timestamp(value.expiresAt)) throw new Error('Invalid delivered connector expiry.');
102
+ return { id, name: value.name, url, auth, state, revision: String(value.revision), headers: headersOf(value.headers, auth, state), policy: connectorPolicyOf(value.policy), ...(timestamp(value.expiresAt) ? { expiresAt: value.expiresAt } : {}) };
103
+ }
104
+
105
+ export function deliverySnapshotOf(raw: unknown): DeliverySnapshot {
106
+ const value = deliveryRecord(raw, ['version', 'issuedAt', 'expiresAt', 'connectors']);
107
+ if (value.version !== 1 || !timestamp(value.issuedAt) || !timestamp(value.expiresAt) || value.expiresAt <= value.issuedAt || value.expiresAt - value.issuedAt > CONNECTOR_DELIVERY_LEASE_MS || !Array.isArray(value.connectors)) throw new Error('Invalid connector delivery snapshot.');
108
+ const issuedAt = value.issuedAt;
109
+ const connectors = value.connectors.map((entry: unknown) => connectorOf(entry));
110
+ if (new Set(connectors.map((connector) => connector.id)).size !== connectors.length) throw new Error('Duplicate delivered connector.');
111
+ if (connectors.some((connector) => connector.state === 'ready' && connector.expiresAt !== undefined && connector.expiresAt <= issuedAt)) throw new Error('Expired delivered connector.');
112
+ const snapshot: DeliverySnapshot = { version: 1, issuedAt: value.issuedAt, expiresAt: value.expiresAt, connectors };
113
+ if (Buffer.byteLength(JSON.stringify(snapshot)) > DELIVERY_PLAINTEXT_MAX) throw new Error('Connector delivery is too large.');
114
+ return snapshot;
115
+ }
@@ -0,0 +1,19 @@
1
+ import type { KeyObject } from 'node:crypto';
2
+ import { CONNECTOR_DELIVERY_MAX_BYTES, DELIVERY_PLAINTEXT_MAX, deliveryContextBytes, deliverySnapshotOf, type DeliveryContext, type DeliverySnapshot } from './connector-delivery-validation.js';
3
+ import { openTransfer, sealTransfer, type SealedTransfer } from './transfer-crypto.js';
4
+
5
+ export { CONNECTOR_DELIVERY_LEASE_MS, CONNECTOR_DELIVERY_MAX_BYTES, deliverySnapshotOf, type DeliveryContext, type DeliverySnapshot, type DeliveredConnector } from './connector-delivery-validation.js';
6
+ export { combineConnectorPolicies, connectorPolicyOf, type ConnectorPolicy } from './connector-policy.js';
7
+ export type SealedDelivery = SealedTransfer;
8
+
9
+ export function sealConnectorDelivery(publicKey: string, context: DeliveryContext, snapshot: DeliverySnapshot): SealedDelivery {
10
+ const sealed = sealTransfer(publicKey, deliveryContextBytes(context), Buffer.from(JSON.stringify(deliverySnapshotOf(snapshot))));
11
+ if (Buffer.byteLength(JSON.stringify({ sealed })) > CONNECTOR_DELIVERY_MAX_BYTES) throw new Error('Connector delivery is too large.');
12
+ return sealed;
13
+ }
14
+
15
+ export function openConnectorDelivery(privateKey: KeyObject, context: DeliveryContext, envelope: unknown): DeliverySnapshot {
16
+ if (Buffer.byteLength(JSON.stringify({ sealed: envelope })) > CONNECTOR_DELIVERY_MAX_BYTES) throw new Error('Connector delivery is too large.');
17
+ const plaintext = openTransfer(privateKey, deliveryContextBytes(context), envelope, DELIVERY_PLAINTEXT_MAX);
18
+ return deliverySnapshotOf(JSON.parse(plaintext.toString('utf8')) as unknown);
19
+ }
@@ -1,4 +1,7 @@
1
- import { ConnectorVerifyError, parseConnectorUrl } from './connector-verify.js';
1
+ import { isRecord } from '@metro-labs/core/is-record';
2
+ import type { FetchLike } from '@metro-labs/core/stations/oauth';
3
+ import { stringOf } from './api-http.js';
4
+ import { parseConnectorUrl, refused } from './connector-url.js';
2
5
 
3
6
  const DISCOVERY_TIMEOUT_MS = 10_000;
4
7
 
@@ -8,23 +11,18 @@ export interface OAuthServer {
8
11
  tokenEndpoint: string;
9
12
  registrationEndpoint: string | null;
10
13
  supportsS256: boolean;
14
+ scopes: string[];
11
15
  }
12
16
 
13
- function refused(message: string): ConnectorVerifyError {
14
- return new ConnectorVerifyError(message, 400);
17
+ interface ResourceMetadata {
18
+ issuer: URL;
19
+ scopes: string[];
15
20
  }
16
21
 
17
- function isRecord(value: unknown): value is Record<string, unknown> {
18
- return typeof value === 'object' && value !== null && !Array.isArray(value);
19
- }
20
-
21
- const str = (value: unknown): string =>
22
- typeof value === 'string' ? value : '';
23
-
24
- async function getJson(url: URL): Promise<Record<string, unknown> | null> {
22
+ async function getJson(url: URL, fetchImpl: FetchLike): Promise<Record<string, unknown> | null> {
25
23
  let res: Response;
26
24
  try {
27
- res = await fetch(url, {
25
+ res = await fetchImpl(url.toString(), {
28
26
  redirect: 'manual',
29
27
  signal: AbortSignal.timeout(DISCOVERY_TIMEOUT_MS),
30
28
  headers: { accept: 'application/json' },
@@ -58,9 +56,9 @@ export function resourceMetadataUrls(resource: URL): URL[] {
58
56
  return urls;
59
57
  }
60
58
 
61
- export async function advertisesOAuth(resource: URL): Promise<boolean> {
59
+ export async function advertisesOAuth(resource: URL, fetchImpl: FetchLike = fetch): Promise<boolean> {
62
60
  for (const candidate of resourceMetadataUrls(resource)) {
63
- const body = await getJson(candidate);
61
+ const body = await getJson(candidate, fetchImpl);
64
62
  const servers: unknown = body?.authorization_servers;
65
63
  const first: unknown = Array.isArray(servers) ? servers[0] : undefined;
66
64
  if (typeof first === 'string' && first !== '') return true;
@@ -68,32 +66,64 @@ export async function advertisesOAuth(resource: URL): Promise<boolean> {
68
66
  return false;
69
67
  }
70
68
 
71
- async function authServerFor(resource: URL): Promise<URL> {
69
+ function scopesOf(body: Record<string, unknown> | null): string[] {
70
+ const raw: unknown = body?.scopes_supported;
71
+ if (!Array.isArray(raw)) return [];
72
+ const out: string[] = [];
73
+ for (const entry of raw) {
74
+ const scope = stringOf(entry).trim();
75
+ if (scope !== '' && !/\s/.test(scope) && !out.includes(scope)) out.push(scope);
76
+ }
77
+ return out;
78
+ }
79
+
80
+ async function resourceMetadata(resource: URL, fetchImpl: FetchLike): Promise<ResourceMetadata> {
72
81
  for (const candidate of resourceMetadataUrls(resource)) {
73
- const body = await getJson(candidate);
82
+ const body = await getJson(candidate, fetchImpl);
74
83
  const servers: unknown = body?.authorization_servers;
75
84
  const first: unknown = Array.isArray(servers) ? servers[0] : undefined;
76
85
  if (typeof first === 'string' && first !== '')
77
- return parseConnectorUrl(first);
86
+ return { issuer: parseConnectorUrl(first), scopes: scopesOf(body) };
78
87
  }
79
- return parseConnectorUrl(resource.origin);
88
+ return { issuer: parseConnectorUrl(resource.origin), scopes: [] };
89
+ }
90
+
91
+ const webAddress = (text: string): boolean => {
92
+ try {
93
+ parseConnectorUrl(text);
94
+ return true;
95
+ } catch {
96
+ return false;
97
+ }
98
+ };
99
+
100
+ function endpointOf(raw: unknown, issuer: URL): string {
101
+ const text = stringOf(raw);
102
+ if (text !== '' && !webAddress(text)) throw refused(`${issuer.hostname} advertises a sign-in address Metro will not open.`);
103
+ return text;
80
104
  }
81
105
 
82
- function toServer(body: Record<string, unknown>, issuer: URL): OAuthServer {
83
- const authorizationEndpoint = str(body.authorization_endpoint);
84
- const tokenEndpoint = str(body.token_endpoint);
106
+ function toServer(
107
+ body: Record<string, unknown>,
108
+ issuer: URL,
109
+ scopes: string[],
110
+ ): OAuthServer {
111
+ const authorizationEndpoint = endpointOf(body.authorization_endpoint, issuer);
112
+ const tokenEndpoint = endpointOf(body.token_endpoint, issuer);
85
113
  if (authorizationEndpoint === '' || tokenEndpoint === '')
86
114
  throw refused(
87
115
  `${issuer.hostname} advertises OAuth but not where to sign in.`,
88
116
  );
89
117
  const methods = body.code_challenge_methods_supported;
90
- const registration = str(body.registration_endpoint);
118
+ const offered = stringOf(body.registration_endpoint);
119
+ const registration = webAddress(offered) ? offered : '';
91
120
  return {
92
- issuer: str(body.issuer) === '' ? issuer.origin : str(body.issuer),
121
+ issuer: stringOf(body.issuer) === '' ? issuer.origin : stringOf(body.issuer),
93
122
  authorizationEndpoint,
94
123
  tokenEndpoint,
95
124
  registrationEndpoint: registration === '' ? null : registration,
96
125
  supportsS256: Array.isArray(methods) ? methods.includes('S256') : false,
126
+ scopes,
97
127
  };
98
128
  }
99
129
 
@@ -108,11 +138,11 @@ export function authServerMetadataUrls(issuer: URL): URL[] {
108
138
  return [...aware, new URL(`${path}/.well-known/openid-configuration`, issuer.origin), ...urls];
109
139
  }
110
140
 
111
- export async function discoverOAuth(resource: URL): Promise<OAuthServer> {
112
- const issuer = await authServerFor(resource);
141
+ export async function discoverOAuth(resource: URL, fetchImpl: FetchLike = fetch): Promise<OAuthServer> {
142
+ const { issuer, scopes } = await resourceMetadata(resource, fetchImpl);
113
143
  for (const candidate of authServerMetadataUrls(issuer)) {
114
- const body = await getJson(candidate);
115
- if (body !== null) return toServer(body, issuer);
144
+ const body = await getJson(candidate, fetchImpl);
145
+ if (body !== null) return toServer(body, issuer, scopes);
116
146
  }
117
147
  throw refused(
118
148
  `${resource.hostname} needs authorization, but publishes no OAuth metadata Metro can use.`,
@@ -0,0 +1,73 @@
1
+ import { ApiError } from './api-error.js';
2
+ import { stringOf } from './api-http.js';
3
+ import type { ConnectorAuth } from './connector-mcp.js';
4
+ import type { OAuthClient } from './connector-oauth.js';
5
+
6
+ const CONNECTOR_NAME_MAX = 64;
7
+ const HEADER_NAME_RE = /^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,64}$/;
8
+ const HEADER_VALUE_RE = /^[\x20-\x7e]{1,4096}$/;
9
+ const CLIENT_ID_RE = /^[\x21-\x7e]{1,256}$/;
10
+ const CLIENT_SECRET_RE = /^[\x21-\x7e]{1,1024}$/;
11
+ const DEFAULT_HEADER = 'Authorization';
12
+
13
+ export class ConnectorError extends ApiError {}
14
+
15
+ function hasControlChar(value: string): boolean {
16
+ for (const ch of value) {
17
+ const code = ch.codePointAt(0) ?? 0;
18
+ if (code < 0x20 || code === 0x7f) return true;
19
+ }
20
+ return false;
21
+ }
22
+
23
+ export function connectorName(raw: unknown): string {
24
+ const name = typeof raw === 'string' ? raw.trim() : '';
25
+ if (name === '') throw new ConnectorError('a connector needs a name', 400);
26
+ if (name.length > CONNECTOR_NAME_MAX)
27
+ throw new ConnectorError(
28
+ `a connector name must be ${String(CONNECTOR_NAME_MAX)} characters or fewer`,
29
+ 400,
30
+ );
31
+ if (hasControlChar(name))
32
+ throw new ConnectorError(
33
+ 'a connector name must not contain control characters',
34
+ 400,
35
+ );
36
+ return name;
37
+ }
38
+
39
+ export function connectorAuth(
40
+ rawHeader: unknown,
41
+ rawValue: unknown,
42
+ ): ConnectorAuth {
43
+ const header = stringOf(rawHeader).trim();
44
+ const value = stringOf(rawValue).trim();
45
+ if (header === '' && value === '') return { kind: 'none' };
46
+ if (value === '')
47
+ throw new ConnectorError(
48
+ 'that header has no value. Give both a header name and its value, or neither.',
49
+ 400,
50
+ );
51
+ const name = header === '' ? DEFAULT_HEADER : header;
52
+ if (!HEADER_NAME_RE.test(name))
53
+ throw new ConnectorError('that is not a valid HTTP header name', 400);
54
+ if (!HEADER_VALUE_RE.test(value))
55
+ throw new ConnectorError('that header value is not sendable', 400);
56
+ return { kind: 'header', name, value };
57
+ }
58
+
59
+ export function connectorClient(
60
+ rawId: unknown,
61
+ rawSecret: unknown,
62
+ ): OAuthClient | null {
63
+ const clientId = stringOf(rawId).trim();
64
+ const clientSecret = stringOf(rawSecret).trim();
65
+ if (clientId === '' && clientSecret === '') return null;
66
+ if (clientId === '')
67
+ throw new ConnectorError('a client secret needs the client ID it belongs to', 400);
68
+ if (!CLIENT_ID_RE.test(clientId))
69
+ throw new ConnectorError('that is not a client ID Metro can send', 400);
70
+ if (clientSecret !== '' && !CLIENT_SECRET_RE.test(clientSecret))
71
+ throw new ConnectorError('that client secret is not sendable', 400);
72
+ return { clientId, ...(clientSecret === '' ? {} : { clientSecret }) };
73
+ }
@@ -0,0 +1,106 @@
1
+ import { isRecord } from '@metro-labs/core/is-record';
2
+ import type { FetchLike } from '@metro-labs/core/stations/oauth';
3
+ import { ApiError } from './api-error.js';
4
+ import { whyUnreachable } from './connector-reach.js';
5
+ import { ConnectorUnauthorized, refused } from './connector-url.js';
6
+
7
+ export interface OAuthTokens {
8
+ accessToken: string;
9
+ refreshToken?: string;
10
+ expiresAt?: number;
11
+ }
12
+
13
+ export interface OAuthAuth extends OAuthTokens {
14
+ kind: 'oauth';
15
+ issuer: string;
16
+ tokenEndpoint: string;
17
+ clientId: string;
18
+ clientSecret?: string;
19
+ scope?: string;
20
+ }
21
+
22
+ export type ConnectorAuth =
23
+ | { kind: 'none' }
24
+ | { kind: 'header'; name: string; value: string }
25
+ | OAuthAuth;
26
+
27
+ export interface VerifiedServer {
28
+ server: string;
29
+ }
30
+
31
+ export interface VerifiedRecord extends VerifiedServer {
32
+ at: string;
33
+ }
34
+
35
+ const PROBE_TIMEOUT_MS = 10_000;
36
+
37
+ export const INITIALIZE = {
38
+ jsonrpc: '2.0',
39
+ id: 1,
40
+ method: 'initialize',
41
+ params: { protocolVersion: '2025-11-25', capabilities: {}, clientInfo: { name: 'metro', version: '0.1.0' } },
42
+ };
43
+
44
+ export function authHeaders(auth: ConnectorAuth): Record<string, string> {
45
+ if (auth.kind === 'header') return { [auth.name]: auth.value };
46
+ if (auth.kind === 'oauth') return { Authorization: `Bearer ${auth.accessToken}` };
47
+ return {};
48
+ }
49
+
50
+ export function payloadOf(text: string, contentType: string): string {
51
+ if (!contentType.includes('text/event-stream')) return text;
52
+ for (const line of text.replace(/\r\n/g, '\n').split('\n')) if (line.startsWith('data:')) return line.slice(5).trim();
53
+ return '';
54
+ }
55
+
56
+ export async function mcpPost(
57
+ url: URL,
58
+ auth: ConnectorAuth,
59
+ body: unknown,
60
+ opts: { timeoutMs: number; headers?: Record<string, string>; fetch?: FetchLike },
61
+ ): Promise<Response> {
62
+ const send = opts.fetch ?? fetch;
63
+ try {
64
+ return await send(url.toString(), {
65
+ method: 'POST',
66
+ redirect: 'manual',
67
+ signal: AbortSignal.timeout(opts.timeoutMs),
68
+ headers: { 'content-type': 'application/json', accept: 'application/json, text/event-stream', ...authHeaders(auth), ...opts.headers },
69
+ body: JSON.stringify(body),
70
+ });
71
+ } catch (err) {
72
+ if (err instanceof ApiError) throw err;
73
+ throw refused(`Metro could not reach ${url.hostname}: ${whyUnreachable(err)}`);
74
+ }
75
+ }
76
+
77
+ function serverNameOf(url: URL, text: string, contentType: string): string {
78
+ let parsed: unknown;
79
+ try {
80
+ parsed = JSON.parse(payloadOf(text, contentType));
81
+ } catch {
82
+ throw refused(`${url.hostname} answered, but it does not speak MCP.`);
83
+ }
84
+ const result = isRecord(parsed) && isRecord(parsed.result) ? parsed.result : null;
85
+ if (result === null || typeof result.protocolVersion !== 'string') throw refused(`${url.hostname} answered, but it does not speak MCP.`);
86
+ const info = isRecord(result.serverInfo) ? result.serverInfo : {};
87
+ const title = typeof info.title === 'string' ? info.title : '';
88
+ if (title !== '') return title;
89
+ return typeof info.name === 'string' ? info.name : url.hostname;
90
+ }
91
+
92
+ function refuseStatus(res: Response, url: URL, auth: ConnectorAuth): void {
93
+ if (res.status >= 300 && res.status < 400) throw refused('that url redirects. Use the url it redirects to.');
94
+ if (res.status === 401 || res.status === 403)
95
+ throw new ConnectorUnauthorized(auth.kind === 'none' ? `${url.hostname} requires authorization.` : `${url.hostname} rejected that credential.`, 400);
96
+ if (res.status === 404 || res.status === 405)
97
+ throw refused(`${url.hostname} did not accept an MCP initialize over HTTP POST. If it is a legacy SSE server, Metro cannot verify it yet.`);
98
+ if (!res.ok) throw refused(`${url.hostname} answered ${String(res.status)} instead of an MCP initialize.`);
99
+ }
100
+
101
+ export async function verifyRemoteMcp(url: URL, auth: ConnectorAuth, fetchImpl: FetchLike = fetch): Promise<VerifiedServer> {
102
+ const res = await mcpPost(url, auth, INITIALIZE, { timeoutMs: PROBE_TIMEOUT_MS, fetch: fetchImpl });
103
+ const text = await res.text().catch(() => '');
104
+ refuseStatus(res, url, auth);
105
+ return { server: serverNameOf(url, text, res.headers.get('content-type') ?? '') };
106
+ }
@@ -0,0 +1,176 @@
1
+ import type { KeyObject } from 'node:crypto';
2
+ import { parseId } from '@metro-labs/core/ids';
3
+ import { sealingKeyOf } from './agent-signature.js';
4
+ import { deliveryBytes, deliveryRecord } from './connector-delivery-validation.js';
5
+ import { connectorAuth, connectorClient, connectorName } from './connector-input.js';
6
+ import type { OAuthClient } from './connector-oauth.js';
7
+ import { connectorPolicyOf, type ConnectorPolicy } from './connector-policy.js';
8
+ import { parseConnectorUrl } from './connector-url.js';
9
+ import { openTransfer, sealTransfer, type SealedTransfer } from './transfer-crypto.js';
10
+ import { isOrganizationId } from './workos-token.js';
11
+
12
+ export const CONNECTOR_MIGRATION_MAX_BYTES = 96 * 1024;
13
+ const PAYLOAD_MAX = 60 * 1024;
14
+
15
+ export interface MigrationContext {
16
+ owner: string;
17
+ agent: string;
18
+ keyId: string;
19
+ operationId: string;
20
+ sourceId: string;
21
+ destinationId: string;
22
+ }
23
+
24
+ export interface MigrationPayload {
25
+ name: string;
26
+ url: string;
27
+ auth: { kind: 'none' } | { kind: 'header'; name: string; value: string } | { kind: 'oauth' };
28
+ client: OAuthClient | null;
29
+ policy: ConnectorPolicy;
30
+ sourceStamp: string;
31
+ }
32
+
33
+ export interface MigrationView {
34
+ operationId: string;
35
+ sourceId: string;
36
+ destinationId: string;
37
+ phase: 'preparing' | 'prepared' | 'active' | 'rolled_back';
38
+ readiness: 'pending' | 'ready' | 'signin' | 'changed' | 'unavailable';
39
+ name: string | null;
40
+ auth: 'none' | 'header' | 'oauth' | null;
41
+ policy: ConnectorPolicy | null;
42
+ sourceStamp: string | null;
43
+ }
44
+
45
+ export interface MigrationResponse {
46
+ migration: MigrationView;
47
+ receiving?: { publicKey: string; context: MigrationContext };
48
+ }
49
+
50
+ export type MigrationRequest = { action: 'begin' | 'status' | 'activate' | 'rollback'; operationId: string; sourceId: string } | { action: 'prepare'; operationId: string; sourceId: string; sealed: unknown };
51
+
52
+ const invalid = (): Error => new Error('Invalid connector migration.');
53
+ const idOf = (value: unknown): string => {
54
+ const id = parseId(value);
55
+ if (id === null) throw invalid();
56
+ return id;
57
+ };
58
+
59
+ export function migrationRequestOf(raw: unknown): MigrationRequest {
60
+ const value = deliveryRecord(raw, ['action', 'operationId', 'sourceId', 'sealed']);
61
+ const operationId = idOf(value.operationId);
62
+ const sourceId = idOf(value.sourceId);
63
+ if (value.action === 'prepare' && Object.hasOwn(value, 'sealed')) return { action: 'prepare', operationId, sourceId, sealed: value.sealed };
64
+ if (Object.hasOwn(value, 'sealed')) throw invalid();
65
+ if (value.action !== 'begin' && value.action !== 'status' && value.action !== 'activate' && value.action !== 'rollback') throw invalid();
66
+ return { action: value.action, operationId, sourceId };
67
+ }
68
+
69
+ function contextOf(raw: unknown): MigrationContext {
70
+ const value = deliveryRecord(raw, ['owner', 'agent', 'keyId', 'operationId', 'sourceId', 'destinationId']);
71
+ if (typeof value.owner !== 'string' || !isOrganizationId(value.owner) || typeof value.keyId !== 'string') throw invalid();
72
+ deliveryBytes(value.keyId, 32);
73
+ return { owner: value.owner, agent: idOf(value.agent), keyId: value.keyId, operationId: idOf(value.operationId), sourceId: idOf(value.sourceId), destinationId: idOf(value.destinationId) };
74
+ }
75
+
76
+ function contextBytes(context: MigrationContext): Buffer {
77
+ const value = contextOf(context);
78
+ return Buffer.from(JSON.stringify(['metro-connector-migration/v1', value.owner, value.agent, value.keyId, value.operationId, value.sourceId, value.destinationId]));
79
+ }
80
+
81
+ function authOf(raw: unknown): MigrationPayload['auth'] {
82
+ const value = deliveryRecord(raw, ['kind', 'name', 'value']);
83
+ if (value.kind === 'header') {
84
+ const auth = connectorAuth(value.name, value.value);
85
+ if (auth.kind !== 'header' || auth.name !== value.name || auth.value !== value.value || ['__proto__', 'constructor', 'prototype'].includes(auth.name)) throw invalid();
86
+ return auth;
87
+ }
88
+ if ((value.kind !== 'none' && value.kind !== 'oauth') || Object.hasOwn(value, 'name') || Object.hasOwn(value, 'value')) throw invalid();
89
+ return { kind: value.kind };
90
+ }
91
+
92
+ function clientOf(raw: unknown): OAuthClient | null {
93
+ if (raw === null) return null;
94
+ const value = deliveryRecord(raw, ['clientId', 'clientSecret']);
95
+ const client = connectorClient(value.clientId, value.clientSecret);
96
+ if (client === null || client.clientId !== value.clientId || client.clientSecret !== value.clientSecret) throw invalid();
97
+ return client;
98
+ }
99
+
100
+ function canonicalResource(raw: unknown, url: URL): boolean {
101
+ return raw === `${url.origin}${url.pathname}` || (url.pathname === '/' && raw === url.origin);
102
+ }
103
+
104
+ function migrationClient(auth: MigrationPayload['auth'], url: URL, input: Record<string, unknown>): OAuthClient | null {
105
+ const client = clientOf(input.client);
106
+ if (auth.kind !== 'oauth' && client !== null) throw invalid();
107
+ if (auth.kind === 'oauth' && (url.search !== '' || !['/', '/mcp'].includes(url.pathname) || !canonicalResource(input.url, url))) throw invalid();
108
+ return client;
109
+ }
110
+
111
+ export function migrationPayloadOf(raw: unknown): MigrationPayload {
112
+ const value = deliveryRecord(raw, ['name', 'url', 'auth', 'client', 'policy', 'sourceStamp']);
113
+ if (typeof value.name !== 'string' || connectorName(value.name) !== value.name || typeof value.url !== 'string' || typeof value.sourceStamp !== 'string') throw invalid();
114
+ const url = parseConnectorUrl(value.url);
115
+ if (url.protocol !== 'https:' || value.url.length > 2048) throw invalid();
116
+ deliveryBytes(value.sourceStamp, 32);
117
+ const auth = authOf(value.auth);
118
+ const client = migrationClient(auth, url, value);
119
+ const payload = { name: value.name, url: value.url, auth, client, policy: connectorPolicyOf(value.policy), sourceStamp: value.sourceStamp };
120
+ if (Buffer.byteLength(JSON.stringify(payload)) > PAYLOAD_MAX) throw invalid();
121
+ return payload;
122
+ }
123
+
124
+ function phaseOf(value: unknown): MigrationView['phase'] {
125
+ if (value !== 'preparing' && value !== 'prepared' && value !== 'active' && value !== 'rolled_back') throw invalid();
126
+ return value;
127
+ }
128
+
129
+ function readinessOf(value: unknown): MigrationView['readiness'] {
130
+ if (value !== 'pending' && value !== 'ready' && value !== 'signin' && value !== 'changed' && value !== 'unavailable') throw invalid();
131
+ return value;
132
+ }
133
+
134
+ function authKindOf(value: unknown): MigrationView['auth'] {
135
+ if (value !== null && value !== 'none' && value !== 'header' && value !== 'oauth') throw invalid();
136
+ return value;
137
+ }
138
+
139
+ function nullableName(value: unknown): string | null {
140
+ if (value === null) return null;
141
+ if (typeof value !== 'string' || connectorName(value) !== value) throw invalid();
142
+ return value;
143
+ }
144
+
145
+ function nullableStamp(value: unknown): string | null {
146
+ if (value === null) return null;
147
+ if (typeof value !== 'string') throw invalid();
148
+ deliveryBytes(value, 32);
149
+ return value;
150
+ }
151
+
152
+ function viewOf(raw: unknown): MigrationView {
153
+ const view = deliveryRecord(raw, ['operationId', 'sourceId', 'destinationId', 'phase', 'readiness', 'name', 'auth', 'policy', 'sourceStamp']);
154
+ return { operationId: idOf(view.operationId), sourceId: idOf(view.sourceId), destinationId: idOf(view.destinationId), phase: phaseOf(view.phase), readiness: readinessOf(view.readiness), name: nullableName(view.name), auth: authKindOf(view.auth), policy: view.policy === null ? null : connectorPolicyOf(view.policy), sourceStamp: nullableStamp(view.sourceStamp) };
155
+ }
156
+
157
+ export function migrationResponseOf(raw: unknown): MigrationResponse {
158
+ const value = deliveryRecord(raw, ['migration', 'receiving']);
159
+ const migration = viewOf(value.migration);
160
+ if (!Object.hasOwn(value, 'receiving')) return { migration };
161
+ const receiving = deliveryRecord(value.receiving, ['publicKey', 'context']);
162
+ if (typeof receiving.publicKey !== 'string' || sealingKeyOf(receiving.publicKey) === null) throw invalid();
163
+ const context = contextOf(receiving.context);
164
+ if (context.operationId !== migration.operationId || context.sourceId !== migration.sourceId || context.destinationId !== migration.destinationId) throw invalid();
165
+ return { migration, receiving: { publicKey: receiving.publicKey, context } };
166
+ }
167
+
168
+ export function sealConnectorMigration(publicKey: string, context: MigrationContext, payload: MigrationPayload): SealedTransfer {
169
+ return sealTransfer(publicKey, contextBytes(context), Buffer.from(JSON.stringify(migrationPayloadOf(payload))));
170
+ }
171
+
172
+ export function openConnectorMigration(privateKey: KeyObject, context: MigrationContext, sealed: unknown): MigrationPayload {
173
+ if (Buffer.byteLength(JSON.stringify(sealed)) > CONNECTOR_MIGRATION_MAX_BYTES) throw invalid();
174
+ const plain = openTransfer(privateKey, contextBytes(context), sealed, PAYLOAD_MAX);
175
+ return migrationPayloadOf(JSON.parse(plain.toString('utf8')) as unknown);
176
+ }