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

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 (230) hide show
  1. package/dist/cli.js +0 -3
  2. package/dist/runtime.js +1 -1
  3. package/dist/serve.js +0 -1
  4. package/package.json +1 -1
  5. package/runtime/node_modules/@metro-labs/core/package.json +43 -0
  6. package/runtime/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  7. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/events.ts +1 -1
  8. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/identity.ts +1 -1
  9. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/protocol.ts +1 -1
  10. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/account-store.ts +2 -2
  11. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/station-runtime.ts +1 -1
  12. package/runtime/node_modules/@metro-labs/daemon/package.json +47 -0
  13. package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/agents}/account-attach.ts +1 -1
  14. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/account-api.ts → daemon/src/agents/accounts-api.ts} +6 -6
  15. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-admin.ts → daemon/src/agents/admin.ts} +2 -2
  16. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/agent-api.ts → daemon/src/agents/api.ts} +6 -6
  17. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/bundle-api.ts → daemon/src/agents/bundle.ts} +7 -7
  18. package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/agents}/file-admin.ts +9 -9
  19. package/runtime/node_modules/@metro-labs/{mcp/src/db/file-source.ts → daemon/src/agents/files.ts} +4 -4
  20. package/runtime/node_modules/@metro-labs/{mcp/src/db/key-map.ts → daemon/src/agents/keys.ts} +1 -1
  21. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-scope.ts → daemon/src/agents/scope.ts} +2 -2
  22. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/boot.ts +23 -51
  23. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/crash-guard.ts +1 -1
  24. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/local-owner.ts +2 -2
  25. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/paths.ts +1 -4
  26. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/addressed.ts +1 -1
  27. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/dedupe.ts +1 -1
  28. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/inbound.ts +1 -1
  29. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/pending.ts +1 -1
  30. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +1 -1
  31. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-api.ts → daemon/src/claude/api.ts} +7 -7
  32. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-files.ts → daemon/src/claude/files.ts} +2 -2
  33. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-login.ts → daemon/src/claude/login.ts} +3 -3
  34. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/claude-settings.ts → daemon/src/claude/settings.ts} +4 -4
  35. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-api.ts → daemon/src/connectors/api.ts} +6 -6
  36. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/local-cli-api.ts → daemon/src/connectors/cli-api.ts} +5 -5
  37. package/runtime/node_modules/@metro-labs/{mcp/src/db/connector-config.ts → daemon/src/connectors/config.ts} +4 -4
  38. package/runtime/node_modules/@metro-labs/{mcp/src/db/connectors.ts → daemon/src/connectors/model.ts} +3 -3
  39. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-client.ts +2 -2
  40. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-discovery.ts +2 -2
  41. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth-routes.ts → daemon/src/connectors/oauth-routes.ts} +6 -6
  42. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-oauth.ts → daemon/src/connectors/oauth.ts} +3 -3
  43. package/runtime/node_modules/@metro-labs/{mcp/src/db/connector-relay.ts → daemon/src/connectors/relay-target.ts} +1 -1
  44. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/relay.ts +4 -4
  45. package/runtime/node_modules/@metro-labs/{mcp/src/db/local-connectors.ts → daemon/src/connectors/store.ts} +12 -12
  46. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-tools.ts → daemon/src/connectors/tools.ts} +1 -1
  47. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-url.ts → daemon/src/connectors/url.ts} +1 -1
  48. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-verify.ts → daemon/src/connectors/verify.ts} +5 -5
  49. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-grant.ts +3 -3
  50. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-owner.ts +3 -3
  51. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-serve.ts +5 -12
  52. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-api.ts +5 -5
  53. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-store.ts +2 -2
  54. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/bedrock.ts +1 -1
  55. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-auth.ts +1 -1
  56. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-device.ts +2 -2
  57. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-stream.ts +1 -1
  58. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex-translate.ts +1 -1
  59. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/codex.ts +2 -2
  60. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/gateway.ts +2 -2
  61. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/gateway}/model-api.ts +12 -12
  62. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/model-config.ts +3 -3
  63. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/openrouter.ts +1 -1
  64. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/accounts.ts +3 -7
  65. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/call-tools.ts +3 -3
  66. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/channel-owner.ts +1 -1
  67. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
  68. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/frame-scope.ts +2 -2
  69. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/group-tools.ts +2 -2
  70. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/index.ts +1 -1
  71. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/member-tools.ts +2 -2
  72. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/request-identity.ts +1 -1
  73. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session-registry.ts +2 -2
  74. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session.ts +2 -2
  75. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-dispatch.ts +4 -4
  76. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +5 -5
  77. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/monitor/api.ts +5 -5
  78. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/net}/tunnel.ts +6 -10
  79. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +15 -15
  80. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/identity-routes.ts → daemon/src/routes/identity.ts} +5 -5
  81. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/local-mode.ts +16 -16
  82. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/session-apis.ts +14 -20
  83. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-api.ts → daemon/src/routes/session.ts} +1 -1
  84. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/control-api.ts → daemon/src/server/control.ts} +3 -3
  85. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/machine-api.ts → daemon/src/server/machine.ts} +8 -8
  86. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/update-api.ts → daemon/src/server/update.ts} +5 -5
  87. package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
  88. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-resolve.ts +3 -3
  89. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/attach-session.ts +4 -4
  90. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-xmtp.ts +1 -1
  91. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach.ts +3 -3
  92. package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/stations}/materialize.ts +9 -14
  93. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/registry.ts +2 -2
  94. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/runtime-deps.ts +4 -4
  95. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor-io.ts +2 -2
  96. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor.ts +4 -4
  97. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/train-call.ts +1 -1
  98. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/terminal-api.ts → daemon/src/terminal/api.ts} +4 -4
  99. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/terminal-ws.ts → daemon/src/terminal/socket.ts} +3 -3
  100. package/runtime/node_modules/@metro-labs/discord-bot/package.json +1 -1
  101. package/runtime/node_modules/@metro-labs/discord-bot/src/accounts.ts +2 -2
  102. package/runtime/node_modules/@metro-labs/discord-bot/src/actions.ts +3 -3
  103. package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +2 -2
  104. package/runtime/node_modules/@metro-labs/discord-bot/src/group.ts +2 -2
  105. package/runtime/node_modules/@metro-labs/discord-bot/src/index.ts +2 -2
  106. package/runtime/node_modules/@metro-labs/discord-bot/src/members.ts +2 -2
  107. package/runtime/node_modules/@metro-labs/discord-bot/src/send-files.ts +1 -1
  108. package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +1 -1
  109. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-speak.ts +1 -1
  110. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-transcribe.ts +1 -1
  111. package/runtime/node_modules/@metro-labs/discord-bot/src/voice.ts +1 -1
  112. package/runtime/node_modules/@metro-labs/discord-bot/src/wire.ts +1 -1
  113. package/runtime/node_modules/@metro-labs/http/package.json +33 -0
  114. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-http.ts +1 -1
  115. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/signed-identity.ts +1 -1
  116. package/runtime/node_modules/@metro-labs/telegram/package.json +1 -1
  117. package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +1 -1
  118. package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +3 -3
  119. package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +1 -1
  120. package/runtime/node_modules/@metro-labs/telegram/src/client.ts +2 -2
  121. package/runtime/node_modules/@metro-labs/telegram/src/format.ts +1 -1
  122. package/runtime/node_modules/@metro-labs/telegram/src/group.ts +3 -3
  123. package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +1 -1
  124. package/runtime/node_modules/@metro-labs/telegram/src/index.ts +3 -3
  125. package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +1 -1
  126. package/runtime/node_modules/@metro-labs/telegram/src/members.ts +1 -1
  127. package/runtime/node_modules/@metro-labs/telegram/src/normalize.ts +1 -1
  128. package/runtime/node_modules/@metro-labs/telegram/src/reactions.ts +1 -1
  129. package/runtime/node_modules/@metro-labs/telegram/src/station.ts +1 -1
  130. package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +1 -1
  131. package/runtime/node_modules/@metro-labs/telegram-bot/package.json +1 -1
  132. package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +2 -2
  133. package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +4 -4
  134. package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +2 -2
  135. package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +1 -1
  136. package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +2 -2
  137. package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +1 -1
  138. package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +1 -1
  139. package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +1 -1
  140. package/runtime/node_modules/@metro-labs/telegram-bot/src/wire.ts +1 -1
  141. package/runtime/node_modules/@metro-labs/webhook/package.json +1 -1
  142. package/runtime/node_modules/@metro-labs/webhook/src/station.ts +4 -4
  143. package/runtime/node_modules/@metro-labs/whatsapp/package.json +1 -1
  144. package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +1 -1
  145. package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +1 -1
  146. package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +4 -4
  147. package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +2 -2
  148. package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +1 -1
  149. package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +2 -2
  150. package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +1 -1
  151. package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +1 -1
  152. package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +3 -3
  153. package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +1 -1
  154. package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +1 -1
  155. package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +1 -1
  156. package/runtime/node_modules/@metro-labs/whatsapp/src/normalize.ts +1 -1
  157. package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +1 -1
  158. package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +2 -2
  159. package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +1 -1
  160. package/runtime/node_modules/@metro-labs/xmtp/package.json +1 -1
  161. package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +2 -2
  162. package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +1 -1
  163. package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +1 -1
  164. package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +1 -1
  165. package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +3 -3
  166. package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +3 -3
  167. package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +2 -2
  168. package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +1 -1
  169. package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +1 -1
  170. package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +1 -1
  171. package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +2 -2
  172. package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +2 -2
  173. package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +1 -1
  174. package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +2 -2
  175. package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +1 -1
  176. package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +3 -3
  177. package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +1 -1
  178. package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +1 -1
  179. package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +1 -1
  180. package/runtime/runtime.json +1 -1
  181. package/dist/bedrock-eventstream.js +0 -120
  182. package/dist/bedrock-proxy.js +0 -260
  183. package/dist/bedrock-upstream.js +0 -72
  184. package/dist/bedrock.js +0 -37
  185. package/runtime/node_modules/@metro-labs/mcp/package.json +0 -64
  186. package/runtime/node_modules/@metro-labs/mcp/src/daemon/server-types.ts +0 -21
  187. package/runtime/node_modules/@metro-labs/mcp/src/daemon/servers-api.ts +0 -80
  188. package/runtime/node_modules/@metro-labs/mcp/src/daemon/vault-api.ts +0 -78
  189. package/runtime/node_modules/@metro-labs/mcp/src/daemon/vault-types.ts +0 -12
  190. package/runtime/node_modules/@metro-labs/mcp/src/db/client.ts +0 -32
  191. package/runtime/node_modules/@metro-labs/mcp/src/db/schema.ts +0 -33
  192. package/runtime/node_modules/@metro-labs/mcp/src/db/servers.ts +0 -83
  193. package/runtime/node_modules/@metro-labs/mcp/src/db/vault.ts +0 -109
  194. package/runtime/node_modules/@metro-labs/mcp/src/server.ts +0 -2
  195. /package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/address.ts +0 -0
  196. /package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/ids.ts +0 -0
  197. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/is-record.ts +0 -0
  198. /package/runtime/node_modules/@metro-labs/{mcp/src/stations → core/src}/lines.ts +0 -0
  199. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/log.ts +0 -0
  200. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/secure-fs.ts +0 -0
  201. /package/runtime/node_modules/@metro-labs/{mcp/src/db/stations.ts → core/src/station-names.ts} +0 -0
  202. /package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/attachments.ts +0 -0
  203. /package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/messaging-normalize.ts +0 -0
  204. /package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/types.ts +0 -0
  205. /package/runtime/node_modules/@metro-labs/{mcp/src/mcp → core/src}/str.ts +0 -0
  206. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/train-error.ts +0 -0
  207. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/version.ts +0 -0
  208. /package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-map.ts → daemon/src/agents/map.ts} +0 -0
  209. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/connect-hint.ts +0 -0
  210. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/media-note.ts +0 -0
  211. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/webhook-note.ts +0 -0
  212. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon/connector-json.ts → daemon/src/connectors/json.ts} +0 -0
  213. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/connectors}/oauth-pending.ts +0 -0
  214. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/eventstream.ts +0 -0
  215. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/forward.ts +0 -0
  216. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/gateway/served.ts +0 -0
  217. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +0 -0
  218. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/permission-relay.ts +0 -0
  219. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/raw-get-stream.ts +0 -0
  220. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session-route.ts +0 -0
  221. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +0 -0
  222. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-inline.ts +0 -0
  223. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-interactive.ts +0 -0
  224. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon/terminal-tickets.ts → daemon/src/terminal/tickets.ts} +0 -0
  225. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-error.ts +0 -0
  226. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/cors.ts +0 -0
  227. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/identity-key.ts +0 -0
  228. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/identity-registry.ts +0 -0
  229. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/mode-api.ts +0 -0
  230. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/return-to.ts +0 -0
@@ -1,4 +1,4 @@
1
- export { emit, mintId } from '@metro-labs/mcp/stations/station-runtime';
1
+ export { emit, mintId } from '@metro-labs/core/stations/station-runtime';
2
2
 
3
3
  export const SELF_URI =
4
4
  process.env.METRO_SELF_URI ??
@@ -13,7 +13,7 @@
13
13
  "test": "tsc --noEmit && DYLD_FALLBACK_LIBRARY_PATH=/usr/lib bun test test/"
14
14
  },
15
15
  "dependencies": {
16
- "@metro-labs/mcp": "workspace:*",
16
+ "@metro-labs/core": "workspace:*",
17
17
  "@xmtp/content-type-primitives": "^3.0.1",
18
18
  "@xmtp/content-type-reaction": "^2.0.2",
19
19
  "@xmtp/content-type-remote-attachment": "^2.0.4",
@@ -11,8 +11,8 @@ import { expandHome, signerFor, XMTP_ENV } from './identity.js';
11
11
  import {
12
12
  makeAccountStore,
13
13
  resolveAccountId,
14
- } from '@metro-labs/mcp/stations/account-store';
15
- import { Line } from '@metro-labs/mcp/lines';
14
+ } from '@metro-labs/core/stations/account-store';
15
+ import { Line } from '@metro-labs/core/lines';
16
16
 
17
17
  const ACCOUNTS_FILE =
18
18
  process.env.XMTP_ACCOUNTS_FILE ??
@@ -1,4 +1,4 @@
1
- import { errMsg } from '@metro-labs/mcp/log';
1
+ import { errMsg } from '@metro-labs/core/log';
2
2
  import { accountForCall, convOf, lineOf, type Account } from './accounts.js';
3
3
  import { respond } from './wire.js';
4
4
  import type { GroupLike } from './labels.js';
@@ -8,7 +8,7 @@ import {
8
8
  type Account,
9
9
  } from './accounts.js';
10
10
  import { respond } from './wire.js';
11
- import { TrainError } from '@metro-labs/mcp/train-error';
11
+ import { TrainError } from '@metro-labs/core/train-error';
12
12
  import { pushHandlers } from './actions-push.js';
13
13
  import { cleanLabels, labelsBlob } from './labels.js';
14
14
  import {
@@ -2,7 +2,7 @@ import { accountForCall, convOf, lineOf } from './accounts.js';
2
2
  import { respond } from './wire.js';
3
3
  import { warmGroupName } from './conv-helpers.js';
4
4
  import { mergeAppData, readAppData, type GroupLike } from './labels.js';
5
- import { TrainError } from '@metro-labs/mcp/train-error';
5
+ import { TrainError } from '@metro-labs/core/train-error';
6
6
 
7
7
  type Args = Record<string, unknown>;
8
8
 
@@ -19,9 +19,9 @@ import {
19
19
  type SignatureRequestContent,
20
20
  } from './codecs.js';
21
21
  import { convHandlers } from './actions-conv.js';
22
- import { normalizeXmtp } from '@metro-labs/mcp/stations/messaging-normalize';
23
- import { TrainError } from '@metro-labs/mcp/train-error';
24
- import { makeStation, type CallMsg } from '@metro-labs/mcp/stations/station-runtime';
22
+ import { normalizeXmtp } from '@metro-labs/core/stations/messaging-normalize';
23
+ import { TrainError } from '@metro-labs/core/train-error';
24
+ import { makeStation, type CallMsg } from '@metro-labs/core/stations/station-runtime';
25
25
 
26
26
  type Args = Record<string, unknown>;
27
27
 
@@ -6,9 +6,9 @@ import {
6
6
  import {
7
7
  saveBufferToCache,
8
8
  assertAttachmentSize,
9
- } from '@metro-labs/mcp/stations/attachments';
10
- import type { SavedAttachment } from '@metro-labs/mcp/stations/attachments';
11
- import { errMsg } from '@metro-labs/mcp/log';
9
+ } from '@metro-labs/core/stations/attachments';
10
+ import type { SavedAttachment } from '@metro-labs/core/stations/attachments';
11
+ import { errMsg } from '@metro-labs/core/log';
12
12
 
13
13
  export type { SavedAttachment };
14
14
 
@@ -1,8 +1,8 @@
1
1
  import { IdentifierKind } from '@xmtp/node-sdk';
2
2
  import { convOf, type Account } from './accounts.js';
3
3
  import { inboxEthCache, cacheInboxEth } from './wire.js';
4
- import { TrainError } from '@metro-labs/mcp/train-error';
5
- import type { MemberList, MetroMember } from '@metro-labs/mcp/stations/types';
4
+ import { TrainError } from '@metro-labs/core/train-error';
5
+ import type { MemberList, MetroMember } from '@metro-labs/core/stations/types';
6
6
  import { readAppData, type GroupLike } from './labels.js';
7
7
 
8
8
  export { parseMemberArgs, resolveMembers } from './member-args.js';
@@ -1,6 +1,6 @@
1
1
  import type { Reaction } from '@xmtp/content-type-reaction';
2
2
  import type { Reply } from '@xmtp/content-type-reply';
3
- import { errMsg } from '@metro-labs/mcp/log';
3
+ import { errMsg } from '@metro-labs/core/log';
4
4
  import { transcribeAndEmit } from './transcribe.js';
5
5
  import {
6
6
  saveInlineAttachment,
@@ -4,7 +4,7 @@ import { emit, mintId, rememberSent, rememberUid, SELF_URI } from './wire.js';
4
4
  import { fcmPushToAll } from './push.js';
5
5
  import { emitInbound, emitAttachmentSaved } from './emit-core.js';
6
6
  import { typedEnvelope, type EnvelopeCtx } from './emit-payloads.js';
7
- import type { StructuredEvent } from '@metro-labs/mcp/events';
7
+ import type { StructuredEvent } from '@metro-labs/core/events';
8
8
 
9
9
  export { emitInbound, emitAttachmentSaved };
10
10
 
@@ -1,7 +1,7 @@
1
1
  import type {
2
2
  MemberOutcome,
3
3
  MemberOutcomeStatus,
4
- } from '@metro-labs/mcp/stations/types';
4
+ } from '@metro-labs/core/stations/types';
5
5
 
6
6
  type Args = Record<string, unknown>;
7
7
 
@@ -1,5 +1,5 @@
1
- import { TrainError } from '@metro-labs/mcp/train-error';
2
- import type { GroupResult } from '@metro-labs/mcp/stations/types';
1
+ import { TrainError } from '@metro-labs/core/train-error';
2
+ import type { GroupResult } from '@metro-labs/core/stations/types';
3
3
  import { accountForCall, convOf, lineOf } from './accounts.js';
4
4
  import {
5
5
  applyMemberOp,
@@ -1,4 +1,4 @@
1
- import { errMsg } from '@metro-labs/mcp/log';
1
+ import { errMsg } from '@metro-labs/core/log';
2
2
  import { ConsentState, type DecodedMessage } from '@xmtp/node-sdk';
3
3
  import {
4
4
  accounts,
@@ -9,7 +9,7 @@ import {
9
9
  import { emitInbound, envelope } from './emit.js';
10
10
  import { groupNameFor } from './conv-helpers.js';
11
11
  import { handleControlDm, pushInbound } from './push.js';
12
- import { readCalls } from '@metro-labs/mcp/trains/protocol';
12
+ import { readCalls } from '@metro-labs/core/trains/protocol';
13
13
  import { handleCall } from './actions.js';
14
14
 
15
15
  readCalls('xmtp', handleCall);
@@ -1,4 +1,4 @@
1
- import { TrainError } from '@metro-labs/mcp/train-error';
1
+ import { TrainError } from '@metro-labs/core/train-error';
2
2
 
3
3
  type Args = Record<string, unknown>;
4
4
 
@@ -1,8 +1,8 @@
1
- import { errMsg } from '@metro-labs/mcp/log';
1
+ import { errMsg } from '@metro-labs/core/log';
2
2
  import { type DecodedMessage } from '@xmtp/node-sdk';
3
3
  import { existsSync, readFileSync, mkdirSync } from 'node:fs';
4
4
  import { dirname } from 'node:path';
5
- import { readJson, writeJson } from '@metro-labs/mcp/secure-fs';
5
+ import { readJson, writeJson } from '@metro-labs/core/secure-fs';
6
6
  import { parseLine } from './accounts.js';
7
7
 
8
8
  const FCM_SVC_PATH = `${process.env.HOME}/.config/metro/firebase-service-account.json`;
@@ -1,4 +1,4 @@
1
- import type { GroupOp, Station, Verb } from '@metro-labs/mcp/stations/types';
1
+ import type { GroupOp, Station, Verb } from '@metro-labs/core/stations/types';
2
2
  import { XMTP_TOOLS, xmtpSendAttachments } from './tools.js';
3
3
 
4
4
  export const xmtpStation: Station = {
@@ -1,11 +1,11 @@
1
- import type { CanonicalAttachment, ToolContext } from '@metro-labs/mcp/stations/types';
2
- import { TrainError } from '@metro-labs/mcp/train-error';
1
+ import type { CanonicalAttachment, ToolContext } from '@metro-labs/core/stations/types';
2
+ import { TrainError } from '@metro-labs/core/train-error';
3
3
  import {
4
4
  guessMime,
5
5
  isImageMime,
6
6
  isImageExt,
7
7
  kindOf,
8
- } from '@metro-labs/mcp/stations/attachments';
8
+ } from '@metro-labs/core/stations/attachments';
9
9
 
10
10
  export const str = (v: unknown): string => (typeof v === 'string' ? v : '');
11
11
 
@@ -1,4 +1,4 @@
1
- import type { StationTool } from '@metro-labs/mcp/stations/types';
1
+ import type { StationTool } from '@metro-labs/core/stations/types';
2
2
  import {
3
3
  str,
4
4
  createChannel,
@@ -1,4 +1,4 @@
1
- import { errMsg } from '@metro-labs/mcp/log';
1
+ import { errMsg } from '@metro-labs/core/log';
2
2
  import { mintId, SELF_URI } from './wire.js';
3
3
 
4
4
  type EmitInbound = (accountId: string, e: Record<string, unknown>) => void;
@@ -1,4 +1,4 @@
1
- export { emit, respond, mintId } from '@metro-labs/mcp/stations/station-runtime';
1
+ export { emit, respond, mintId } from '@metro-labs/core/stations/station-runtime';
2
2
 
3
3
  export const SELF_URI = process.env.METRO_SELF_URI ?? '';
4
4
 
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "0.1.0-beta.76"
2
+ "version": "0.1.0-beta.77"
3
3
  }
@@ -1,120 +0,0 @@
1
- const PRELUDE_BYTES = 12;
2
- const CRC_BYTES = 4;
3
- const HEADER_TRUE = 0;
4
- const HEADER_FALSE = 1;
5
- const HEADER_BYTE = 2;
6
- const HEADER_SHORT = 3;
7
- const HEADER_INT = 4;
8
- const HEADER_LONG = 5;
9
- const HEADER_BYTES = 6;
10
- const HEADER_STRING = 7;
11
- const HEADER_TIMESTAMP = 8;
12
- const HEADER_UUID = 9;
13
- const FIXED_WIDTH = {
14
- [HEADER_TRUE]: 0,
15
- [HEADER_FALSE]: 0,
16
- [HEADER_BYTE]: 1,
17
- [HEADER_SHORT]: 2,
18
- [HEADER_INT]: 4,
19
- [HEADER_LONG]: 8,
20
- [HEADER_TIMESTAMP]: 8,
21
- [HEADER_UUID]: 16,
22
- };
23
- function readHeaderValue(buf, at, type) {
24
- if (type === HEADER_BYTES || type === HEADER_STRING) {
25
- const len = buf.readUInt16BE(at);
26
- const raw = buf.subarray(at + 2, at + 2 + len);
27
- const value = type === HEADER_STRING ? raw.toString('utf8') : raw.toString('base64');
28
- return { value, next: at + 2 + len };
29
- }
30
- const width = FIXED_WIDTH[type];
31
- if (width === undefined)
32
- throw new Error(`eventstream: unknown header type ${String(type)}`);
33
- if (type === HEADER_TRUE)
34
- return { value: 'true', next: at };
35
- if (type === HEADER_FALSE)
36
- return { value: 'false', next: at };
37
- return { value: buf.subarray(at, at + width).toString('hex'), next: at + width };
38
- }
39
- function readHeaders(buf) {
40
- const out = {};
41
- let at = 0;
42
- while (at < buf.length) {
43
- const nameLen = buf.readUInt8(at);
44
- const name = buf.subarray(at + 1, at + 1 + nameLen).toString('utf8');
45
- const type = buf.readUInt8(at + 1 + nameLen);
46
- const parsed = readHeaderValue(buf, at + 2 + nameLen, type);
47
- out[name] = parsed.value;
48
- at = parsed.next;
49
- }
50
- return out;
51
- }
52
- export function decodeFrame(buf, offset) {
53
- if (buf.length - offset < PRELUDE_BYTES)
54
- return null;
55
- const total = buf.readUInt32BE(offset);
56
- const headersLen = buf.readUInt32BE(offset + 4);
57
- if (total < PRELUDE_BYTES + CRC_BYTES || headersLen > total)
58
- throw new Error('eventstream: malformed frame prelude');
59
- if (buf.length - offset < total)
60
- return null;
61
- const headersStart = offset + PRELUDE_BYTES;
62
- const payloadStart = headersStart + headersLen;
63
- const payloadEnd = offset + total - CRC_BYTES;
64
- return {
65
- message: {
66
- headers: readHeaders(buf.subarray(headersStart, payloadStart)),
67
- payload: Buffer.from(buf.subarray(payloadStart, payloadEnd)),
68
- },
69
- end: offset + total,
70
- };
71
- }
72
- export class EventStreamDecoder {
73
- pending = Buffer.alloc(0);
74
- push(chunk) {
75
- this.pending =
76
- this.pending.length === 0 ? chunk : Buffer.concat([this.pending, chunk]);
77
- const out = [];
78
- let offset = 0;
79
- for (;;) {
80
- const frame = decodeFrame(this.pending, offset);
81
- if (frame === null)
82
- break;
83
- out.push(frame.message);
84
- offset = frame.end;
85
- }
86
- this.pending = this.pending.subarray(offset);
87
- return out;
88
- }
89
- leftover() {
90
- return this.pending.length;
91
- }
92
- }
93
- function encodeHeader(name, value) {
94
- const nameBuf = Buffer.from(name, 'utf8');
95
- const valueBuf = Buffer.from(value, 'utf8');
96
- const out = Buffer.alloc(1 + nameBuf.length + 1 + 2 + valueBuf.length);
97
- let at = 0;
98
- out.writeUInt8(nameBuf.length, at);
99
- at += 1;
100
- nameBuf.copy(out, at);
101
- at += nameBuf.length;
102
- out.writeUInt8(HEADER_STRING, at);
103
- at += 1;
104
- out.writeUInt16BE(valueBuf.length, at);
105
- at += 2;
106
- valueBuf.copy(out, at);
107
- return out;
108
- }
109
- export function encodeFrame(headers, payload) {
110
- const headerBuf = Buffer.concat(Object.entries(headers).map(([name, value]) => encodeHeader(name, value)));
111
- const total = PRELUDE_BYTES + headerBuf.length + payload.length + CRC_BYTES;
112
- const out = Buffer.alloc(total);
113
- out.writeUInt32BE(total, 0);
114
- out.writeUInt32BE(headerBuf.length, 4);
115
- out.writeUInt32BE(0, 8);
116
- headerBuf.copy(out, PRELUDE_BYTES);
117
- payload.copy(out, PRELUDE_BYTES + headerBuf.length);
118
- out.writeUInt32BE(0, total - CRC_BYTES);
119
- return out;
120
- }
@@ -1,260 +0,0 @@
1
- import { createServer, } from 'node:http';
2
- import { EventStreamDecoder } from './bedrock-eventstream.js';
3
- import { callBedrock, freshAdaptations, invoke, invokeUrl, upstreamMessage, } from './bedrock-upstream.js';
4
- export class BedrockConfigError extends Error {
5
- }
6
- class ProxyError extends Error {
7
- status;
8
- kind;
9
- constructor(status, kind, message) {
10
- super(message);
11
- this.status = status;
12
- this.kind = kind;
13
- }
14
- }
15
- const ANTHROPIC_VERSION = 'bedrock-2023-05-31';
16
- const BODY_MAX = 64 * 1024 * 1024;
17
- const MESSAGES_PATH = '/v1/messages';
18
- const COUNT_PATH = '/v1/messages/count_tokens';
19
- function firstEnv(env, names) {
20
- for (const name of names) {
21
- const value = env[name]?.trim() ?? '';
22
- if (value !== '')
23
- return value;
24
- }
25
- return '';
26
- }
27
- export function bedrockConfigFromEnv(env = process.env) {
28
- const bearerToken = firstEnv(env, ['AWS_BEARER_TOKEN_BEDROCK']);
29
- if (bearerToken === '')
30
- throw new BedrockConfigError('AWS_BEARER_TOKEN_BEDROCK is not set. Create an Amazon Bedrock API key in the AWS console (Bedrock → API keys) and export it.');
31
- const region = firstEnv(env, ['METRO_BEDROCK_REGION', 'AWS_REGION', 'AWS_DEFAULT_REGION']);
32
- if (region === '')
33
- throw new BedrockConfigError('no AWS region: set AWS_REGION (or METRO_BEDROCK_REGION) to the region your Bedrock API key belongs to');
34
- const model = firstEnv(env, ['METRO_BEDROCK_MODEL']);
35
- return { region, bearerToken, model: model === '' ? null : model };
36
- }
37
- const PREFIXES = [
38
- [/^us-gov-/, 'us-gov'],
39
- [/^us-/, 'us'],
40
- [/^eu-/, 'eu'],
41
- [/^ap-/, 'apac'],
42
- ];
43
- export function regionPrefix(region) {
44
- for (const [pattern, prefix] of PREFIXES)
45
- if (pattern.test(region))
46
- return prefix;
47
- return 'global';
48
- }
49
- export function mapModel(requested, cfg) {
50
- if (cfg.model !== null)
51
- return cfg.model;
52
- if (requested.includes('anthropic.'))
53
- return requested;
54
- return `${regionPrefix(cfg.region)}.anthropic.${requested}`;
55
- }
56
- export const upstreamBase = (cfg, override) => override ?? `https://bedrock-runtime.${cfg.region}.amazonaws.com`;
57
- function splitBetas(header) {
58
- const raw = Array.isArray(header) ? header.join(',') : (header ?? '');
59
- return raw
60
- .split(',')
61
- .map((b) => b.trim())
62
- .filter((b) => b !== '');
63
- }
64
- export function rewriteBody(raw, betaHeader, cfg) {
65
- if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
66
- throw new ProxyError(400, 'invalid_request_error', 'body must be a JSON object');
67
- const { model, stream, ...rest } = raw;
68
- if (typeof model !== 'string' || model === '')
69
- throw new ProxyError(400, 'invalid_request_error', 'model is required');
70
- const betas = splitBetas(betaHeader);
71
- const body = { ...rest, anthropic_version: ANTHROPIC_VERSION };
72
- if (betas.length > 0)
73
- body.anthropic_beta = betas;
74
- return { modelId: mapModel(model, cfg), stream: stream === true, body, betas };
75
- }
76
- export function errorKind(status, errorType) {
77
- if (status === 429 || errorType === 'ThrottlingException')
78
- return 'rate_limit_error';
79
- if (status === 400)
80
- return 'invalid_request_error';
81
- if (status === 401)
82
- return 'authentication_error';
83
- if (status === 403)
84
- return 'permission_error';
85
- if (status === 404)
86
- return 'not_found_error';
87
- if (status === 503)
88
- return 'overloaded_error';
89
- return 'api_error';
90
- }
91
- function sendError(res, status, kind, message) {
92
- res.writeHead(status, { 'content-type': 'application/json' });
93
- res.end(JSON.stringify({ type: 'error', error: { type: kind, message } }));
94
- }
95
- async function readBody(req) {
96
- const chunks = [];
97
- let total = 0;
98
- for await (const chunk of req) {
99
- const buf = chunk;
100
- total += buf.length;
101
- if (total > BODY_MAX)
102
- throw new ProxyError(413, 'invalid_request_error', 'request too large');
103
- chunks.push(buf);
104
- }
105
- try {
106
- return JSON.parse(Buffer.concat(chunks).toString('utf8'));
107
- }
108
- catch {
109
- throw new ProxyError(400, 'invalid_request_error', 'body must be JSON');
110
- }
111
- }
112
- async function relayError(upstream, res) {
113
- const text = await upstream.text();
114
- const kind = errorKind(upstream.status, upstream.headers.get('x-amzn-errortype'));
115
- sendError(res, upstream.status, kind, upstreamMessage(text));
116
- }
117
- function eventTypeOf(event) {
118
- try {
119
- const parsed = JSON.parse(event);
120
- return typeof parsed.type === 'string' ? parsed.type : 'message';
121
- }
122
- catch {
123
- return 'message';
124
- }
125
- }
126
- function writeEvent(res, message) {
127
- if (message.headers[':message-type'] === 'event') {
128
- const parsed = JSON.parse(message.payload.toString('utf8'));
129
- if (typeof parsed.bytes !== 'string')
130
- return;
131
- const event = Buffer.from(parsed.bytes, 'base64').toString('utf8');
132
- res.write(`event: ${eventTypeOf(event)}\ndata: ${event}\n\n`);
133
- return;
134
- }
135
- const errorType = message.headers[':exception-type'] ?? message.headers[':error-code'] ?? null;
136
- const body = {
137
- type: 'error',
138
- error: {
139
- type: errorKind(500, errorType),
140
- message: upstreamMessage(message.payload.toString('utf8')),
141
- },
142
- };
143
- res.write(`event: error\ndata: ${JSON.stringify(body)}\n\n`);
144
- }
145
- async function relayStream(upstream, res) {
146
- res.writeHead(200, {
147
- 'content-type': 'text/event-stream',
148
- 'cache-control': 'no-store',
149
- connection: 'keep-alive',
150
- });
151
- const body = upstream.body;
152
- if (body === null) {
153
- res.end();
154
- return;
155
- }
156
- const decoder = new EventStreamDecoder();
157
- const reader = body.getReader();
158
- for (;;) {
159
- const { done, value } = await reader.read();
160
- if (done)
161
- break;
162
- for (const message of decoder.push(Buffer.from(value)))
163
- writeEvent(res, message);
164
- }
165
- res.end();
166
- }
167
- async function relayJson(upstream, res) {
168
- const text = await upstream.text();
169
- res.writeHead(200, { 'content-type': 'application/json' });
170
- res.end(text);
171
- }
172
- async function handleMessages(req, res, up) {
173
- const rewritten = rewriteBody(await readBody(req), req.headers['anthropic-beta'], up.cfg);
174
- const controller = new AbortController();
175
- res.on('close', () => {
176
- if (!res.writableEnded)
177
- controller.abort();
178
- });
179
- const upstream = await invoke(up, rewritten, controller.signal);
180
- if (!upstream.ok) {
181
- await relayError(upstream, res);
182
- return;
183
- }
184
- if (rewritten.stream)
185
- await relayStream(upstream, res);
186
- else
187
- await relayJson(upstream, res);
188
- }
189
- function estimateTokens(body) {
190
- return Math.ceil(JSON.stringify(body).length / 4);
191
- }
192
- async function handleCount(req, res, up) {
193
- const rewritten = rewriteBody(await readBody(req), req.headers['anthropic-beta'], up.cfg);
194
- const controller = new AbortController();
195
- const upstream = await callBedrock(up, invokeUrl(up, rewritten.modelId, 'count-tokens'), { input: { invokeModel: { body: JSON.stringify(rewritten.body) } } }, 'application/json', controller.signal);
196
- const text = await upstream.text();
197
- let counted = null;
198
- if (upstream.ok) {
199
- const parsed = JSON.parse(text);
200
- if (typeof parsed.inputTokens === 'number')
201
- counted = parsed.inputTokens;
202
- }
203
- res.writeHead(200, { 'content-type': 'application/json' });
204
- res.end(JSON.stringify({ input_tokens: counted ?? estimateTokens(rewritten.body) }));
205
- }
206
- function presentedToken(req) {
207
- const auth = req.headers.authorization ?? '';
208
- if (auth.toLowerCase().startsWith('bearer '))
209
- return auth.slice(7).trim();
210
- const key = req.headers['x-api-key'];
211
- return Array.isArray(key) ? (key[0] ?? '') : (key ?? '');
212
- }
213
- async function route(req, res, cfg, opts, learned) {
214
- if (presentedToken(req) !== opts.token)
215
- throw new ProxyError(401, 'authentication_error', 'unauthorized');
216
- const path = (req.url ?? '').split('?')[0] ?? '';
217
- const up = { cfg, base: upstreamBase(cfg, opts.upstream), learned };
218
- if (req.method === 'POST' && path === MESSAGES_PATH)
219
- return handleMessages(req, res, up);
220
- if (req.method === 'POST' && path === COUNT_PATH)
221
- return handleCount(req, res, up);
222
- throw new ProxyError(404, 'not_found_error', 'not found');
223
- }
224
- function failed(res, err) {
225
- if (res.headersSent) {
226
- res.end();
227
- return;
228
- }
229
- if (err instanceof ProxyError) {
230
- sendError(res, err.status, err.kind, err.message);
231
- return;
232
- }
233
- const message = err instanceof Error ? err.message : 'proxy failure';
234
- sendError(res, 502, 'api_error', `metro bedrock proxy: ${message}`);
235
- }
236
- export function startBedrockProxy(cfg, opts) {
237
- const learned = freshAdaptations();
238
- const server = createServer((req, res) => {
239
- route(req, res, cfg, opts, learned).catch((err) => {
240
- failed(res, err);
241
- });
242
- });
243
- return new Promise((resolve, reject) => {
244
- server.once('error', reject);
245
- server.listen(opts.port ?? 0, '127.0.0.1', () => {
246
- const address = server.address();
247
- const port = typeof address === 'object' && address !== null ? address.port : 0;
248
- resolve({
249
- port,
250
- server,
251
- learned,
252
- close: () => new Promise((done) => {
253
- server.close(() => {
254
- done();
255
- });
256
- }),
257
- });
258
- });
259
- });
260
- }