@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
@@ -1,26 +1,21 @@
1
1
  import { createHash, randomBytes } from 'node:crypto';
2
- import {
3
- ConnectorVerifyError,
4
- type OAuthTokens,
5
- } from './connector-verify.js';
6
- import type { OAuthServer } from './oauth-discovery.js';
2
+ import { isRecord } from '@metro-labs/core/is-record';
3
+ import type { FetchLike } from '@metro-labs/core/stations/oauth';
4
+ import { whyUnreachable } from './connector-reach.js';
5
+ import { ConnectorVerifyError, refused } from './connector-url.js';
6
+ import type { OAuthTokens } from './connector-mcp.js';
7
+ import type { OAuthServer } from './connector-discovery.js';
7
8
 
8
9
  const TOKEN_TIMEOUT_MS = 15_000;
9
10
  const CLIENT_NAME = 'Metro';
10
11
 
12
+ export class OAuthInvalidGrant extends ConnectorVerifyError {}
13
+
11
14
  export interface OAuthClient {
12
15
  clientId: string;
13
16
  clientSecret?: string;
14
17
  }
15
18
 
16
- function refused(message: string): ConnectorVerifyError {
17
- return new ConnectorVerifyError(message, 400);
18
- }
19
-
20
- function isRecord(value: unknown): value is Record<string, unknown> {
21
- return typeof value === 'object' && value !== null && !Array.isArray(value);
22
- }
23
-
24
19
  export function newVerifier(): string {
25
20
  return randomBytes(32).toString('base64url');
26
21
  }
@@ -32,14 +27,17 @@ export function challengeOf(verifier: string): string {
32
27
  export async function registerClient(
33
28
  server: OAuthServer,
34
29
  redirectUri: string,
30
+ fetchImpl: FetchLike = fetch,
35
31
  ): Promise<OAuthClient> {
36
32
  if (server.registrationEndpoint === null)
37
33
  throw refused(
38
- 'That server requires OAuth but does not accept client registration, so Metro cannot sign in to it.',
34
+ 'That server signs in with OAuth but registers no clients on its own. ' +
35
+ `Register an app with it yourself, with ${redirectUri} as its redirect URL, ` +
36
+ "and add the connector again with that app's client ID.",
39
37
  );
40
38
  let res: Response;
41
39
  try {
42
- res = await fetch(server.registrationEndpoint, {
40
+ res = await fetchImpl(server.registrationEndpoint, {
43
41
  method: 'POST',
44
42
  redirect: 'manual',
45
43
  signal: AbortSignal.timeout(TOKEN_TIMEOUT_MS),
@@ -52,8 +50,8 @@ export async function registerClient(
52
50
  token_endpoint_auth_method: 'none',
53
51
  }),
54
52
  });
55
- } catch {
56
- throw refused('Metro could not reach that server to register.');
53
+ } catch (err) {
54
+ throw refused(`Metro could not reach that server to register: ${whyUnreachable(err)}`);
57
55
  }
58
56
  const body: unknown = await res.json().catch(() => null);
59
57
  if (!res.ok || !isRecord(body) || typeof body.client_id !== 'string')
@@ -83,21 +81,37 @@ export function authorizeUrl(input: AuthorizeInput): string {
83
81
  url.searchParams.set('code_challenge', challengeOf(input.verifier));
84
82
  url.searchParams.set('code_challenge_method', 'S256');
85
83
  url.searchParams.set('resource', input.resource);
84
+ if (input.server.scopes.length > 0)
85
+ url.searchParams.set('scope', input.server.scopes.join(' '));
86
86
  return url.toString();
87
87
  }
88
88
 
89
+ function validateOptionalTokens(body: Record<string, unknown>): void {
90
+ const refresh = body.refresh_token;
91
+ if (Object.hasOwn(body, 'refresh_token') && (typeof refresh !== 'string' || !/^[\x21-\x7e]{1,16384}$/.test(refresh))) throw refused('That server returned an invalid refresh token.');
92
+ if (Object.hasOwn(body, 'token_type') && (typeof body.token_type !== 'string' || body.token_type.toLowerCase() !== 'bearer')) throw refused('That server returned an unsupported token type.');
93
+ }
94
+
95
+ function expiryFrom(body: Record<string, unknown>): number | undefined {
96
+ if (!Object.hasOwn(body, 'expires_in')) return undefined;
97
+ const expires = body.expires_in;
98
+ if (typeof expires !== 'number' || !Number.isFinite(expires) || expires <= 0) throw refused('That server returned an invalid token expiry.');
99
+ const at = Date.now() + expires * 1000;
100
+ if (!Number.isSafeInteger(at)) throw refused('That server returned an invalid token expiry.');
101
+ return at;
102
+ }
103
+
89
104
  function tokensFrom(body: Record<string, unknown>): OAuthTokens {
90
105
  const access = body.access_token;
91
- if (typeof access !== 'string' || access === '')
92
- throw refused('That server did not return an access token.');
106
+ if (typeof access !== 'string' || !/^[\x21-\x7e]{1,16377}$/.test(access))
107
+ throw refused('That server did not return a sendable access token.');
108
+ validateOptionalTokens(body);
109
+ const expiresAt = expiryFrom(body);
93
110
  const refresh = body.refresh_token;
94
- const expires = body.expires_in;
95
111
  return {
96
112
  accessToken: access,
97
113
  ...(typeof refresh === 'string' ? { refreshToken: refresh } : {}),
98
- ...(typeof expires === 'number'
99
- ? { expiresAt: Date.now() + expires * 1000 }
100
- : {}),
114
+ ...(expiresAt === undefined ? {} : { expiresAt }),
101
115
  };
102
116
  }
103
117
 
@@ -105,6 +119,7 @@ async function postToken(
105
119
  server: OAuthServer,
106
120
  client: OAuthClient,
107
121
  form: Record<string, string>,
122
+ fetchImpl: FetchLike,
108
123
  ): Promise<OAuthTokens> {
109
124
  const params = new URLSearchParams({
110
125
  ...form,
@@ -115,7 +130,7 @@ async function postToken(
115
130
  });
116
131
  let res: Response;
117
132
  try {
118
- res = await fetch(server.tokenEndpoint, {
133
+ res = await fetchImpl(server.tokenEndpoint, {
119
134
  method: 'POST',
120
135
  redirect: 'manual',
121
136
  signal: AbortSignal.timeout(TOKEN_TIMEOUT_MS),
@@ -125,10 +140,11 @@ async function postToken(
125
140
  },
126
141
  body: params.toString(),
127
142
  });
128
- } catch {
129
- throw refused('Metro could not reach that server to finish signing in.');
143
+ } catch (err) {
144
+ throw refused(`Metro could not reach that server to finish signing in: ${whyUnreachable(err)}`);
130
145
  }
131
146
  const body: unknown = await res.json().catch(() => null);
147
+ if (form.grant_type === 'refresh_token' && res.status === 400 && isRecord(body) && body.error === 'invalid_grant') throw new OAuthInvalidGrant('That server requires a new sign-in.', 400);
132
148
  if (!res.ok || !isRecord(body))
133
149
  throw refused('That server refused to complete the sign-in.');
134
150
  return tokensFrom(body);
@@ -138,6 +154,7 @@ export function exchangeCode(
138
154
  server: OAuthServer,
139
155
  client: OAuthClient,
140
156
  input: { code: string; redirectUri: string; verifier: string; resource: string },
157
+ fetchImpl: FetchLike = fetch,
141
158
  ): Promise<OAuthTokens> {
142
159
  return postToken(server, client, {
143
160
  grant_type: 'authorization_code',
@@ -145,7 +162,7 @@ export function exchangeCode(
145
162
  redirect_uri: input.redirectUri,
146
163
  code_verifier: input.verifier,
147
164
  resource: input.resource,
148
- });
165
+ }, fetchImpl);
149
166
  }
150
167
 
151
168
  export function refreshTokens(
@@ -153,10 +170,13 @@ export function refreshTokens(
153
170
  client: OAuthClient,
154
171
  refreshToken: string,
155
172
  resource: string,
173
+ scope?: string,
174
+ fetchImpl: FetchLike = fetch,
156
175
  ): Promise<OAuthTokens> {
157
176
  return postToken(server, client, {
158
177
  grant_type: 'refresh_token',
159
178
  refresh_token: refreshToken,
160
179
  resource,
161
- });
180
+ ...(scope === undefined ? {} : { scope }),
181
+ }, fetchImpl);
162
182
  }
@@ -0,0 +1,56 @@
1
+ import { isRecord } from '@metro-labs/core/is-record';
2
+
3
+ export type ConnectorDecision = 'allow' | 'ask' | 'deny';
4
+
5
+ export interface ConnectorPolicy {
6
+ read?: ConnectorDecision;
7
+ write?: ConnectorDecision;
8
+ tools?: Record<string, ConnectorDecision>;
9
+ }
10
+
11
+ const RANK: Record<ConnectorDecision, number> = { allow: 0, ask: 1, deny: 2 };
12
+ const TOOL_RE = /^[A-Za-z0-9_.:/-]{1,256}$/;
13
+
14
+ const decision = (value: unknown): value is ConnectorDecision => value === 'allow' || value === 'ask' || value === 'deny';
15
+
16
+ export function connectorPolicyOf(value: unknown): ConnectorPolicy {
17
+ if (!isRecord(value) || Object.keys(value).some((key) => !['read', 'write', 'tools'].includes(key))) throw new Error('Invalid connector policy.');
18
+ const out: ConnectorPolicy = {};
19
+ for (const group of ['read', 'write'] as const) {
20
+ if (!Object.hasOwn(value, group)) continue;
21
+ const field = value[group];
22
+ if (!decision(field)) throw new Error('Invalid connector policy.');
23
+ out[group] = field;
24
+ }
25
+ if (Object.hasOwn(value, 'tools')) out.tools = toolPolicyOf(value.tools);
26
+ return out;
27
+ }
28
+
29
+ function toolPolicyOf(value: unknown): Record<string, ConnectorDecision> {
30
+ if (!isRecord(value) || Object.keys(value).length > 2000) throw new Error('Invalid connector policy.');
31
+ const out: Record<string, ConnectorDecision> = {};
32
+ for (const [name, rule] of Object.entries(value)) {
33
+ if (!TOOL_RE.test(name) || ['__proto__', 'constructor', 'prototype'].includes(name) || !decision(rule)) throw new Error('Invalid connector policy.');
34
+ out[name] = rule;
35
+ }
36
+ return out;
37
+ }
38
+
39
+ const strictest = (...values: (ConnectorDecision | undefined)[]): ConnectorDecision => values.reduce<ConnectorDecision>((held, next) => next !== undefined && RANK[next] > RANK[held] ? next : held, 'allow');
40
+
41
+ export function combineConnectorPolicies(global: ConnectorPolicy, assignment: ConnectorPolicy): ConnectorPolicy {
42
+ const policies = [connectorPolicyOf(global), connectorPolicyOf(assignment)];
43
+ const neutral = (policy: ConnectorPolicy): boolean => (policy.read ?? 'allow') === 'allow' && (policy.write ?? 'allow') === 'allow' && Object.keys(policy.tools ?? {}).length === 0;
44
+ if (neutral(assignment)) return connectorPolicyOf(global);
45
+ if (neutral(global)) return connectorPolicyOf(assignment);
46
+ const out: ConnectorPolicy = {
47
+ read: strictest(...policies.map((policy) => policy.read)),
48
+ write: strictest(...policies.map((policy) => policy.write)),
49
+ };
50
+ const names = new Set(policies.flatMap((policy) => Object.keys(policy.tools ?? {})));
51
+ if (names.size > 0) {
52
+ out.tools = {};
53
+ for (const name of names) out.tools[name] = strictest(...policies.flatMap((policy) => [policy.read, policy.write, policy.tools?.[name]]));
54
+ }
55
+ return out;
56
+ }
@@ -0,0 +1,27 @@
1
+ import { errMsg } from '@metro-labs/core/log';
2
+
3
+ const HINTS: Record<string, string> = {
4
+ ENOTFOUND: 'the name does not resolve',
5
+ EAI_AGAIN: 'the name did not resolve in time',
6
+ ECONNREFUSED: 'nothing is listening there',
7
+ ECONNRESET: 'the server dropped the connection',
8
+ ETIMEDOUT: 'the server did not answer in time',
9
+ ConnectionRefused: 'nothing is listening there',
10
+ CERT_HAS_EXPIRED: 'its certificate has expired',
11
+ DEPTH_ZERO_SELF_SIGNED_CERT: 'its certificate is self-signed',
12
+ UNABLE_TO_VERIFY_LEAF_SIGNATURE: 'its certificate could not be verified',
13
+ ERR_TLS_CERT_ALTNAME_INVALID: 'its certificate is for another name',
14
+ SELF_SIGNED_CERT_IN_CHAIN: 'its certificate chain is not trusted',
15
+ };
16
+
17
+ const codeOf = (err: unknown): string =>
18
+ err !== null && typeof err === 'object' && 'code' in err && typeof err.code === 'string' ? err.code : '';
19
+
20
+ export function whyUnreachable(err: unknown): string {
21
+ const inner = err instanceof Error && err.cause instanceof Error ? err.cause : err;
22
+ const message = errMsg(inner).trim();
23
+ const code = codeOf(inner) || codeOf(err);
24
+ const said = message !== '' && message !== 'fetch failed' ? message : code || 'no answer';
25
+ const hint = HINTS[code];
26
+ return hint === undefined ? said : `${said} (${hint})`;
27
+ }
@@ -4,22 +4,17 @@ export class ConnectorVerifyError extends ApiError {}
4
4
 
5
5
  export class ConnectorUnauthorized extends ConnectorVerifyError {}
6
6
 
7
- export class ConnectorNotMcp extends ConnectorVerifyError {}
8
-
9
- export const POLICY_MESSAGE =
10
- 'Metro connects from its own server, so it cannot reach a URL on your machine. localhost and private addresses are not usable as connectors.';
11
-
12
- const IPV4 = /^\d{1,3}(?:\.\d{1,3}){3}$/;
13
- const PRIVATE_SUFFIX = /(?:^|\.)(?:localhost|local|internal|flycast)$/;
14
-
15
7
  export function refused(message: string): ConnectorVerifyError {
16
8
  return new ConnectorVerifyError(message, 400);
17
9
  }
18
10
 
19
- function hostAllowed(host: string): boolean {
20
- if (host === '' || host.startsWith('[')) return false;
21
- if (IPV4.test(host) || !host.includes('.')) return false;
22
- return !PRIVATE_SUFFIX.test(host);
11
+ function refuseShape(url: URL): void {
12
+ if (url.protocol !== 'https:' && url.protocol !== 'http:')
13
+ throw refused('a connector url must start with https:// or http://');
14
+ if (url.username !== '' || url.password !== '')
15
+ throw refused('a connector url must not carry a user:password');
16
+ if (url.hash !== '')
17
+ throw refused('a connector url must not carry a #fragment');
23
18
  }
24
19
 
25
20
  export function parseConnectorUrl(raw: unknown): URL {
@@ -31,13 +26,7 @@ export function parseConnectorUrl(raw: unknown): URL {
31
26
  } catch {
32
27
  throw refused('that is not a valid url');
33
28
  }
34
- if (url.protocol !== 'https:')
35
- throw refused('a connector url must start with https://');
36
- if (url.username !== '' || url.password !== '')
37
- throw refused('a connector url must not carry a user:password');
38
- if (url.hash !== '')
39
- throw refused('a connector url must not carry a #fragment');
40
- if (!hostAllowed(url.hostname.toLowerCase())) throw refused(POLICY_MESSAGE);
29
+ refuseShape(url);
41
30
  return url;
42
31
  }
43
32
 
@@ -46,12 +35,3 @@ export function connectorUrlText(url: URL): string {
46
35
  if (url.pathname !== '/' || url.search !== '') return text;
47
36
  return text.endsWith('/') ? text.slice(0, -1) : text;
48
37
  }
49
-
50
- export function safeIconSrc(raw: unknown): string {
51
- if (typeof raw !== 'string' || raw === '') return '';
52
- try {
53
- return new URL(raw).protocol === 'https:' ? raw.slice(0, 500) : '';
54
- } catch {
55
- return '';
56
- }
57
- }
@@ -0,0 +1,56 @@
1
+ const P = 2n ** 255n - 19n;
2
+
3
+ interface Point {
4
+ x: bigint;
5
+ y: bigint;
6
+ }
7
+
8
+ const mod = (a: bigint): bigint => ((a % P) + P) % P;
9
+
10
+ function pow(base: bigint, exp: bigint): bigint {
11
+ let result = 1n;
12
+ let b = mod(base);
13
+ for (let e = exp; e > 0n; e >>= 1n) {
14
+ if ((e & 1n) === 1n) result = (result * b) % P;
15
+ b = (b * b) % P;
16
+ }
17
+ return result;
18
+ }
19
+
20
+ const inv = (a: bigint): bigint => pow(a, P - 2n);
21
+ const D = mod(-121665n * inv(121666n));
22
+ const SQRT_M1 = pow(2n, (P - 1n) / 4n);
23
+
24
+ function rootOf(u: bigint, v: bigint): bigint | null {
25
+ const x = mod(u * pow(v, 3n) * pow(mod(u * pow(v, 7n)), (P - 5n) / 8n));
26
+ const vx2 = mod(v * x * x);
27
+ if (vx2 === u) return x;
28
+ return vx2 === mod(-u) ? mod(x * SQRT_M1) : null;
29
+ }
30
+
31
+ function decode(bytes: Buffer): Point | null {
32
+ if (bytes.length !== 32) return null;
33
+ const last = bytes[31] ?? 0;
34
+ const sign = BigInt(last >> 7);
35
+ const copy = Buffer.from(bytes);
36
+ copy[31] = last & 0x7f;
37
+ const y = BigInt(`0x${copy.reverse().toString('hex')}`);
38
+ if (y >= P) return null;
39
+ const y2 = (y * y) % P;
40
+ const x = rootOf(mod(y2 - 1n), mod(D * y2 + 1n));
41
+ if (x === null || (x === 0n && sign === 1n)) return null;
42
+ return { x: (x & 1n) === sign ? x : mod(-x), y };
43
+ }
44
+
45
+ function add(a: Point, b: Point): Point {
46
+ const t = mod(D * a.x * b.x * a.y * b.y);
47
+ return { x: mod((a.x * b.y + a.y * b.x) * inv(mod(1n + t))), y: mod((a.y * b.y + a.x * b.x) * inv(mod(1n - t))) };
48
+ }
49
+
50
+ export function strongEd25519(raw: Buffer): boolean {
51
+ const point = decode(raw);
52
+ if (point === null) return false;
53
+ let eight = point;
54
+ for (let i = 0; i < 3; i += 1) eight = add(eight, eight);
55
+ return !(eight.x === 0n && eight.y === 1n);
56
+ }
@@ -1,11 +1,20 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
- import { apiSession, cors, sendJson } from './api-http.js';
2
+ import { cors, sendJson } from './api-http.js';
3
3
 
4
- const PATH = '/api/session';
4
+ const PATH = '/api/mode';
5
5
 
6
- export function handleSessionApiRequest(
6
+ export type DaemonMode = 'hosted' | 'local';
7
+
8
+ export interface ModeInfo {
9
+ mode: DaemonMode;
10
+ owner: string | null;
11
+ version: string;
12
+ }
13
+
14
+ export function handleModeRequest(
7
15
  req: IncomingMessage,
8
16
  res: ServerResponse,
17
+ info: () => ModeInfo,
9
18
  ): boolean {
10
19
  const path = (req.url ?? '').split('?')[0] ?? '';
11
20
  if (path !== PATH) return false;
@@ -17,11 +26,6 @@ export function handleSessionApiRequest(
17
26
  sendJson(req, res, 405, { error: 'method not allowed' });
18
27
  return true;
19
28
  }
20
- const session = apiSession(req);
21
- if (!session) {
22
- sendJson(req, res, 401, { error: 'unauthorized' });
23
- return true;
24
- }
25
- sendJson(req, res, 200, { email: session.email });
29
+ sendJson(req, res, 200, info());
26
30
  return true;
27
31
  }
@@ -0,0 +1,25 @@
1
+ const PREVIEW = /^([a-z0-9-]+--)?metro-ui\.netlify\.app$/;
2
+
3
+ export function allowedWebHost(host: string): boolean {
4
+ if (host === 'metro.box' || host === 'localhost' || host === '127.0.0.1')
5
+ return true;
6
+ return PREVIEW.test(host);
7
+ }
8
+
9
+ export const APP_RETURN = 'metro://auth';
10
+
11
+ export const isAppReturn = (returnTo: string): boolean => returnTo === APP_RETURN;
12
+
13
+ export function validateReturnTo(returnTo: string): boolean {
14
+ let url: URL;
15
+ try {
16
+ url = new URL(returnTo);
17
+ } catch {
18
+ return false;
19
+ }
20
+ const host = url.hostname;
21
+ if (url.protocol === 'http:' && (host === 'localhost' || host === '127.0.0.1'))
22
+ return true;
23
+ if (url.protocol !== 'https:') return false;
24
+ return allowedWebHost(host);
25
+ }
@@ -0,0 +1,90 @@
1
+ const enc = new TextEncoder();
2
+
3
+ const hex = (bytes: Uint8Array): string =>
4
+ [...bytes].map((b) => b.toString(16).padStart(2, '0')).join('');
5
+
6
+ export async function sha256Hex(data: string | Uint8Array<ArrayBuffer>): Promise<string> {
7
+ const bytes = typeof data === 'string' ? enc.encode(data) : data;
8
+ return hex(new Uint8Array(await crypto.subtle.digest('SHA-256', bytes)));
9
+ }
10
+
11
+ async function hmac(key: Uint8Array<ArrayBuffer>, data: string): Promise<Uint8Array<ArrayBuffer>> {
12
+ const cryptoKey = await crypto.subtle.importKey('raw', key, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
13
+ return new Uint8Array(await crypto.subtle.sign('HMAC', cryptoKey, enc.encode(data)));
14
+ }
15
+
16
+ const encodeRfc3986 = (value: string): string =>
17
+ encodeURIComponent(value).replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
18
+
19
+ const byPair = (a: [string, string], b: [string, string]): number =>
20
+ a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0;
21
+
22
+ function canonicalQuery(url: URL): string {
23
+ const pairs: [string, string][] = [];
24
+ url.searchParams.forEach((value, key) => {
25
+ pairs.push([encodeRfc3986(key), encodeRfc3986(value)]);
26
+ });
27
+ return pairs.sort(byPair).map(([k, v]) => `${k}=${v}`).join('&');
28
+ }
29
+
30
+ export const amzDate = (date: Date): string =>
31
+ date.toISOString().replace(/[-:]/g, '').replace(/\.\d{3}Z$/, 'Z');
32
+
33
+ export interface SignInput {
34
+ method: string;
35
+ url: string;
36
+ headers: Record<string, string>;
37
+ body: string;
38
+ region: string;
39
+ service: string;
40
+ accessKeyId: string;
41
+ secretAccessKey: string;
42
+ sessionToken?: string;
43
+ date?: Date;
44
+ }
45
+
46
+ export interface Signed {
47
+ headers: Record<string, string>;
48
+ canonicalRequest: string;
49
+ stringToSign: string;
50
+ signature: string;
51
+ }
52
+
53
+ function canonicalHeaders(input: SignInput, url: URL, date: string): Record<string, string> {
54
+ const out: Record<string, string> = {};
55
+ for (const [key, value] of Object.entries(input.headers)) out[key.toLowerCase()] = value.trim().replace(/\s+/g, ' ');
56
+ out.host = url.host;
57
+ out['x-amz-date'] = date;
58
+ if (input.sessionToken !== undefined) out['x-amz-security-token'] = input.sessionToken;
59
+ return out;
60
+ }
61
+
62
+ async function signingKey(input: SignInput, day: string): Promise<Uint8Array<ArrayBuffer>> {
63
+ const kDate = await hmac(enc.encode(`AWS4${input.secretAccessKey}`), day);
64
+ const kRegion = await hmac(kDate, input.region);
65
+ const kService = await hmac(kRegion, input.service);
66
+ return hmac(kService, 'aws4_request');
67
+ }
68
+
69
+ export async function signV4(input: SignInput): Promise<Signed> {
70
+ const url = new URL(input.url);
71
+ const date = amzDate(input.date ?? new Date());
72
+ const day = date.slice(0, 8);
73
+ const headers = canonicalHeaders(input, url, date);
74
+ const names = Object.keys(headers).sort();
75
+ const signedHeaders = names.join(';');
76
+ const canonicalRequest = [
77
+ input.method.toUpperCase(),
78
+ url.pathname === '' ? '/' : url.pathname,
79
+ canonicalQuery(url),
80
+ names.map((name) => `${name}:${headers[name] ?? ''}\n`).join(''),
81
+ signedHeaders,
82
+ await sha256Hex(input.body),
83
+ ].join('\n');
84
+ const scope = `${day}/${input.region}/${input.service}/aws4_request`;
85
+ const stringToSign = ['AWS4-HMAC-SHA256', date, scope, await sha256Hex(canonicalRequest)].join('\n');
86
+ const signature = hex(await hmac(await signingKey(input, day), stringToSign));
87
+ const authorization = `AWS4-HMAC-SHA256 Credential=${input.accessKeyId}/${scope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
88
+ const sendable = Object.fromEntries(Object.entries(headers).filter(([name]) => name !== 'host'));
89
+ return { headers: { ...sendable, authorization }, canonicalRequest, stringToSign, signature };
90
+ }
@@ -0,0 +1,44 @@
1
+ import { createCipheriv, createDecipheriv, createPublicKey, diffieHellman, generateKeyPairSync, hkdfSync, randomBytes, type KeyObject } from 'node:crypto';
2
+ import { rawPublicKey, sealingKeyOf } from './agent-signature.js';
3
+ import { deliveryBytes, deliveryRecord } from './connector-delivery-validation.js';
4
+
5
+ export interface SealedTransfer {
6
+ version: 1;
7
+ ephemeralKey: string;
8
+ iv: string;
9
+ tag: string;
10
+ ciphertext: string;
11
+ }
12
+
13
+ function cipherKey(privateKey: KeyObject, publicKey: KeyObject, context: Buffer, ephemeral: string, recipient: string): Buffer {
14
+ const shared = diffieHellman({ privateKey, publicKey });
15
+ if (!shared.some((byte) => byte !== 0)) throw new Error('Invalid connector transfer key.');
16
+ return Buffer.from(hkdfSync('sha256', shared, Buffer.concat([deliveryBytes(ephemeral, 32), deliveryBytes(recipient, 32)]), context, 32));
17
+ }
18
+
19
+ export function sealTransfer(publicKey: string, aad: Buffer, bytes: Buffer): SealedTransfer {
20
+ const recipient = sealingKeyOf(publicKey);
21
+ if (recipient === null) throw new Error('Invalid connector transfer key.');
22
+ const pair = generateKeyPairSync('x25519');
23
+ const ephemeralKey = rawPublicKey(pair.publicKey);
24
+ const iv = randomBytes(12);
25
+ const cipher = createCipheriv('aes-256-gcm', cipherKey(pair.privateKey, recipient, aad, ephemeralKey, publicKey), iv);
26
+ cipher.setAAD(aad);
27
+ const ciphertext = Buffer.concat([cipher.update(bytes), cipher.final()]).toString('base64url');
28
+ return { version: 1, ephemeralKey, iv: iv.toString('base64url'), tag: cipher.getAuthTag().toString('base64url'), ciphertext };
29
+ }
30
+
31
+ export function openTransfer(privateKey: KeyObject, aad: Buffer, envelope: unknown, maxBytes: number): Buffer {
32
+ if (privateKey.type !== 'private' || privateKey.asymmetricKeyType !== 'x25519') throw new Error('Invalid connector transfer key.');
33
+ const value = deliveryRecord(envelope, ['version', 'ephemeralKey', 'iv', 'tag', 'ciphertext']);
34
+ if (value.version !== 1 || typeof value.ephemeralKey !== 'string') throw new Error('Invalid connector transfer envelope.');
35
+ const ephemeral = sealingKeyOf(value.ephemeralKey);
36
+ if (ephemeral === null) throw new Error('Invalid connector transfer key.');
37
+ const ciphertext = deliveryBytes(value.ciphertext);
38
+ if (ciphertext.length > maxBytes) throw new Error('Connector transfer is too large.');
39
+ const key = cipherKey(privateKey, ephemeral, aad, value.ephemeralKey, rawPublicKey(createPublicKey(privateKey)));
40
+ const decipher = createDecipheriv('aes-256-gcm', key, deliveryBytes(value.iv, 12));
41
+ decipher.setAAD(aad);
42
+ decipher.setAuthTag(deliveryBytes(value.tag, 16));
43
+ return Buffer.concat([decipher.update(ciphertext), decipher.final()]);
44
+ }