@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,17 +1,12 @@
1
- import { forwardTrainCall } from '../daemon/train-call.js';
1
+ import { storedPolicy } from '../policy/policy.js';
2
+ import { forwardTrainCall } from '../stations/train-call.js';
2
3
  import {
3
4
  accountStationNames,
4
5
  stationByName,
5
6
  } from '../stations/registry.js';
6
- import { listEndpoints } from '../daemon/tunnel.js';
7
- import { hookUrl } from '../stations/attach.js';
8
- import { agentIdForAccount } from '../db/agent-map.js';
9
- import {
10
- listAllStations,
11
- stationRunsHere,
12
- type StationRecord,
13
- } from '../db/materialize.js';
14
- import { type StationName } from '../db/schema.js';
7
+ import { listEndpoints } from '../stations/webhook-endpoints.js';
8
+ import { hookUrl, threemaCallbackUrl } from '../stations/attach.js';
9
+ import { accountEnabled, agentIdForAccount, allowlistForAccount, approversForAccount, knownAccounts, type KnownAccount } from '../agents/map.js';
15
10
 
16
11
  const accountId = (acc: unknown): string | undefined => {
17
12
  const id = (acc as { id?: unknown }).id;
@@ -29,7 +24,14 @@ function withAgentId(station: string, acc: unknown): unknown {
29
24
  const id = typeof rec.id === 'string' ? rec.id : undefined;
30
25
  if (id === undefined) return acc;
31
26
  const agentId = agentIdForAccount(station, id);
32
- return agentId === undefined ? acc : { ...rec, agentId };
27
+ if (agentId === undefined) return acc;
28
+ const allowlist = allowlistForAccount(station, id);
29
+ const stored = storedPolicy({ kind: 'channel', station, account: id });
30
+ const policy = stored === undefined ? {} : { policy: stored };
31
+ const approvers = approversForAccount(station, id);
32
+ const extra = approvers.length === 0 ? policy : { ...policy, approvers };
33
+ const tagged = allowlist === undefined ? { ...rec, agentId, ...extra } : { ...rec, agentId, allowlist, ...extra };
34
+ return accountEnabled(station, id) ? tagged : { ...tagged, enabled: false };
33
35
  }
34
36
 
35
37
  export function attachAgentIds(
@@ -75,6 +77,17 @@ function inCoreAccounts(station: string): unknown[] {
75
77
  );
76
78
  }
77
79
 
80
+ function withCallbackUrl(acc: unknown): unknown {
81
+ const rec = asRecord(acc);
82
+ if (rec === undefined) return acc;
83
+ const { callbackId, callbackToken, ...rest } = rec;
84
+ if (typeof callbackId !== 'string' || typeof callbackToken !== 'string') return rest;
85
+ return { ...rest, callback: threemaCallbackUrl(callbackId, callbackToken) };
86
+ }
87
+
88
+ const decorate = (station: string, rows: unknown[]): unknown[] =>
89
+ station === 'threema' ? rows.map(withCallbackUrl) : rows;
90
+
78
91
  export interface ScopedAccounts {
79
92
  accounts: Record<string, unknown[]>;
80
93
  unavailable: string[];
@@ -85,12 +98,10 @@ async function liveAccounts(
85
98
  ): Promise<{ rows: unknown[]; reachable: boolean }> {
86
99
  if (!hasTrain(station))
87
100
  return { rows: inCoreAccounts(station), reachable: true };
88
- if (!stationRunsHere(station as StationName))
89
- return { rows: [], reachable: true };
90
101
  try {
91
102
  const resp = await forwardTrainCall(station, 'accounts', {});
92
103
  const list = (resp.result as { accounts?: unknown[] } | undefined)?.accounts;
93
- return { rows: Array.isArray(list) ? list : [], reachable: true };
104
+ return { rows: decorate(station, Array.isArray(list) ? list : []), reachable: true };
94
105
  } catch {
95
106
  return { rows: [], reachable: false };
96
107
  }
@@ -99,7 +110,7 @@ async function liveAccounts(
99
110
  function mergeKnown(
100
111
  station: string,
101
112
  live: unknown[],
102
- known: StationRecord[],
113
+ known: KnownAccount[],
103
114
  ): unknown[] {
104
115
  const seen = new Set(
105
116
  live.flatMap((row) => {
@@ -116,22 +127,31 @@ function mergeKnown(
116
127
  async function loadStations(): Promise<ScopedAccounts> {
117
128
  const unavailable: string[] = [];
118
129
  const accounts: Record<string, unknown[]> = {};
119
- const known = await listAllStations();
130
+ const known = knownAccounts();
120
131
  await Promise.all(
121
132
  accountStationNames().map(async (station) => {
122
133
  const { rows, reachable } = await liveAccounts(station);
123
134
  if (!reachable) unavailable.push(station);
124
- accounts[station] = mergeKnown(station, rows, known);
135
+ accounts[station] = hasTrain(station) ? mergeKnown(station, rows, known) : rows;
125
136
  }),
126
137
  );
127
138
  return { accounts, unavailable };
128
139
  }
129
140
 
141
+ const URL_SECRETS = new Set(['endpoint', 'callback']);
142
+
143
+ function withoutUrlSecrets(acc: unknown): unknown {
144
+ const rec = asRecord(acc);
145
+ if (rec === undefined) return acc;
146
+ return Object.fromEntries(Object.entries(rec).filter(([key]) => !URL_SECRETS.has(key)));
147
+ }
148
+
130
149
  export async function gatherAccounts(
131
150
  allowedAgents?: Set<string>,
132
151
  ): Promise<Record<string, unknown[]>> {
133
152
  const { accounts } = await loadStations();
134
- return allowedAgents ? scopeAccountsByAgent(accounts, allowedAgents) : accounts;
153
+ const scoped = allowedAgents ? scopeAccountsByAgent(accounts, allowedAgents) : accounts;
154
+ return Object.fromEntries(Object.entries(scoped).map(([station, rows]) => [station, rows.map(withoutUrlSecrets)]));
135
155
  }
136
156
 
137
157
  export async function gatherAccountsForAgents(
@@ -0,0 +1,91 @@
1
+ import type { ToolDef } from './tool-def.js';
2
+
3
+ export const attachmentItem = {
4
+ type: 'object',
5
+ description:
6
+ 'A file to attach. Provide EXACTLY ONE source; naming two is an error and so is naming ' +
7
+ 'none. Which one to use: `upload` for any real file on your own machine, including a ' +
8
+ 'confidential one (call `create_upload` first, push the bytes over HTTP, then name the ' +
9
+ 'id here); `data` ONLY for a tiny file, a few KB at most, because the base64 has to be ' +
10
+ 'written out verbatim in this tool call and long base64 gets corrupted in the writing; ' +
11
+ '`url` when the file is ALREADY published somewhere the daemon can fetch it; `path` ONLY ' +
12
+ 'for a file that is already sitting on the daemon host, which is almost never your ' +
13
+ 'machine.',
14
+ properties: {
15
+ upload: {
16
+ type: 'string',
17
+ description:
18
+ 'The `upload_id` of a file already pushed to metro over HTTP (`create_upload` mints ' +
19
+ 'the slot and the one-line command; the bytes never pass through this conversation). ' +
20
+ 'THIS IS THE ROUTE FOR ANYTHING REAL: it takes files up to 64 MiB, works for a file on ' +
21
+ 'your own machine, and publishes nothing. The upload belongs to your agent, expires ' +
22
+ '30 minutes after it is created, and no other agent can name it.',
23
+ },
24
+ data: {
25
+ type: 'string',
26
+ description:
27
+ 'Base64-encoded file bytes, inline in this call. ONLY FOR TINY FILES. The hard cap is ' +
28
+ '8 MiB decoded, but the real ceiling is far lower and is not enforced by the daemon: ' +
29
+ 'this base64 has to be emitted verbatim as part of the tool call, and past roughly ' +
30
+ '10 KB (~13 KB of base64) it comes out corrupted, so the file arrives silently ' +
31
+ 'damaged or fails to decode. Use `upload` instead for anything bigger. A ' +
32
+ '`data:<mime>;base64,` prefix is accepted and supplies the mime when `mime` is ' +
33
+ 'omitted. Stations impose their own, lower limits (xmtp refuses non-image files over ' +
34
+ '~190 KiB).',
35
+ },
36
+ url: {
37
+ type: 'string',
38
+ description:
39
+ 'http(s) URL fetched BY THE DAEMON, so it must already be publicly reachable from the ' +
40
+ 'daemon host. Right when the file is already published; never for anything ' +
41
+ 'confidential, because it has to be public for this to work at all. Use `upload` for ' +
42
+ 'a confidential file.',
43
+ },
44
+ path: {
45
+ type: 'string',
46
+ description:
47
+ 'Absolute path resolved ON THE DAEMON HOST, which is a different machine from yours. ' +
48
+ 'A path on your own disk does NOT resolve here and is refused, however local it ' +
49
+ 'looks. Use `upload` for a file on your machine.',
50
+ },
51
+ mime: {
52
+ type: 'string',
53
+ description: 'MIME type (guessed from the name/extension if omitted).',
54
+ },
55
+ name: {
56
+ type: 'string',
57
+ description:
58
+ 'Filename to present (defaults to the basename, or to the name given at upload time).',
59
+ },
60
+ },
61
+ } as const;
62
+
63
+ export const CREATE_UPLOAD_TOOL: ToolDef = {
64
+ name: 'create_upload',
65
+ group: 'write',
66
+ description:
67
+ 'Reserve a slot to push a file to metro over HTTP so you can attach it with `send`. Use ' +
68
+ 'this for any file that actually matters: it is the only attachment route that carries a ' +
69
+ 'file from YOUR machine without publishing it and without the bytes passing through this ' +
70
+ 'conversation. Args: name? (the filename to present), mime?. Returns `upload_id`, a ' +
71
+ 'single-use `upload_url` and a ready-to-run `curl` line. ONE STEP NEEDS A SHELL: run that ' +
72
+ 'command (or any HTTP client) to push the bytes; there is no way to move a local file to ' +
73
+ 'the daemon over MCP alone, because anything in an MCP call has to be written out by the ' +
74
+ 'model first. If you have no shell, hand the single command to a subagent that does and ' +
75
+ 'keep the `upload_id` -- the slot belongs to this metro agent, not to whoever runs the ' +
76
+ 'command. Then: send({line, attachments:[{upload:"<upload_id>"}]}). Up to 64 MiB, expires ' +
77
+ '30 minutes after it is created, and no other agent can reference it.',
78
+ inputSchema: {
79
+ type: 'object',
80
+ properties: {
81
+ name: {
82
+ type: 'string',
83
+ description: 'Filename to present to the recipient (e.g. `report.pdf`).',
84
+ },
85
+ mime: {
86
+ type: 'string',
87
+ description: 'MIME type (guessed from the name/extension if omitted).',
88
+ },
89
+ },
90
+ },
91
+ };
@@ -0,0 +1,45 @@
1
+ import { CALL_NOTICE, sameCall, type CallNotice, type CallRoute } from '@metro-labs/core/call';
2
+ import { errMsg, log } from '@metro-labs/core/log';
3
+ import { eventInScope } from '../agents/scope.js';
4
+ import { revokeCallPrompts } from '../approvals/pending.js';
5
+ import { sharedCalls } from '../voice/shared.js';
6
+ import type { McpSession } from './session.js';
7
+
8
+ export const callInScope = (scope: Set<string>, route: CallRoute): boolean =>
9
+ scope.has(route.agentId) && eventInScope(scope, route.line);
10
+
11
+ export function connectCallBridge(current: () => McpSession | undefined): void {
12
+ let owner: McpSession | undefined;
13
+ let route: CallRoute | undefined;
14
+ const available = (wanted: CallRoute): boolean => {
15
+ const session = current();
16
+ return session !== undefined && session.streamAttached && session.server.getClientVersion()?.name === 'metro-sdk-runner' &&
17
+ callInScope(session.scope, wanted) && (route === undefined || owner === session);
18
+ };
19
+ const boundTo = (session: McpSession | undefined, wanted: CallRoute): boolean => session === owner && route !== undefined && sameCall(route, wanted);
20
+ const forgetEnded = (notice: CallNotice): void => {
21
+ if (notice.type === 'ended' && route !== undefined && sameCall(route, notice.route)) {
22
+ owner = undefined;
23
+ route = undefined;
24
+ }
25
+ };
26
+ sharedCalls.connect({
27
+ available,
28
+ notify: (notice: CallNotice): boolean => {
29
+ const session = current();
30
+ const bound = notice.type === 'started' ? available(notice.route) : boundTo(session, notice.route);
31
+ forgetEnded(notice);
32
+ if (session === undefined || !session.streamAttached || !callInScope(session.scope, notice.route) || !bound) return false;
33
+ if (notice.type === 'started') {
34
+ owner = session;
35
+ route = notice.route;
36
+ }
37
+ session.server.notification({ method: CALL_NOTICE, params: { ...notice, meta: { line: notice.route.line } } }).catch((err: unknown) => {
38
+ log.warn({ err: errMsg(err) }, 'sdk-call: notification failed');
39
+ sharedCalls.end(notice.route);
40
+ });
41
+ return true;
42
+ },
43
+ revoked: (ended) => { revokeCallPrompts(ended); },
44
+ });
45
+ }
@@ -0,0 +1,25 @@
1
+ import { callRoute, speechTarget, type CallSource } from '@metro-labs/core/call';
2
+ import { isRecord } from '@metro-labs/core/is-record';
3
+ import { readPreview } from '../approvals/preview.js';
4
+ import { sharedCalls } from '../voice/shared.js';
5
+ import { agentIdForLine } from '../agents/map.js';
6
+
7
+ function boundCall(value: unknown, inScope: (line: string) => boolean): CallSource | null {
8
+ if (!isRecord(value)) return null;
9
+ const route = callRoute(value.route);
10
+ const sourceId = value.sourceId;
11
+ if (route === null || typeof sourceId !== 'string') return null;
12
+ const source = { route, sourceId };
13
+ return inScope(route.line) && sharedCalls.valid(source) ? source : null;
14
+ }
15
+
16
+ export function permissionCall(params: { call?: unknown; input_preview: string; tool_name: string }, inScope: (line: string) => boolean): CallSource | null | undefined {
17
+ if (params.call !== undefined) return boundCall(params.call, inScope);
18
+ if (params.tool_name !== 'mcp__metro__send') return undefined;
19
+ const { input } = readPreview(params.input_preview);
20
+ if (!isRecord(input) || input.speech === undefined) return undefined;
21
+ const target = speechTarget(input.speech);
22
+ if (target === null || typeof input.line !== 'string' || !inScope(input.line)) return null;
23
+ const agentId = agentIdForLine(input.line);
24
+ return agentId === undefined ? null : sharedCalls.source(input.line, target, new Set([agentId]));
25
+ }
@@ -1,14 +1,16 @@
1
1
  import { stationForLine } from '../stations/registry.js';
2
- import { kindOf, toCanonical } from '../stations/attachments.js';
2
+ import { kindOf, toCanonical } from '@metro-labs/core/stations/attachments';
3
3
  import {
4
4
  cleanupAttachments,
5
5
  resolveAttachments,
6
6
  type ResolvedAttachment,
7
7
  } from '../stations/attach-resolve.js';
8
- import type { CanonicalAttachment, ToolResult } from '../stations/types.js';
9
- import { errResult, makeCtx, ok, okJson, toErr } from './ctx.js';
8
+ import type { CanonicalAttachment, ToolResult } from '@metro-labs/core/stations/types';
9
+ import { errResult, makeCtx, ok, toErr } from './ctx.js';
10
+ import { runRead } from './read-tool.js';
10
11
  import { allowedAgents, currentIdentity } from './request-identity.js';
11
- import { str } from './str.js';
12
+ import { str } from '@metro-labs/core/str';
13
+ import { sendSpeech } from './speech-send.js';
12
14
 
13
15
  type Station = NonNullable<ReturnType<typeof stationForLine>>;
14
16
 
@@ -16,6 +18,7 @@ interface MessageArgs {
16
18
  line: string;
17
19
  a: Record<string, unknown>;
18
20
  ctx: ReturnType<typeof makeCtx>;
21
+ onSent?: (messageId: string) => void;
19
22
  station: Station;
20
23
  }
21
24
 
@@ -30,8 +33,14 @@ const withId = (text: string, messageId: string | undefined): string =>
30
33
  interface Sent {
31
34
  labels: string[];
32
35
  messageId?: string;
36
+ thread?: string;
33
37
  }
34
38
 
39
+ const threadOf = (response: { result: unknown }, asked: string): string | undefined => {
40
+ const line = (response.result as { line?: unknown } | null)?.line;
41
+ return typeof line === 'string' && line !== '' && line !== asked ? line : undefined;
42
+ };
43
+
35
44
  const deliveredLabels = (response: { result: unknown }): string[] => {
36
45
  const list = (response.result as { attachments?: unknown } | null)
37
46
  ?.attachments;
@@ -52,6 +61,25 @@ function assertDelivered(
52
61
  );
53
62
  }
54
63
 
64
+ const STAGE_PARTS = ['frame', 'wallet'] as const;
65
+
66
+ const stagePartsIn = (m: MessageArgs): string[] => STAGE_PARTS.filter((key) => m.a[key] !== undefined);
67
+
68
+ const stagePartArgs = (m: MessageArgs): Record<string, unknown> =>
69
+ Object.fromEntries(stagePartsIn(m).map((key) => [key, m.a[key]]));
70
+
71
+ const sentLabels = (m: MessageArgs, text: string | undefined): string[] => [
72
+ ...(text ? ['text'] : []),
73
+ ...stagePartsIn(m),
74
+ ];
75
+
76
+ function nativeBody(m: MessageArgs, text: string | undefined, replyTo: string | undefined): Record<string, unknown> {
77
+ const body: Record<string, unknown> = { line: m.line, ...stagePartArgs(m) };
78
+ if (text) body.text = text;
79
+ if (text && replyTo) body.replyTo = replyTo;
80
+ return body;
81
+ }
82
+
55
83
  async function sendNative(
56
84
  m: MessageArgs,
57
85
  text: string | undefined,
@@ -59,16 +87,9 @@ async function sendNative(
59
87
  atts: ResolvedAttachment[],
60
88
  ): Promise<Sent> {
61
89
  const { line, ctx, station } = m;
62
- const labels: string[] = [];
90
+ const labels = sentLabels(m, text);
63
91
  let messageId: string | undefined;
64
- if (text) {
65
- const response = await ctx.call(
66
- 'send',
67
- replyTo ? { line, text, replyTo } : { line, text },
68
- );
69
- messageId = messageIdOf(response);
70
- labels.push('text');
71
- }
92
+ if (labels.length) messageId = messageIdOf(await ctx.call('send', nativeBody(m, text, replyTo)));
72
93
  if (!atts.length) return { labels, messageId };
73
94
  const delivered = station.sendAttachments
74
95
  ? await station.sendAttachments(line, atts, ctx)
@@ -85,19 +106,21 @@ async function sendForwarded(
85
106
  atts: ResolvedAttachment[],
86
107
  ): Promise<Sent> {
87
108
  const { line, ctx, station } = m;
88
- const args: Record<string, unknown> = { line };
109
+ const args: Record<string, unknown> = { line, ...stagePartArgs(m) };
89
110
  if (text) args.text = text;
111
+ if (typeof m.a.subject === 'string' && m.a.subject.trim() !== '') args.subject = m.a.subject;
90
112
  if (replyTo) args.replyTo = replyTo;
91
113
  if (atts.length) args.attachments = atts.map(toCanonical);
92
114
  const response = await ctx.call('send', args);
93
115
  const messageId = messageIdOf(response);
94
- const labels: string[] = [];
95
- if (text) labels.push('text');
96
- if (!atts.length) return { labels, messageId };
97
- const delivered = deliveredLabels(response);
98
- assertDelivered(station, delivered, atts);
99
- labels.push(...delivered);
100
- return { labels, messageId };
116
+ const thread = threadOf(response, line);
117
+ const labels = sentLabels(m, text);
118
+ if (atts.length) {
119
+ const delivered = deliveredLabels(response);
120
+ assertDelivered(station, delivered, atts);
121
+ labels.push(...delivered);
122
+ }
123
+ return thread === undefined ? { labels, messageId } : { labels, messageId, thread };
101
124
  }
102
125
 
103
126
  const unsupported = (station: Station, atts: CanonicalAttachment[]): string =>
@@ -105,14 +128,28 @@ const unsupported = (station: Station, atts: CanonicalAttachment[]): string =>
105
128
  .map((a) => kindOf(a.mime ?? '', a.path ?? a.url ?? a.name ?? ''))
106
129
  .join(', ')}); send a link in \`text\` instead`;
107
130
 
131
+ const NOTHING_TO_SEND = 'send requires `text`, `attachments`, `frame` or `wallet`';
132
+
133
+ function refusal(m: MessageArgs, text: string | undefined, requested: CanonicalAttachment[]): string | undefined {
134
+ const stageOnly = stagePartsIn(m);
135
+ if (!text && !requested.length && !stageOnly.length) return NOTHING_TO_SEND;
136
+ if (stageOnly.length && m.station.sendsFrames !== true)
137
+ return `${m.station.name} cannot send \`${stageOnly.join('` or `')}\`; that is Stage (XMTP) only`;
138
+ if (requested.length && m.station.attachmentMode === 'none') return unsupported(m.station, requested);
139
+ return undefined;
140
+ }
141
+
142
+ function noteSent(m: MessageArgs, messageId: string | undefined): void {
143
+ if (messageId !== undefined) m.onSent?.(messageId);
144
+ }
145
+
108
146
  async function handleSend(m: MessageArgs): Promise<ToolResult> {
147
+ if (m.a.speech !== undefined) return sendSpeech(m.line, m.a);
109
148
  const text = m.a.text as string | undefined;
110
149
  const replyTo = m.a.reply_to as string | undefined;
111
150
  const requested = (m.a.attachments as CanonicalAttachment[] | undefined) ?? [];
112
- if (!text && !requested.length)
113
- return errResult('send requires `text` or `attachments`');
114
- if (requested.length && m.station.attachmentMode === 'none')
115
- return errResult(unsupported(m.station, requested));
151
+ const refused = refusal(m, text, requested);
152
+ if (refused !== undefined) return errResult(refused);
116
153
  const atts = await resolveAttachments(requested, {
117
154
  allowed: allowedAgents(currentIdentity()),
118
155
  });
@@ -123,21 +160,16 @@ async function handleSend(m: MessageArgs): Promise<ToolResult> {
123
160
  const sent = native
124
161
  ? await sendNative(m, text, replyTo, atts)
125
162
  : await sendForwarded(m, text, replyTo, atts);
126
- if (!sent.labels.length)
127
- return errResult('send requires `text` or `attachments`');
128
- return ok(withId(`sent: ${sent.labels.join(', ')}`, sent.messageId));
163
+ if (!sent.labels.length) return errResult(NOTHING_TO_SEND);
164
+ noteSent(m, sent.messageId);
165
+ const done = withId(`sent: ${sent.labels.join(', ')}`, sent.messageId);
166
+ return ok(sent.thread === undefined ? done : `${done} — new thread line: ${sent.thread}`);
129
167
  } finally {
130
168
  await cleanupAttachments(atts);
131
169
  }
132
170
  }
133
171
 
134
- async function handleRead({ line, a, ctx }: MessageArgs): Promise<ToolResult> {
135
- const args: Record<string, unknown> = { line };
136
- if (typeof a.limit === 'number') args.limit = a.limit;
137
- if (a.before) args.before = str(a.before);
138
- if (a.since) args.since = str(a.since);
139
- return okJson(await ctx.call('read', args));
140
- }
172
+ const handleRead = ({ a, station }: MessageArgs): Promise<ToolResult> => runRead(station, a);
141
173
 
142
174
  type MessageHandler = (m: MessageArgs) => Promise<ToolResult>;
143
175
 
@@ -158,7 +190,7 @@ const MESSAGE_VERBS: Record<string, VerbSpec> = {
158
190
  };
159
191
 
160
192
  function makeVerbHandler(verb: string, spec: VerbSpec): MessageHandler {
161
- return async ({ line, a, ctx }) => {
193
+ return async ({ line, a, ctx, onSent }) => {
162
194
  const payload: Record<string, unknown> = { line };
163
195
  for (const [snake, camel] of spec.args) {
164
196
  const value = str(a[snake]);
@@ -169,21 +201,34 @@ function makeVerbHandler(verb: string, spec: VerbSpec): MessageHandler {
169
201
  payload[camel] = value;
170
202
  }
171
203
  const response = await ctx.call(verb, payload);
172
- return ok(withId(spec.success, messageIdOf(response)));
204
+ const messageId = messageIdOf(response);
205
+ if (verb === 'reply' && messageId !== undefined) onSent?.(messageId);
206
+ return ok(withId(spec.success, messageId));
173
207
  };
174
208
  }
175
209
 
210
+ const handleTyping = async ({ line, ctx }: MessageArgs): Promise<ToolResult> => {
211
+ await ctx.call('typing', { line });
212
+ return ok('typing shown');
213
+ };
214
+
176
215
  const MESSAGE_HANDLERS: Record<string, MessageHandler> = {
177
216
  send: handleSend,
178
217
  read: handleRead,
218
+ typing: handleTyping,
179
219
  ...Object.fromEntries(
180
220
  Object.entries(MESSAGE_VERBS).map(([verb, spec]) => [verb, makeVerbHandler(verb, spec)]),
181
221
  ),
182
222
  };
183
223
 
224
+ export interface ToolHooks {
225
+ onSent?: (messageId: string) => void;
226
+ }
227
+
184
228
  export async function dispatchMessageTool(
185
229
  name: string,
186
230
  a: Record<string, unknown>,
231
+ hooks: ToolHooks = {},
187
232
  ): Promise<ToolResult> {
188
233
  const line = str(a.line);
189
234
  if (!line) return errResult(`${name} requires \`line\``);
@@ -195,8 +240,13 @@ export async function dispatchMessageTool(
195
240
  }
196
241
  const handler = MESSAGE_HANDLERS[name];
197
242
  if (!handler) return errResult(`unknown tool: ${name}`);
243
+ const verbs: ReadonlySet<string> = station.messageVerbs;
244
+ if (!verbs.has(name))
245
+ return errResult(
246
+ `${station.name} does not support ${name}; it supports ${[...verbs].join(', ')}.`,
247
+ );
198
248
  try {
199
- return await handler({ line, a, ctx: makeCtx(station.name), station });
249
+ return await handler({ line, a, ctx: makeCtx(station.name), station, onSent: hooks.onSent });
200
250
  } catch (e) {
201
251
  return toErr(name, e);
202
252
  }
@@ -0,0 +1,80 @@
1
+ import { channelOptions, type ChannelList } from '@metro-labs/core/stations/channel-directory';
2
+ import type { ToolResult } from '@metro-labs/core/stations/types';
3
+ import { str } from '@metro-labs/core/str';
4
+ import { stationByName } from '../stations/registry.js';
5
+ import { callTargetDenied } from '../agents/scope.js';
6
+ import { errResult, makeCtx, okJson, toErr } from './ctx.js';
7
+ import { stationOfAccount } from './read-tool.js';
8
+ import type { ToolDef } from './tool-def.js';
9
+
10
+ export const LIST_CHANNELS_TOOL: ToolDef = {
11
+ name: 'list_channels',
12
+ group: 'read',
13
+ description:
14
+ 'Discover existing conversations for one account from list_accounts, returning metadata only. ' +
15
+ 'Args: account (required), query?, limit? (1 to 100, default 50), cursor?. Query matches names, ids or lines ' +
16
+ 'case-insensitively. Returns {account, station, channels:[{id, line, name?, kind:direct|group|channel|thread}], ' +
17
+ 'capability:{supported, complete, source:remote|local|mixed|unsupported, reason?}, next_cursor?}. ' +
18
+ 'Use each returned line with other Metro tools. Follow next_cursor with the same account and query. ' +
19
+ 'Check capability: local or partial directories are not exhaustive, and unsupported is not an empty account. ' +
20
+ 'No recent message is required. Receive messages Off does not disable discovery; read policies still apply.',
21
+ inputSchema: {
22
+ type: 'object',
23
+ properties: {
24
+ account: { type: 'string', minLength: 1, description: 'An account id from list_accounts.' },
25
+ query: { type: 'string', maxLength: 200, description: 'Case-insensitive name, id or line substring.' },
26
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 50, description: 'Maximum channels per page.' },
27
+ cursor: { type: 'string', minLength: 1, maxLength: 2048, description: 'The next_cursor from the previous page.' },
28
+ },
29
+ required: ['account'],
30
+ },
31
+ };
32
+
33
+ export function channelScopeDenied(allowed: Set<string>, a: Record<string, unknown>): boolean {
34
+ const account = str(a.account);
35
+ const station = account ? stationOfAccount(account) : undefined;
36
+ return station === undefined || stationByName(station) === undefined || callTargetDenied(allowed, station, { account });
37
+ }
38
+
39
+ export function channelArgsError(a: Record<string, unknown>): ToolResult | undefined {
40
+ if (typeof a.account !== 'string' || !a.account.trim())
41
+ return errResult('list_channels requires `account` from list_accounts');
42
+ try {
43
+ channelOptions(a);
44
+ return undefined;
45
+ } catch (e) {
46
+ return toErr('list_channels', e);
47
+ }
48
+ }
49
+
50
+ export async function dispatchListChannels(a: Record<string, unknown>): Promise<ToolResult> {
51
+ const account = str(a.account);
52
+ const name = stationOfAccount(account);
53
+ const station = name === undefined ? undefined : stationByName(name);
54
+ if (station === undefined) return errResult('list_channels requires a unique account from list_accounts');
55
+ if (!station.hasTrain || station.discoversChannels !== true) {
56
+ const list: ChannelList = {
57
+ channels: [],
58
+ capability: {
59
+ supported: false,
60
+ complete: false,
61
+ source: 'unsupported',
62
+ reason: `${station.name} does not support channel discovery`,
63
+ },
64
+ };
65
+ return okJson({ account, station: station.name, ...list });
66
+ }
67
+ try {
68
+ const { limit, cursor } = channelOptions(a);
69
+ const args = {
70
+ account,
71
+ limit,
72
+ ...(a.query === undefined ? {} : { query: str(a.query) }),
73
+ ...(cursor === undefined ? {} : { cursor }),
74
+ };
75
+ const { result } = await makeCtx(station.name).call('listChannels', args);
76
+ return okJson({ ...result as ChannelList, account, station: station.name });
77
+ } catch (e) {
78
+ return toErr('list_channels', e);
79
+ }
80
+ }
@@ -1,8 +1,8 @@
1
1
  import { readFile } from 'node:fs/promises';
2
- import { forwardTrainCall } from '../daemon/train-call.js';
3
- import { errMsg, log } from '../daemon/log.js';
4
- import { TrainError } from '../daemon/train-error.js';
5
- import { type ToolContext, type ToolResult } from '../stations/types.js';
2
+ import { forwardTrainCall } from '../stations/train-call.js';
3
+ import { errMsg, log } from '@metro-labs/core/log';
4
+ import { TrainError } from '@metro-labs/core/train-error';
5
+ import { type ToolContext, type ToolResult } from '@metro-labs/core/stations/types';
6
6
 
7
7
  export async function metroCall(
8
8
  train: string,