@stage-labs/metro 0.1.0-beta.31 → 0.1.0-beta.310

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 (617) hide show
  1. package/dist/agent.js +123 -0
  2. package/dist/api.js +9 -129
  3. package/dist/automation.js +56 -0
  4. package/dist/child.js +33 -0
  5. package/dist/claude-env.js +104 -0
  6. package/dist/claude-settings.js +40 -0
  7. package/dist/cli.js +62 -136
  8. package/dist/control.js +19 -103
  9. package/dist/hold.js +210 -0
  10. package/dist/local.js +43 -0
  11. package/dist/lock.js +62 -0
  12. package/dist/memory.js +206 -0
  13. package/dist/node-name.js +71 -0
  14. package/dist/provider-flags.js +9 -0
  15. package/dist/root-release-io.js +160 -0
  16. package/dist/root-release.js +74 -0
  17. package/dist/route.js +65 -0
  18. package/dist/runtime-install.js +106 -0
  19. package/dist/runtime.js +29 -52
  20. package/dist/serve.js +157 -0
  21. package/dist/service.js +328 -0
  22. package/dist/tail.js +10 -11
  23. package/dist/update.js +13 -1
  24. package/hooks/guard.mjs +77 -0
  25. package/hooks/policy.mjs +74 -0
  26. package/hooks/session-start.mjs +31 -0
  27. package/package.json +6 -25
  28. package/runtime/node_modules/@metro-labs/core/package.json +58 -0
  29. package/runtime/node_modules/@metro-labs/core/src/automation-files.ts +216 -0
  30. package/runtime/node_modules/@metro-labs/core/src/automation-store.ts +171 -0
  31. package/runtime/node_modules/@metro-labs/core/src/automation-types.ts +141 -0
  32. package/runtime/node_modules/@metro-labs/core/src/call.ts +81 -0
  33. package/runtime/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  34. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/events.ts +54 -6
  35. package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/ids.ts +10 -1
  36. package/runtime/node_modules/@metro-labs/core/src/is-record.ts +2 -0
  37. package/runtime/node_modules/@metro-labs/{mcp/src/stations → core/src}/lines.ts +22 -26
  38. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/protocol.ts +7 -4
  39. package/runtime/node_modules/@metro-labs/core/src/runner-activity.ts +270 -0
  40. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/secure-fs.ts +17 -0
  41. package/runtime/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
  42. package/runtime/node_modules/@metro-labs/core/src/station-names.ts +14 -0
  43. package/runtime/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
  44. package/runtime/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
  45. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/attachments.ts +9 -3
  46. package/runtime/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
  47. package/runtime/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
  48. package/runtime/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
  49. package/runtime/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
  50. package/runtime/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
  51. package/runtime/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
  52. package/runtime/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
  53. package/runtime/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
  54. package/runtime/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
  55. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/station-runtime.ts +6 -11
  56. package/runtime/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
  57. package/runtime/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
  58. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/types.ts +20 -1
  59. package/runtime/node_modules/@metro-labs/core/src/tickets.ts +44 -0
  60. package/runtime/node_modules/@metro-labs/core/src/version.ts +2 -0
  61. package/runtime/node_modules/@metro-labs/daemon/package.json +51 -0
  62. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/agent-fs.ts +246 -0
  63. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/crontab.ts +44 -0
  64. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files-api.ts +12 -0
  65. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files.ts +89 -0
  66. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/home-fs.ts +86 -0
  67. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/job-env.ts +39 -0
  68. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/metro-home.ts +42 -0
  69. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/provision.ts +57 -0
  70. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedule-detail.ts +93 -0
  71. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules-api.ts +27 -0
  72. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules.ts +144 -0
  73. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/unit-files.ts +43 -0
  74. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/user.ts +110 -0
  75. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/view.ts +90 -0
  76. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-attach.ts +19 -0
  77. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-lookups.ts +55 -0
  78. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-routes.ts +76 -0
  79. package/runtime/node_modules/@metro-labs/daemon/src/agents/accounts-api.ts +362 -0
  80. package/runtime/node_modules/@metro-labs/daemon/src/agents/admin.ts +30 -0
  81. package/runtime/node_modules/@metro-labs/daemon/src/agents/allowlist.ts +59 -0
  82. package/runtime/node_modules/@metro-labs/daemon/src/agents/api.ts +131 -0
  83. package/runtime/node_modules/@metro-labs/daemon/src/agents/bundle.ts +124 -0
  84. package/runtime/node_modules/@metro-labs/daemon/src/agents/file-admin.ts +317 -0
  85. package/runtime/node_modules/@metro-labs/daemon/src/agents/files.ts +142 -0
  86. package/runtime/node_modules/@metro-labs/{mcp/src/db/key-map.ts → daemon/src/agents/keys.ts} +1 -11
  87. package/runtime/node_modules/@metro-labs/daemon/src/agents/map.ts +135 -0
  88. package/runtime/node_modules/@metro-labs/daemon/src/agents/policy-route.ts +27 -0
  89. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-scope.ts → daemon/src/agents/scope.ts} +2 -2
  90. package/runtime/node_modules/@metro-labs/daemon/src/agents/sender-cards.ts +94 -0
  91. package/runtime/node_modules/@metro-labs/daemon/src/agents/senders.ts +38 -0
  92. package/runtime/node_modules/@metro-labs/daemon/src/approvals/api.ts +55 -0
  93. package/runtime/node_modules/@metro-labs/daemon/src/approvals/owner-line.ts +45 -0
  94. package/runtime/node_modules/@metro-labs/daemon/src/approvals/pending.ts +190 -0
  95. package/runtime/node_modules/@metro-labs/daemon/src/approvals/preview.ts +66 -0
  96. package/runtime/node_modules/@metro-labs/daemon/src/boot/boot.ts +264 -0
  97. package/runtime/node_modules/@metro-labs/daemon/src/boot/connect-hint.ts +36 -0
  98. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/crash-guard.ts +1 -1
  99. package/runtime/node_modules/@metro-labs/daemon/src/boot/local-owner.ts +21 -0
  100. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/paths.ts +8 -36
  101. package/runtime/node_modules/@metro-labs/daemon/src/channels/addressed.ts +26 -0
  102. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/inbound.ts +99 -73
  103. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/media-note.ts +11 -7
  104. package/runtime/node_modules/@metro-labs/daemon/src/channels/notice.ts +22 -0
  105. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/pending.ts +13 -1
  106. package/runtime/node_modules/@metro-labs/daemon/src/channels/react-note.ts +13 -0
  107. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +6 -2
  108. package/runtime/node_modules/@metro-labs/daemon/src/claude/api.ts +304 -0
  109. package/runtime/node_modules/@metro-labs/daemon/src/claude/cli-files.ts +28 -0
  110. package/runtime/node_modules/@metro-labs/daemon/src/claude/files.ts +359 -0
  111. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-api.ts +12 -0
  112. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-fetch.ts +160 -0
  113. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-skills.ts +255 -0
  114. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-validate.ts +53 -0
  115. package/runtime/node_modules/@metro-labs/daemon/src/claude/hooks.ts +60 -0
  116. package/runtime/node_modules/@metro-labs/daemon/src/claude/login.ts +243 -0
  117. package/runtime/node_modules/@metro-labs/daemon/src/claude/memory-routine.ts +123 -0
  118. package/runtime/node_modules/@metro-labs/daemon/src/claude/memory.ts +32 -0
  119. package/runtime/node_modules/@metro-labs/daemon/src/claude/onboarding.ts +38 -0
  120. package/runtime/node_modules/@metro-labs/daemon/src/claude/runner-activity.ts +17 -0
  121. package/runtime/node_modules/@metro-labs/daemon/src/claude/runner-process.ts +52 -0
  122. package/runtime/node_modules/@metro-labs/daemon/src/claude/session-files.ts +75 -0
  123. package/runtime/node_modules/@metro-labs/daemon/src/claude/session.ts +303 -0
  124. package/runtime/node_modules/@metro-labs/daemon/src/claude/settings.ts +109 -0
  125. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup-api.ts +114 -0
  126. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup-state.ts +18 -0
  127. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup.ts +323 -0
  128. package/runtime/node_modules/@metro-labs/daemon/src/claude/skills.ts +123 -0
  129. package/runtime/node_modules/@metro-labs/daemon/src/claude/usage-probe.ts +128 -0
  130. package/runtime/node_modules/@metro-labs/daemon/src/connectors/agent-key.ts +145 -0
  131. package/runtime/node_modules/@metro-labs/daemon/src/connectors/enroll-api.ts +99 -0
  132. package/runtime/node_modules/@metro-labs/daemon/src/connectors/leftovers.ts +59 -0
  133. package/runtime/node_modules/@metro-labs/daemon/src/connectors/metro-api.ts +93 -0
  134. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-grant.ts +4 -4
  135. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-owner.ts +3 -3
  136. package/runtime/node_modules/@metro-labs/daemon/src/files/attach-reaper.ts +174 -0
  137. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-serve.ts +11 -17
  138. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-api.ts +10 -27
  139. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-store.ts +4 -4
  140. package/runtime/node_modules/@metro-labs/daemon/src/gateway/bedrock.ts +228 -0
  141. package/runtime/node_modules/@metro-labs/daemon/src/gateway/claude-logins.ts +192 -0
  142. package/runtime/node_modules/@metro-labs/daemon/src/gateway/claude-store.ts +59 -0
  143. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-stream.ts +179 -0
  144. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-translate.ts +209 -0
  145. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-version.ts +44 -0
  146. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex.ts +121 -0
  147. package/runtime/node_modules/@metro-labs/daemon/src/gateway/delivered.ts +82 -0
  148. package/runtime/node_modules/@metro-labs/daemon/src/gateway/effective.ts +43 -0
  149. package/runtime/node_modules/@metro-labs/daemon/src/gateway/effort.ts +103 -0
  150. package/runtime/node_modules/@metro-labs/daemon/src/gateway/eventstream.ts +123 -0
  151. package/runtime/node_modules/@metro-labs/daemon/src/gateway/fallback.ts +146 -0
  152. package/runtime/node_modules/@metro-labs/daemon/src/gateway/forward.ts +284 -0
  153. package/runtime/node_modules/@metro-labs/daemon/src/gateway/frames.ts +118 -0
  154. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gateway.ts +356 -0
  155. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-api.ts +125 -0
  156. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-config.ts +159 -0
  157. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-leftovers.ts +42 -0
  158. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-lists.ts +40 -0
  159. package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter.ts +25 -0
  160. package/runtime/node_modules/@metro-labs/daemon/src/gateway/org-models.ts +203 -0
  161. package/runtime/node_modules/@metro-labs/daemon/src/gateway/provider-models.ts +77 -0
  162. package/runtime/node_modules/@metro-labs/daemon/src/gateway/served.ts +18 -0
  163. package/runtime/node_modules/@metro-labs/daemon/src/gateway/subscription.ts +120 -0
  164. package/runtime/node_modules/@metro-labs/daemon/src/gateway/text.ts +33 -0
  165. package/runtime/node_modules/@metro-labs/daemon/src/gateway/tool-search.ts +126 -0
  166. package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage-refresh.ts +95 -0
  167. package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage.ts +330 -0
  168. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/accounts.ts +38 -18
  169. package/runtime/node_modules/@metro-labs/daemon/src/mcp/attachment-schema.ts +91 -0
  170. package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-bridge.ts +45 -0
  171. package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-permission.ts +25 -0
  172. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/call-tools.ts +88 -38
  173. package/runtime/node_modules/@metro-labs/daemon/src/mcp/channel-tool.ts +80 -0
  174. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
  175. package/runtime/node_modules/@metro-labs/daemon/src/mcp/diagnostics.ts +102 -0
  176. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +24 -18
  177. package/runtime/node_modules/@metro-labs/daemon/src/mcp/frame-schema.ts +44 -0
  178. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/group-tools.ts +2 -2
  179. package/runtime/node_modules/@metro-labs/daemon/src/mcp/index.ts +167 -0
  180. package/runtime/node_modules/@metro-labs/daemon/src/mcp/instructions.ts +21 -0
  181. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/member-tools.ts +2 -2
  182. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-prompt.ts +115 -0
  183. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-relay.ts +111 -0
  184. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-gate.ts +88 -0
  185. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-snapshot.ts +65 -0
  186. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-lookup.ts +60 -0
  187. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-tool.ts +96 -0
  188. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/raw-get-stream.ts +54 -16
  189. package/runtime/node_modules/@metro-labs/daemon/src/mcp/read-tool.ts +87 -0
  190. package/runtime/node_modules/@metro-labs/daemon/src/mcp/request-identity.ts +48 -0
  191. package/runtime/node_modules/@metro-labs/daemon/src/mcp/server-approvals.ts +108 -0
  192. package/runtime/node_modules/@metro-labs/daemon/src/mcp/session-slot.ts +137 -0
  193. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session.ts +103 -52
  194. package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-schema.ts +11 -0
  195. package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-send.ts +15 -0
  196. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-catalog.ts +108 -0
  197. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-def.ts +9 -0
  198. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-dispatch.ts +74 -48
  199. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +87 -114
  200. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +6 -11
  201. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/announced.ts +68 -0
  202. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/config.ts +29 -0
  203. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/connector-tools.ts +114 -0
  204. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/link.ts +197 -0
  205. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/rpc.ts +67 -0
  206. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/token.ts +50 -0
  207. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/helper-script.ts +183 -0
  208. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/imds.ts +16 -0
  209. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/install.ts +78 -0
  210. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/privilege.ts +50 -0
  211. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/root-follow.ts +16 -0
  212. package/runtime/node_modules/@metro-labs/daemon/src/monitor/api.ts +132 -0
  213. package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-event.ts +139 -0
  214. package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-events.ts +101 -0
  215. package/runtime/node_modules/@metro-labs/daemon/src/net/tunnel.ts +323 -0
  216. package/runtime/node_modules/@metro-labs/daemon/src/policy/policy.ts +120 -0
  217. package/runtime/node_modules/@metro-labs/daemon/src/routes/bearer.ts +35 -0
  218. package/runtime/node_modules/@metro-labs/daemon/src/routes/body.ts +24 -0
  219. package/runtime/node_modules/@metro-labs/daemon/src/routes/gmail-attach.ts +67 -0
  220. package/runtime/node_modules/@metro-labs/daemon/src/routes/gmail-detach.ts +37 -0
  221. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +63 -54
  222. package/runtime/node_modules/@metro-labs/daemon/src/routes/local-mode.ts +149 -0
  223. package/runtime/node_modules/@metro-labs/daemon/src/routes/session-apis.ts +65 -0
  224. package/runtime/node_modules/@metro-labs/daemon/src/routes/session.ts +29 -0
  225. package/runtime/node_modules/@metro-labs/daemon/src/routes/threema-callback.ts +103 -0
  226. package/runtime/node_modules/@metro-labs/daemon/src/server/cloudwatch.ts +178 -0
  227. package/runtime/node_modules/@metro-labs/daemon/src/server/control.ts +39 -0
  228. package/runtime/node_modules/@metro-labs/daemon/src/server/machine.ts +58 -0
  229. package/runtime/node_modules/@metro-labs/daemon/src/server/owner.ts +26 -0
  230. package/runtime/node_modules/@metro-labs/daemon/src/server/update.ts +90 -0
  231. package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
  232. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-browser.ts +107 -0
  233. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-driver.ts +42 -0
  234. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-gmail.ts +78 -0
  235. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-inline.ts +29 -1
  236. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-interactive.ts +5 -31
  237. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-resolve.ts +84 -13
  238. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/attach-session.ts +61 -25
  239. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-xmtp.ts +8 -9
  240. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach.ts +69 -3
  241. package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/stations}/materialize.ts +53 -175
  242. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/registry.ts +20 -2
  243. package/runtime/node_modules/@metro-labs/daemon/src/stations/runtime-deps.ts +135 -0
  244. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor-io.ts +3 -3
  245. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor.ts +6 -9
  246. package/runtime/node_modules/@metro-labs/daemon/src/stations/threema-callbacks.ts +32 -0
  247. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/train-call.ts +1 -1
  248. package/runtime/node_modules/@metro-labs/daemon/src/stations/webhook-endpoints.ts +51 -0
  249. package/runtime/node_modules/@metro-labs/daemon/src/terminal/api.ts +84 -0
  250. package/runtime/node_modules/@metro-labs/daemon/src/terminal/socket.ts +124 -0
  251. package/runtime/node_modules/@metro-labs/daemon/src/terminal/tickets.ts +15 -0
  252. package/runtime/node_modules/@metro-labs/daemon/src/vault/api.ts +45 -0
  253. package/runtime/node_modules/@metro-labs/daemon/src/vault/config.ts +51 -0
  254. package/runtime/node_modules/@metro-labs/daemon/src/vault/firewall.ts +9 -0
  255. package/runtime/node_modules/@metro-labs/daemon/src/vault/index.ts +96 -0
  256. package/runtime/node_modules/@metro-labs/daemon/src/vault/install.ts +56 -0
  257. package/runtime/node_modules/@metro-labs/daemon/src/vault/paths.ts +26 -0
  258. package/runtime/node_modules/@metro-labs/daemon/src/vault/proxy.ts +147 -0
  259. package/runtime/node_modules/@metro-labs/daemon/src/vault/store.ts +129 -0
  260. package/runtime/node_modules/@metro-labs/daemon/src/vault/trust.ts +44 -0
  261. package/runtime/node_modules/@metro-labs/daemon/src/voice/api.ts +14 -0
  262. package/runtime/node_modules/@metro-labs/daemon/src/voice/audio.ts +193 -0
  263. package/runtime/node_modules/@metro-labs/daemon/src/voice/call.ts +191 -0
  264. package/runtime/node_modules/@metro-labs/daemon/src/voice/calls.ts +153 -0
  265. package/runtime/node_modules/@metro-labs/daemon/src/voice/peer.ts +85 -0
  266. package/runtime/node_modules/@metro-labs/daemon/src/voice/scribe.ts +115 -0
  267. package/runtime/node_modules/@metro-labs/daemon/src/voice/shared-talk.ts +85 -0
  268. package/runtime/node_modules/@metro-labs/daemon/src/voice/shared.ts +198 -0
  269. package/runtime/node_modules/@metro-labs/daemon/src/voice/speech-queue.ts +200 -0
  270. package/runtime/node_modules/@metro-labs/daemon/src/voice/speech.ts +125 -0
  271. package/runtime/node_modules/@metro-labs/daemon/src/voice/store.ts +103 -0
  272. package/runtime/node_modules/@metro-labs/discord-bot/package.json +3 -5
  273. package/runtime/node_modules/@metro-labs/discord-bot/src/accounts.ts +3 -23
  274. package/runtime/node_modules/@metro-labs/discord-bot/src/actions.ts +21 -187
  275. package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +2 -2
  276. package/runtime/node_modules/@metro-labs/discord-bot/src/channel-source.ts +79 -0
  277. package/runtime/node_modules/@metro-labs/discord-bot/src/channels.ts +186 -0
  278. package/runtime/node_modules/@metro-labs/discord-bot/src/format.ts +26 -67
  279. package/runtime/node_modules/@metro-labs/discord-bot/src/group-actions.ts +1 -1
  280. package/runtime/node_modules/@metro-labs/discord-bot/src/group.ts +2 -2
  281. package/runtime/node_modules/@metro-labs/discord-bot/src/index.ts +8 -14
  282. package/runtime/node_modules/@metro-labs/discord-bot/src/members.ts +2 -2
  283. package/runtime/node_modules/@metro-labs/discord-bot/src/profile.ts +68 -0
  284. package/runtime/node_modules/@metro-labs/discord-bot/src/send-files.ts +12 -13
  285. package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +6 -1
  286. package/runtime/node_modules/@metro-labs/gmail/package.json +27 -0
  287. package/runtime/node_modules/@metro-labs/gmail/src/accounts.ts +133 -0
  288. package/runtime/node_modules/@metro-labs/gmail/src/actions.ts +20 -0
  289. package/runtime/node_modules/@metro-labs/gmail/src/api.ts +34 -0
  290. package/runtime/node_modules/@metro-labs/gmail/src/attachments.ts +38 -0
  291. package/runtime/node_modules/@metro-labs/gmail/src/auth.ts +115 -0
  292. package/runtime/node_modules/@metro-labs/gmail/src/channels.ts +66 -0
  293. package/runtime/node_modules/@metro-labs/gmail/src/config.ts +15 -0
  294. package/runtime/node_modules/@metro-labs/gmail/src/inbound.ts +97 -0
  295. package/runtime/node_modules/@metro-labs/gmail/src/index.ts +12 -0
  296. package/runtime/node_modules/@metro-labs/gmail/src/login.ts +39 -0
  297. package/runtime/node_modules/@metro-labs/gmail/src/managed-binding.ts +33 -0
  298. package/runtime/node_modules/@metro-labs/gmail/src/managed.ts +45 -0
  299. package/runtime/node_modules/@metro-labs/gmail/src/message.ts +125 -0
  300. package/runtime/node_modules/@metro-labs/gmail/src/mime.ts +70 -0
  301. package/runtime/node_modules/@metro-labs/gmail/src/outbound.ts +125 -0
  302. package/runtime/node_modules/@metro-labs/gmail/src/query.ts +101 -0
  303. package/runtime/node_modules/@metro-labs/gmail/src/state.ts +30 -0
  304. package/runtime/node_modules/@metro-labs/gmail/src/station.ts +16 -0
  305. package/runtime/node_modules/@metro-labs/gmail/src/trust.ts +42 -0
  306. package/runtime/node_modules/@metro-labs/http/package.json +44 -0
  307. package/runtime/node_modules/@metro-labs/http/src/agent-signature.ts +95 -0
  308. package/runtime/node_modules/@metro-labs/http/src/api-http.ts +146 -0
  309. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-discovery.ts → http/src/connector-discovery.ts} +57 -27
  310. package/runtime/node_modules/@metro-labs/http/src/connector-grant.ts +8 -0
  311. package/runtime/node_modules/@metro-labs/http/src/connector-input.ts +73 -0
  312. package/runtime/node_modules/@metro-labs/http/src/connector-mcp.ts +108 -0
  313. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-client.ts → http/src/connector-oauth.ts} +48 -28
  314. package/runtime/node_modules/@metro-labs/http/src/connector-policy.ts +92 -0
  315. package/runtime/node_modules/@metro-labs/http/src/connector-public-url.ts +64 -0
  316. package/runtime/node_modules/@metro-labs/http/src/connector-reach.ts +27 -0
  317. package/runtime/node_modules/@metro-labs/http/src/connector-resource.ts +108 -0
  318. package/runtime/node_modules/@metro-labs/http/src/connector-tools.ts +95 -0
  319. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/connector-url.ts +8 -28
  320. package/runtime/node_modules/@metro-labs/http/src/ed25519.ts +56 -0
  321. package/runtime/node_modules/@metro-labs/http/src/mcp-server-protocol.ts +86 -0
  322. package/runtime/node_modules/@metro-labs/http/src/mcp-server-tools.ts +93 -0
  323. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-api.ts → http/src/mode-api.ts} +13 -9
  324. package/runtime/node_modules/@metro-labs/http/src/return-to.ts +25 -0
  325. package/runtime/node_modules/@metro-labs/http/src/sigv4.ts +90 -0
  326. package/runtime/node_modules/@metro-labs/http/src/workos-token.ts +149 -0
  327. package/runtime/node_modules/@metro-labs/outlook/package.json +25 -0
  328. package/runtime/node_modules/@metro-labs/outlook/src/accounts.ts +78 -0
  329. package/runtime/node_modules/@metro-labs/outlook/src/actions.ts +15 -0
  330. package/runtime/node_modules/@metro-labs/outlook/src/attachments.ts +81 -0
  331. package/runtime/node_modules/@metro-labs/outlook/src/auth.ts +120 -0
  332. package/runtime/node_modules/@metro-labs/outlook/src/browser.ts +42 -0
  333. package/runtime/node_modules/@metro-labs/outlook/src/channels.ts +60 -0
  334. package/runtime/node_modules/@metro-labs/outlook/src/config.ts +23 -0
  335. package/runtime/node_modules/@metro-labs/outlook/src/format.ts +59 -0
  336. package/runtime/node_modules/@metro-labs/outlook/src/graph.ts +55 -0
  337. package/runtime/node_modules/@metro-labs/outlook/src/inbound.ts +96 -0
  338. package/runtime/node_modules/@metro-labs/outlook/src/index.ts +12 -0
  339. package/runtime/node_modules/@metro-labs/outlook/src/login.ts +129 -0
  340. package/runtime/node_modules/@metro-labs/outlook/src/me.ts +31 -0
  341. package/runtime/node_modules/@metro-labs/outlook/src/outbound.ts +103 -0
  342. package/runtime/node_modules/@metro-labs/outlook/src/query.ts +84 -0
  343. package/runtime/node_modules/@metro-labs/outlook/src/state.ts +28 -0
  344. package/runtime/node_modules/@metro-labs/outlook/src/station.ts +16 -0
  345. package/runtime/node_modules/@metro-labs/outlook/src/trust.ts +41 -0
  346. package/runtime/node_modules/@metro-labs/telegram/package.json +2 -4
  347. package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +5 -24
  348. package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +27 -6
  349. package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +1 -1
  350. package/runtime/node_modules/@metro-labs/telegram/src/channels.ts +58 -0
  351. package/runtime/node_modules/@metro-labs/telegram/src/client.ts +4 -4
  352. package/runtime/node_modules/@metro-labs/telegram/src/format.ts +19 -34
  353. package/runtime/node_modules/@metro-labs/telegram/src/group.ts +3 -3
  354. package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +13 -34
  355. package/runtime/node_modules/@metro-labs/telegram/src/index.ts +4 -43
  356. package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +2 -3
  357. package/runtime/node_modules/@metro-labs/telegram/src/members.ts +1 -1
  358. package/runtime/node_modules/@metro-labs/telegram/src/profile.ts +70 -0
  359. package/runtime/node_modules/@metro-labs/telegram/src/reactions.ts +2 -2
  360. package/runtime/node_modules/@metro-labs/telegram/src/station.ts +5 -1
  361. package/runtime/node_modules/@metro-labs/telegram/src/types.ts +0 -1
  362. package/runtime/node_modules/@metro-labs/telegram-bot/package.json +2 -2
  363. package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +7 -41
  364. package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +24 -77
  365. package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +2 -2
  366. package/runtime/node_modules/@metro-labs/telegram-bot/src/channel-files.ts +3 -0
  367. package/runtime/node_modules/@metro-labs/telegram-bot/src/channels.ts +43 -0
  368. package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +46 -48
  369. package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +15 -44
  370. package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +6 -82
  371. package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +1 -1
  372. package/runtime/node_modules/@metro-labs/telegram-bot/src/observed-chats.ts +172 -0
  373. package/runtime/node_modules/@metro-labs/telegram-bot/src/profile.ts +85 -0
  374. package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +9 -1
  375. package/runtime/node_modules/@metro-labs/telegram-bot/src/types.ts +50 -15
  376. package/runtime/node_modules/@metro-labs/telegram-bot/src/updates.ts +26 -0
  377. package/runtime/node_modules/@metro-labs/threema/package.json +26 -0
  378. package/runtime/node_modules/@metro-labs/threema/src/accounts.ts +108 -0
  379. package/runtime/node_modules/@metro-labs/threema/src/actions.ts +130 -0
  380. package/runtime/node_modules/@metro-labs/threema/src/api.ts +152 -0
  381. package/runtime/node_modules/@metro-labs/threema/src/channels.ts +37 -0
  382. package/runtime/node_modules/@metro-labs/threema/src/chats.ts +88 -0
  383. package/runtime/node_modules/@metro-labs/threema/src/crypto.ts +100 -0
  384. package/runtime/node_modules/@metro-labs/threema/src/files.ts +47 -0
  385. package/runtime/node_modules/@metro-labs/threema/src/format.ts +164 -0
  386. package/runtime/node_modules/@metro-labs/threema/src/groups.ts +96 -0
  387. package/runtime/node_modules/@metro-labs/threema/src/ids.ts +21 -0
  388. package/runtime/node_modules/@metro-labs/threema/src/inbound.ts +92 -0
  389. package/runtime/node_modules/@metro-labs/threema/src/index.ts +24 -0
  390. package/runtime/node_modules/@metro-labs/threema/src/messages.ts +264 -0
  391. package/runtime/node_modules/@metro-labs/threema/src/outbound.ts +161 -0
  392. package/runtime/node_modules/@metro-labs/threema/src/station.ts +21 -0
  393. package/runtime/node_modules/@metro-labs/threema/src/verify.ts +117 -0
  394. package/runtime/node_modules/@metro-labs/webhook/package.json +2 -2
  395. package/runtime/node_modules/@metro-labs/webhook/src/station.ts +5 -8
  396. package/runtime/node_modules/@metro-labs/whatsapp/package.json +3 -6
  397. package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +6 -28
  398. package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +1 -1
  399. package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +97 -12
  400. package/runtime/node_modules/@metro-labs/whatsapp/src/app-state.ts +49 -0
  401. package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +2 -2
  402. package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +1 -1
  403. package/runtime/node_modules/@metro-labs/whatsapp/src/channel-chats.ts +137 -0
  404. package/runtime/node_modules/@metro-labs/whatsapp/src/channels.ts +48 -0
  405. package/runtime/node_modules/@metro-labs/whatsapp/src/client-history.ts +31 -0
  406. package/runtime/node_modules/@metro-labs/whatsapp/src/client-types.ts +48 -0
  407. package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +145 -63
  408. package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +7 -58
  409. package/runtime/node_modules/@metro-labs/whatsapp/src/history-events.ts +127 -0
  410. package/runtime/node_modules/@metro-labs/whatsapp/src/history-files.ts +39 -0
  411. package/runtime/node_modules/@metro-labs/whatsapp/src/history-identity.ts +58 -0
  412. package/runtime/node_modules/@metro-labs/whatsapp/src/history-message.ts +161 -0
  413. package/runtime/node_modules/@metro-labs/whatsapp/src/history-state.ts +344 -0
  414. package/runtime/node_modules/@metro-labs/whatsapp/src/history-types.ts +91 -0
  415. package/runtime/node_modules/@metro-labs/whatsapp/src/history.ts +195 -0
  416. package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +11 -28
  417. package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +4 -37
  418. package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +1 -1
  419. package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +1 -1
  420. package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +1 -1
  421. package/runtime/node_modules/@metro-labs/whatsapp/src/members.ts +94 -0
  422. package/runtime/node_modules/@metro-labs/whatsapp/src/messages.ts +70 -0
  423. package/runtime/node_modules/@metro-labs/whatsapp/src/names.ts +75 -0
  424. package/runtime/node_modules/@metro-labs/whatsapp/src/parse.ts +44 -0
  425. package/runtime/node_modules/@metro-labs/whatsapp/src/resolve.ts +52 -0
  426. package/runtime/node_modules/@metro-labs/whatsapp/src/send-expiry.ts +65 -0
  427. package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +24 -1
  428. package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +5 -9
  429. package/runtime/node_modules/@metro-labs/whatsapp/src/types.ts +0 -1
  430. package/runtime/node_modules/@metro-labs/xmtp/package.json +4 -3
  431. package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +10 -20
  432. package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +2 -2
  433. package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +55 -224
  434. package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +47 -53
  435. package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +114 -223
  436. package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +58 -15
  437. package/runtime/node_modules/@metro-labs/xmtp/src/call-leftovers.ts +48 -0
  438. package/runtime/node_modules/@metro-labs/xmtp/src/channels.ts +56 -0
  439. package/runtime/node_modules/@metro-labs/xmtp/src/codecs.ts +114 -3
  440. package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +35 -20
  441. package/runtime/node_modules/@metro-labs/xmtp/src/delete-requests.ts +34 -0
  442. package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +38 -25
  443. package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +8 -18
  444. package/runtime/node_modules/@metro-labs/xmtp/src/frames.ts +190 -0
  445. package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +1 -1
  446. package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +2 -2
  447. package/runtime/node_modules/@metro-labs/xmtp/src/identity.ts +30 -16
  448. package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +18 -70
  449. package/runtime/node_modules/@metro-labs/xmtp/src/labels.ts +102 -50
  450. package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +1 -1
  451. package/runtime/node_modules/@metro-labs/xmtp/src/names.ts +61 -0
  452. package/runtime/node_modules/@metro-labs/xmtp/src/network.ts +114 -0
  453. package/runtime/node_modules/@metro-labs/xmtp/src/profile.ts +160 -0
  454. package/runtime/node_modules/@metro-labs/xmtp/src/read-attachments.ts +37 -0
  455. package/runtime/node_modules/@metro-labs/xmtp/src/resolve.ts +44 -0
  456. package/runtime/node_modules/@metro-labs/xmtp/src/sender.ts +112 -0
  457. package/runtime/node_modules/@metro-labs/xmtp/src/smart.ts +79 -0
  458. package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +10 -2
  459. package/runtime/node_modules/@metro-labs/xmtp/src/stream.ts +66 -0
  460. package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +22 -58
  461. package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +72 -49
  462. package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +4 -6
  463. package/runtime/node_modules/@metro-labs/xmtp/src/verify.ts +19 -5
  464. package/runtime/node_modules/@metro-labs/xmtp/src/wallet.ts +28 -0
  465. package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +14 -4
  466. package/runtime/patches/5bca2c07d5852d3f58453cff0448dd85da13d3665b61e3d758905b298d432d7c.patch +31 -0
  467. package/runtime/runtime.json +1 -1
  468. package/runtime/sdk-runner/node_modules/@metro-labs/core/package.json +58 -0
  469. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-files.ts +216 -0
  470. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-store.ts +171 -0
  471. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-types.ts +141 -0
  472. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/call.ts +81 -0
  473. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  474. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/events.ts +165 -0
  475. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/ids.ts +28 -0
  476. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/is-record.ts +2 -0
  477. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/lines.ts +78 -0
  478. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/log.ts +42 -0
  479. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/protocol.ts +227 -0
  480. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/runner-activity.ts +270 -0
  481. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/secure-fs.ts +74 -0
  482. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
  483. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/station-names.ts +14 -0
  484. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
  485. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
  486. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/attachments.ts +202 -0
  487. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
  488. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
  489. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
  490. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
  491. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
  492. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
  493. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
  494. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
  495. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
  496. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/station-runtime.ts +59 -0
  497. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
  498. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
  499. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/types.ts +126 -0
  500. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/str.ts +5 -0
  501. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/tickets.ts +44 -0
  502. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/train-error.ts +53 -0
  503. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/version.ts +2 -0
  504. package/runtime/sdk-runner/runner.json +10 -0
  505. package/runtime/sdk-runner/src/activity-tasks.ts +194 -0
  506. package/runtime/sdk-runner/src/activity.ts +391 -0
  507. package/runtime/sdk-runner/src/app.ts +87 -0
  508. package/runtime/sdk-runner/src/approvals.ts +37 -0
  509. package/runtime/sdk-runner/src/automation-cli.ts +10 -0
  510. package/runtime/sdk-runner/src/automation-command.ts +151 -0
  511. package/runtime/sdk-runner/src/automation.ts +145 -0
  512. package/runtime/sdk-runner/src/calls.ts +133 -0
  513. package/runtime/sdk-runner/src/channel-text.ts +26 -0
  514. package/runtime/sdk-runner/src/config.ts +50 -0
  515. package/runtime/sdk-runner/src/errors.ts +142 -0
  516. package/runtime/sdk-runner/src/inbox.ts +168 -0
  517. package/runtime/sdk-runner/src/input-queue.ts +77 -0
  518. package/runtime/sdk-runner/src/input-timing.ts +68 -0
  519. package/runtime/sdk-runner/src/link.ts +154 -0
  520. package/runtime/sdk-runner/src/main.ts +57 -0
  521. package/runtime/sdk-runner/src/recovery.ts +46 -0
  522. package/runtime/sdk-runner/src/rules.ts +28 -0
  523. package/runtime/sdk-runner/src/runner.ts +358 -0
  524. package/runtime/sdk-runner/src/session-store.ts +129 -0
  525. package/runtime/sdk-runner/src/session-watch.ts +158 -0
  526. package/runtime/sdk-runner/src/singleton.ts +15 -0
  527. package/runtime/sdk-runner/src/skill-work.ts +76 -0
  528. package/runtime/sdk-runner/src/skills-files.ts +169 -0
  529. package/runtime/sdk-runner/src/skills.ts +150 -0
  530. package/runtime/sdk-runner/src/task-ledger.ts +229 -0
  531. package/runtime/sdk-runner/src/task-recovery.ts +203 -0
  532. package/runtime/sdk-runner/src/task-state.ts +71 -0
  533. package/runtime/sdk-runner/src/tool-proxy.ts +40 -0
  534. package/runtime/server.ts +1 -0
  535. package/runtime/stations.json +43 -0
  536. package/skills/MEMORY.md +78 -0
  537. package/skills/METRO.md +33 -0
  538. package/skills/STAGE.md +109 -0
  539. package/dist/bedrock-eventstream.js +0 -120
  540. package/dist/bedrock-proxy.js +0 -260
  541. package/dist/bedrock-upstream.js +0 -72
  542. package/dist/bedrock.js +0 -106
  543. package/dist/claude.js +0 -15
  544. package/dist/plugin.js +0 -82
  545. package/dist/prompt.js +0 -61
  546. package/dist/store.js +0 -93
  547. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-speak.ts +0 -195
  548. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-transcribe.ts +0 -292
  549. package/runtime/node_modules/@metro-labs/discord-bot/src/voice.ts +0 -197
  550. package/runtime/node_modules/@metro-labs/discord-bot/src/wire.ts +0 -5
  551. package/runtime/node_modules/@metro-labs/mcp/package.json +0 -66
  552. package/runtime/node_modules/@metro-labs/mcp/src/channels/dedupe.ts +0 -24
  553. package/runtime/node_modules/@metro-labs/mcp/src/daemon/account-api.ts +0 -311
  554. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-api.ts +0 -332
  555. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-connector-api.ts +0 -150
  556. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-pair.ts +0 -20
  557. package/runtime/node_modules/@metro-labs/mcp/src/daemon/api-http.ts +0 -152
  558. package/runtime/node_modules/@metro-labs/mcp/src/daemon/boot.ts +0 -330
  559. package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair-api.ts +0 -125
  560. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-api.ts +0 -313
  561. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-json.ts +0 -21
  562. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-oauth-routes.ts +0 -157
  563. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-oauth.ts +0 -127
  564. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-tools.ts +0 -100
  565. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-verify.ts +0 -333
  566. package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-auth.ts +0 -164
  567. package/runtime/node_modules/@metro-labs/mcp/src/daemon/google-oauth.ts +0 -208
  568. package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity.ts +0 -79
  569. package/runtime/node_modules/@metro-labs/mcp/src/daemon/oauth-pending.ts +0 -65
  570. package/runtime/node_modules/@metro-labs/mcp/src/daemon/pair-codes.ts +0 -58
  571. package/runtime/node_modules/@metro-labs/mcp/src/daemon/project-api.ts +0 -214
  572. package/runtime/node_modules/@metro-labs/mcp/src/daemon/relay.ts +0 -303
  573. package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-api.ts +0 -139
  574. package/runtime/node_modules/@metro-labs/mcp/src/daemon/runtime-source.ts +0 -105
  575. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session-apis.ts +0 -48
  576. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session.ts +0 -218
  577. package/runtime/node_modules/@metro-labs/mcp/src/daemon/tunnel.ts +0 -169
  578. package/runtime/node_modules/@metro-labs/mcp/src/db/account-attach.ts +0 -91
  579. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-admin.ts +0 -215
  580. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-connectors.ts +0 -143
  581. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-map.ts +0 -71
  582. package/runtime/node_modules/@metro-labs/mcp/src/db/client.ts +0 -37
  583. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-config.ts +0 -147
  584. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-relay.ts +0 -126
  585. package/runtime/node_modules/@metro-labs/mcp/src/db/connectors.ts +0 -308
  586. package/runtime/node_modules/@metro-labs/mcp/src/db/projects.ts +0 -300
  587. package/runtime/node_modules/@metro-labs/mcp/src/db/runtime-admin.ts +0 -24
  588. package/runtime/node_modules/@metro-labs/mcp/src/db/runtimes.ts +0 -105
  589. package/runtime/node_modules/@metro-labs/mcp/src/db/schema.ts +0 -117
  590. package/runtime/node_modules/@metro-labs/mcp/src/db/token-carry.ts +0 -45
  591. package/runtime/node_modules/@metro-labs/mcp/src/db/users.ts +0 -62
  592. package/runtime/node_modules/@metro-labs/mcp/src/db/whatsapp-login.ts +0 -18
  593. package/runtime/node_modules/@metro-labs/mcp/src/mcp/channel-owner.ts +0 -29
  594. package/runtime/node_modules/@metro-labs/mcp/src/mcp/frame-scope.ts +0 -21
  595. package/runtime/node_modules/@metro-labs/mcp/src/mcp/index.ts +0 -192
  596. package/runtime/node_modules/@metro-labs/mcp/src/mcp/permission-relay.ts +0 -66
  597. package/runtime/node_modules/@metro-labs/mcp/src/mcp/request-identity.ts +0 -73
  598. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-registry.ts +0 -172
  599. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-route.ts +0 -43
  600. package/runtime/node_modules/@metro-labs/mcp/src/monitor/api.ts +0 -240
  601. package/runtime/node_modules/@metro-labs/mcp/src/server.ts +0 -2
  602. package/runtime/node_modules/@metro-labs/mcp/src/stations/account-store.ts +0 -80
  603. package/runtime/node_modules/@metro-labs/mcp/src/stations/messaging-normalize.ts +0 -88
  604. package/runtime/node_modules/@metro-labs/telegram/src/normalize.ts +0 -22
  605. package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +0 -1
  606. package/runtime/node_modules/@metro-labs/telegram-bot/src/wire.ts +0 -3
  607. package/runtime/node_modules/@metro-labs/whatsapp/src/normalize.ts +0 -22
  608. package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +0 -5
  609. package/runtime/node_modules/@metro-labs/xmtp/src/actions-push.ts +0 -87
  610. package/runtime/node_modules/@metro-labs/xmtp/src/emit-core.ts +0 -55
  611. package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +0 -349
  612. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/log.ts +0 -0
  613. /package/runtime/node_modules/@metro-labs/{mcp/src/mcp → core/src}/str.ts +0 -0
  614. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/train-error.ts +0 -0
  615. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/webhook-note.ts +0 -0
  616. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-error.ts +0 -0
  617. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/cors.ts +0 -0
@@ -1,3 +1,8 @@
1
+ import type { ToolDef } from './tool-def.js';
2
+ import { attachmentItem, CREATE_UPLOAD_TOOL } from './attachment-schema.js';
3
+ import { frameSchema } from './frame-schema.js';
4
+ import { speechSchema } from './speech-schema.js';
5
+
1
6
  const lineProp = {
2
7
  type: 'string',
3
8
  description:
@@ -8,98 +13,10 @@ const msgIdProp = {
8
13
  description: 'The target message_id.',
9
14
  } as const;
10
15
 
11
- const attachmentItem = {
12
- type: 'object',
13
- description:
14
- 'A file to attach. Provide EXACTLY ONE source; naming two is an error and so is naming ' +
15
- 'none. Which one to use: `upload` for any real file on your own machine, including a ' +
16
- 'confidential one (call `create_upload` first, push the bytes over HTTP, then name the ' +
17
- 'id here); `data` ONLY for a tiny file, a few KB at most, because the base64 has to be ' +
18
- 'written out verbatim in this tool call and long base64 gets corrupted in the writing; ' +
19
- '`url` when the file is ALREADY published somewhere the daemon can fetch it; `path` ONLY ' +
20
- 'for a file that is already sitting on the daemon host, which is almost never your ' +
21
- 'machine.',
22
- properties: {
23
- upload: {
24
- type: 'string',
25
- description:
26
- 'The `upload_id` of a file already pushed to metro over HTTP (`create_upload` mints ' +
27
- 'the slot and the one-line command; the bytes never pass through this conversation). ' +
28
- 'THIS IS THE ROUTE FOR ANYTHING REAL: it takes files up to 64 MiB, works for a file on ' +
29
- 'your own machine, and publishes nothing. The upload belongs to your agent, expires ' +
30
- '30 minutes after it is created, and no other agent can name it.',
31
- },
32
- data: {
33
- type: 'string',
34
- description:
35
- 'Base64-encoded file bytes, inline in this call. ONLY FOR TINY FILES. The hard cap is ' +
36
- '8 MiB decoded, but the real ceiling is far lower and is not enforced by the daemon: ' +
37
- 'this base64 has to be emitted verbatim as part of the tool call, and past roughly ' +
38
- '10 KB (~13 KB of base64) it comes out corrupted, so the file arrives silently ' +
39
- 'damaged or fails to decode. Use `upload` instead for anything bigger. A ' +
40
- '`data:<mime>;base64,` prefix is accepted and supplies the mime when `mime` is ' +
41
- 'omitted. Stations impose their own, lower limits (xmtp refuses non-image files over ' +
42
- '~190 KiB).',
43
- },
44
- url: {
45
- type: 'string',
46
- description:
47
- 'http(s) URL fetched BY THE DAEMON, so it must already be publicly reachable from the ' +
48
- 'daemon host. Right when the file is already published; never for anything ' +
49
- 'confidential, because it has to be public for this to work at all. Use `upload` for ' +
50
- 'a confidential file.',
51
- },
52
- path: {
53
- type: 'string',
54
- description:
55
- 'Absolute path resolved ON THE DAEMON HOST, which is a different machine from yours. ' +
56
- 'A path on your own disk does NOT resolve here and is refused, however local it ' +
57
- 'looks. Use `upload` for a file on your machine.',
58
- },
59
- mime: {
60
- type: 'string',
61
- description: 'MIME type (guessed from the name/extension if omitted).',
62
- },
63
- name: {
64
- type: 'string',
65
- description:
66
- 'Filename to present (defaults to the basename, or to the name given at upload time).',
67
- },
68
- },
69
- } as const;
70
-
71
- const CREATE_UPLOAD_TOOL = {
72
- name: 'create_upload',
73
- description:
74
- 'Reserve a slot to push a file to metro over HTTP so you can attach it with `send`. Use ' +
75
- 'this for any file that actually matters: it is the only attachment route that carries a ' +
76
- 'file from YOUR machine without publishing it and without the bytes passing through this ' +
77
- 'conversation. Args: name? (the filename to present), mime?. Returns `upload_id`, a ' +
78
- 'single-use `upload_url` and a ready-to-run `curl` line. ONE STEP NEEDS A SHELL: run that ' +
79
- 'command (or any HTTP client) to push the bytes; there is no way to move a local file to ' +
80
- 'the daemon over MCP alone, because anything in an MCP call has to be written out by the ' +
81
- 'model first. If you have no shell, hand the single command to a subagent that does and ' +
82
- 'keep the `upload_id` -- the slot belongs to this metro agent, not to whoever runs the ' +
83
- 'command. Then: send({line, attachments:[{upload:"<upload_id>"}]}). Up to 64 MiB, expires ' +
84
- '30 minutes after it is created, and no other agent can reference it.',
85
- inputSchema: {
86
- type: 'object',
87
- properties: {
88
- name: {
89
- type: 'string',
90
- description: 'Filename to present to the recipient (e.g. `report.pdf`).',
91
- },
92
- mime: {
93
- type: 'string',
94
- description: 'MIME type (guessed from the name/extension if omitted).',
95
- },
96
- },
97
- },
98
- };
99
-
100
- export const COMMON_TOOLS = [
16
+ export const COMMON_TOOLS: ToolDef[] = [
101
17
  {
102
18
  name: 'reply',
19
+ group: 'write',
103
20
  description:
104
21
  'Reply to a specific message in a Metro conversation (text quotes the target). Args: ' +
105
22
  "line, message_id, text. The station is derived from the line. Returns the daemon's " +
@@ -116,15 +33,19 @@ export const COMMON_TOOLS = [
116
33
  },
117
34
  {
118
35
  name: 'send',
36
+ group: 'write',
119
37
  description:
120
38
  'Send a message (and/or media) to a Metro conversation. Args: line, text?, reply_to?, ' +
121
- 'attachments?. The station is derived from the line. Each attachment names EXACTLY ONE ' +
39
+ 'subject?, attachments?, frame?, wallet?, speech?. `speech` speaks text only in an authorized active call, never posts it in chat. The station is derived from the line. Outlook and Gmail: send to ' +
40
+ 'metro://<outlook|gmail>/<account>/<email address> to start a new email (subject defaults to the ' +
41
+ 'first line of text); the result names the new thread line. Each attachment names EXACTLY ONE ' +
122
42
  'source, and the choice matters: `upload` (an `upload_id` from `create_upload`, the ' +
123
43
  'route for any real file on your own machine, confidential or not, up to 64 MiB); ' +
124
44
  '`data` (base64 inline -- TINY FILES ONLY, a few KB, because the base64 has to be ' +
125
45
  'written out verbatim in the call and longer than that it corrupts); `url` (the daemon ' +
126
46
  'fetches it, so the file must already be public); `path` (resolved on the DAEMON host, ' +
127
- 'which is not your machine). At least one of text/attachments is required. ' +
47
+ 'which is not your machine). Stage (XMTP) only: `frame` posts an interactive view, `wallet` a payment ' +
48
+ 'or signature card. At least one of text/attachments/frame/wallet is required. ' +
128
49
  'The success line names each attachment the station actually delivered; a station that ' +
129
50
  'cannot carry a file errors instead of reporting success.',
130
51
  inputSchema: {
@@ -135,21 +56,45 @@ export const COMMON_TOOLS = [
135
56
  type: 'string',
136
57
  description: 'The message text (optional if sending only media).',
137
58
  },
59
+ speech: speechSchema,
138
60
  reply_to: {
139
61
  type: 'string',
140
62
  description: 'Optional message_id to quote/reply to.',
141
63
  },
64
+ subject: {
65
+ type: 'string',
66
+ description: 'Outlook and Gmail only: the subject of a new email.',
67
+ },
142
68
  attachments: {
143
69
  type: 'array',
144
70
  description: 'Optional files to attach.',
145
71
  items: attachmentItem,
146
72
  },
73
+ frame: frameSchema,
74
+ wallet: {
75
+ type: 'object',
76
+ description:
77
+ 'Stage (XMTP) only: a wallet card. `type` walletSendCalls is a payment request with a Pay button, ' +
78
+ 'transactionReference a payment receipt with an explorer link, signatureRequest a Sign button, ' +
79
+ 'signatureReference a signed proof. `content` is that type\'s JSON as Stage reads it; the stage skill ' +
80
+ 'has an example of each. Sending it moves nothing: the person taps Pay or Sign and confirms in Stage. ' +
81
+ "It is sent after the text and any frame, and the message_id returned is the card's.",
82
+ properties: {
83
+ type: {
84
+ type: 'string',
85
+ enum: ['walletSendCalls', 'transactionReference', 'signatureRequest', 'signatureReference'],
86
+ },
87
+ content: { type: 'object', description: 'The JSON of that content type.', additionalProperties: true },
88
+ },
89
+ required: ['type', 'content'],
90
+ },
147
91
  },
148
92
  required: ['line'],
149
93
  },
150
94
  },
151
95
  {
152
96
  name: 'react',
97
+ group: 'write',
153
98
  description:
154
99
  'Add an emoji reaction to a message. Args: line, message_id, emoji. The station is derived from the line.',
155
100
  inputSchema: {
@@ -162,8 +107,22 @@ export const COMMON_TOOLS = [
162
107
  required: ['line', 'message_id', 'emoji'],
163
108
  },
164
109
  },
110
+ {
111
+ name: 'typing',
112
+ group: 'write',
113
+ description:
114
+ 'Show "typing…" once in a chat while you prepare an answer. The network clears it by itself after its own time (about 5 s on the Telegram bot, 10 s on Discord, 25 s on WhatsApp) or when you send. Call it again to show it again. Args: line.',
115
+ inputSchema: {
116
+ type: 'object',
117
+ properties: {
118
+ line: lineProp,
119
+ },
120
+ required: ['line'],
121
+ },
122
+ },
165
123
  {
166
124
  name: 'unreact',
125
+ group: 'write',
167
126
  description:
168
127
  'Remove an emoji reaction from a message. Args: line, message_id, emoji. The station is derived from the line.',
169
128
  inputSchema: {
@@ -181,6 +140,7 @@ export const COMMON_TOOLS = [
181
140
  },
182
141
  {
183
142
  name: 'edit',
143
+ group: 'write',
184
144
  description:
185
145
  'Edit the text of a message you sent. Args: line, message_id, text. The station is ' +
186
146
  "derived from the line. Returns the daemon's reason if the station does not support edits.",
@@ -196,6 +156,8 @@ export const COMMON_TOOLS = [
196
156
  },
197
157
  {
198
158
  name: 'delete',
159
+ group: 'write',
160
+ destructive: true,
199
161
  description:
200
162
  'Delete a message you sent. Args: line, message_id. The station is derived from the line. ' +
201
163
  "Returns the daemon's reason if the station does not support deletes.",
@@ -207,14 +169,28 @@ export const COMMON_TOOLS = [
207
169
  },
208
170
  {
209
171
  name: 'read',
172
+ group: 'read',
210
173
  description:
211
- 'Read recent message history for a conversation. Args: line, limit?, before?, since?. The ' +
212
- 'station is derived from the line. Returns the raw history JSON (shapes differ per ' +
213
- "station), or the daemon's reason if the station does not support reads.",
174
+ 'Read message history. Args: line?, account?, limit?, before?, since?, until?, query?, ' +
175
+ 'from?, unread_only?, message_id?. Give a line to read one conversation, or an account ' +
176
+ '(from list_accounts) instead of a line to read across that whole account, where the ' +
177
+ 'station allows it. `message_id` returns that one message in full, with its files saved ' +
178
+ 'like inbound media (url and local_path). Each station applies the filters it supports; ' +
179
+ 'the answer lists any it did not apply in `ignored`, so check it. Returns the raw JSON ' +
180
+ "(shapes differ per station), or the daemon's reason if the station does not support " +
181
+ 'reads. Outlook: `query` is a Microsoft search over all mail (with `from` folded into it; ' +
182
+ 'line, since, until and unread_only then narrow what the search found), and without ' +
183
+ '`query` every filter is applied by Outlook itself, newest first. Gmail: `query` uses ' +
184
+ 'Gmail search syntax (from:, subject:, has:attachment, newer_than:7d...), and the other ' +
185
+ 'filters are added to it.',
214
186
  inputSchema: {
215
187
  type: 'object',
216
188
  properties: {
217
189
  line: lineProp,
190
+ account: {
191
+ type: 'string',
192
+ description: 'An account id from list_accounts, to read the whole account when you give no line.',
193
+ },
218
194
  limit: { type: 'number', description: 'Max messages to return.' },
219
195
  before: {
220
196
  type: 'string',
@@ -224,12 +200,20 @@ export const COMMON_TOOLS = [
224
200
  type: 'string',
225
201
  description: 'Return messages since this timestamp.',
226
202
  },
203
+ until: {
204
+ type: 'string',
205
+ description: 'Return messages before this timestamp.',
206
+ },
207
+ query: { type: 'string', description: 'Free text to search for.' },
208
+ from: { type: 'string', description: 'Only messages from this sender (an id or an address).' },
209
+ unread_only: { type: 'boolean', description: 'Only messages not read yet.' },
210
+ message_id: { type: 'string', description: 'Return this one message in full.' },
227
211
  },
228
- required: ['line'],
229
212
  },
230
213
  },
231
214
  {
232
215
  name: 'list_members',
216
+ group: 'read',
233
217
  description:
234
218
  'List the members of a Metro group/channel in a station-agnostic shape. Args: line, ' +
235
219
  'limit?. The station is derived from the line. Returns {line, station, memberCount, ' +
@@ -253,6 +237,7 @@ export const COMMON_TOOLS = [
253
237
  },
254
238
  {
255
239
  name: 'create_group',
240
+ group: 'write',
256
241
  description:
257
242
  'Create a new group/channel on a station and add members, in a station-agnostic shape. ' +
258
243
  'Args: station (required, xmtp|telegram|discord-bot|telegram-bot), name (required), members? ' +
@@ -292,6 +277,7 @@ export const COMMON_TOOLS = [
292
277
  },
293
278
  {
294
279
  name: 'add_members',
280
+ group: 'write',
295
281
  description:
296
282
  'Add members to an existing Metro group, in a station-agnostic shape. Args: line ' +
297
283
  '(required), members? (string[]; station-specific identifiers). xmtp also accepts ' +
@@ -324,6 +310,8 @@ export const COMMON_TOOLS = [
324
310
  },
325
311
  {
326
312
  name: 'remove_members',
313
+ group: 'write',
314
+ destructive: true,
327
315
  description:
328
316
  'Remove members from an existing Metro group, in a station-agnostic shape. Args: line ' +
329
317
  '(required), members? (string[]). xmtp also accepts addresses?/inboxIds? for backward ' +
@@ -354,6 +342,7 @@ export const COMMON_TOOLS = [
354
342
  },
355
343
  {
356
344
  name: 'export_invite',
345
+ group: 'write',
357
346
  description:
358
347
  'Get a join/invite link for a Metro group, for platforms where direct-add is not always ' +
359
348
  'permitted. Args: line (required). The station is derived from the line. Returns {op, ' +
@@ -368,8 +357,9 @@ export const COMMON_TOOLS = [
368
357
  CREATE_UPLOAD_TOOL,
369
358
  ];
370
359
 
371
- export const LIST_ACCOUNTS_TOOL = {
360
+ export const LIST_ACCOUNTS_TOOL: ToolDef = {
372
361
  name: 'list_accounts',
362
+ group: 'read',
373
363
  description:
374
364
  'List the configured messaging accounts across all stations (PUBLIC identity only: ' +
375
365
  'addresses, bot ids/usernames). No args. Never returns tokens, private keys, or the ' +
@@ -378,20 +368,3 @@ export const LIST_ACCOUNTS_TOOL = {
378
368
  'verb need not be discovered by trial and error.',
379
369
  inputSchema: { type: 'object', properties: {} },
380
370
  };
381
-
382
- export const MCP_INSTRUCTIONS =
383
- 'Messages from Metro chat arrive as <channel source="metro" line="..." from="..." ' +
384
- 'station="..." message_id="...">. To respond, use the messaging tools, always passing the ' +
385
- '`line` attribute verbatim (the station is derived from it): `send` (text and/or media via ' +
386
- '`attachments`, optional `reply_to`), `reply` (quote a `message_id` with `text`), `react`/' +
387
- '`unreact` (emoji on a `message_id`), `edit`/`delete` (a `message_id`), and `read` (recent ' +
388
- "history). Station support varies - the tool returns the daemon's reason if a verb is " +
389
- 'unsupported on that line. An inbound attachment is surfaced as a note carrying the ' +
390
- "sender's own text alongside a `Public URL` - fetch that url to read the file; the note's " +
391
- '`local_path` resolves on the DAEMON host, not on yours, so the Read tool works on it only ' +
392
- 'for an agent running there. To send a file OUT, call `create_upload`, ' +
393
- 'run the one curl line it hands back (that step needs a shell; the bytes go from your disk ' +
394
- 'straight to metro and never through this conversation), then `send` with ' +
395
- 'attachments:[{upload:"<upload_id>"}]. Inline `data` is for tiny files only, `url` only for ' +
396
- 'an already-public file, and `path` is read on the DAEMON host, not yours. Tool-approval ' +
397
- 'prompts are relayed to the same chat - answer "yes <id>"/"no <id>".';
@@ -1,34 +1,29 @@
1
- import { publicBaseOrDefault } from '../daemon/attach-serve.js';
1
+ import { publicBaseOrDefault } from '../files/attach-serve.js';
2
2
  import { safeFileName } from '../stations/attach-inline.js';
3
- import { guessMime } from '../stations/attachments.js';
3
+ import { guessMime } from '@metro-labs/core/stations/attachments';
4
4
  import {
5
5
  createUploadSlot,
6
6
  issueUploadTicket,
7
7
  MAX_UPLOAD_BYTES,
8
8
  removeUpload,
9
9
  UPLOAD_TTL_MS,
10
- } from '../daemon/upload-store.js';
11
- import type { ToolResult } from '../stations/types.js';
10
+ } from '../files/upload-store.js';
11
+ import type { ToolResult } from '@metro-labs/core/stations/types';
12
12
  import { errResult, okJson } from './ctx.js';
13
13
  import { allowedAgents, currentIdentity } from './request-identity.js';
14
- import { str } from './str.js';
14
+ import { str } from '@metro-labs/core/str';
15
15
 
16
16
  const ttlMinutes = (): number => Math.round(UPLOAD_TTL_MS / 60_000);
17
17
 
18
18
  const NO_AGENT =
19
19
  'create_upload needs an agent credential; this session is not scoped to one agent';
20
20
 
21
- const manyAgents = (n: number): string =>
22
- `create_upload is scoped to one agent, but this session covers ${String(n)}` +
23
- ' (a multi-agent sign-in); use `POST /api/uploads?agent=<id>` directly instead';
24
-
25
21
  type OwnerAgent = { agentId: string } | { error: string };
26
22
 
27
23
  function ownerAgent(): OwnerAgent {
28
24
  const allowed = allowedAgents(currentIdentity());
29
25
  const [only] = [...allowed];
30
- if (allowed.size === 1 && only !== undefined) return { agentId: only };
31
- return { error: allowed.size === 0 ? NO_AGENT : manyAgents(allowed.size) };
26
+ return allowed.size === 1 && only !== undefined ? { agentId: only } : { error: NO_AGENT };
32
27
  }
33
28
 
34
29
  export function dispatchCreateUpload(
@@ -0,0 +1,68 @@
1
+ import { errMsg, log } from '@metro-labs/core/log';
2
+ import { isRecord } from '@metro-labs/core/is-record';
3
+ import { readJson, writeSecure } from '@metro-labs/core/secure-fs';
4
+ import { MCP_APPROVAL_ID_RE } from '@metro-labs/http/mcp-server-protocol';
5
+
6
+ const KEEP_MS = 24 * 3_600_000;
7
+ const MAX = 200;
8
+
9
+ interface Announced {
10
+ line: string;
11
+ at: number;
12
+ }
13
+
14
+ let file: string | undefined;
15
+ let known = new Map<string, Announced>();
16
+
17
+ function entryOf(raw: unknown): Announced | null {
18
+ if (!isRecord(raw) || typeof raw.line !== 'string' || !raw.line.startsWith('metro://') || typeof raw.at !== 'number' || !Number.isFinite(raw.at)) return null;
19
+ return { line: raw.line, at: raw.at };
20
+ }
21
+
22
+ function parse(raw: unknown): Map<string, Announced> {
23
+ const out = new Map<string, Announced>();
24
+ const entries = isRecord(raw) && raw.version === 1 && isRecord(raw.announced) ? raw.announced : {};
25
+ for (const [id, value] of Object.entries(entries)) {
26
+ const entry = entryOf(value);
27
+ if (MCP_APPROVAL_ID_RE.test(id) && entry !== null) out.set(id, entry);
28
+ }
29
+ return out;
30
+ }
31
+
32
+ function prune(now: number): void {
33
+ for (const [id, entry] of known) if (now - entry.at >= KEEP_MS || entry.at > now) known.delete(id);
34
+ const oldest = [...known].sort(([, a], [, b]) => a.at - b.at);
35
+ for (const [id] of oldest.slice(0, Math.max(0, known.size - MAX))) known.delete(id);
36
+ }
37
+
38
+ function save(): void {
39
+ if (file === undefined) return;
40
+ const announced = Object.fromEntries([...known].map(([id, entry]) => [id, { line: entry.line, at: entry.at }]));
41
+ try {
42
+ writeSecure(file, `${JSON.stringify({ version: 1, announced })}\n`);
43
+ } catch (err) {
44
+ log.warn({ err: errMsg(err) }, 'mcp-server: the announced approvals could not be saved, so they are kept in memory only');
45
+ }
46
+ }
47
+
48
+ export function setAnnouncedFile(path: string, now = Date.now()): void {
49
+ file = path;
50
+ known = parse(readJson<unknown>(path, null, { warn: 'mcp-server: the announced approvals file is not valid JSON, so it was ignored' }));
51
+ prune(now);
52
+ }
53
+
54
+ export function announcedLine(id: string, now = Date.now()): string | undefined {
55
+ const entry = known.get(id);
56
+ return entry !== undefined && now - entry.at < KEEP_MS && entry.at <= now ? entry.line : undefined;
57
+ }
58
+
59
+ export function noteAnnounced(id: string, line: string, now = Date.now()): void {
60
+ known.set(id, { line, at: now });
61
+ prune(now);
62
+ save();
63
+ }
64
+
65
+ export function forgetAnnounced(): void {
66
+ file = undefined;
67
+ known = new Map();
68
+ }
@@ -0,0 +1,29 @@
1
+ import { log } from '@metro-labs/core/log';
2
+
3
+ const DEFAULT_URL = 'https://mcp.metro.box';
4
+
5
+ const LOOPBACK = new Set(['localhost', '127.0.0.1', '[::1]']);
6
+
7
+ let refused: string | undefined;
8
+
9
+ function usable(raw: string): boolean {
10
+ let url: URL;
11
+ try {
12
+ url = new URL(raw);
13
+ } catch {
14
+ return false;
15
+ }
16
+ const secure = url.protocol === 'https:' || (url.protocol === 'http:' && LOOPBACK.has(url.hostname));
17
+ return secure && url.username === '' && url.password === '' && url.search === '' && url.hash === '';
18
+ }
19
+
20
+ export function mcpServerUrl(env: NodeJS.ProcessEnv = process.env): string | null {
21
+ const raw = env.METRO_MCP_SERVER_URL?.trim() ?? DEFAULT_URL;
22
+ if (raw === '') return null;
23
+ if (usable(raw)) return raw.replace(/\/+$/, '');
24
+ if (refused !== raw) {
25
+ refused = raw;
26
+ log.warn({ url: raw }, 'mcp-server: METRO_MCP_SERVER_URL must be an https url (http only on this machine), so it is ignored');
27
+ }
28
+ return null;
29
+ }
@@ -0,0 +1,114 @@
1
+ import { isRecord } from '@metro-labs/core/is-record';
2
+ import { errMsg, log } from '@metro-labs/core/log';
3
+ import { TOOL_CALL, TOOL_SEARCH } from '@metro-labs/http/mcp-server-protocol';
4
+ import { mcpServerTools, type McpServerTool } from '@metro-labs/http/mcp-server-tools';
5
+ import { askServer, type ServerAnswer, type ServerDeps } from './rpc.js';
6
+
7
+ export const CONNECTOR_TOOLS: ReadonlySet<string> = new Set([TOOL_SEARCH, TOOL_CALL]);
8
+
9
+ export const CALL_TIMEOUT_MS = 120_000;
10
+ const LIST_TIMEOUT_MS = 15_000;
11
+ const REFRESH_MS = 5 * 60_000;
12
+
13
+ export const NOT_SET_UP = 'Connectors are not set up on this agent: enroll it in its organization on the Server page of metro.box, then try again.';
14
+ export const UNAVAILABLE = 'mcp.metro.box is unavailable, try again.';
15
+
16
+ export interface ConnectorResult {
17
+ [key: string]: unknown;
18
+ content: unknown[];
19
+ isError?: boolean;
20
+ }
21
+
22
+ const FALLBACK = mcpServerTools(null);
23
+ let current: McpServerTool[] = FALLBACK;
24
+ let version = 0;
25
+ const listeners = new Set<() => void>();
26
+
27
+ export const connectorTools = (): McpServerTool[] => current;
28
+
29
+ export const connectorToolsVersion = (): number => version;
30
+
31
+ export function onConnectorToolsChanged(listener: () => void): () => void {
32
+ listeners.add(listener);
33
+ return () => {
34
+ listeners.delete(listener);
35
+ };
36
+ }
37
+
38
+ function toolOf(raw: unknown, fallback: McpServerTool): McpServerTool | null {
39
+ if (!isRecord(raw) || typeof raw.description !== 'string' || !isRecord(raw.inputSchema)) return null;
40
+ return {
41
+ name: fallback.name,
42
+ title: typeof raw.title === 'string' ? raw.title : fallback.title,
43
+ description: raw.description,
44
+ inputSchema: raw.inputSchema,
45
+ annotations: isRecord(raw.annotations) ? raw.annotations : fallback.annotations,
46
+ };
47
+ }
48
+
49
+ function servedTools(result: unknown): McpServerTool[] | null {
50
+ const tools: unknown[] = isRecord(result) && Array.isArray(result.tools) ? result.tools : [];
51
+ const picked = FALLBACK.map((fallback) => toolOf(tools.find((tool) => isRecord(tool) && tool.name === fallback.name), fallback));
52
+ return picked.every((tool): tool is McpServerTool => tool !== null) ? picked : null;
53
+ }
54
+
55
+ function changed(): void {
56
+ for (const listener of listeners)
57
+ try {
58
+ listener();
59
+ } catch (err) {
60
+ log.warn({ err: errMsg(err) }, 'mcp-server: a tool list listener failed');
61
+ }
62
+ }
63
+
64
+ export async function refreshConnectorTools(deps: ServerDeps = {}): Promise<boolean> {
65
+ const answer = await askServer('tools/list', {}, LIST_TIMEOUT_MS, deps);
66
+ const tools = answer.ok ? servedTools(answer.result) : null;
67
+ if (tools === null) {
68
+ if (!answer.ok && answer.reason !== 'unset') log.debug({ reason: answer.reason }, 'mcp-server: the connector tool list could not be read');
69
+ return false;
70
+ }
71
+ if (JSON.stringify(tools) === JSON.stringify(current)) return false;
72
+ current = tools;
73
+ version += 1;
74
+ log.info({ version }, 'mcp-server: the connector tools changed, the session is told');
75
+ changed();
76
+ return true;
77
+ }
78
+
79
+ let timer: ReturnType<typeof setInterval> | null = null;
80
+
81
+ export function watchConnectorTools(everyMs = REFRESH_MS): () => void {
82
+ const tick = (): void => {
83
+ refreshConnectorTools().catch((err: unknown) => {
84
+ log.warn({ err: errMsg(err) }, 'mcp-server: the connector tool refresh failed');
85
+ });
86
+ };
87
+ if (timer === null) {
88
+ tick();
89
+ timer = setInterval(tick, everyMs);
90
+ timer.unref();
91
+ }
92
+ return () => {
93
+ if (timer !== null) clearInterval(timer);
94
+ timer = null;
95
+ };
96
+ }
97
+
98
+ const errorResult = (text: string): ConnectorResult => ({ content: [{ type: 'text', text }], isError: true });
99
+
100
+ function resultOf(name: string, answer: ServerAnswer): ConnectorResult {
101
+ if (answer.ok) {
102
+ if (isRecord(answer.result) && Array.isArray(answer.result.content)) return answer.result as ConnectorResult;
103
+ log.warn({ tool: name }, 'mcp-server: mcp.metro.box answered a tool call without content');
104
+ return errorResult(UNAVAILABLE);
105
+ }
106
+ if (answer.reason === 'unset') return errorResult(NOT_SET_UP);
107
+ if (answer.reason === 'refused') return errorResult(`mcp.metro.box refused the call: ${answer.message}`);
108
+ log.warn({ tool: name, detail: answer.detail }, 'mcp-server: a connector tool call did not reach mcp.metro.box');
109
+ return errorResult(UNAVAILABLE);
110
+ }
111
+
112
+ export async function callConnectorTool(name: string, args: Record<string, unknown>, deps: ServerDeps = {}): Promise<ConnectorResult> {
113
+ return resultOf(name, await askServer('tools/call', { name, arguments: args }, CALL_TIMEOUT_MS, deps));
114
+ }