@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,7 +1,7 @@
1
- import type { StationTool } from '@metro-labs/mcp/stations/types';
1
+ import type { StationTool } from '@metro-labs/core/stations/types';
2
+ import { PRIORITIES } from './labels.js';
2
3
  import {
3
4
  str,
4
- createChannel,
5
5
  setChannelMetadata,
6
6
  xmtpSendAttachments,
7
7
  } from './tools-handlers.js';
@@ -15,43 +15,9 @@ const lineProp = {
15
15
  } as const;
16
16
 
17
17
  export const XMTP_TOOLS: StationTool[] = [
18
- {
19
- name: 'create_channel',
20
- description:
21
- 'Create a new XMTP group conversation (channel). Args: addresses (required, array of ' +
22
- 'Ethereum 0x addresses to add as members), name (required, the group name), labels? ' +
23
- '(optional string[] status labels applied after creation), account? ' +
24
- '(defaults to your only XMTP account). Calls the daemon xmtp `newGroup`, then ' +
25
- '`updateChannelMeta` if labels ' +
26
- 'are given. Returns the new metro:// line and convId. This is an xmtp-only operation. ' +
27
- 'NOTE: there is no add-members verb on the daemon, so members must be supplied at ' +
28
- 'creation time.',
29
- inputSchema: {
30
- type: 'object',
31
- properties: {
32
- addresses: {
33
- type: 'array',
34
- description: 'Ethereum 0x addresses to add as group members.',
35
- items: { type: 'string' },
36
- },
37
- name: { type: 'string', description: 'The group/channel name.' },
38
- labels: {
39
- type: 'array',
40
- description: 'Optional status labels to apply after creation.',
41
- items: { type: 'string' },
42
- },
43
- account: {
44
- type: 'string',
45
- description:
46
- 'XMTP account to create under. Omit when you have only one.',
47
- },
48
- },
49
- required: ['addresses', 'name'],
50
- },
51
- handle: (a, ctx) => createChannel(a, ctx),
52
- },
53
18
  {
54
19
  name: 'ask',
20
+ group: 'write',
55
21
  description:
56
22
  'Ask a question as a poll in an XMTP conversation (mirrors Claude AskUserQuestion). ' +
57
23
  'Single-question form: question (required), options? (string[]), header?, multiSelect?, ' +
@@ -116,11 +82,12 @@ export const XMTP_TOOLS: StationTool[] = [
116
82
  },
117
83
  {
118
84
  name: 'dm',
85
+ group: 'write',
119
86
  description:
120
87
  'Open (or reuse) a 1:1 XMTP DM with an Ethereum address. Args: address (required, 0x...), ' +
121
88
  'account? (defaults to your only XMTP account). Returns the new metro:// line and ' +
122
89
  'convId. xmtp-only ' +
123
- '(daemon `newDm`). Use this instead of create_channel when there is a single recipient.',
90
+ '(daemon `newDm`). For a group, use create_group.',
124
91
  inputSchema: {
125
92
  type: 'object',
126
93
  properties: {
@@ -145,10 +112,13 @@ export const XMTP_TOOLS: StationTool[] = [
145
112
  },
146
113
  {
147
114
  name: 'group_info',
115
+ group: 'read',
148
116
  description:
149
117
  "Read an XMTP channel's current metadata + membership. Args: line (required). Returns " +
150
- '{line, id, account, version (dm|group), name, memberCount, labels, github, preview, ' +
151
- 'members:[{inboxId, address}]}. xmtp-only (daemon `groupInfo`). Use before ' +
118
+ '{line, id, account, version (dm|group), name, memberCount, labels, category, status, priority, github, preview, ' +
119
+ 'assigned, appData (stored JSON object), rawAppData (stored JSON string), ' +
120
+ 'members:[{inboxId, address}]}. Syncs first and fails if metadata cannot be read. ' +
121
+ 'xmtp-only (daemon `groupInfo`). Use before ' +
152
122
  'set_channel_metadata/add_members to see current state.',
153
123
  inputSchema: {
154
124
  type: 'object',
@@ -163,35 +133,88 @@ export const XMTP_TOOLS: StationTool[] = [
163
133
  },
164
134
  {
165
135
  name: 'close_channel',
136
+ group: 'write',
137
+ destructive: true,
166
138
  description:
167
- 'Archive/close an XMTP group (removes members). Args: line (required). xmtp-only ' +
168
- '(daemon `closeGroup`). Irreversible-ish: members are removed from the group.',
139
+ 'Remove members from an XMTP group, and optionally leave it. Args: line (required), ' +
140
+ 'removeInboxIds? (inbox ids to remove; your own is ignored here), removeSelf? (true to ' +
141
+ 'leave the group yourself). With neither, nothing changes. xmtp-only (daemon ' +
142
+ '`closeGroup`). Returns {removed, leftSelf}.',
169
143
  inputSchema: {
170
144
  type: 'object',
171
- properties: { line: lineProp },
145
+ properties: {
146
+ line: lineProp,
147
+ removeInboxIds: {
148
+ type: 'array',
149
+ description: 'Inbox ids of the members to remove.',
150
+ items: { type: 'string' },
151
+ },
152
+ removeSelf: {
153
+ type: 'boolean',
154
+ description: 'Leave the group after removing the others.',
155
+ },
156
+ },
172
157
  required: ['line'],
173
158
  },
174
159
  async handle(a, ctx) {
175
160
  const line = str(a.line);
176
161
  if (!line) return ctx.err('close_channel requires `line`');
177
- return ctx.okJson(await ctx.call('closeGroup', { line }));
162
+ const args: Record<string, unknown> = { line };
163
+ if (Array.isArray(a.removeInboxIds)) args.removeInboxIds = a.removeInboxIds.map(String);
164
+ if (a.removeSelf === true) args.removeSelf = true;
165
+ return ctx.okJson(await ctx.call('closeGroup', args));
178
166
  },
179
167
  },
180
168
  {
181
169
  name: 'set_channel_metadata',
170
+ group: 'write',
182
171
  description:
183
172
  "Update an existing channel's metadata. Args: line (required, the metro:// line), and " +
184
- 'any of labels? (string[]), github? (url), preview? (url), name? (string). All provided ' +
185
- 'fields are applied together in one atomic updateChannelMeta daemon call (a single ' +
186
- 'appData merge plus name update). xmtp-only ' +
187
- '(channel metadata lives on xmtp groups). Returns the updated channel info.',
173
+ 'any of metadata? (JSON object), github? (url), preview? (url), name? (string). ' +
174
+ 'metadata is a shallow appData patch: omitted keys are preserved, supplied nested ' +
175
+ 'values replace that key, and null deletes custom keys. v is reserved. Put labels, ' +
176
+ 'assigned, category, status and priority inside metadata. assigned replaces the array with normalized lowercase ' +
177
+ 'Ethereum addresses of current members. Read group_info and union existing IDs to ' +
178
+ 'add assignees. category and status are each one free-form string per channel, trimmed, ' +
179
+ 'whitespace collapsed and truncated to 24 characters. priority is trimmed and must be Urgent, High, Medium or Low. ' +
180
+ '"" or null clears category, status or priority. labels remains a legacy top-level alias. Duplicate top-level/metadata ' +
181
+ 'label/link aliases are refused. All fields use one updateChannelMeta call. xmtp-only. ' +
182
+ 'Returns updated metadata. Reread group_info to verify persistence.',
188
183
  inputSchema: {
189
184
  type: 'object',
190
185
  properties: {
191
186
  line: lineProp,
187
+ metadata: {
188
+ type: 'object',
189
+ description: 'Shallow JSON appData patch. Omitted keys stay unchanged. v is reserved.',
190
+ properties: {
191
+ labels: { type: 'array', items: { type: 'string' } },
192
+ assigned: {
193
+ type: 'array',
194
+ description: 'Replacement assignee list. Current member Ethereum addresses only. [] clears.',
195
+ items: { type: 'string', pattern: '^0x[0-9a-fA-F]{40}$' },
196
+ },
197
+ category: {
198
+ type: ['string', 'null'],
199
+ description: 'One free-form category, trimmed, whitespace collapsed, truncated to 24 characters. "" or null clears it.',
200
+ },
201
+ status: {
202
+ type: ['string', 'null'],
203
+ description: 'One free-form status, trimmed, whitespace collapsed, truncated to 24 characters. "" or null clears it.',
204
+ },
205
+ priority: {
206
+ type: ['string', 'null'],
207
+ enum: [...PRIORITIES, '', null],
208
+ description: 'One priority: Urgent, High, Medium or Low. Surrounding whitespace is trimmed; empty or null clears it.',
209
+ },
210
+ github: { type: 'string' },
211
+ preview: { type: 'string' },
212
+ },
213
+ additionalProperties: true,
214
+ },
192
215
  labels: {
193
216
  type: 'array',
194
- description: 'Status labels to set.',
217
+ description: 'Legacy alias. Prefer metadata.labels.',
195
218
  items: { type: 'string' },
196
219
  },
197
220
  github: {
@@ -1,7 +1,6 @@
1
- import { errMsg } from '@metro-labs/mcp/log';
2
- import { mintId, SELF_URI } from './wire.js';
3
-
4
- type EmitInbound = (accountId: string, e: Record<string, unknown>) => void;
1
+ import { errMsg } from '@metro-labs/core/log';
2
+ import { emitInbound, selfUri } from '@metro-labs/core/stations/train-events';
3
+ import { mintId } from '@metro-labs/core/stations/station-runtime';
5
4
 
6
5
  const WHISPER_BIN = process.env.METRO_WHISPER_BIN ?? 'whisper-cli';
7
6
  const WHISPER_MODEL =
@@ -14,7 +13,6 @@ export async function transcribeAndEmit(
14
13
  line: string,
15
14
  accountId: string,
16
15
  sourceMsgId: string,
17
- emitInbound: EmitInbound,
18
16
  ): Promise<void> {
19
17
  const {
20
18
  existsSync: ex,
@@ -69,7 +67,7 @@ export async function transcribeAndEmit(
69
67
  ts: new Date().toISOString(),
70
68
  station: 'xmtp',
71
69
  line,
72
- from: SELF_URI,
70
+ from: selfUri(),
73
71
  text: `🎙️ ${text}`,
74
72
  payload: {
75
73
  contentType: 'transcript',
@@ -1,7 +1,8 @@
1
1
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { dirname } from 'node:path';
3
3
  import { Client, type ClientOptions, type Signer } from '@xmtp/node-sdk';
4
- import { expandHome, signerFor, XMTP_ENV } from './identity.js';
4
+ import { expandHome, identityFor, signerFor, XMTP_ENV } from './identity.js';
5
+ import { ensureDeployed } from './smart.js';
5
6
 
6
7
  export class XmtpVerifyError extends Error {}
7
8
 
@@ -10,6 +11,7 @@ export interface XmtpVerified {
10
11
  address: string;
11
12
  installationId: string;
12
13
  dbPath: string;
14
+ smart: boolean;
13
15
  }
14
16
 
15
17
  interface RegisteredClient {
@@ -34,15 +36,25 @@ const reason = (err: unknown): string =>
34
36
  export async function verifyXmtpKey(
35
37
  privateKey: string,
36
38
  dbPath: string,
39
+ smart = false,
37
40
  create: CreateXmtpClient = openInbox,
38
41
  ): Promise<XmtpVerified> {
39
- let signer: Signer;
40
- let address: string;
42
+ let identity: Awaited<ReturnType<typeof identityFor>>;
41
43
  try {
42
- ({ signer, address } = signerFor(privateKey));
44
+ signerFor(privateKey);
43
45
  } catch {
44
46
  throw new XmtpVerifyError('that is not a usable XMTP private key');
45
47
  }
48
+ try {
49
+ identity = await identityFor(privateKey, smart);
50
+ } catch (err) {
51
+ throw new XmtpVerifyError(`could not build the smart account on Base: ${reason(err)}`);
52
+ }
53
+ const { signer, address } = identity;
54
+ if (identity.smart !== null)
55
+ await ensureDeployed(identity.smart).catch((err: unknown) => {
56
+ throw new XmtpVerifyError(`could not deploy the smart account on Base (is the ZeroDev sponsorship still on?): ${reason(err)}`);
57
+ });
46
58
  const resolved = expandHome(dbPath);
47
59
  mkdirSync(dirname(resolved), { recursive: true });
48
60
  const client = await create(signer, resolved).catch((err: unknown) => {
@@ -59,6 +71,7 @@ export async function verifyXmtpKey(
59
71
  address,
60
72
  installationId: client.installationId,
61
73
  dbPath: resolved,
74
+ smart,
62
75
  };
63
76
  }
64
77
 
@@ -68,10 +81,11 @@ async function runCli(): Promise<void> {
68
81
  const input = JSON.parse(readFileSync(0, 'utf8')) as {
69
82
  privateKey?: unknown;
70
83
  dbPath?: unknown;
84
+ smart?: unknown;
71
85
  };
72
86
  if (typeof input.privateKey !== 'string' || typeof input.dbPath !== 'string')
73
87
  throw new XmtpVerifyError('xmtp verify needs a privateKey and a dbPath');
74
- out = { ok: true, ...(await verifyXmtpKey(input.privateKey, input.dbPath)) };
88
+ out = { ok: true, ...(await verifyXmtpKey(input.privateKey, input.dbPath, input.smart === true)) };
75
89
  } catch (err) {
76
90
  out = { ok: false, error: reason(err) };
77
91
  }
@@ -0,0 +1,28 @@
1
+ import type { EncodedContent } from '@xmtp/content-type-primitives';
2
+ import {
3
+ SignatureReferenceCodec,
4
+ SignatureRequestCodec,
5
+ TransactionReferenceCodec,
6
+ WalletSendCallsCodec,
7
+ } from './codecs.js';
8
+ import { bad, isNode, parseJson } from './frames.js';
9
+
10
+ const WALLET_TYPES: Record<string, { codec: { encode(c: Record<string, unknown>): EncodedContent }; needs: string[] }> = {
11
+ walletSendCalls: { codec: new WalletSendCallsCodec(), needs: ['version', 'chainId', 'from', 'calls'] },
12
+ transactionReference: { codec: new TransactionReferenceCodec(), needs: ['networkId', 'reference'] },
13
+ signatureRequest: { codec: new SignatureRequestCodec(), needs: ['id', 'kind'] },
14
+ signatureReference: { codec: new SignatureReferenceCodec(), needs: ['requestId', 'signature', 'signer'] },
15
+ };
16
+
17
+ export function buildWalletContent(raw: unknown): { encoded: EncodedContent; summary: string } {
18
+ const args = parseJson(raw, 'wallet');
19
+ const type = isNode(args) && typeof args.type === 'string' ? args.type : '';
20
+ const spec = Object.hasOwn(WALLET_TYPES, type) ? WALLET_TYPES[type] : undefined;
21
+ if (!isNode(args) || !spec) throw bad(`wallet type must be one of ${Object.keys(WALLET_TYPES).join(', ')}`);
22
+ const content = parseJson(args.content, 'wallet content');
23
+ if (!isNode(content)) throw bad(`wallet content must be the ${type} JSON object`);
24
+ const missing = spec.needs.filter((key) => content[key] === undefined);
25
+ if (missing.length > 0) throw bad(`${type} content needs ${missing.join(', ')}`);
26
+ const encoded = spec.codec.encode(content);
27
+ return { encoded, summary: encoded.fallback ?? type };
28
+ }
@@ -1,7 +1,3 @@
1
- export { emit, respond, mintId } from '@metro-labs/mcp/stations/station-runtime';
2
-
3
- export const SELF_URI = process.env.METRO_SELF_URI ?? '';
4
-
5
1
  const UID_MAP_MAX = 5000;
6
2
  const uidToXmtp = new Map<string, string>();
7
3
 
@@ -37,3 +33,17 @@ export function resolveMsgId(rawId: string): string {
37
33
  '(not seen by this train; pass the raw xmtp message_id)',
38
34
  );
39
35
  }
36
+
37
+ const SENT_MAX = 5000;
38
+ const sentIds = new Set<string>();
39
+
40
+ export function rememberSent(xmtpId: string | undefined): void {
41
+ if (!xmtpId) return;
42
+ sentIds.add(xmtpId);
43
+ if (sentIds.size > SENT_MAX) {
44
+ const oldest = sentIds.values().next().value;
45
+ if (oldest !== undefined) sentIds.delete(oldest);
46
+ }
47
+ }
48
+
49
+ export const sentByMe = (xmtpId: string): boolean => sentIds.has(xmtpId);
@@ -0,0 +1,31 @@
1
+ diff --git a/lib/Types/Events.d.ts b/lib/Types/Events.d.ts
2
+ index f55c4c325b08b8c25dc9d17032514ce5c80ad3fd..930cb143e813b9a656533ae765f9db70f6eb7ccd 100644
3
+ --- a/lib/Types/Events.d.ts
4
+ +++ b/lib/Types/Events.d.ts
5
+ @@ -46,6 +46,10 @@ export type BaileysEventMap = {
6
+ 'lid-mapping.update': LIDMapping;
7
+ /** delete chats with given ID */
8
+ 'chats.delete': string[];
9
+ + 'chats.clear': {
10
+ + id: string;
11
+ + messageRange?: proto.SyncActionValue.ISyncActionMessageRange | null;
12
+ + };
13
+ /** presence of contact in a chat updated */
14
+ 'presence.update': {
15
+ id: string;
16
+ diff --git a/lib/Utils/chat-utils.js b/lib/Utils/chat-utils.js
17
+ index c30265d36671bacd25a8c456cafedcd9fc2fdd9a..2be37df069eda49c546eac1eb3485e649432dbeb 100644
18
+ --- a/lib/Utils/chat-utils.js
19
+ +++ b/lib/Utils/chat-utils.js
20
+ @@ -763,7 +763,11 @@ export const processSyncAction = (syncAction, ev, me, initialSyncOpts, logger) =
21
+ }
22
+ ]);
23
+ }
24
+ + else if (action?.clearChatAction || type === 'clearChat') {
25
+ + ev.emit('chats.clear', { id, messageRange: action?.clearChatAction?.messageRange });
26
+ + }
27
+ else if (action?.deleteChatAction || type === 'deleteChat') {
28
+ + ev.emit('chats.clear', { id, messageRange: action?.deleteChatAction?.messageRange });
29
+ if (!isInitialSync) {
30
+ ev.emit('chats.delete', [id]);
31
+ }
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "0.1.0-beta.31"
2
+ "version": "0.1.0-beta.310"
3
3
  }
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@metro-labs/core",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "description": "What every metro process shares: the logger, the event bus and its types, ids, secure file writes, the train protocol, station types and attachment handling. No HTTP, no policy.",
6
+ "type": "module",
7
+ "exports": {
8
+ "./log": "./src/log.ts",
9
+ "./events": "./src/events.ts",
10
+ "./is-record": "./src/is-record.ts",
11
+ "./runner-activity": "./src/runner-activity.ts",
12
+ "./automation-store": "./src/automation-store.ts",
13
+ "./automation-types": "./src/automation-types.ts",
14
+ "./call": "./src/call.ts",
15
+ "./secure-fs": "./src/secure-fs.ts",
16
+ "./skill-source": "./src/skill-source.ts",
17
+ "./version": "./src/version.ts",
18
+ "./train-error": "./src/train-error.ts",
19
+ "./trains/protocol": "./src/protocol.ts",
20
+ "./ids": "./src/ids.ts",
21
+ "./tickets": "./src/tickets.ts",
22
+ "./station-names": "./src/station-names.ts",
23
+ "./str": "./src/str.ts",
24
+ "./lines": "./src/lines.ts",
25
+ "./endpoints": "./src/endpoints.ts",
26
+ "./stations/types": "./src/stations/types.ts",
27
+ "./stations/channel-directory": "./src/stations/channel-directory.ts",
28
+ "./stations/channel-pages": "./src/stations/channel-pages.ts",
29
+ "./stations/account-files": "./src/stations/account-files.ts",
30
+ "./stations/station-runtime": "./src/stations/station-runtime.ts",
31
+ "./stations/account-store": "./src/stations/account-store.ts",
32
+ "./stations/attachments": "./src/stations/attachments.ts",
33
+ "./stations/mail": "./src/stations/mail.ts",
34
+ "./stations/mail-text": "./src/stations/mail-text.ts",
35
+ "./stations/mail-trust": "./src/stations/mail-trust.ts",
36
+ "./stations/oauth": "./src/stations/oauth.ts",
37
+ "./stations/messaging-normalize": "./src/stations/messaging-normalize.ts",
38
+ "./stations/profile": "./src/stations/profile.ts",
39
+ "./stations/sender-profile": "./src/stations/sender-profile.ts",
40
+ "./stations/train-events": "./src/stations/train-events.ts",
41
+ "./stations/train-boot": "./src/stations/train-boot.ts"
42
+ },
43
+ "scripts": {
44
+ "build": "tsc",
45
+ "test": "tsc --noEmit && METRO_STATE_DIR=\"$(mktemp -d /tmp/metro-test.XXXXXX)\" bun test test/"
46
+ },
47
+ "dependencies": {
48
+ "pino": "^9.5.0",
49
+ "pino-pretty": "^13.1.3"
50
+ },
51
+ "devDependencies": {
52
+ "@stage-labs/config": "0.1.0-beta.3",
53
+ "eslint": "^10.3.0",
54
+ "knip": "^6.15.0",
55
+ "madge": "^8.0.0",
56
+ "typescript": "^5"
57
+ }
58
+ }
@@ -0,0 +1,216 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import fs, { closeSync, constants, fstatSync, lstatSync, mkdirSync, openSync, type Stats } from 'node:fs';
3
+ import { dirname, join, parse, resolve, sep } from 'node:path';
4
+ import { DatabaseSync } from 'node:sqlite';
5
+ import { AutomationError } from './automation-types.js';
6
+ import { isRecord } from './is-record.js';
7
+
8
+ const FILE = 'automation.sqlite';
9
+ const SCHEMA = `
10
+ CREATE TABLE requests (
11
+ uuid TEXT PRIMARY KEY NOT NULL,
12
+ routine TEXT NOT NULL,
13
+ slot INTEGER NOT NULL,
14
+ payload TEXT NOT NULL,
15
+ UNIQUE (routine, slot)
16
+ );
17
+ CREATE TABLE statuses (
18
+ uuid TEXT PRIMARY KEY NOT NULL REFERENCES requests(uuid) ON DELETE CASCADE,
19
+ payload TEXT NOT NULL
20
+ );
21
+ CREATE TABLE resolutions (
22
+ uuid TEXT NOT NULL REFERENCES requests(uuid) ON DELETE CASCADE,
23
+ outcome TEXT NOT NULL,
24
+ payload TEXT NOT NULL,
25
+ PRIMARY KEY (uuid, outcome)
26
+ );
27
+ PRAGMA user_version = 1;
28
+ `;
29
+
30
+ function hasCode(error: unknown, code: string): boolean {
31
+ return isRecord(error) && error.code === code;
32
+ }
33
+
34
+ function metadata(path: string): Stats | null {
35
+ try {
36
+ return lstatSync(path);
37
+ } catch (error) {
38
+ if (hasCode(error, 'ENOENT')) return null;
39
+ throw error;
40
+ }
41
+ }
42
+
43
+ function uid(): number {
44
+ if (process.getuid === undefined) throw new AutomationError('unsafe-storage');
45
+ return process.getuid();
46
+ }
47
+
48
+ function checkDirectory(info: Stats, privateDirectory: boolean): void {
49
+ if (!info.isDirectory() || info.isSymbolicLink()) throw new AutomationError('unsafe-storage');
50
+ if (privateDirectory) {
51
+ if (info.uid !== uid() || (info.mode & 0o7777) !== 0o700) throw new AutomationError('unsafe-storage');
52
+ return;
53
+ }
54
+ if (info.uid !== uid() && info.uid !== 0) throw new AutomationError('unsafe-storage');
55
+ if ((info.mode & 0o022) !== 0 && (info.mode & 0o1000) === 0) throw new AutomationError('unsafe-storage');
56
+ }
57
+
58
+ function syncDirectory(path: string): void {
59
+ const fd = openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
60
+ try {
61
+ fs.fsyncSync(fd);
62
+ } finally {
63
+ closeSync(fd);
64
+ }
65
+ }
66
+
67
+ function directory(root: string, create: boolean): boolean {
68
+ let current = parse(root).root;
69
+ const base = metadata(current);
70
+ if (base === null) throw new AutomationError('unsafe-storage');
71
+ checkDirectory(base, current === root);
72
+ for (const component of root.slice(current.length).split(sep).filter(Boolean)) {
73
+ current = join(current, component);
74
+ let info = metadata(current);
75
+ if (info === null) {
76
+ if (!create) return false;
77
+ try {
78
+ mkdirSync(current, { mode: 0o700 });
79
+ syncDirectory(dirname(current));
80
+ } catch (error) {
81
+ if (!hasCode(error, 'EEXIST')) throw error;
82
+ }
83
+ info = metadata(current);
84
+ }
85
+ if (info === null) throw new AutomationError('unsafe-storage');
86
+ checkDirectory(info, current === root);
87
+ }
88
+ return true;
89
+ }
90
+
91
+ function checkFile(info: Stats, singleLink = false): void {
92
+ if (!info.isFile() || info.uid !== uid() || (info.mode & 0o7777) !== 0o600 || (singleLink && info.nlink !== 1)) throw new AutomationError('unsafe-storage');
93
+ }
94
+
95
+ function companions(path: string): void {
96
+ for (const suffix of ['-journal', '-wal', '-shm']) {
97
+ const info = metadata(`${path}${suffix}`);
98
+ if (info !== null) checkFile(info, true);
99
+ }
100
+ }
101
+
102
+ function sameFile(path: string, opened: Stats): void {
103
+ const current = metadata(path);
104
+ if (current === null || current.dev !== opened.dev || current.ino !== opened.ino) throw new AutomationError('unsafe-storage');
105
+ checkFile(current);
106
+ }
107
+
108
+ function initializeFile(path: string, fd: number): void {
109
+ const opened = fstatSync(fd);
110
+ checkFile(opened);
111
+ const db = new DatabaseSync(path);
112
+ try {
113
+ sameFile(path, opened);
114
+ db.exec('PRAGMA trusted_schema = OFF');
115
+ transaction(db, (database) => { database.exec(SCHEMA); });
116
+ } finally {
117
+ db.close();
118
+ }
119
+ fs.fsyncSync(fd);
120
+ }
121
+
122
+ function createFile(path: string): void {
123
+ if (metadata(path) !== null) return;
124
+ const temporary = `${path}.${randomUUID()}.tmp`;
125
+ const fd = openSync(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
126
+ try {
127
+ initializeFile(temporary, fd);
128
+ try {
129
+ fs.linkSync(temporary, path);
130
+ } catch (error) {
131
+ if (!hasCode(error, 'EEXIST')) throw error;
132
+ }
133
+ } finally {
134
+ closeSync(fd);
135
+ fs.unlinkSync(temporary);
136
+ }
137
+ syncDirectory(dirname(path));
138
+ }
139
+
140
+ function transaction<T>(db: DatabaseSync, action: (database: DatabaseSync) => T): T {
141
+ db.exec('PRAGMA journal_mode = DELETE; PRAGMA synchronous = FULL; PRAGMA foreign_keys = ON; BEGIN IMMEDIATE');
142
+ try {
143
+ const result = action(db);
144
+ db.exec('COMMIT');
145
+ return result;
146
+ } catch (error) {
147
+ db.exec('ROLLBACK');
148
+ throw error;
149
+ }
150
+ }
151
+
152
+ function useDatabase<T>(path: string, writable: boolean, action: (database: DatabaseSync) => T): T {
153
+ const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
154
+ let db: DatabaseSync | undefined;
155
+ try {
156
+ const opened = fstatSync(fd);
157
+ checkFile(opened);
158
+ companions(path);
159
+ db = new DatabaseSync(path, { readOnly: !writable });
160
+ sameFile(path, opened);
161
+ db.exec('PRAGMA busy_timeout = 5000; PRAGMA trusted_schema = OFF');
162
+ if (db.prepare('PRAGMA user_version').get()?.user_version !== 1) throw new AutomationError('corrupt-storage');
163
+ if (writable) return transaction(db, action);
164
+ if (db.prepare('PRAGMA journal_mode').get()?.journal_mode !== 'delete') throw new AutomationError('corrupt-storage');
165
+ db.exec('BEGIN');
166
+ try {
167
+ return action(db);
168
+ } finally {
169
+ db.exec('ROLLBACK');
170
+ }
171
+ } finally {
172
+ db?.close();
173
+ closeSync(fd);
174
+ }
175
+ }
176
+
177
+ function databasePath(root: string, writable: boolean, existingOnly: boolean): string | null {
178
+ const create = writable && !existingOnly;
179
+ const absolute = resolve(root);
180
+ if (!directory(absolute, create)) return null;
181
+ const path = join(absolute, FILE);
182
+ companions(path);
183
+ if (create) createFile(path);
184
+ const info = metadata(path);
185
+ if (info === null) {
186
+ if (create) throw new AutomationError('storage-unavailable');
187
+ return null;
188
+ }
189
+ checkFile(info);
190
+ return path;
191
+ }
192
+
193
+ export function validateAutomationDirectory(root: string): void {
194
+ try {
195
+ databasePath(root, false, false);
196
+ } catch (error) {
197
+ if (error instanceof AutomationError) throw error;
198
+ throw new AutomationError('storage-unavailable', { cause: error });
199
+ }
200
+ }
201
+
202
+ export function automationDatabase<T>(root: string, writable: boolean, action: (database: DatabaseSync) => T, missing: T, existingOnly = false): T {
203
+ try {
204
+ const path = databasePath(root, writable, existingOnly);
205
+ if (path === null) return missing;
206
+ const result = useDatabase(path, writable, action);
207
+ if (writable) {
208
+ companions(path);
209
+ syncDirectory(dirname(path));
210
+ }
211
+ return result;
212
+ } catch (error) {
213
+ if (error instanceof AutomationError) throw error;
214
+ throw new AutomationError('storage-unavailable', { cause: error });
215
+ }
216
+ }