@stage-labs/metro 0.1.0-beta.76 → 0.1.0-beta.78

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 (233) hide show
  1. package/dist/cli.js +4 -4
  2. package/dist/runtime-install.js +7 -4
  3. package/dist/runtime.js +6 -2
  4. package/dist/serve.js +2 -3
  5. package/dist/service.js +29 -11
  6. package/package.json +1 -1
  7. package/runtime/node_modules/@metro-labs/core/package.json +43 -0
  8. package/runtime/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  9. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/events.ts +1 -1
  10. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/identity.ts +1 -1
  11. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/protocol.ts +1 -1
  12. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/account-store.ts +2 -2
  13. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/station-runtime.ts +1 -1
  14. package/runtime/node_modules/@metro-labs/daemon/package.json +47 -0
  15. package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/agents}/account-attach.ts +1 -1
  16. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/account-api.ts → daemon/src/agents/accounts-api.ts} +6 -6
  17. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-admin.ts → daemon/src/agents/admin.ts} +2 -2
  18. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/agent-api.ts → daemon/src/agents/api.ts} +6 -6
  19. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/bundle-api.ts → daemon/src/agents/bundle.ts} +7 -7
  20. package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/agents}/file-admin.ts +9 -9
  21. package/runtime/node_modules/@metro-labs/{mcp/src/db/file-source.ts → daemon/src/agents/files.ts} +4 -4
  22. package/runtime/node_modules/@metro-labs/{mcp/src/db/key-map.ts → daemon/src/agents/keys.ts} +1 -1
  23. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-scope.ts → daemon/src/agents/scope.ts} +2 -2
  24. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/boot.ts +23 -51
  25. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/crash-guard.ts +1 -1
  26. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/local-owner.ts +2 -2
  27. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/paths.ts +1 -4
  28. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/addressed.ts +1 -1
  29. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/dedupe.ts +1 -1
  30. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/inbound.ts +1 -1
  31. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/pending.ts +1 -1
  32. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +1 -1
  33. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-api.ts → daemon/src/claude/api.ts} +7 -7
  34. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-files.ts → daemon/src/claude/files.ts} +2 -2
  35. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-login.ts → daemon/src/claude/login.ts} +3 -3
  36. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-settings.ts → daemon/src/claude/settings.ts} +4 -4
  37. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-api.ts → daemon/src/connectors/api.ts} +6 -6
  38. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/local-cli-api.ts → daemon/src/connectors/cli-api.ts} +5 -5
  39. package/runtime/node_modules/@metro-labs/{mcp/src/db/connector-config.ts → daemon/src/connectors/config.ts} +4 -4
  40. package/runtime/node_modules/@metro-labs/{mcp/src/db/connectors.ts → daemon/src/connectors/model.ts} +3 -3
  41. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-client.ts +2 -2
  42. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-discovery.ts +2 -2
  43. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth-routes.ts → daemon/src/connectors/oauth-routes.ts} +6 -6
  44. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth.ts → daemon/src/connectors/oauth.ts} +3 -3
  45. package/runtime/node_modules/@metro-labs/{mcp/src/db/connector-relay.ts → daemon/src/connectors/relay-target.ts} +1 -1
  46. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/relay.ts +4 -4
  47. package/runtime/node_modules/@metro-labs/{mcp/src/db/local-connectors.ts → daemon/src/connectors/store.ts} +12 -12
  48. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-tools.ts → daemon/src/connectors/tools.ts} +1 -1
  49. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-url.ts → daemon/src/connectors/url.ts} +1 -1
  50. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-verify.ts → daemon/src/connectors/verify.ts} +5 -5
  51. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-grant.ts +3 -3
  52. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-owner.ts +3 -3
  53. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-serve.ts +5 -12
  54. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-api.ts +5 -5
  55. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-store.ts +2 -2
  56. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/bedrock.ts +1 -1
  57. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-auth.ts +1 -1
  58. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-device.ts +2 -2
  59. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-stream.ts +1 -1
  60. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-translate.ts +1 -1
  61. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex.ts +2 -2
  62. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/gateway.ts +2 -2
  63. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/gateway}/model-api.ts +12 -12
  64. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/model-config.ts +3 -3
  65. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/openrouter.ts +1 -1
  66. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/accounts.ts +3 -7
  67. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/call-tools.ts +3 -3
  68. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/channel-owner.ts +1 -1
  69. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
  70. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/frame-scope.ts +2 -2
  71. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/group-tools.ts +2 -2
  72. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/index.ts +1 -1
  73. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/member-tools.ts +2 -2
  74. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/request-identity.ts +1 -1
  75. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session-registry.ts +2 -2
  76. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session.ts +2 -2
  77. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-dispatch.ts +4 -4
  78. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +5 -5
  79. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/monitor/api.ts +5 -5
  80. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/net}/tunnel.ts +6 -10
  81. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +15 -15
  82. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/identity-routes.ts → daemon/src/routes/identity.ts} +5 -5
  83. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/local-mode.ts +16 -16
  84. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/session-apis.ts +14 -20
  85. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-api.ts → daemon/src/routes/session.ts} +1 -1
  86. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/control-api.ts → daemon/src/server/control.ts} +3 -3
  87. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/machine-api.ts → daemon/src/server/machine.ts} +8 -8
  88. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/update-api.ts → daemon/src/server/update.ts} +5 -5
  89. package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
  90. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-resolve.ts +5 -3
  91. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/attach-session.ts +4 -4
  92. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-xmtp.ts +1 -1
  93. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach.ts +3 -3
  94. package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/stations}/materialize.ts +9 -14
  95. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/registry.ts +2 -2
  96. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/runtime-deps.ts +4 -4
  97. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor-io.ts +2 -2
  98. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor.ts +4 -4
  99. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/train-call.ts +1 -1
  100. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/terminal-api.ts → daemon/src/terminal/api.ts} +4 -4
  101. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/terminal-ws.ts → daemon/src/terminal/socket.ts} +3 -3
  102. package/runtime/node_modules/@metro-labs/discord-bot/package.json +1 -1
  103. package/runtime/node_modules/@metro-labs/discord-bot/src/accounts.ts +2 -2
  104. package/runtime/node_modules/@metro-labs/discord-bot/src/actions.ts +3 -3
  105. package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +2 -2
  106. package/runtime/node_modules/@metro-labs/discord-bot/src/group.ts +2 -2
  107. package/runtime/node_modules/@metro-labs/discord-bot/src/index.ts +2 -2
  108. package/runtime/node_modules/@metro-labs/discord-bot/src/members.ts +2 -2
  109. package/runtime/node_modules/@metro-labs/discord-bot/src/send-files.ts +1 -1
  110. package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +1 -1
  111. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-speak.ts +1 -1
  112. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-transcribe.ts +1 -1
  113. package/runtime/node_modules/@metro-labs/discord-bot/src/voice.ts +1 -1
  114. package/runtime/node_modules/@metro-labs/discord-bot/src/wire.ts +1 -1
  115. package/runtime/node_modules/@metro-labs/http/package.json +33 -0
  116. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-http.ts +1 -1
  117. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/signed-identity.ts +1 -1
  118. package/runtime/node_modules/@metro-labs/telegram/package.json +1 -1
  119. package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +1 -1
  120. package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +3 -3
  121. package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +1 -1
  122. package/runtime/node_modules/@metro-labs/telegram/src/client.ts +2 -2
  123. package/runtime/node_modules/@metro-labs/telegram/src/format.ts +1 -1
  124. package/runtime/node_modules/@metro-labs/telegram/src/group.ts +3 -3
  125. package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +1 -1
  126. package/runtime/node_modules/@metro-labs/telegram/src/index.ts +3 -3
  127. package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +1 -1
  128. package/runtime/node_modules/@metro-labs/telegram/src/members.ts +1 -1
  129. package/runtime/node_modules/@metro-labs/telegram/src/normalize.ts +1 -1
  130. package/runtime/node_modules/@metro-labs/telegram/src/reactions.ts +1 -1
  131. package/runtime/node_modules/@metro-labs/telegram/src/station.ts +1 -1
  132. package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +1 -1
  133. package/runtime/node_modules/@metro-labs/telegram-bot/package.json +1 -1
  134. package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +2 -2
  135. package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +4 -4
  136. package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +2 -2
  137. package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +1 -1
  138. package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +2 -2
  139. package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +1 -1
  140. package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +1 -1
  141. package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +1 -1
  142. package/runtime/node_modules/@metro-labs/telegram-bot/src/wire.ts +1 -1
  143. package/runtime/node_modules/@metro-labs/webhook/package.json +1 -1
  144. package/runtime/node_modules/@metro-labs/webhook/src/station.ts +4 -4
  145. package/runtime/node_modules/@metro-labs/whatsapp/package.json +1 -1
  146. package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +1 -1
  147. package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +1 -1
  148. package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +4 -4
  149. package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +2 -2
  150. package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +1 -1
  151. package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +2 -2
  152. package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +1 -1
  153. package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +1 -1
  154. package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +3 -3
  155. package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +1 -1
  156. package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +1 -1
  157. package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +1 -1
  158. package/runtime/node_modules/@metro-labs/whatsapp/src/normalize.ts +1 -1
  159. package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +1 -1
  160. package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +2 -2
  161. package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +1 -1
  162. package/runtime/node_modules/@metro-labs/xmtp/package.json +1 -1
  163. package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +2 -2
  164. package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +1 -1
  165. package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +1 -1
  166. package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +1 -1
  167. package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +3 -3
  168. package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +3 -3
  169. package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +2 -2
  170. package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +1 -1
  171. package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +1 -1
  172. package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +1 -1
  173. package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +2 -2
  174. package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +2 -2
  175. package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +1 -1
  176. package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +2 -2
  177. package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +1 -1
  178. package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +3 -3
  179. package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +1 -1
  180. package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +1 -1
  181. package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +1 -1
  182. package/runtime/runtime.json +1 -1
  183. package/runtime/server.ts +1 -0
  184. package/dist/bedrock-eventstream.js +0 -120
  185. package/dist/bedrock-proxy.js +0 -260
  186. package/dist/bedrock-upstream.js +0 -72
  187. package/dist/bedrock.js +0 -37
  188. package/runtime/node_modules/@metro-labs/mcp/package.json +0 -64
  189. package/runtime/node_modules/@metro-labs/mcp/src/daemon/server-types.ts +0 -21
  190. package/runtime/node_modules/@metro-labs/mcp/src/daemon/servers-api.ts +0 -80
  191. package/runtime/node_modules/@metro-labs/mcp/src/daemon/vault-api.ts +0 -78
  192. package/runtime/node_modules/@metro-labs/mcp/src/daemon/vault-types.ts +0 -12
  193. package/runtime/node_modules/@metro-labs/mcp/src/db/client.ts +0 -32
  194. package/runtime/node_modules/@metro-labs/mcp/src/db/schema.ts +0 -33
  195. package/runtime/node_modules/@metro-labs/mcp/src/db/servers.ts +0 -83
  196. package/runtime/node_modules/@metro-labs/mcp/src/db/vault.ts +0 -109
  197. package/runtime/node_modules/@metro-labs/mcp/src/server.ts +0 -2
  198. /package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/address.ts +0 -0
  199. /package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/ids.ts +0 -0
  200. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/is-record.ts +0 -0
  201. /package/runtime/node_modules/@metro-labs/{mcp/src/stations → core/src}/lines.ts +0 -0
  202. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/log.ts +0 -0
  203. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/secure-fs.ts +0 -0
  204. /package/runtime/node_modules/@metro-labs/{mcp/src/db/stations.ts → core/src/station-names.ts} +0 -0
  205. /package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/attachments.ts +0 -0
  206. /package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/messaging-normalize.ts +0 -0
  207. /package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/types.ts +0 -0
  208. /package/runtime/node_modules/@metro-labs/{mcp/src/mcp → core/src}/str.ts +0 -0
  209. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/train-error.ts +0 -0
  210. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/version.ts +0 -0
  211. /package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-map.ts → daemon/src/agents/map.ts} +0 -0
  212. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/connect-hint.ts +0 -0
  213. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/media-note.ts +0 -0
  214. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/webhook-note.ts +0 -0
  215. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-json.ts → daemon/src/connectors/json.ts} +0 -0
  216. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-pending.ts +0 -0
  217. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/eventstream.ts +0 -0
  218. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/forward.ts +0 -0
  219. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/served.ts +0 -0
  220. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +0 -0
  221. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/permission-relay.ts +0 -0
  222. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/raw-get-stream.ts +0 -0
  223. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session-route.ts +0 -0
  224. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +0 -0
  225. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-inline.ts +0 -0
  226. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-interactive.ts +0 -0
  227. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon/terminal-tickets.ts → daemon/src/terminal/tickets.ts} +0 -0
  228. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-error.ts +0 -0
  229. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/cors.ts +0 -0
  230. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/identity-key.ts +0 -0
  231. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/identity-registry.ts +0 -0
  232. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/mode-api.ts +0 -0
  233. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/return-to.ts +0 -0
package/dist/cli.js CHANGED
@@ -3,11 +3,10 @@ import { mcpServers, whoisAuthorized } from './api.js';
3
3
  import { stopAll } from './control.js';
4
4
  import { tailEvents } from './tail.js';
5
5
  import { launchClaude } from './claude.js';
6
- import { bedrock } from './bedrock.js';
7
6
  import { installPlugin } from './plugin.js';
8
7
  import { update } from './update.js';
9
8
  import { serve } from './serve.js';
10
- import { service } from './service.js';
9
+ import { service, serviceStopHint } from './service.js';
11
10
  import { currentVersion } from './version.js';
12
11
  const USAGE = `metro — run your agent on this machine
13
12
 
@@ -34,7 +33,6 @@ const USAGE = `metro — run your agent on this machine
34
33
  metro plugin set up the Claude Code plugin (connector servers + /metro:refresh)
35
34
  metro claude [args...]
36
35
  open Claude Code with the metro channel; every argument is passed through
37
- metro bedrock [args...]
38
36
  the same, with inference on Amazon Bedrock through a local proxy so the
39
37
  channel still works (needs AWS_BEARER_TOKEN_BEDROCK and AWS_REGION)
40
38
  metro update update to the newest published version (--check only reports)
@@ -60,6 +58,9 @@ async function stopDaemon() {
60
58
  }
61
59
  for (const d of stopped)
62
60
  process.stderr.write(`Stopped metro (pid ${String(d.pid)}, via ${d.via})\n`);
61
+ const hint = serviceStopHint();
62
+ if (hint !== null)
63
+ process.stderr.write(`${hint}\n`);
63
64
  return 0;
64
65
  }
65
66
  const HELP = new Set([undefined, 'help', '--help', '-h']);
@@ -79,7 +80,6 @@ const COMMANDS = {
79
80
  },
80
81
  plugin: installPlugin,
81
82
  claude: () => launchClaude(process.argv.slice(3)),
82
- bedrock: () => bedrock(process.argv.slice(3)),
83
83
  update: () => update(process.argv.slice(3)),
84
84
  version: async () => {
85
85
  process.stdout.write(`${currentVersion()}\n`);
@@ -1,9 +1,9 @@
1
1
  import { spawnSync } from 'node:child_process';
2
- import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { copyFileSync, cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
3
3
  import { homedir } from 'node:os';
4
4
  import { join } from 'node:path';
5
5
  import { localStations } from './local.js';
6
- import { SERVER_ENTRY, findBun, runtimeDir } from './runtime.js';
6
+ import { STORE_ENTRY, daemonEntry, findBun, runtimeDir } from './runtime.js';
7
7
  export const MANIFEST_FILE = 'stations.json';
8
8
  const METRO_SOURCES = join('node_modules', '@metro-labs');
9
9
  const INSTALL_TIMEOUT_MS = 15 * 60_000;
@@ -41,6 +41,9 @@ function readOrNull(path) {
41
41
  }
42
42
  }
43
43
  function syncSources(sources, store) {
44
+ const shim = join(sources, STORE_ENTRY);
45
+ if (existsSync(shim))
46
+ copyFileSync(shim, join(store, STORE_ENTRY));
44
47
  const stamp = readOrNull(join(sources, 'runtime.json'));
45
48
  if (stamp !== null && readOrNull(join(store, 'runtime.json')) === stamp)
46
49
  return false;
@@ -71,7 +74,7 @@ export function prepareRuntime(opts = {}) {
71
74
  const sources = opts.sources ?? runtimeDir();
72
75
  const manifestPath = join(sources, MANIFEST_FILE);
73
76
  if (!existsSync(manifestPath))
74
- return { dir: sources, entry: join(sources, SERVER_ENTRY), trains: join(sources, 'trains'), manifest: null };
77
+ return { dir: sources, entry: daemonEntry(sources), trains: join(sources, 'trains'), manifest: null };
75
78
  const store = opts.store ?? runtimeStore();
76
79
  const log = opts.log ??
77
80
  ((line) => {
@@ -80,5 +83,5 @@ export function prepareRuntime(opts = {}) {
80
83
  mkdirSync(join(store, 'trains'), { recursive: true });
81
84
  syncSources(sources, store);
82
85
  installDependencies(store, dependenciesFor(readManifest(manifestPath), localStations(opts.agents)), opts.bun ?? findBun(), log);
83
- return { dir: store, entry: join(store, SERVER_ENTRY), trains: join(store, 'trains'), manifest: manifestPath };
86
+ return { dir: store, entry: daemonEntry(store), trains: join(store, 'trains'), manifest: manifestPath };
84
87
  }
package/dist/runtime.js CHANGED
@@ -3,7 +3,11 @@ import { existsSync } from 'node:fs';
3
3
  import { dirname, join } from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
5
  const AGENT_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{10}$/;
6
- export const SERVER_ENTRY = join('node_modules', '@metro-labs', 'mcp', 'src', 'server.ts');
6
+ export const STORE_ENTRY = 'server.ts';
7
+ export const PACKAGE_ENTRY = join('node_modules', '@metro-labs', 'daemon', 'src', 'server.ts');
8
+ export const daemonEntry = (dir) => existsSync(join(dir, STORE_ENTRY))
9
+ ? join(dir, STORE_ENTRY)
10
+ : join(dir, PACKAGE_ENTRY);
7
11
  export class MissingRuntime extends Error {
8
12
  }
9
13
  export function runtimeDir() {
@@ -11,7 +15,7 @@ export function runtimeDir() {
11
15
  const dir = explicit !== undefined && explicit !== ''
12
16
  ? explicit
13
17
  : join(dirname(dirname(fileURLToPath(import.meta.url))), 'runtime');
14
- if (!existsSync(join(dir, SERVER_ENTRY)))
18
+ if (!existsSync(daemonEntry(dir)))
15
19
  throw new MissingRuntime(`no metro daemon at ${dir}. Reinstall with: npm i -g @stage-labs/metro@beta`);
16
20
  return dir;
17
21
  }
package/dist/serve.js CHANGED
@@ -4,7 +4,7 @@ import { join } from 'node:path';
4
4
  import { agentsDir } from './local.js';
5
5
  import { currentVersion } from './version.js';
6
6
  import { serveLockedBy, serveStateDir } from './control.js';
7
- import { findBun, localPort, SERVER_ENTRY, spawnPlan } from './runtime.js';
7
+ import { findBun, localPort, spawnPlan } from './runtime.js';
8
8
  import { prepareRuntime } from './runtime-install.js';
9
9
  import { ensureNodeName } from './node-name.js';
10
10
  import { holdUntilStart } from './hold.js';
@@ -113,11 +113,10 @@ export function servePlan(opts) {
113
113
  const env = Object.fromEntries(Object.entries(process.env).filter(([key]) => !SCRUBBED.has(key)));
114
114
  return {
115
115
  command: findBun(),
116
- args: [SERVER_ENTRY],
116
+ args: [opts.runtime.entry],
117
117
  cwd: opts.runtime.dir,
118
118
  env: {
119
119
  ...env,
120
- METRO_MODE: 'local',
121
120
  METRO_VERSION: currentVersion(),
122
121
  METRO_CLI_BIN: process.argv[1] ?? '',
123
122
  METRO_WEBHOOK_PORT: String(opts.port),
package/dist/service.js CHANGED
@@ -127,11 +127,15 @@ export function servicePlan(host, serveArgs) {
127
127
  }
128
128
  function install(serveArgs, deps) {
129
129
  const { owner } = parseServeArgs(serveArgs);
130
+ const plan = servicePlan(deps.host, serveArgs);
131
+ if (deps.exists(plan.file)) {
132
+ deps.out(`metro is already installed as a ${plan.kind} service (${plan.file}) and restarts on its own; metro service status says whether it is running. To change its arguments: metro service uninstall, then install again`);
133
+ return 0;
134
+ }
130
135
  deps.preflight(owner);
131
136
  const pid = deps.running();
132
137
  if (pid !== null)
133
138
  throw new Error(`a metro serve is running on this machine (pid ${String(pid)}). Stop it first (metro stop), then install: the service takes over from there`);
134
- const plan = servicePlan(deps.host, serveArgs);
135
139
  for (const dir of plan.dirs)
136
140
  deps.mkdir(dir);
137
141
  deps.write(plan.file, plan.content);
@@ -168,18 +172,32 @@ function status(deps) {
168
172
  : `installed as a ${plan.kind} service (${plan.file}), not running`);
169
173
  return active ? 0 : 1;
170
174
  }
171
- function realDeps() {
175
+ function realHost() {
172
176
  const who = userInfo();
173
177
  return {
174
- host: {
175
- platform: platform(),
176
- uid: who.uid,
177
- user: who.username,
178
- home: homedir(),
179
- node: process.execPath,
180
- cli: resolve(process.argv[1] ?? ''),
181
- env: process.env,
182
- },
178
+ platform: platform(),
179
+ uid: who.uid,
180
+ user: who.username,
181
+ home: homedir(),
182
+ node: process.execPath,
183
+ cli: resolve(process.argv[1] ?? ''),
184
+ env: process.env,
185
+ };
186
+ }
187
+ export function serviceStopHint(host = realHost(), exists = existsSync) {
188
+ if (host.platform !== 'linux' && host.platform !== 'darwin')
189
+ return null;
190
+ const plan = servicePlan(host, []);
191
+ if (!exists(plan.file))
192
+ return null;
193
+ const keep = plan.kind === 'systemd'
194
+ ? `systemctl ${host.uid === 0 ? '' : '--user '}stop ${SERVICE}`
195
+ : `launchctl bootout gui/${String(host.uid)}/${LABEL}`;
196
+ return `metro runs as a ${plan.kind} service here (${plan.file}), so it starts again on its own in a moment. To keep it stopped: ${keep}`;
197
+ }
198
+ function realDeps() {
199
+ return {
200
+ host: realHost(),
183
201
  run: (command) => {
184
202
  const [bin = '', ...args] = command.args;
185
203
  const result = spawnSync(bin, args, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stage-labs/metro",
3
- "version": "0.1.0-beta.76",
3
+ "version": "0.1.0-beta.78",
4
4
  "description": "The metro command line. Sign in once per machine, then hand your MCP connector list to Claude Code without the credentials touching disk, argv or shell history.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -0,0 +1,43 @@
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
+ "./identity": "./src/identity.ts",
11
+ "./is-record": "./src/is-record.ts",
12
+ "./secure-fs": "./src/secure-fs.ts",
13
+ "./version": "./src/version.ts",
14
+ "./train-error": "./src/train-error.ts",
15
+ "./trains/protocol": "./src/protocol.ts",
16
+ "./ids": "./src/ids.ts",
17
+ "./address": "./src/address.ts",
18
+ "./station-names": "./src/station-names.ts",
19
+ "./str": "./src/str.ts",
20
+ "./lines": "./src/lines.ts",
21
+ "./endpoints": "./src/endpoints.ts",
22
+ "./stations/types": "./src/stations/types.ts",
23
+ "./stations/station-runtime": "./src/stations/station-runtime.ts",
24
+ "./stations/account-store": "./src/stations/account-store.ts",
25
+ "./stations/attachments": "./src/stations/attachments.ts",
26
+ "./stations/messaging-normalize": "./src/stations/messaging-normalize.ts"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc",
30
+ "test": "tsc --noEmit && METRO_STATE_DIR=\"$(mktemp -d /tmp/metro-test.XXXXXX)\" bun test test/"
31
+ },
32
+ "dependencies": {
33
+ "pino": "^9.5.0",
34
+ "pino-pretty": "^13.1.3"
35
+ },
36
+ "devDependencies": {
37
+ "@stage-labs/config": "0.1.0-beta.2",
38
+ "eslint": "^10.3.0",
39
+ "knip": "^6.15.0",
40
+ "madge": "^8.0.0",
41
+ "typescript": "^5"
42
+ }
43
+ }
@@ -0,0 +1,7 @@
1
+ export interface Endpoint {
2
+ id: string;
3
+ webhookId?: string;
4
+ label: string;
5
+ secret?: string;
6
+ createdAt: string;
7
+ }
@@ -1,5 +1,5 @@
1
1
  import { randomBytes } from 'node:crypto';
2
- import { Line } from '../stations/lines.js';
2
+ import { Line } from './lines.js';
3
3
 
4
4
  export { userSelf, daemonSelf } from './identity.js';
5
5
 
@@ -1,4 +1,4 @@
1
- import { Line } from '../stations/lines.js';
1
+ import { Line } from './lines.js';
2
2
 
3
3
  export const userSelf = (): Line =>
4
4
  (process.env.METRO_FROM ?? 'metro://user') as Line;
@@ -3,7 +3,7 @@ import { join, parse as parsePath } from 'node:path';
3
3
  import { errMsg, log } from './log.js';
4
4
  import { coerceErrorInfo, type TrainErrorInfo } from './train-error.js';
5
5
  import type { StructuredEvent } from './events.js';
6
- import type { CallMsg } from '../stations/station-runtime.js';
6
+ import type { CallMsg } from './stations/station-runtime.js';
7
7
 
8
8
  export {
9
9
  TrainError,
@@ -1,6 +1,6 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
- import { errMsg } from '../daemon/log.js';
3
- import { chmodIfExists } from '../daemon/secure-fs.js';
2
+ import { errMsg } from '../log.js';
3
+ import { chmodIfExists } from '../secure-fs.js';
4
4
 
5
5
  export type Die = (msg: string) => never;
6
6
 
@@ -1,4 +1,4 @@
1
- import { serializeTrainError, type TrainErrorInfo } from '../daemon/train-error.js';
1
+ import { serializeTrainError, type TrainErrorInfo } from '../train-error.js';
2
2
  import type { Normalized } from './messaging-normalize.js';
3
3
 
4
4
  export const emit = (e: unknown): void =>
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@metro-labs/daemon",
3
+ "version": "0.1.0-beta.15",
4
+ "private": true,
5
+ "description": "The metro daemon a user runs on their own machine with `metro serve`: the MCP server Claude Code connects to, the station subprocesses it supervises, the model gateway, and the signed-identity APIs the page at metro.box talks to.",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/bonustrack/metro.git"
10
+ },
11
+ "homepage": "https://github.com/bonustrack/metro#readme",
12
+ "bugs": "https://github.com/bonustrack/metro/issues",
13
+ "type": "module",
14
+ "engines": {
15
+ "node": ">=22"
16
+ },
17
+ "exports": {
18
+ ".": "./src/mcp/index.ts"
19
+ },
20
+ "scripts": {
21
+ "start": "bun src/server.ts",
22
+ "build": "tsc",
23
+ "test": "tsc --noEmit && DYLD_FALLBACK_LIBRARY_PATH=/usr/lib METRO_STATE_DIR=\"$(mktemp -d /tmp/metro-test.XXXXXX)\" bun test test/"
24
+ },
25
+ "dependencies": {
26
+ "@metro-labs/core": "workspace:*",
27
+ "@metro-labs/http": "workspace:*",
28
+ "@metro-labs/discord-bot": "workspace:*",
29
+ "@metro-labs/telegram": "workspace:*",
30
+ "@metro-labs/telegram-bot": "workspace:*",
31
+ "@metro-labs/webhook": "workspace:*",
32
+ "@metro-labs/whatsapp": "workspace:*",
33
+ "@metro-labs/xmtp": "workspace:*",
34
+ "@modelcontextprotocol/sdk": "^1.12.0",
35
+ "viem": "2.52.2",
36
+ "ws": "^8.18.0",
37
+ "zod": "^3.23.8"
38
+ },
39
+ "devDependencies": {
40
+ "@stage-labs/config": "0.1.0-beta.2",
41
+ "@types/ws": "^8.18.0",
42
+ "eslint": "^10.3.0",
43
+ "knip": "^6.15.0",
44
+ "madge": "^8.0.0",
45
+ "typescript": "^5"
46
+ }
47
+ }
@@ -1,4 +1,4 @@
1
- import { STATIONS, type StationName } from './stations.js';
1
+ import { STATIONS, type StationName } from '@metro-labs/core/station-names';
2
2
 
3
3
  const ACCOUNT_ID_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/;
4
4
 
@@ -1,19 +1,19 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
- import { errMsg, log } from './log.js';
3
- import { ApiError } from './api-error.js';
2
+ import { errMsg, log } from '@metro-labs/core/log';
3
+ import { ApiError } from '@metro-labs/http/api-error';
4
4
  import {
5
5
  apiFailure,
6
6
  bodyField,
7
7
  readJsonBody,
8
8
  sendJson,
9
9
  type ApiSession,
10
- } from './api-http.js';
10
+ } from '@metro-labs/http/api-http';
11
11
  import {
12
12
  isStationName,
13
13
  parseAccountId,
14
14
  type AccountRef,
15
- } from '../db/account-attach.js';
16
- import type { StationName } from '../db/stations.js';
15
+ } from './account-attach.js';
16
+ import type { StationName } from '@metro-labs/core/station-names';
17
17
  import {
18
18
  ATTACHABLE_STATIONS,
19
19
  isAttachStation,
@@ -30,7 +30,7 @@ import {
30
30
  ATTACH_ID_RE,
31
31
  type AttachOwner,
32
32
  type AttachView,
33
- } from './attach-session.js';
33
+ } from '../stations/attach-session.js';
34
34
 
35
35
  export interface AttachSessionApi {
36
36
  start: (
@@ -1,6 +1,6 @@
1
1
  import { randomBytes } from 'node:crypto';
2
- import { ApiError } from '../daemon/api-error.js';
3
- import { AGENT_NAME_RE } from './ids.js';
2
+ import { ApiError } from '@metro-labs/http/api-error';
3
+ import { AGENT_NAME_RE } from '@metro-labs/core/ids';
4
4
 
5
5
  export class AgentAdminError extends ApiError {}
6
6
 
@@ -1,7 +1,7 @@
1
- import { webhookPort } from './tunnel.js';
1
+ import { webhookPort } from '../net/tunnel.js';
2
2
  import type { IncomingMessage, ServerResponse } from 'node:http';
3
- import { parseId } from '../db/ids.js';
4
- import { errMsg, log } from './log.js';
3
+ import { parseId } from '@metro-labs/core/ids';
4
+ import { errMsg, log } from '@metro-labs/core/log';
5
5
  import {
6
6
  apiFailure,
7
7
  apiSession,
@@ -10,7 +10,7 @@ import {
10
10
  readJsonBody,
11
11
  sendJson,
12
12
  type ApiSession,
13
- } from './api-http.js';
13
+ } from '@metro-labs/http/api-http';
14
14
  import {
15
15
  accountRoute,
16
16
  accountRouteAllows,
@@ -18,13 +18,13 @@ import {
18
18
  handleAccountRoute,
19
19
  type AccountApiDeps,
20
20
  type AccountRoute,
21
- } from './account-api.js';
21
+ } from './accounts-api.js';
22
22
  import {
23
23
  type AgentSummary,
24
24
  type CreatedAgent,
25
25
  type DeletedAgent,
26
26
  type ResetAgentKey,
27
- } from '../db/agent-admin.js';
27
+ } from './admin.js';
28
28
 
29
29
  const PREFIX = '/api/agents';
30
30
  const SERVER_NAME = 'metro';
@@ -1,11 +1,11 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
- import { errMsg, log } from './log.js';
3
- import { apiFailure, apiSession, cors, readJsonBody, sendJson } from './api-http.js';
4
- import { ApiError } from './api-error.js';
5
- import { isRecord } from './is-record.js';
6
- import { parseId } from '../db/ids.js';
7
- import type { LoadedAccount, LoadedAgent, LoadedConnector } from '../db/materialize.js';
8
- import { STATIONS } from '../db/stations.js';
2
+ import { errMsg, log } from '@metro-labs/core/log';
3
+ import { apiFailure, apiSession, cors, readJsonBody, sendJson } from '@metro-labs/http/api-http';
4
+ import { ApiError } from '@metro-labs/http/api-error';
5
+ import { isRecord } from '@metro-labs/core/is-record';
6
+ import { parseId } from '@metro-labs/core/ids';
7
+ import type { LoadedAccount, LoadedAgent, LoadedConnector } from '../stations/materialize.js';
8
+ import { STATIONS } from '@metro-labs/core/station-names';
9
9
 
10
10
  const AGENTS = '/api/agents';
11
11
  const RESTORE_PATH = `${AGENTS}/restore`;
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync, rmdirSync, rmSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import { ApiError } from '../daemon/api-error.js';
4
- import { ensureSecureDir, writeSecure } from '../daemon/secure-fs.js';
3
+ import { ApiError } from '@metro-labs/http/api-error';
4
+ import { ensureSecureDir, writeSecure } from '@metro-labs/core/secure-fs';
5
5
  import {
6
6
  AgentAdminError,
7
7
  newApiKey,
@@ -11,7 +11,7 @@ import {
11
11
  type DeletedAgent,
12
12
  type OwnedAgent,
13
13
  type ResetAgentKey,
14
- } from './agent-admin.js';
14
+ } from './admin.js';
15
15
  import type { AccountRef } from './account-attach.js';
16
16
  import {
17
17
  AGENT_FILE,
@@ -21,12 +21,12 @@ import {
21
21
  parseAgentFile,
22
22
  readAgentFile,
23
23
  type AgentFile,
24
- } from './file-source.js';
25
- import { newId } from './ids.js';
26
- import { registerKey, rotateAgentKey, unregisterAgentKey } from './key-map.js';
27
- import { MOVABLE_STATIONS, type LoadedAgent } from './materialize.js';
28
- import type { StationName } from './stations.js';
29
- import { normalizeAddress } from './address.js';
24
+ } from './files.js';
25
+ import { newId } from '@metro-labs/core/ids';
26
+ import { registerKey, rotateAgentKey, unregisterAgentKey } from './keys.js';
27
+ import { MOVABLE_STATIONS, type LoadedAgent } from '../stations/materialize.js';
28
+ import type { StationName } from '@metro-labs/core/station-names';
29
+ import { normalizeAddress } from '@metro-labs/core/address';
30
30
 
31
31
  export const LOCAL_PROJECT_ID = 'localdaemon';
32
32
  const OWNER_FILE = '.owner';
@@ -1,10 +1,10 @@
1
1
  import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
3
  import { join } from 'node:path';
4
- import { AGENT_NAME_RE, ID_RE } from './ids.js';
5
- import { STATIONS, type StationName } from './stations.js';
6
- import type { LoadedAccount, LoadedAgent, StationSource } from './materialize.js';
7
- import { isRecord } from '../daemon/is-record.js';
4
+ import { AGENT_NAME_RE, ID_RE } from '@metro-labs/core/ids';
5
+ import { STATIONS, type StationName } from '@metro-labs/core/station-names';
6
+ import type { LoadedAccount, LoadedAgent, StationSource } from '../stations/materialize.js';
7
+ import { isRecord } from '@metro-labs/core/is-record';
8
8
 
9
9
  export const AGENT_FILE = 'agent.json';
10
10
 
@@ -1,5 +1,5 @@
1
1
  import { createHash } from 'node:crypto';
2
- import { ID_RE } from './ids.js';
2
+ import { ID_RE } from '@metro-labs/core/ids';
3
3
 
4
4
  const digest = (token: string): string =>
5
5
  createHash('sha256').update(token).digest('hex');
@@ -2,8 +2,8 @@ import {
2
2
  accountFromLine,
3
3
  agentIdForAccount,
4
4
  stationAgentIds,
5
- } from './agent-map.js';
6
- import { STATIONS } from './stations.js';
5
+ } from './map.js';
6
+ import { STATIONS } from '@metro-labs/core/station-names';
7
7
 
8
8
  const ACCOUNT_STATIONS = new Set<string>(STATIONS);
9
9
 
@@ -1,31 +1,30 @@
1
1
  import { join } from 'node:path';
2
2
  import { type Server } from 'node:http';
3
- import { userSelf } from './events.js';
4
- import { setTrainCallBackend } from './train-call.js';
5
- import { errMsg, log, logFatalSync } from './log.js';
6
- import { acquireLock, isLocalMode, STATE_DIR, trainsDir } from './paths.js';
3
+ import { userSelf } from '@metro-labs/core/events';
4
+ import { setTrainCallBackend } from '../stations/train-call.js';
5
+ import { errMsg, log, logFatalSync } from '@metro-labs/core/log';
6
+ import { acquireLock, STATE_DIR, trainsDir } from './paths.js';
7
7
  import { installCrashGuard, markDaemonReady } from './crash-guard.js';
8
- import { METRO_VERSION } from './version.js';
9
- import { funnelDriver, Tunnel, tunnelWanted, webhookPort } from './tunnel.js';
8
+ import { METRO_VERSION } from '@metro-labs/core/version';
9
+ import { funnelDriver, Tunnel, tunnelWanted, webhookPort } from '../net/tunnel.js';
10
10
  import {
11
11
  localConnectHint,
12
12
  publicConnectHint,
13
13
  tunnelPendingHint,
14
14
  } from './connect-hint.js';
15
- import { TrainSupervisor } from './supervisor.js';
15
+ import { TrainSupervisor } from '../stations/supervisor.js';
16
16
  import {
17
17
  makeEmit,
18
18
  startWebhookServer,
19
19
  trainEventToMetroEvent,
20
- } from './http.js';
21
- import { localAgentKey } from '../db/materialize.js';
22
- import { fileSource } from '../db/file-source.js';
20
+ } from '../routes/http.js';
21
+ import { localAgentKey } from '../stations/materialize.js';
22
+ import { fileSource } from '../agents/files.js';
23
23
  import { applyLocalOwner } from './local-owner.js';
24
- import { localOwner } from '../db/file-admin.js';
25
- import { ensureStationDeps } from './runtime-deps.js';
26
- import { localSessionApis } from './local-mode.js';
27
- import type { ModeInfo } from './mode-api.js';
28
- import type { SessionApis } from './session-apis.js';
24
+ import { localOwner } from '../agents/file-admin.js';
25
+ import { ensureStationDeps } from '../stations/runtime-deps.js';
26
+ import { localSessionApis } from '../routes/local-mode.js';
27
+ import type { SessionApis } from '../routes/session-apis.js';
29
28
  import {
30
29
  agentLiveness,
31
30
  closeAgentSession,
@@ -38,9 +37,9 @@ import {
38
37
  stationByName,
39
38
  } from '../stations/registry.js';
40
39
  import { prepareAccount } from '../stations/attach.js';
41
- import { materializeFrom, reloadFrom } from '../db/materialize.js';
42
- import type { StationName } from '../db/stations.js';
43
- import { startUploadReaper } from './upload-store.js';
40
+ import { materializeFrom, reloadFrom } from '../stations/materialize.js';
41
+ import type { StationName } from '@metro-labs/core/station-names';
42
+ import { startUploadReaper } from '../files/upload-store.js';
44
43
 
45
44
  installCrashGuard();
46
45
  acquireLock(join(STATE_DIR, '.tail-lock'));
@@ -96,16 +95,8 @@ async function syncStations(station: StationName): Promise<void> {
96
95
  }
97
96
  }
98
97
 
99
- const hostedMode = (): ModeInfo => ({
100
- mode: 'hosted',
101
- owner: null,
102
- project: null,
103
- version: METRO_VERSION,
104
- });
105
-
106
- async function sessionApis(): Promise<SessionApis> {
107
- if (isLocalMode())
108
- return localSessionApis({
98
+ function sessionApis(): SessionApis {
99
+ return localSessionApis({
109
100
  syncStations,
110
101
  restart: () => {
111
102
  exitCode = RESTART_EXIT;
@@ -121,41 +112,22 @@ async function sessionApis(): Promise<SessionApis> {
121
112
  liveness: agentLiveness,
122
113
  prepareAccount,
123
114
  });
124
- const vault = await import('../db/vault.js');
125
- const servers = await import('../db/servers.js');
126
- return {
127
- vaultApi: {
128
- list: vault.listVaultForOwner,
129
- put: vault.putVaultForOwner,
130
- get: vault.getVaultForOwner,
131
- remove: vault.deleteVaultForOwner,
132
- },
133
- serversApi: {
134
- list: servers.listServersForOwner,
135
- add: servers.addServerForOwner,
136
- rename: servers.renameServerForOwner,
137
- remove: servers.deleteServerForOwner,
138
- },
139
- mode: hostedMode,
140
- };
141
115
  }
142
116
 
143
117
  async function main(): Promise<void> {
144
- if (isLocalMode()) {
145
- applyLocalOwner();
146
- await materializeFrom(fileSource, { allowEmpty: true });
147
- }
118
+ applyLocalOwner();
119
+ await materializeFrom(fileSource, { allowEmpty: true });
148
120
  supervisor.start();
149
121
  const metroMcp = await createMetroMcp();
150
122
  webhookServer = await startWebhookServer(
151
123
  emit,
152
- await sessionApis(),
124
+ sessionApis(),
153
125
  metroMcp.httpHandler,
154
126
  metroCall,
155
127
  );
156
128
  metroMcp.startInbound();
157
129
  startUploadReaper();
158
- if (isLocalMode()) announceLocalEndpoint();
130
+ announceLocalEndpoint();
159
131
  tunnel?.start();
160
132
  log.info(
161
133
  { tunnel: !!tunnel, trainsDir: trainsDir(), mcp: '/', version: METRO_VERSION },