@stage-labs/metro 0.1.0-beta.32 → 0.1.0-beta.321

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 (616) 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 +113 -0
  6. package/dist/claude-settings.js +40 -0
  7. package/dist/cli.js +60 -139
  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 -55
  20. package/dist/serve.js +117 -17
  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 +61 -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/claude-token.ts +3 -0
  34. package/runtime/node_modules/@metro-labs/core/src/effort.ts +21 -0
  35. package/runtime/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  36. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/events.ts +54 -6
  37. package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/ids.ts +8 -1
  38. package/runtime/node_modules/@metro-labs/core/src/is-record.ts +2 -0
  39. package/runtime/node_modules/@metro-labs/{mcp/src/stations → core/src}/lines.ts +22 -26
  40. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/protocol.ts +7 -4
  41. package/runtime/node_modules/@metro-labs/core/src/runner-activity.ts +270 -0
  42. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/secure-fs.ts +17 -0
  43. package/runtime/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
  44. package/runtime/node_modules/@metro-labs/core/src/station-names.ts +14 -0
  45. package/runtime/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
  46. package/runtime/node_modules/@metro-labs/core/src/stations/account-status.ts +26 -0
  47. package/runtime/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
  48. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/attachments.ts +9 -3
  49. package/runtime/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
  50. package/runtime/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
  51. package/runtime/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
  52. package/runtime/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
  53. package/runtime/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
  54. package/runtime/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
  55. package/runtime/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
  56. package/runtime/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
  57. package/runtime/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
  58. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/station-runtime.ts +6 -11
  59. package/runtime/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
  60. package/runtime/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
  61. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/types.ts +22 -1
  62. package/runtime/node_modules/@metro-labs/core/src/tickets.ts +44 -0
  63. package/runtime/node_modules/@metro-labs/core/src/version.ts +2 -0
  64. package/runtime/node_modules/@metro-labs/daemon/package.json +51 -0
  65. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/agent-fs.ts +246 -0
  66. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/crontab.ts +38 -0
  67. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files-api.ts +12 -0
  68. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files.ts +89 -0
  69. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/home-fs.ts +86 -0
  70. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/metro-home.ts +42 -0
  71. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/provision.ts +57 -0
  72. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedule-detail.ts +93 -0
  73. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules-api.ts +27 -0
  74. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules.ts +144 -0
  75. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/unit-files.ts +29 -0
  76. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/user.ts +101 -0
  77. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/view.ts +90 -0
  78. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-attach.ts +19 -0
  79. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-lookups.ts +55 -0
  80. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-routes.ts +78 -0
  81. package/runtime/node_modules/@metro-labs/daemon/src/agents/accounts-api.ts +383 -0
  82. package/runtime/node_modules/@metro-labs/daemon/src/agents/admin.ts +30 -0
  83. package/runtime/node_modules/@metro-labs/daemon/src/agents/allowlist.ts +59 -0
  84. package/runtime/node_modules/@metro-labs/daemon/src/agents/api.ts +134 -0
  85. package/runtime/node_modules/@metro-labs/daemon/src/agents/bundle.ts +124 -0
  86. package/runtime/node_modules/@metro-labs/daemon/src/agents/file-admin.ts +334 -0
  87. package/runtime/node_modules/@metro-labs/{mcp/src/db/file-source.ts → daemon/src/agents/files.ts} +40 -50
  88. package/runtime/node_modules/@metro-labs/{mcp/src/db/key-map.ts → daemon/src/agents/keys.ts} +1 -11
  89. package/runtime/node_modules/@metro-labs/daemon/src/agents/map.ts +135 -0
  90. package/runtime/node_modules/@metro-labs/daemon/src/agents/policy-route.ts +27 -0
  91. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-scope.ts → daemon/src/agents/scope.ts} +2 -2
  92. package/runtime/node_modules/@metro-labs/daemon/src/agents/sender-cards.ts +94 -0
  93. package/runtime/node_modules/@metro-labs/daemon/src/agents/senders.ts +38 -0
  94. package/runtime/node_modules/@metro-labs/daemon/src/approvals/api.ts +55 -0
  95. package/runtime/node_modules/@metro-labs/daemon/src/approvals/owner-line.ts +45 -0
  96. package/runtime/node_modules/@metro-labs/daemon/src/approvals/pending.ts +190 -0
  97. package/runtime/node_modules/@metro-labs/daemon/src/approvals/preview.ts +66 -0
  98. package/runtime/node_modules/@metro-labs/daemon/src/boot/boot.ts +259 -0
  99. package/runtime/node_modules/@metro-labs/daemon/src/boot/connect-hint.ts +36 -0
  100. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/crash-guard.ts +1 -1
  101. package/runtime/node_modules/@metro-labs/daemon/src/boot/local-owner.ts +21 -0
  102. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/paths.ts +3 -41
  103. package/runtime/node_modules/@metro-labs/daemon/src/channels/addressed.ts +26 -0
  104. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/inbound.ts +99 -73
  105. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/media-note.ts +11 -7
  106. package/runtime/node_modules/@metro-labs/daemon/src/channels/notice.ts +22 -0
  107. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/pending.ts +13 -1
  108. package/runtime/node_modules/@metro-labs/daemon/src/channels/react-note.ts +13 -0
  109. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +6 -2
  110. package/runtime/node_modules/@metro-labs/daemon/src/claude/api.ts +269 -0
  111. package/runtime/node_modules/@metro-labs/daemon/src/claude/cli-files.ts +28 -0
  112. package/runtime/node_modules/@metro-labs/daemon/src/claude/files.ts +359 -0
  113. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-api.ts +12 -0
  114. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-fetch.ts +160 -0
  115. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-skills.ts +255 -0
  116. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-validate.ts +53 -0
  117. package/runtime/node_modules/@metro-labs/daemon/src/claude/hooks.ts +60 -0
  118. package/runtime/node_modules/@metro-labs/daemon/src/claude/memory-routine.ts +123 -0
  119. package/runtime/node_modules/@metro-labs/daemon/src/claude/memory.ts +32 -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 +294 -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 +325 -0
  128. package/runtime/node_modules/@metro-labs/daemon/src/claude/skills.ts +123 -0
  129. package/runtime/node_modules/@metro-labs/daemon/src/connectors/agent-key.ts +145 -0
  130. package/runtime/node_modules/@metro-labs/daemon/src/connectors/enroll-api.ts +99 -0
  131. package/runtime/node_modules/@metro-labs/daemon/src/connectors/leftovers.ts +59 -0
  132. package/runtime/node_modules/@metro-labs/daemon/src/connectors/metro-api.ts +93 -0
  133. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-grant.ts +4 -4
  134. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-owner.ts +3 -3
  135. package/runtime/node_modules/@metro-labs/daemon/src/files/attach-reaper.ts +174 -0
  136. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-serve.ts +11 -19
  137. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-api.ts +10 -27
  138. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-store.ts +4 -4
  139. package/runtime/node_modules/@metro-labs/daemon/src/gateway/bedrock.ts +253 -0
  140. package/runtime/node_modules/@metro-labs/daemon/src/gateway/cache-ttl.ts +43 -0
  141. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-stream.ts +186 -0
  142. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-translate.ts +209 -0
  143. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-version.ts +44 -0
  144. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex.ts +137 -0
  145. package/runtime/node_modules/@metro-labs/daemon/src/gateway/delivered.ts +102 -0
  146. package/runtime/node_modules/@metro-labs/daemon/src/gateway/effective.ts +32 -0
  147. package/runtime/node_modules/@metro-labs/daemon/src/gateway/effort.ts +130 -0
  148. package/runtime/node_modules/@metro-labs/daemon/src/gateway/eventstream.ts +123 -0
  149. package/runtime/node_modules/@metro-labs/daemon/src/gateway/failures.ts +40 -0
  150. package/runtime/node_modules/@metro-labs/daemon/src/gateway/fallback.ts +149 -0
  151. package/runtime/node_modules/@metro-labs/daemon/src/gateway/forward.ts +305 -0
  152. package/runtime/node_modules/@metro-labs/daemon/src/gateway/frames.ts +118 -0
  153. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gateway.ts +372 -0
  154. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-api.ts +121 -0
  155. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-config.ts +150 -0
  156. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-leftovers.ts +63 -0
  157. package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter.ts +25 -0
  158. package/runtime/node_modules/@metro-labs/daemon/src/gateway/org-models.ts +203 -0
  159. package/runtime/node_modules/@metro-labs/daemon/src/gateway/routeway.ts +88 -0
  160. package/runtime/node_modules/@metro-labs/daemon/src/gateway/served.ts +18 -0
  161. package/runtime/node_modules/@metro-labs/daemon/src/gateway/subscription.ts +60 -0
  162. package/runtime/node_modules/@metro-labs/daemon/src/gateway/text.ts +33 -0
  163. package/runtime/node_modules/@metro-labs/daemon/src/gateway/tool-search.ts +126 -0
  164. package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage-refresh.ts +51 -0
  165. package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage.ts +265 -0
  166. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/accounts.ts +66 -19
  167. package/runtime/node_modules/@metro-labs/daemon/src/mcp/attachment-schema.ts +91 -0
  168. package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-bridge.ts +45 -0
  169. package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-permission.ts +25 -0
  170. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/call-tools.ts +88 -38
  171. package/runtime/node_modules/@metro-labs/daemon/src/mcp/channel-tool.ts +80 -0
  172. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
  173. package/runtime/node_modules/@metro-labs/daemon/src/mcp/diagnostics.ts +102 -0
  174. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +24 -18
  175. package/runtime/node_modules/@metro-labs/daemon/src/mcp/frame-schema.ts +44 -0
  176. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/group-tools.ts +2 -2
  177. package/runtime/node_modules/@metro-labs/daemon/src/mcp/index.ts +167 -0
  178. package/runtime/node_modules/@metro-labs/daemon/src/mcp/instructions.ts +21 -0
  179. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/member-tools.ts +2 -2
  180. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-prompt.ts +115 -0
  181. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-relay.ts +111 -0
  182. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-gate.ts +88 -0
  183. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-snapshot.ts +65 -0
  184. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-lookup.ts +60 -0
  185. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-tool.ts +96 -0
  186. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/raw-get-stream.ts +55 -17
  187. package/runtime/node_modules/@metro-labs/daemon/src/mcp/read-tool.ts +87 -0
  188. package/runtime/node_modules/@metro-labs/daemon/src/mcp/request-identity.ts +48 -0
  189. package/runtime/node_modules/@metro-labs/daemon/src/mcp/server-approvals.ts +118 -0
  190. package/runtime/node_modules/@metro-labs/daemon/src/mcp/session-slot.ts +137 -0
  191. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session.ts +103 -52
  192. package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-schema.ts +11 -0
  193. package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-send.ts +15 -0
  194. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-catalog.ts +108 -0
  195. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-def.ts +9 -0
  196. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-dispatch.ts +74 -48
  197. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +87 -114
  198. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +6 -11
  199. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/announced.ts +68 -0
  200. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/config.ts +29 -0
  201. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/connector-tools.ts +114 -0
  202. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/link.ts +197 -0
  203. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/rpc.ts +67 -0
  204. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/token.ts +50 -0
  205. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/helper-script.ts +183 -0
  206. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/imds.ts +16 -0
  207. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/install.ts +78 -0
  208. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/privilege.ts +50 -0
  209. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/root-follow.ts +16 -0
  210. package/runtime/node_modules/@metro-labs/daemon/src/monitor/api.ts +132 -0
  211. package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-event.ts +139 -0
  212. package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-events.ts +101 -0
  213. package/runtime/node_modules/@metro-labs/daemon/src/net/tunnel.ts +323 -0
  214. package/runtime/node_modules/@metro-labs/daemon/src/policy/policy.ts +120 -0
  215. package/runtime/node_modules/@metro-labs/daemon/src/routes/bearer.ts +35 -0
  216. package/runtime/node_modules/@metro-labs/daemon/src/routes/body.ts +24 -0
  217. package/runtime/node_modules/@metro-labs/daemon/src/routes/gmail-attach.ts +67 -0
  218. package/runtime/node_modules/@metro-labs/daemon/src/routes/gmail-detach.ts +37 -0
  219. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +55 -56
  220. package/runtime/node_modules/@metro-labs/daemon/src/routes/local-mode.ts +155 -0
  221. package/runtime/node_modules/@metro-labs/daemon/src/routes/pair-again.ts +23 -0
  222. package/runtime/node_modules/@metro-labs/daemon/src/routes/session-apis.ts +63 -0
  223. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-api.ts → daemon/src/routes/session.ts} +9 -7
  224. package/runtime/node_modules/@metro-labs/daemon/src/routes/threema-callback.ts +103 -0
  225. package/runtime/node_modules/@metro-labs/daemon/src/server/cloudwatch.ts +178 -0
  226. package/runtime/node_modules/@metro-labs/daemon/src/server/control.ts +39 -0
  227. package/runtime/node_modules/@metro-labs/daemon/src/server/machine.ts +58 -0
  228. package/runtime/node_modules/@metro-labs/daemon/src/server/owner.ts +26 -0
  229. package/runtime/node_modules/@metro-labs/daemon/src/server/update.ts +90 -0
  230. package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
  231. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-browser.ts +107 -0
  232. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-driver.ts +42 -0
  233. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-gmail.ts +78 -0
  234. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-inline.ts +29 -1
  235. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-interactive.ts +6 -32
  236. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-resolve.ts +84 -13
  237. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/attach-session.ts +70 -27
  238. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-xmtp.ts +8 -9
  239. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach.ts +69 -3
  240. package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/stations}/materialize.ts +50 -181
  241. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/registry.ts +26 -2
  242. package/runtime/node_modules/@metro-labs/daemon/src/stations/runtime-deps.ts +135 -0
  243. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor-io.ts +3 -3
  244. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor.ts +5 -5
  245. package/runtime/node_modules/@metro-labs/daemon/src/stations/threema-callbacks.ts +32 -0
  246. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/train-call.ts +1 -1
  247. package/runtime/node_modules/@metro-labs/daemon/src/stations/webhook-endpoints.ts +51 -0
  248. package/runtime/node_modules/@metro-labs/daemon/src/terminal/api.ts +84 -0
  249. package/runtime/node_modules/@metro-labs/daemon/src/terminal/socket.ts +124 -0
  250. package/runtime/node_modules/@metro-labs/daemon/src/terminal/tickets.ts +15 -0
  251. package/runtime/node_modules/@metro-labs/daemon/src/voice/api.ts +14 -0
  252. package/runtime/node_modules/@metro-labs/daemon/src/voice/audio.ts +193 -0
  253. package/runtime/node_modules/@metro-labs/daemon/src/voice/call.ts +191 -0
  254. package/runtime/node_modules/@metro-labs/daemon/src/voice/calls.ts +153 -0
  255. package/runtime/node_modules/@metro-labs/daemon/src/voice/peer.ts +85 -0
  256. package/runtime/node_modules/@metro-labs/daemon/src/voice/scribe.ts +115 -0
  257. package/runtime/node_modules/@metro-labs/daemon/src/voice/shared-talk.ts +85 -0
  258. package/runtime/node_modules/@metro-labs/daemon/src/voice/shared.ts +198 -0
  259. package/runtime/node_modules/@metro-labs/daemon/src/voice/speech-queue.ts +200 -0
  260. package/runtime/node_modules/@metro-labs/daemon/src/voice/speech.ts +125 -0
  261. package/runtime/node_modules/@metro-labs/daemon/src/voice/store.ts +103 -0
  262. package/runtime/node_modules/@metro-labs/discord-bot/package.json +3 -5
  263. package/runtime/node_modules/@metro-labs/discord-bot/src/accounts.ts +3 -23
  264. package/runtime/node_modules/@metro-labs/discord-bot/src/actions.ts +21 -187
  265. package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +2 -2
  266. package/runtime/node_modules/@metro-labs/discord-bot/src/channel-source.ts +79 -0
  267. package/runtime/node_modules/@metro-labs/discord-bot/src/channels.ts +186 -0
  268. package/runtime/node_modules/@metro-labs/discord-bot/src/format.ts +26 -67
  269. package/runtime/node_modules/@metro-labs/discord-bot/src/group-actions.ts +1 -1
  270. package/runtime/node_modules/@metro-labs/discord-bot/src/group.ts +2 -2
  271. package/runtime/node_modules/@metro-labs/discord-bot/src/index.ts +8 -14
  272. package/runtime/node_modules/@metro-labs/discord-bot/src/members.ts +2 -2
  273. package/runtime/node_modules/@metro-labs/discord-bot/src/profile.ts +68 -0
  274. package/runtime/node_modules/@metro-labs/discord-bot/src/send-files.ts +12 -13
  275. package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +6 -1
  276. package/runtime/node_modules/@metro-labs/gmail/package.json +27 -0
  277. package/runtime/node_modules/@metro-labs/gmail/src/accounts.ts +133 -0
  278. package/runtime/node_modules/@metro-labs/gmail/src/actions.ts +20 -0
  279. package/runtime/node_modules/@metro-labs/gmail/src/api.ts +34 -0
  280. package/runtime/node_modules/@metro-labs/gmail/src/attachments.ts +38 -0
  281. package/runtime/node_modules/@metro-labs/gmail/src/auth.ts +115 -0
  282. package/runtime/node_modules/@metro-labs/gmail/src/channels.ts +66 -0
  283. package/runtime/node_modules/@metro-labs/gmail/src/config.ts +15 -0
  284. package/runtime/node_modules/@metro-labs/gmail/src/inbound.ts +97 -0
  285. package/runtime/node_modules/@metro-labs/gmail/src/index.ts +12 -0
  286. package/runtime/node_modules/@metro-labs/gmail/src/login.ts +39 -0
  287. package/runtime/node_modules/@metro-labs/gmail/src/managed-binding.ts +33 -0
  288. package/runtime/node_modules/@metro-labs/gmail/src/managed.ts +45 -0
  289. package/runtime/node_modules/@metro-labs/gmail/src/message.ts +125 -0
  290. package/runtime/node_modules/@metro-labs/gmail/src/mime.ts +70 -0
  291. package/runtime/node_modules/@metro-labs/gmail/src/outbound.ts +125 -0
  292. package/runtime/node_modules/@metro-labs/gmail/src/query.ts +101 -0
  293. package/runtime/node_modules/@metro-labs/gmail/src/state.ts +30 -0
  294. package/runtime/node_modules/@metro-labs/gmail/src/station.ts +16 -0
  295. package/runtime/node_modules/@metro-labs/gmail/src/trust.ts +42 -0
  296. package/runtime/node_modules/@metro-labs/http/package.json +44 -0
  297. package/runtime/node_modules/@metro-labs/http/src/agent-signature.ts +95 -0
  298. package/runtime/node_modules/@metro-labs/http/src/api-http.ts +146 -0
  299. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-discovery.ts → http/src/connector-discovery.ts} +57 -27
  300. package/runtime/node_modules/@metro-labs/http/src/connector-grant.ts +8 -0
  301. package/runtime/node_modules/@metro-labs/http/src/connector-input.ts +73 -0
  302. package/runtime/node_modules/@metro-labs/http/src/connector-mcp.ts +108 -0
  303. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-client.ts → http/src/connector-oauth.ts} +60 -31
  304. package/runtime/node_modules/@metro-labs/http/src/connector-policy.ts +92 -0
  305. package/runtime/node_modules/@metro-labs/http/src/connector-public-url.ts +64 -0
  306. package/runtime/node_modules/@metro-labs/http/src/connector-reach.ts +27 -0
  307. package/runtime/node_modules/@metro-labs/http/src/connector-resource.ts +108 -0
  308. package/runtime/node_modules/@metro-labs/http/src/connector-tools.ts +101 -0
  309. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/connector-url.ts +8 -28
  310. package/runtime/node_modules/@metro-labs/http/src/ed25519.ts +56 -0
  311. package/runtime/node_modules/@metro-labs/http/src/mcp-server-protocol.ts +99 -0
  312. package/runtime/node_modules/@metro-labs/http/src/mcp-server-tools.ts +104 -0
  313. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/mode-api.ts +2 -2
  314. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-config.ts → http/src/return-to.ts} +4 -6
  315. package/runtime/node_modules/@metro-labs/http/src/sigv4.ts +90 -0
  316. package/runtime/node_modules/@metro-labs/http/src/workos-token.ts +149 -0
  317. package/runtime/node_modules/@metro-labs/outlook/package.json +25 -0
  318. package/runtime/node_modules/@metro-labs/outlook/src/accounts.ts +78 -0
  319. package/runtime/node_modules/@metro-labs/outlook/src/actions.ts +15 -0
  320. package/runtime/node_modules/@metro-labs/outlook/src/attachments.ts +81 -0
  321. package/runtime/node_modules/@metro-labs/outlook/src/auth.ts +120 -0
  322. package/runtime/node_modules/@metro-labs/outlook/src/browser.ts +42 -0
  323. package/runtime/node_modules/@metro-labs/outlook/src/channels.ts +60 -0
  324. package/runtime/node_modules/@metro-labs/outlook/src/config.ts +23 -0
  325. package/runtime/node_modules/@metro-labs/outlook/src/format.ts +59 -0
  326. package/runtime/node_modules/@metro-labs/outlook/src/graph.ts +55 -0
  327. package/runtime/node_modules/@metro-labs/outlook/src/inbound.ts +96 -0
  328. package/runtime/node_modules/@metro-labs/outlook/src/index.ts +12 -0
  329. package/runtime/node_modules/@metro-labs/outlook/src/login.ts +129 -0
  330. package/runtime/node_modules/@metro-labs/outlook/src/me.ts +31 -0
  331. package/runtime/node_modules/@metro-labs/outlook/src/outbound.ts +103 -0
  332. package/runtime/node_modules/@metro-labs/outlook/src/query.ts +84 -0
  333. package/runtime/node_modules/@metro-labs/outlook/src/state.ts +28 -0
  334. package/runtime/node_modules/@metro-labs/outlook/src/station.ts +16 -0
  335. package/runtime/node_modules/@metro-labs/outlook/src/trust.ts +41 -0
  336. package/runtime/node_modules/@metro-labs/telegram/package.json +2 -4
  337. package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +5 -24
  338. package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +27 -6
  339. package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +1 -1
  340. package/runtime/node_modules/@metro-labs/telegram/src/channels.ts +58 -0
  341. package/runtime/node_modules/@metro-labs/telegram/src/client.ts +4 -4
  342. package/runtime/node_modules/@metro-labs/telegram/src/format.ts +19 -34
  343. package/runtime/node_modules/@metro-labs/telegram/src/group.ts +3 -3
  344. package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +13 -34
  345. package/runtime/node_modules/@metro-labs/telegram/src/index.ts +4 -43
  346. package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +2 -3
  347. package/runtime/node_modules/@metro-labs/telegram/src/members.ts +1 -1
  348. package/runtime/node_modules/@metro-labs/telegram/src/profile.ts +70 -0
  349. package/runtime/node_modules/@metro-labs/telegram/src/reactions.ts +2 -2
  350. package/runtime/node_modules/@metro-labs/telegram/src/station.ts +5 -1
  351. package/runtime/node_modules/@metro-labs/telegram/src/types.ts +0 -1
  352. package/runtime/node_modules/@metro-labs/telegram-bot/package.json +2 -2
  353. package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +7 -41
  354. package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +24 -77
  355. package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +2 -2
  356. package/runtime/node_modules/@metro-labs/telegram-bot/src/channel-files.ts +3 -0
  357. package/runtime/node_modules/@metro-labs/telegram-bot/src/channels.ts +43 -0
  358. package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +46 -48
  359. package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +15 -44
  360. package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +6 -82
  361. package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +1 -1
  362. package/runtime/node_modules/@metro-labs/telegram-bot/src/observed-chats.ts +172 -0
  363. package/runtime/node_modules/@metro-labs/telegram-bot/src/profile.ts +85 -0
  364. package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +9 -1
  365. package/runtime/node_modules/@metro-labs/telegram-bot/src/types.ts +50 -15
  366. package/runtime/node_modules/@metro-labs/telegram-bot/src/updates.ts +26 -0
  367. package/runtime/node_modules/@metro-labs/threema/package.json +26 -0
  368. package/runtime/node_modules/@metro-labs/threema/src/accounts.ts +108 -0
  369. package/runtime/node_modules/@metro-labs/threema/src/actions.ts +130 -0
  370. package/runtime/node_modules/@metro-labs/threema/src/api.ts +152 -0
  371. package/runtime/node_modules/@metro-labs/threema/src/channels.ts +37 -0
  372. package/runtime/node_modules/@metro-labs/threema/src/chats.ts +88 -0
  373. package/runtime/node_modules/@metro-labs/threema/src/crypto.ts +100 -0
  374. package/runtime/node_modules/@metro-labs/threema/src/files.ts +47 -0
  375. package/runtime/node_modules/@metro-labs/threema/src/format.ts +164 -0
  376. package/runtime/node_modules/@metro-labs/threema/src/groups.ts +96 -0
  377. package/runtime/node_modules/@metro-labs/threema/src/ids.ts +21 -0
  378. package/runtime/node_modules/@metro-labs/threema/src/inbound.ts +92 -0
  379. package/runtime/node_modules/@metro-labs/threema/src/index.ts +24 -0
  380. package/runtime/node_modules/@metro-labs/threema/src/messages.ts +264 -0
  381. package/runtime/node_modules/@metro-labs/threema/src/outbound.ts +161 -0
  382. package/runtime/node_modules/@metro-labs/threema/src/station.ts +21 -0
  383. package/runtime/node_modules/@metro-labs/threema/src/verify.ts +117 -0
  384. package/runtime/node_modules/@metro-labs/webhook/package.json +2 -2
  385. package/runtime/node_modules/@metro-labs/webhook/src/station.ts +5 -8
  386. package/runtime/node_modules/@metro-labs/whatsapp/package.json +3 -6
  387. package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +6 -28
  388. package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +1 -1
  389. package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +100 -14
  390. package/runtime/node_modules/@metro-labs/whatsapp/src/app-state.ts +49 -0
  391. package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +2 -2
  392. package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +1 -1
  393. package/runtime/node_modules/@metro-labs/whatsapp/src/channel-chats.ts +137 -0
  394. package/runtime/node_modules/@metro-labs/whatsapp/src/channels.ts +48 -0
  395. package/runtime/node_modules/@metro-labs/whatsapp/src/client-history.ts +31 -0
  396. package/runtime/node_modules/@metro-labs/whatsapp/src/client-types.ts +50 -0
  397. package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +161 -84
  398. package/runtime/node_modules/@metro-labs/whatsapp/src/connection.ts +139 -0
  399. package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +7 -58
  400. package/runtime/node_modules/@metro-labs/whatsapp/src/history-events.ts +127 -0
  401. package/runtime/node_modules/@metro-labs/whatsapp/src/history-files.ts +39 -0
  402. package/runtime/node_modules/@metro-labs/whatsapp/src/history-identity.ts +58 -0
  403. package/runtime/node_modules/@metro-labs/whatsapp/src/history-message.ts +161 -0
  404. package/runtime/node_modules/@metro-labs/whatsapp/src/history-state.ts +344 -0
  405. package/runtime/node_modules/@metro-labs/whatsapp/src/history-types.ts +91 -0
  406. package/runtime/node_modules/@metro-labs/whatsapp/src/history.ts +195 -0
  407. package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +11 -28
  408. package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +4 -37
  409. package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +1 -1
  410. package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +37 -4
  411. package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +1 -1
  412. package/runtime/node_modules/@metro-labs/whatsapp/src/members.ts +94 -0
  413. package/runtime/node_modules/@metro-labs/whatsapp/src/messages.ts +91 -0
  414. package/runtime/node_modules/@metro-labs/whatsapp/src/names.ts +106 -0
  415. package/runtime/node_modules/@metro-labs/whatsapp/src/parse.ts +44 -0
  416. package/runtime/node_modules/@metro-labs/whatsapp/src/profile.ts +158 -0
  417. package/runtime/node_modules/@metro-labs/whatsapp/src/resolve.ts +52 -0
  418. package/runtime/node_modules/@metro-labs/whatsapp/src/send-expiry.ts +65 -0
  419. package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +26 -1
  420. package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +5 -9
  421. package/runtime/node_modules/@metro-labs/whatsapp/src/types.ts +0 -1
  422. package/runtime/node_modules/@metro-labs/xmtp/package.json +4 -3
  423. package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +10 -20
  424. package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +2 -2
  425. package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +55 -224
  426. package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +55 -54
  427. package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +114 -223
  428. package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +58 -15
  429. package/runtime/node_modules/@metro-labs/xmtp/src/call-leftovers.ts +48 -0
  430. package/runtime/node_modules/@metro-labs/xmtp/src/channels.ts +56 -0
  431. package/runtime/node_modules/@metro-labs/xmtp/src/codecs.ts +114 -3
  432. package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +36 -20
  433. package/runtime/node_modules/@metro-labs/xmtp/src/delete-requests.ts +34 -0
  434. package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +38 -25
  435. package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +8 -18
  436. package/runtime/node_modules/@metro-labs/xmtp/src/frames.ts +190 -0
  437. package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +1 -1
  438. package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +2 -2
  439. package/runtime/node_modules/@metro-labs/xmtp/src/identity.ts +30 -16
  440. package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +18 -70
  441. package/runtime/node_modules/@metro-labs/xmtp/src/labels.ts +102 -50
  442. package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +1 -1
  443. package/runtime/node_modules/@metro-labs/xmtp/src/names.ts +61 -0
  444. package/runtime/node_modules/@metro-labs/xmtp/src/network.ts +114 -0
  445. package/runtime/node_modules/@metro-labs/xmtp/src/profile.ts +160 -0
  446. package/runtime/node_modules/@metro-labs/xmtp/src/read-attachments.ts +37 -0
  447. package/runtime/node_modules/@metro-labs/xmtp/src/resolve.ts +44 -0
  448. package/runtime/node_modules/@metro-labs/xmtp/src/sender.ts +112 -0
  449. package/runtime/node_modules/@metro-labs/xmtp/src/smart.ts +79 -0
  450. package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +10 -2
  451. package/runtime/node_modules/@metro-labs/xmtp/src/stream.ts +66 -0
  452. package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +32 -60
  453. package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +78 -49
  454. package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +4 -6
  455. package/runtime/node_modules/@metro-labs/xmtp/src/verify.ts +19 -5
  456. package/runtime/node_modules/@metro-labs/xmtp/src/wallet.ts +28 -0
  457. package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +14 -4
  458. package/runtime/patches/5bca2c07d5852d3f58453cff0448dd85da13d3665b61e3d758905b298d432d7c.patch +31 -0
  459. package/runtime/runtime.json +1 -1
  460. package/runtime/sdk-runner/node_modules/@metro-labs/core/package.json +61 -0
  461. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-files.ts +216 -0
  462. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-store.ts +171 -0
  463. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-types.ts +141 -0
  464. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/call.ts +81 -0
  465. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/claude-token.ts +3 -0
  466. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/effort.ts +21 -0
  467. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  468. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/events.ts +165 -0
  469. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/ids.ts +28 -0
  470. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/is-record.ts +2 -0
  471. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/lines.ts +78 -0
  472. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/log.ts +42 -0
  473. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/protocol.ts +227 -0
  474. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/runner-activity.ts +270 -0
  475. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/secure-fs.ts +74 -0
  476. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
  477. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/station-names.ts +14 -0
  478. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
  479. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-status.ts +26 -0
  480. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
  481. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/attachments.ts +202 -0
  482. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
  483. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
  484. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
  485. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
  486. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
  487. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
  488. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
  489. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
  490. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
  491. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/station-runtime.ts +59 -0
  492. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
  493. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
  494. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/types.ts +128 -0
  495. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/str.ts +5 -0
  496. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/tickets.ts +44 -0
  497. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/train-error.ts +53 -0
  498. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/version.ts +2 -0
  499. package/runtime/sdk-runner/runner.json +10 -0
  500. package/runtime/sdk-runner/src/activity-tasks.ts +194 -0
  501. package/runtime/sdk-runner/src/activity.ts +392 -0
  502. package/runtime/sdk-runner/src/app.ts +87 -0
  503. package/runtime/sdk-runner/src/approvals.ts +37 -0
  504. package/runtime/sdk-runner/src/automation-cli.ts +10 -0
  505. package/runtime/sdk-runner/src/automation-command.ts +151 -0
  506. package/runtime/sdk-runner/src/automation.ts +145 -0
  507. package/runtime/sdk-runner/src/calls.ts +133 -0
  508. package/runtime/sdk-runner/src/channel-text.ts +26 -0
  509. package/runtime/sdk-runner/src/config.ts +50 -0
  510. package/runtime/sdk-runner/src/errors.ts +142 -0
  511. package/runtime/sdk-runner/src/inbox.ts +168 -0
  512. package/runtime/sdk-runner/src/input-queue.ts +77 -0
  513. package/runtime/sdk-runner/src/input-timing.ts +68 -0
  514. package/runtime/sdk-runner/src/link.ts +154 -0
  515. package/runtime/sdk-runner/src/main.ts +57 -0
  516. package/runtime/sdk-runner/src/recovery.ts +46 -0
  517. package/runtime/sdk-runner/src/rules.ts +28 -0
  518. package/runtime/sdk-runner/src/runner.ts +358 -0
  519. package/runtime/sdk-runner/src/session-store.ts +129 -0
  520. package/runtime/sdk-runner/src/session-watch.ts +158 -0
  521. package/runtime/sdk-runner/src/singleton.ts +15 -0
  522. package/runtime/sdk-runner/src/skill-work.ts +76 -0
  523. package/runtime/sdk-runner/src/skills-files.ts +169 -0
  524. package/runtime/sdk-runner/src/skills.ts +150 -0
  525. package/runtime/sdk-runner/src/task-ledger.ts +244 -0
  526. package/runtime/sdk-runner/src/task-recovery.ts +203 -0
  527. package/runtime/sdk-runner/src/task-state.ts +77 -0
  528. package/runtime/sdk-runner/src/tool-proxy.ts +40 -0
  529. package/runtime/server.ts +1 -0
  530. package/runtime/stations.json +43 -0
  531. package/skills/MEMORY.md +78 -0
  532. package/skills/METRO.md +35 -0
  533. package/skills/STAGE.md +110 -0
  534. package/dist/bedrock-eventstream.js +0 -120
  535. package/dist/bedrock-proxy.js +0 -260
  536. package/dist/bedrock-upstream.js +0 -72
  537. package/dist/bedrock.js +0 -106
  538. package/dist/claude.js +0 -15
  539. package/dist/plugin.js +0 -82
  540. package/dist/prompt.js +0 -61
  541. package/dist/store.js +0 -93
  542. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-speak.ts +0 -195
  543. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-transcribe.ts +0 -292
  544. package/runtime/node_modules/@metro-labs/discord-bot/src/voice.ts +0 -197
  545. package/runtime/node_modules/@metro-labs/discord-bot/src/wire.ts +0 -5
  546. package/runtime/node_modules/@metro-labs/mcp/package.json +0 -67
  547. package/runtime/node_modules/@metro-labs/mcp/src/channels/dedupe.ts +0 -24
  548. package/runtime/node_modules/@metro-labs/mcp/src/daemon/account-api.ts +0 -311
  549. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-api.ts +0 -333
  550. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-connector-api.ts +0 -150
  551. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-pair.ts +0 -20
  552. package/runtime/node_modules/@metro-labs/mcp/src/daemon/api-http.ts +0 -153
  553. package/runtime/node_modules/@metro-labs/mcp/src/daemon/boot.ts +0 -368
  554. package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair-api.ts +0 -134
  555. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-api.ts +0 -313
  556. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-json.ts +0 -21
  557. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-oauth-routes.ts +0 -157
  558. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-oauth.ts +0 -127
  559. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-tools.ts +0 -100
  560. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-verify.ts +0 -333
  561. package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity.ts +0 -86
  562. package/runtime/node_modules/@metro-labs/mcp/src/daemon/local-mode.ts +0 -158
  563. package/runtime/node_modules/@metro-labs/mcp/src/daemon/local-secret.ts +0 -21
  564. package/runtime/node_modules/@metro-labs/mcp/src/daemon/oauth-pending.ts +0 -65
  565. package/runtime/node_modules/@metro-labs/mcp/src/daemon/pair-codes.ts +0 -58
  566. package/runtime/node_modules/@metro-labs/mcp/src/daemon/project-api.ts +0 -214
  567. package/runtime/node_modules/@metro-labs/mcp/src/daemon/relay.ts +0 -303
  568. package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-api.ts +0 -139
  569. package/runtime/node_modules/@metro-labs/mcp/src/daemon/runtime-source.ts +0 -105
  570. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session-apis.ts +0 -52
  571. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session.ts +0 -218
  572. package/runtime/node_modules/@metro-labs/mcp/src/daemon/siwe-auth.ts +0 -82
  573. package/runtime/node_modules/@metro-labs/mcp/src/daemon/siwe-nonces.ts +0 -43
  574. package/runtime/node_modules/@metro-labs/mcp/src/daemon/siwe-routes.ts +0 -89
  575. package/runtime/node_modules/@metro-labs/mcp/src/daemon/tunnel.ts +0 -169
  576. package/runtime/node_modules/@metro-labs/mcp/src/db/account-attach.ts +0 -91
  577. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-admin.ts +0 -214
  578. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-connectors.ts +0 -143
  579. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-map.ts +0 -71
  580. package/runtime/node_modules/@metro-labs/mcp/src/db/client.ts +0 -37
  581. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-config.ts +0 -147
  582. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-relay.ts +0 -126
  583. package/runtime/node_modules/@metro-labs/mcp/src/db/connectors.ts +0 -308
  584. package/runtime/node_modules/@metro-labs/mcp/src/db/file-admin.ts +0 -250
  585. package/runtime/node_modules/@metro-labs/mcp/src/db/projects.ts +0 -309
  586. package/runtime/node_modules/@metro-labs/mcp/src/db/runtime-admin.ts +0 -24
  587. package/runtime/node_modules/@metro-labs/mcp/src/db/runtimes.ts +0 -105
  588. package/runtime/node_modules/@metro-labs/mcp/src/db/schema.ts +0 -118
  589. package/runtime/node_modules/@metro-labs/mcp/src/db/token-carry.ts +0 -45
  590. package/runtime/node_modules/@metro-labs/mcp/src/db/users.ts +0 -72
  591. package/runtime/node_modules/@metro-labs/mcp/src/db/whatsapp-login.ts +0 -18
  592. package/runtime/node_modules/@metro-labs/mcp/src/mcp/channel-owner.ts +0 -29
  593. package/runtime/node_modules/@metro-labs/mcp/src/mcp/frame-scope.ts +0 -21
  594. package/runtime/node_modules/@metro-labs/mcp/src/mcp/index.ts +0 -192
  595. package/runtime/node_modules/@metro-labs/mcp/src/mcp/permission-relay.ts +0 -66
  596. package/runtime/node_modules/@metro-labs/mcp/src/mcp/request-identity.ts +0 -73
  597. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-registry.ts +0 -172
  598. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-route.ts +0 -43
  599. package/runtime/node_modules/@metro-labs/mcp/src/monitor/api.ts +0 -240
  600. package/runtime/node_modules/@metro-labs/mcp/src/server.ts +0 -2
  601. package/runtime/node_modules/@metro-labs/mcp/src/stations/account-store.ts +0 -80
  602. package/runtime/node_modules/@metro-labs/mcp/src/stations/messaging-normalize.ts +0 -88
  603. package/runtime/node_modules/@metro-labs/telegram/src/normalize.ts +0 -22
  604. package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +0 -1
  605. package/runtime/node_modules/@metro-labs/telegram-bot/src/wire.ts +0 -3
  606. package/runtime/node_modules/@metro-labs/whatsapp/src/normalize.ts +0 -22
  607. package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +0 -5
  608. package/runtime/node_modules/@metro-labs/xmtp/src/actions-push.ts +0 -87
  609. package/runtime/node_modules/@metro-labs/xmtp/src/emit-core.ts +0 -55
  610. package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +0 -349
  611. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/log.ts +0 -0
  612. /package/runtime/node_modules/@metro-labs/{mcp/src/mcp → core/src}/str.ts +0 -0
  613. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/train-error.ts +0 -0
  614. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/webhook-note.ts +0 -0
  615. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-error.ts +0 -0
  616. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/cors.ts +0 -0
package/dist/cli.js CHANGED
@@ -1,167 +1,88 @@
1
1
  #!/usr/bin/env node
2
- import { hostname } from 'node:os';
3
- import { claimCode, claimRuntime, mcpServers, NotSignedIn, whoisAuthorized, } from './api.js';
4
- import { askSecret } from './prompt.js';
5
- import { clearToken, credentialsPath, metroUrl, metroWebUrl, writeToken, } from './store.js';
6
- import { detach, lockedBy, probe, runningPid, stopAll, tail } from './control.js';
2
+ import { whoisAuthorized } from './api.js';
3
+ import { stopAll } from './control.js';
7
4
  import { tailEvents } from './tail.js';
8
- import { assertAgentId, daemonPlan, localUrl, readRunToken, runDaemon, runtimeDir, writeRunToken, } from './runtime.js';
9
- import { launchClaude } from './claude.js';
10
- import { bedrock } from './bedrock.js';
11
- import { installPlugin, syncPluginServers } from './plugin.js';
5
+ import { agentSession } from './agent.js';
6
+ import { automationCommand } from './automation.js';
7
+ import { memoryPaths, memoryRoutine } from './memory.js';
12
8
  import { update } from './update.js';
13
9
  import { serve } from './serve.js';
10
+ import { service, serviceStopHint } from './service.js';
14
11
  import { currentVersion } from './version.js';
15
- const USAGE = `metro — the command line for your MCP connectors
12
+ const USAGE = `metro: run your agent on this machine
16
13
 
17
- metro start <agent-id> [--detach]
18
- run that agent's stations on this machine
19
- metro serve [--port <n>]
20
- run a daemon of your own: its agents and stations live in ~/.metro/agents
21
- here, and metro.box manages it through the link it prints
22
- metro stop [agent-id]
23
- stop every metro daemon on this machine, however it was started
24
- metro status <agent-id>
25
- is it running, and is it healthy
26
- metro logs <agent-id> [-f]
27
- show the detached daemon's log
28
- metro tail <agent-id>
14
+ metro serve [--port <n>] [--owner <organization id>]
15
+ run the daemon: the agent, its channels and its connectors live in
16
+ ~/.metro/agents here, and it is published through Tailscale Funnel at a
17
+ permanent https://<machine>.<tailnet>.ts.net (Tailscale installed and
18
+ signed in on this machine); the page at metro.box manages it through the
19
+ link it prints; --owner names the organization whose members may sign
20
+ in, needed on the first start only; Stop on the page parks the daemon and keeps the
21
+ address, so Start works from the page too
22
+ metro service install [--port <n>] [--owner <organization id>] [--user metro]
23
+ run metro serve as a service (systemd on Linux, launchd on macOS): it
24
+ starts at boot and after a crash, so the page can stop, start and
25
+ restart it with no shell; on Linux, root passes --user metro so Metro
26
+ runs as its own user and Claude Code as the user agent;
27
+ metro service uninstall and status as well
28
+ metro stop stop metro on this machine, metro serve included
29
+ metro tail [agent-id]
29
30
  follow this machine's inbound events, one JSON line each
30
- metro login [code]
31
- authorize this machine for one agent with a code from its page
32
- metro logout forget this machine's sign-in
33
- metro whoami print the account and agent this machine may read
34
- metro mcp print the mcpServers block of the authorized agent's connectors
35
- metro plugin set up the Claude Code plugin (connector servers + /metro:login)
36
- metro claude [args...]
37
- open Claude Code with the metro channel; every argument is passed through
38
- metro bedrock [args...]
39
- the same, with inference on Amazon Bedrock through a local proxy so the
40
- channel still works (needs AWS_BEARER_TOKEN_BEDROCK and AWS_REGION)
41
- metro update update to the newest published version
31
+ metro whoami print the agent this machine runs
32
+ metro agent run chat, calls and background workers in one Agent SDK conversation,
33
+ using the Model page's model through the daemon's model gateway;
34
+ resume it after a restart; call audio runs independently
35
+ metro agent --prepare
36
+ install the Agent SDK runtime and the Claude Code it bundles if needed,
37
+ and check that it runs, without starting a session or connecting to chat
38
+ metro task submit <routine> <prompt-file> [--slot <UTC ISO timestamp>] [--dry-run]
39
+ metro task status [routine]
40
+ metro task finish <uuid> <token> completed|blocked
41
+ queue work without starting a session, or read safe local task metadata;
42
+ default slot is the current UTC hour; use --slot for other cadences;
43
+ accepted is saved, not executed; finish awaits runner verification;
44
+ --dry-run writes nothing; local authorization is not fresh owner approval
45
+ metro memory [skill file]
46
+ run the memory routine once: when Claude Code transcripts changed since
47
+ the last run, the Claude Code bundled with the Agent SDK reads the memory
48
+ skill (or the file given) and files them into its memory, with no metro
49
+ tools and writes only inside the memory folder
50
+ metro update update to the newest published version (--check only reports)
42
51
  metro version print this CLI's version
43
52
 
44
- Start Claude Code with all of them, without writing them to disk:
45
-
46
- claude --mcp-config <(metro mcp)
47
-
48
- METRO_URL the metro to talk to (default https://mcp.metro.box)
49
- METRO_UI_URL where the web UI lives (default https://metro.box)
50
- METRO_TOKEN use this agent sign-in instead of the stored one; with neither,
51
- a machine running metro start uses its run token
52
- METRO_RUN_TOKEN use this runtime authorization instead of the stored one
53
- METRO_BEDROCK_MODEL
54
- send every request to this Bedrock model id (default: derive from the
55
- model Claude Code asks for, e.g. eu.anthropic.claude-sonnet-4-6)
53
+ METRO_WEBHOOK_PORT the daemon's port (default 8420)
54
+ METRO_AGENTS_DIR where the agents live (default ~/.metro/agents)
55
+ METRO_AGENT_KEY the key metro tail presents, instead of the agent file's
56
56
  METRO_RUNTIME_DIR run the daemon from this directory instead of the bundled one
57
57
  `;
58
- function hostLabel() {
59
- const name = hostname().trim();
60
- return name === '' ? 'unnamed machine' : name;
61
- }
62
- async function authorizeRuntime(agentId) {
63
- process.stderr.write(`Authorize this machine at ${metroWebUrl()}/#/authorize/${agentId}\n`);
64
- const code = (await askSecret('Paste the code (input is hidden): ')).trim();
65
- if (code === '')
66
- throw new Error('no code given');
67
- const claimed = await claimRuntime(code, hostLabel());
68
- writeRunToken(claimed.agent, claimed.token);
69
- process.stderr.write(`Authorized as '${claimed.label}'.\n`);
70
- return claimed.token;
71
- }
72
- async function start(argv) {
73
- const agentId = assertAgentId(argv[0]);
74
- if (runningPid(agentId) !== null || lockedBy() !== null)
75
- throw new Error('a metro daemon is already running on this machine. ' +
76
- 'Stop it first: metro stop');
77
- const dir = runtimeDir();
78
- const token = readRunToken(agentId) ?? (await authorizeRuntime(agentId));
79
- const detached = argv.includes('--detach');
80
- const plan = daemonPlan({ agentId, token, dir });
81
- if (!detached)
82
- return runDaemon(agentId, plan);
83
- const pid = detach({ agentId, ...plan });
84
- process.stderr.write(`metro is running for ${agentId} (pid ${String(pid)})\n` +
85
- ` logs: metro logs ${agentId} -f\n` +
86
- ` stop: metro stop ${agentId}\n`);
87
- return 0;
88
- }
89
- async function stopDaemon(argv) {
90
- const agentId = argv[0] === undefined ? undefined : assertAgentId(argv[0]);
91
- const stopped = await stopAll(agentId);
58
+ async function stopDaemon() {
59
+ const stopped = await stopAll();
92
60
  if (stopped.length === 0) {
93
61
  process.stderr.write('no metro daemon is running on this machine\n');
94
62
  return 1;
95
63
  }
96
64
  for (const d of stopped)
97
65
  process.stderr.write(`Stopped metro (pid ${String(d.pid)}, via ${d.via})\n`);
66
+ const hint = serviceStopHint();
67
+ if (hint !== null)
68
+ process.stderr.write(`${hint}\n`);
98
69
  return 0;
99
70
  }
100
- async function status(argv) {
101
- const agentId = assertAgentId(argv[0]);
102
- const pid = runningPid(agentId);
103
- if (pid === null) {
104
- process.stdout.write(`${agentId}: not running\n`);
105
- return 1;
106
- }
107
- const health = await probe(localUrl());
108
- process.stdout.write(`${agentId}: running (pid ${String(pid)}) · ` +
109
- (health === null
110
- ? `not answering on ${localUrl()}\n`
111
- : `healthy, up ${String(health.uptime)}s\n`));
112
- return health === null ? 1 : 0;
113
- }
114
- function logs(argv) {
115
- const agentId = assertAgentId(argv[0]);
116
- return tail(agentId, argv.includes('-f') || argv.includes('--follow'));
117
- }
118
- async function pastedCode(given) {
119
- if (given !== undefined && given.trim() !== '')
120
- return given.trim();
121
- process.stderr.write(`Get a pairing code from the agent's page, or pick the agent at ${metroWebUrl()}/#/authorize\n`);
122
- return askSecret('Paste the code here (input is hidden): ');
123
- }
124
- async function login(given) {
125
- const { token, email, agent } = await claimCode(await pastedCode(given));
126
- writeToken(token);
127
- process.stderr.write(`Authorized '${agent}' for ${email}. Stored in ${credentialsPath()}\n`);
128
- if (syncPluginServers())
129
- process.stderr.write('Claude Code plugin refreshed — new sessions have the connectors; ' +
130
- 'run /reload-plugins in any session already open.\n');
131
- }
132
- async function whoami() {
133
- const { email, agent } = await whoisAuthorized();
134
- process.stdout.write(`${email} · agent '${agent}' on ${metroUrl()}\n`);
135
- }
136
71
  const HELP = new Set([undefined, 'help', '--help', '-h']);
137
72
  const COMMANDS = {
138
- login: async () => {
139
- await login(process.argv[3]);
140
- return 0;
141
- },
142
- logout: async () => {
143
- clearToken();
144
- process.stderr.write('Signed out.\n');
145
- return Promise.resolve(0);
146
- },
147
73
  whoami: async () => {
148
- await whoami();
74
+ const { agent, where } = await whoisAuthorized();
75
+ process.stdout.write(`agent ${agent} on ${where}\n`);
149
76
  return 0;
150
77
  },
151
- start: () => start(process.argv.slice(3)),
152
78
  serve: () => serve(process.argv.slice(3)),
153
- stop: () => stopDaemon(process.argv.slice(3)),
154
- status: () => status(process.argv.slice(3)),
155
- logs: () => logs(process.argv.slice(3)),
79
+ service: () => service(process.argv.slice(3)),
80
+ stop: stopDaemon,
156
81
  tail: () => tailEvents(process.argv.slice(3)),
157
- mcp: async () => {
158
- process.stdout.write(`${await mcpServers()}\n`);
159
- return 0;
160
- },
161
- plugin: installPlugin,
162
- claude: () => launchClaude(process.argv.slice(3)),
163
- bedrock: () => bedrock(process.argv.slice(3)),
164
- update,
82
+ agent: () => agentSession(process.argv.slice(3)),
83
+ task: () => automationCommand(process.argv.slice(3)),
84
+ memory: () => memoryRoutine(memoryPaths(process.env, process.argv[3])),
85
+ update: () => update(process.argv.slice(3)),
165
86
  version: async () => {
166
87
  process.stdout.write(`${currentVersion()}\n`);
167
88
  return Promise.resolve(0);
@@ -177,6 +98,6 @@ async function run(command) {
177
98
  const code = await run(process.argv[2]).catch((err) => {
178
99
  const message = err instanceof Error ? err.message : String(err);
179
100
  process.stderr.write(`metro: ${message}\n`);
180
- return err instanceof NotSignedIn ? 2 : 1;
101
+ return 1;
181
102
  });
182
103
  process.exit(code);
package/dist/control.js CHANGED
@@ -1,23 +1,13 @@
1
- import { execFileSync, spawn } from 'node:child_process';
2
- import { existsSync, mkdirSync, openSync, readdirSync, readFileSync, rmSync, writeFileSync, } from 'node:fs';
1
+ import { execFileSync } from 'node:child_process';
2
+ import { readFileSync, rmSync } from 'node:fs';
3
3
  import { homedir } from 'node:os';
4
4
  import { join } from 'node:path';
5
- const STATE = () => join(homedir(), '.metro');
6
- const pidPath = (agentId) => join(STATE(), `run-${agentId}.pid`);
7
- export const logPath = (agentId) => join(STATE(), 'logs', `${agentId}.log`);
8
- function ensureStateDirs() {
9
- mkdirSync(STATE(), { recursive: true, mode: 0o700 });
10
- mkdirSync(join(STATE(), 'logs'), { recursive: true, mode: 0o700 });
11
- }
12
- function readPid(agentId) {
13
- try {
14
- const pid = Number(readFileSync(pidPath(agentId), 'utf8').trim());
15
- return Number.isInteger(pid) && pid > 0 ? pid : null;
16
- }
17
- catch {
18
- return null;
19
- }
5
+ export function serveStateDir() {
6
+ const xdg = process.env.XDG_CACHE_HOME?.trim();
7
+ const base = xdg === undefined || xdg === '' ? join(homedir(), '.cache') : xdg;
8
+ return join(base, 'metro', 'serve');
20
9
  }
10
+ const serveLockPath = () => join(serveStateDir(), '.tail-lock');
21
11
  function isAlive(pid) {
22
12
  try {
23
13
  process.kill(pid, 0);
@@ -27,37 +17,6 @@ function isAlive(pid) {
27
17
  return false;
28
18
  }
29
19
  }
30
- export function runningPid(agentId) {
31
- const pid = readPid(agentId);
32
- if (pid === null)
33
- return null;
34
- if (isAlive(pid))
35
- return pid;
36
- rmSync(pidPath(agentId), { force: true });
37
- return null;
38
- }
39
- function writePid(agentId, pid) {
40
- writeFileSync(pidPath(agentId), String(pid));
41
- }
42
- function clearPid(agentId) {
43
- rmSync(pidPath(agentId), { force: true });
44
- }
45
- export function detach(opts) {
46
- ensureStateDirs();
47
- const out = openSync(logPath(opts.agentId), 'a');
48
- const child = spawn(opts.command, opts.args, {
49
- cwd: opts.cwd,
50
- env: opts.env,
51
- detached: true,
52
- stdio: ['ignore', out, out],
53
- });
54
- child.unref();
55
- const pid = child.pid ?? 0;
56
- if (pid === 0)
57
- throw new Error('could not start the metro daemon');
58
- writePid(opts.agentId, pid);
59
- return pid;
60
- }
61
20
  async function stopPid(pid, waitMs) {
62
21
  process.kill(pid, 'SIGTERM');
63
22
  const until = Date.now() + waitMs;
@@ -83,10 +42,10 @@ function commandOf(pid) {
83
42
  }
84
43
  }
85
44
  const looksLikeMetro = (command) => command.includes('server.ts') || command.includes('metro');
86
- export function lockedBy() {
45
+ function holderOf(lockFile) {
87
46
  let pid;
88
47
  try {
89
- pid = Number(readFileSync(lockPath(), 'utf8').trim());
48
+ pid = Number(readFileSync(lockFile, 'utf8').trim());
90
49
  }
91
50
  catch {
92
51
  return null;
@@ -95,64 +54,21 @@ export function lockedBy() {
95
54
  return null;
96
55
  return looksLikeMetro(commandOf(pid)) ? pid : null;
97
56
  }
98
- function trackedAgents(agentId) {
99
- const tracked = new Set();
100
- if (agentId !== undefined)
101
- tracked.add(agentId);
102
- try {
103
- for (const name of readdirSync(STATE())) {
104
- const found = /^run-(.+)\.pid$/.exec(name);
105
- if (found?.[1] !== undefined)
106
- tracked.add(found[1]);
107
- }
108
- }
109
- catch {
110
- return tracked;
111
- }
112
- return tracked;
113
- }
114
- export async function stopAll(agentId, waitMs = 10_000) {
57
+ export const lockedBy = () => holderOf(lockPath());
58
+ export const serveLockedBy = () => holderOf(serveLockPath());
59
+ export async function stopAll(waitMs = 10_000) {
115
60
  const stopped = [];
116
- const seen = new Set();
117
- for (const id of trackedAgents(agentId)) {
118
- const pid = runningPid(id);
119
- if (pid === null || seen.has(pid))
120
- continue;
121
- seen.add(pid);
122
- await stopPid(pid, waitMs);
123
- clearPid(id);
124
- stopped.push({ pid, via: id });
125
- }
126
61
  const holder = lockedBy();
127
- if (holder !== null && !seen.has(holder)) {
62
+ if (holder !== null) {
128
63
  await stopPid(holder, waitMs);
129
64
  rmSync(lockPath(), { force: true });
130
65
  stopped.push({ pid: holder, via: 'the machine lock' });
131
66
  }
132
- return stopped;
133
- }
134
- export function tail(agentId, follow) {
135
- const path = logPath(agentId);
136
- if (!existsSync(path))
137
- throw new Error(`no log for ${agentId} yet — it is only written when started with --detach`);
138
- const args = follow ? ['-n', '200', '-f', path] : ['-n', '200', path];
139
- const child = spawn('tail', args, { stdio: ['ignore', 'inherit', 'inherit'] });
140
- return new Promise((resolve) => {
141
- child.on('exit', (code) => {
142
- resolve(code ?? 0);
143
- });
144
- });
145
- }
146
- export async function probe(url) {
147
- try {
148
- const res = await fetch(`${url}/health`, {
149
- signal: AbortSignal.timeout(3_000),
150
- });
151
- if (!res.ok)
152
- return null;
153
- return (await res.json());
154
- }
155
- catch {
156
- return null;
67
+ const served = serveLockedBy();
68
+ if (served !== null && served !== holder) {
69
+ await stopPid(served, waitMs);
70
+ rmSync(serveLockPath(), { force: true });
71
+ stopped.push({ pid: served, via: 'metro serve' });
157
72
  }
73
+ return stopped;
158
74
  }
package/dist/hold.js ADDED
@@ -0,0 +1,210 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { readFileSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { createServer } from 'node:http';
4
+ const FUNNEL_RETRY_MS = 2_000;
5
+ const FUNNEL_EXIT_WAIT_MS = 5_000;
6
+ const LISTEN_ATTEMPTS = 10;
7
+ const LISTEN_RETRY_MS = 500;
8
+ const STOPPED = 503;
9
+ export const STOPPED_MESSAGE = 'metro is stopped on this machine. Start it from the Server page on metro.box, or run metro serve.';
10
+ const wait = (ms) => new Promise((r) => setTimeout(r, ms));
11
+ function corsHeaders(req) {
12
+ return {
13
+ 'access-control-allow-origin': req.headers.origin ?? '*',
14
+ 'access-control-allow-methods': 'GET, POST, PUT, DELETE, OPTIONS',
15
+ 'access-control-allow-headers': 'Authorization, Content-Type',
16
+ 'access-control-allow-private-network': 'true',
17
+ 'access-control-max-age': '86400',
18
+ vary: 'Origin',
19
+ };
20
+ }
21
+ function sendJson(req, res, status, body) {
22
+ res.writeHead(status, {
23
+ 'content-type': 'application/json',
24
+ 'cache-control': 'no-store',
25
+ ...corsHeaders(req),
26
+ });
27
+ res.end(JSON.stringify(body));
28
+ }
29
+ function holdRequest(req, res, info, onStart) {
30
+ const path = (req.url ?? '').split('?')[0] ?? '';
31
+ if (req.method === 'OPTIONS') {
32
+ res.writeHead(204, corsHeaders(req)).end();
33
+ return;
34
+ }
35
+ if (path === '/api/mode' && req.method === 'GET') {
36
+ sendJson(req, res, 200, {
37
+ mode: 'local',
38
+ owner: info.owner,
39
+ version: info.version,
40
+ stopped: true,
41
+ });
42
+ return;
43
+ }
44
+ if (path === '/api/start') {
45
+ if (req.method !== 'POST') {
46
+ sendJson(req, res, 405, { error: 'method not allowed' });
47
+ return;
48
+ }
49
+ sendJson(req, res, 200, { starting: true });
50
+ onStart();
51
+ return;
52
+ }
53
+ if (path === '/health' || path === '/healthz') {
54
+ sendJson(req, res, STOPPED, { status: 'stopped', version: info.version });
55
+ return;
56
+ }
57
+ sendJson(req, res, STOPPED, { error: STOPPED_MESSAGE, stopped: true });
58
+ }
59
+ export const holdServer = (info, onStart) => createServer((req, res) => {
60
+ holdRequest(req, res, info, onStart);
61
+ });
62
+ const lastLine = (chunk) => String(chunk).trim().split('\n').at(-1) ?? '';
63
+ class HeldFunnel {
64
+ bin;
65
+ port;
66
+ log;
67
+ child = null;
68
+ closed = false;
69
+ timer = null;
70
+ exits = 0;
71
+ constructor(bin, port, log) {
72
+ this.bin = bin;
73
+ this.port = port;
74
+ this.log = log;
75
+ }
76
+ start() {
77
+ if (this.closed)
78
+ return;
79
+ const child = spawn(this.bin, ['funnel', String(this.port)], { stdio: ['ignore', 'pipe', 'pipe'] });
80
+ this.child = child;
81
+ let last = '';
82
+ const read = (chunk) => {
83
+ const line = lastLine(chunk);
84
+ if (line !== '')
85
+ last = line;
86
+ };
87
+ child.stdout?.on('data', read);
88
+ child.stderr?.on('data', read);
89
+ child.on('error', (err) => {
90
+ this.child = null;
91
+ this.closed = true;
92
+ this.log(`funnel could not start (${err.message}); the loopback address is still held`);
93
+ });
94
+ child.on('exit', () => {
95
+ this.child = null;
96
+ if (this.closed)
97
+ return;
98
+ this.exits += 1;
99
+ if (this.exits > 1)
100
+ this.log(`funnel exited (${last}); retrying in ${String(FUNNEL_RETRY_MS / 1000)}s`);
101
+ this.timer = setTimeout(() => {
102
+ this.start();
103
+ }, FUNNEL_RETRY_MS);
104
+ });
105
+ }
106
+ async stop() {
107
+ this.closed = true;
108
+ if (this.timer !== null)
109
+ clearTimeout(this.timer);
110
+ const child = this.child;
111
+ this.child = null;
112
+ if (child === null)
113
+ return;
114
+ if (child.exitCode !== null || child.signalCode !== null)
115
+ return;
116
+ await new Promise((resolve) => {
117
+ const kill = setTimeout(() => {
118
+ child.kill('SIGKILL');
119
+ }, FUNNEL_EXIT_WAIT_MS);
120
+ child.once('exit', () => {
121
+ clearTimeout(kill);
122
+ resolve();
123
+ });
124
+ child.kill('SIGINT');
125
+ });
126
+ }
127
+ }
128
+ async function listen(server, info) {
129
+ for (let attempt = 1;; attempt += 1) {
130
+ try {
131
+ await new Promise((resolve, reject) => {
132
+ server.once('error', reject);
133
+ server.listen(info.port, info.host, () => {
134
+ server.off('error', reject);
135
+ resolve();
136
+ });
137
+ });
138
+ return;
139
+ }
140
+ catch (err) {
141
+ if (attempt >= LISTEN_ATTEMPTS)
142
+ throw err;
143
+ await wait(LISTEN_RETRY_MS);
144
+ }
145
+ }
146
+ }
147
+ const CLOSE_WAIT_MS = 2_000;
148
+ const close = (server) => new Promise((resolve) => {
149
+ const timer = setTimeout(resolve, CLOSE_WAIT_MS);
150
+ server.close(() => {
151
+ clearTimeout(timer);
152
+ resolve();
153
+ });
154
+ server.closeAllConnections();
155
+ });
156
+ function releaseLock(lockFile) {
157
+ try {
158
+ if (readFileSync(lockFile, 'utf8').trim() === String(process.pid))
159
+ rmSync(lockFile, { force: true });
160
+ }
161
+ catch {
162
+ return;
163
+ }
164
+ }
165
+ function armFunnel(info, log, ending) {
166
+ if (info.funnel === null || ending !== null)
167
+ return null;
168
+ const funnel = new HeldFunnel(info.funnel, info.port, log);
169
+ funnel.start();
170
+ return funnel;
171
+ }
172
+ export const holdBanner = (info) => `metro is stopped. Holding http://${info.host}:${String(info.port)}${info.funnel === null ? '' : ' and the Funnel address'} ` +
173
+ 'until Start on the Server page; Ctrl-C or metro stop ends metro serve';
174
+ export async function holdUntilStart(info, deps = {}) {
175
+ const signals = deps.signals ?? process;
176
+ const log = deps.log ??
177
+ ((line) => {
178
+ process.stderr.write(`${line}\n`);
179
+ });
180
+ let finish = () => undefined;
181
+ let ending = null;
182
+ const ended = new Promise((resolve) => {
183
+ finish = (end) => {
184
+ ending ??= end;
185
+ resolve(end);
186
+ };
187
+ });
188
+ const server = holdServer(info, () => {
189
+ finish('start');
190
+ });
191
+ const onSignal = () => {
192
+ finish('exit');
193
+ };
194
+ signals.on('SIGINT', onSignal);
195
+ signals.on('SIGTERM', onSignal);
196
+ if (info.lockFile !== null)
197
+ writeFileSync(info.lockFile, String(process.pid));
198
+ await listen(server, info);
199
+ const funnel = armFunnel(info, log, ending);
200
+ if (ending === null)
201
+ log(holdBanner(info));
202
+ const end = await ended;
203
+ signals.off('SIGINT', onSignal);
204
+ signals.off('SIGTERM', onSignal);
205
+ await funnel?.stop();
206
+ await close(server);
207
+ if (info.lockFile !== null)
208
+ releaseLock(info.lockFile);
209
+ return end;
210
+ }
package/dist/local.js ADDED
@@ -0,0 +1,43 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { localUrl } from './runtime.js';
5
+ const PROBE_MS = 3_000;
6
+ export function agentsDir() {
7
+ const explicit = process.env.METRO_AGENTS_DIR?.trim();
8
+ return explicit !== undefined && explicit !== '' ? explicit : join(homedir(), '.metro', 'agents');
9
+ }
10
+ function agentFile(dir) {
11
+ try {
12
+ return JSON.parse(readFileSync(join(dir, 'agent.json'), 'utf8'));
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ export function localAgent(dir = agentsDir()) {
19
+ const file = agentFile(dir);
20
+ return typeof file?.id === 'string' && typeof file.key === 'string' ? { id: file.id, key: file.key } : null;
21
+ }
22
+ export function localStations(dir = agentsDir()) {
23
+ const stations = agentFile(dir)?.stations;
24
+ if (!Array.isArray(stations))
25
+ return [];
26
+ const out = new Set();
27
+ for (const s of stations) {
28
+ const station = s.station;
29
+ if (typeof station === 'string')
30
+ out.add(station);
31
+ }
32
+ return [...out].sort();
33
+ }
34
+ export async function localDaemonUp(base = localUrl()) {
35
+ try {
36
+ const res = await fetch(`${base}/api/mode`, { signal: AbortSignal.timeout(PROBE_MS) });
37
+ const body = (await res.json());
38
+ return res.ok && body.mode === 'local';
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }