@stage-labs/metro 0.1.0-beta.7 → 0.1.0-beta.71

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 (279) hide show
  1. package/dist/api.js +14 -0
  2. package/dist/bedrock-eventstream.js +120 -0
  3. package/dist/bedrock-proxy.js +260 -0
  4. package/dist/bedrock-upstream.js +72 -0
  5. package/dist/bedrock.js +37 -0
  6. package/dist/claude-settings.js +40 -0
  7. package/dist/claude.js +107 -0
  8. package/dist/cli.js +101 -0
  9. package/dist/control.js +74 -0
  10. package/dist/hold.js +211 -0
  11. package/dist/local.js +93 -0
  12. package/dist/node-name.js +51 -0
  13. package/dist/plugin.js +80 -0
  14. package/dist/provider-flags.js +9 -0
  15. package/dist/runtime-install.js +84 -0
  16. package/dist/runtime.js +70 -0
  17. package/dist/serve.js +147 -0
  18. package/dist/service.js +224 -0
  19. package/dist/tail.js +119 -0
  20. package/dist/update.js +45 -0
  21. package/dist/version.js +97 -0
  22. package/package.json +14 -25
  23. package/runtime/node_modules/@metro-labs/discord-bot/package.json +28 -0
  24. package/runtime/node_modules/@metro-labs/discord-bot/src/accounts.ts +118 -0
  25. package/runtime/node_modules/@metro-labs/discord-bot/src/actions.ts +388 -0
  26. package/runtime/node_modules/@metro-labs/discord-bot/src/api-base.ts +1 -0
  27. package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +29 -0
  28. package/runtime/node_modules/@metro-labs/discord-bot/src/format.ts +220 -0
  29. package/runtime/node_modules/@metro-labs/discord-bot/src/group-actions.ts +50 -0
  30. package/runtime/node_modules/@metro-labs/discord-bot/src/group.ts +115 -0
  31. package/runtime/node_modules/@metro-labs/discord-bot/src/index.ts +127 -0
  32. package/runtime/node_modules/@metro-labs/discord-bot/src/members.ts +215 -0
  33. package/runtime/node_modules/@metro-labs/discord-bot/src/send-files.ts +43 -0
  34. package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +19 -0
  35. package/runtime/node_modules/@metro-labs/discord-bot/src/verify.ts +82 -0
  36. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-speak.ts +195 -0
  37. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-transcribe.ts +292 -0
  38. package/runtime/node_modules/@metro-labs/discord-bot/src/voice.ts +197 -0
  39. package/runtime/node_modules/@metro-labs/discord-bot/src/wire.ts +5 -0
  40. package/runtime/node_modules/@metro-labs/mcp/package.json +64 -0
  41. package/runtime/node_modules/@metro-labs/mcp/src/channels/addressed.ts +25 -0
  42. package/runtime/node_modules/@metro-labs/mcp/src/channels/dedupe.ts +24 -0
  43. package/runtime/node_modules/@metro-labs/mcp/src/channels/inbound.ts +377 -0
  44. package/runtime/node_modules/@metro-labs/mcp/src/channels/media-note.ts +85 -0
  45. package/runtime/node_modules/@metro-labs/mcp/src/channels/pending.ts +75 -0
  46. package/runtime/node_modules/@metro-labs/mcp/src/channels/relay.ts +129 -0
  47. package/runtime/node_modules/@metro-labs/mcp/src/channels/webhook-note.ts +51 -0
  48. package/runtime/node_modules/@metro-labs/mcp/src/daemon/account-api.ts +311 -0
  49. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-api.ts +302 -0
  50. package/runtime/node_modules/@metro-labs/mcp/src/daemon/api-error.ts +8 -0
  51. package/runtime/node_modules/@metro-labs/mcp/src/daemon/api-http.ts +95 -0
  52. package/runtime/node_modules/@metro-labs/mcp/src/daemon/attach-grant.ts +99 -0
  53. package/runtime/node_modules/@metro-labs/mcp/src/daemon/attach-owner.ts +32 -0
  54. package/runtime/node_modules/@metro-labs/mcp/src/daemon/attach-serve.ts +128 -0
  55. package/runtime/node_modules/@metro-labs/mcp/src/daemon/attach-session.ts +280 -0
  56. package/runtime/node_modules/@metro-labs/mcp/src/daemon/boot.ts +204 -0
  57. package/runtime/node_modules/@metro-labs/mcp/src/daemon/bundle-api.ts +111 -0
  58. package/runtime/node_modules/@metro-labs/mcp/src/daemon/claude-api.ts +97 -0
  59. package/runtime/node_modules/@metro-labs/mcp/src/daemon/claude-files.ts +329 -0
  60. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connect-hint.ts +39 -0
  61. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-api.ts +307 -0
  62. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-json.ts +21 -0
  63. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-oauth-routes.ts +157 -0
  64. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-oauth.ts +127 -0
  65. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-tools.ts +98 -0
  66. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-url.ts +70 -0
  67. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-verify.ts +330 -0
  68. package/runtime/node_modules/@metro-labs/mcp/src/daemon/control-api.ts +64 -0
  69. package/runtime/node_modules/@metro-labs/mcp/src/daemon/cors.ts +29 -0
  70. package/runtime/node_modules/@metro-labs/mcp/src/daemon/crash-guard.ts +49 -0
  71. package/runtime/node_modules/@metro-labs/mcp/src/daemon/events.ts +120 -0
  72. package/runtime/node_modules/@metro-labs/mcp/src/daemon/http.ts +390 -0
  73. package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity-key.ts +33 -0
  74. package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity-registry.ts +13 -0
  75. package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity-routes.ts +54 -0
  76. package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity.ts +7 -0
  77. package/runtime/node_modules/@metro-labs/mcp/src/daemon/is-record.ts +2 -0
  78. package/runtime/node_modules/@metro-labs/mcp/src/daemon/local-cli-api.ts +63 -0
  79. package/runtime/node_modules/@metro-labs/mcp/src/daemon/local-mode.ts +187 -0
  80. package/runtime/node_modules/@metro-labs/mcp/src/daemon/local-owner.ts +14 -0
  81. package/runtime/node_modules/@metro-labs/mcp/src/daemon/log.ts +42 -0
  82. package/runtime/node_modules/@metro-labs/mcp/src/daemon/machine-api.ts +61 -0
  83. package/runtime/node_modules/@metro-labs/mcp/src/daemon/mode-api.ts +32 -0
  84. package/runtime/node_modules/@metro-labs/mcp/src/daemon/model-api.ts +169 -0
  85. package/runtime/node_modules/@metro-labs/mcp/src/daemon/oauth-client.ts +159 -0
  86. package/runtime/node_modules/@metro-labs/mcp/src/daemon/oauth-discovery.ts +117 -0
  87. package/runtime/node_modules/@metro-labs/mcp/src/daemon/oauth-pending.ts +65 -0
  88. package/runtime/node_modules/@metro-labs/mcp/src/daemon/paths.ts +109 -0
  89. package/runtime/node_modules/@metro-labs/mcp/src/daemon/protocol.ts +226 -0
  90. package/runtime/node_modules/@metro-labs/mcp/src/daemon/relay.ts +295 -0
  91. package/runtime/node_modules/@metro-labs/mcp/src/daemon/return-to.ts +21 -0
  92. package/runtime/node_modules/@metro-labs/mcp/src/daemon/runtime-deps.ts +82 -0
  93. package/runtime/node_modules/@metro-labs/mcp/src/daemon/secure-fs.ts +57 -0
  94. package/runtime/node_modules/@metro-labs/mcp/src/daemon/server-types.ts +21 -0
  95. package/runtime/node_modules/@metro-labs/mcp/src/daemon/servers-api.ts +80 -0
  96. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session-api.ts +29 -0
  97. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session-apis.ts +66 -0
  98. package/runtime/node_modules/@metro-labs/mcp/src/daemon/signed-identity.ts +36 -0
  99. package/runtime/node_modules/@metro-labs/mcp/src/daemon/supervisor-io.ts +97 -0
  100. package/runtime/node_modules/@metro-labs/mcp/src/daemon/supervisor.ts +320 -0
  101. package/runtime/node_modules/@metro-labs/mcp/src/daemon/terminal-api.ts +71 -0
  102. package/runtime/node_modules/@metro-labs/mcp/src/daemon/terminal-tickets.ts +40 -0
  103. package/runtime/node_modules/@metro-labs/mcp/src/daemon/terminal-ws.ts +114 -0
  104. package/runtime/node_modules/@metro-labs/mcp/src/daemon/train-call.ts +22 -0
  105. package/runtime/node_modules/@metro-labs/mcp/src/daemon/train-error.ts +53 -0
  106. package/runtime/node_modules/@metro-labs/mcp/src/daemon/tunnel.ts +352 -0
  107. package/runtime/node_modules/@metro-labs/mcp/src/daemon/update-api.ts +116 -0
  108. package/runtime/node_modules/@metro-labs/mcp/src/daemon/upload-api.ts +294 -0
  109. package/runtime/node_modules/@metro-labs/mcp/src/daemon/upload-store.ts +181 -0
  110. package/runtime/node_modules/@metro-labs/mcp/src/daemon/vault-api.ts +78 -0
  111. package/runtime/node_modules/@metro-labs/mcp/src/daemon/vault-types.ts +12 -0
  112. package/runtime/node_modules/@metro-labs/mcp/src/daemon/version.ts +2 -0
  113. package/runtime/node_modules/@metro-labs/mcp/src/db/account-attach.ts +19 -0
  114. package/runtime/node_modules/@metro-labs/mcp/src/db/address.ts +6 -0
  115. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-admin.ts +43 -0
  116. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-map.ts +84 -0
  117. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-scope.ts +64 -0
  118. package/runtime/node_modules/@metro-labs/mcp/src/db/client.ts +32 -0
  119. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-config.ts +144 -0
  120. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-relay.ts +39 -0
  121. package/runtime/node_modules/@metro-labs/mcp/src/db/connectors.ts +69 -0
  122. package/runtime/node_modules/@metro-labs/mcp/src/db/file-admin.ts +329 -0
  123. package/runtime/node_modules/@metro-labs/mcp/src/db/file-source.ts +155 -0
  124. package/runtime/node_modules/@metro-labs/mcp/src/db/ids.ts +21 -0
  125. package/runtime/node_modules/@metro-labs/mcp/src/db/key-map.ts +45 -0
  126. package/runtime/node_modules/@metro-labs/mcp/src/db/local-connectors.ts +277 -0
  127. package/runtime/node_modules/@metro-labs/mcp/src/db/materialize.ts +253 -0
  128. package/runtime/node_modules/@metro-labs/mcp/src/db/schema.ts +33 -0
  129. package/runtime/node_modules/@metro-labs/mcp/src/db/servers.ts +83 -0
  130. package/runtime/node_modules/@metro-labs/mcp/src/db/stations.ts +12 -0
  131. package/runtime/node_modules/@metro-labs/mcp/src/db/vault.ts +109 -0
  132. package/runtime/node_modules/@metro-labs/mcp/src/gateway/bedrock.ts +252 -0
  133. package/runtime/node_modules/@metro-labs/mcp/src/gateway/codex-auth.ts +231 -0
  134. package/runtime/node_modules/@metro-labs/mcp/src/gateway/codex-device.ts +91 -0
  135. package/runtime/node_modules/@metro-labs/mcp/src/gateway/codex-stream.ts +288 -0
  136. package/runtime/node_modules/@metro-labs/mcp/src/gateway/codex-translate.ts +203 -0
  137. package/runtime/node_modules/@metro-labs/mcp/src/gateway/codex.ts +211 -0
  138. package/runtime/node_modules/@metro-labs/mcp/src/gateway/eventstream.ts +123 -0
  139. package/runtime/node_modules/@metro-labs/mcp/src/gateway/forward.ts +169 -0
  140. package/runtime/node_modules/@metro-labs/mcp/src/gateway/gateway.ts +193 -0
  141. package/runtime/node_modules/@metro-labs/mcp/src/gateway/model-config.ts +180 -0
  142. package/runtime/node_modules/@metro-labs/mcp/src/mcp/accounts.ts +141 -0
  143. package/runtime/node_modules/@metro-labs/mcp/src/mcp/call-tools.ts +216 -0
  144. package/runtime/node_modules/@metro-labs/mcp/src/mcp/channel-owner.ts +29 -0
  145. package/runtime/node_modules/@metro-labs/mcp/src/mcp/ctx.ts +62 -0
  146. package/runtime/node_modules/@metro-labs/mcp/src/mcp/event-store.ts +91 -0
  147. package/runtime/node_modules/@metro-labs/mcp/src/mcp/frame-scope.ts +21 -0
  148. package/runtime/node_modules/@metro-labs/mcp/src/mcp/group-tools.ts +129 -0
  149. package/runtime/node_modules/@metro-labs/mcp/src/mcp/index.ts +191 -0
  150. package/runtime/node_modules/@metro-labs/mcp/src/mcp/member-tools.ts +72 -0
  151. package/runtime/node_modules/@metro-labs/mcp/src/mcp/permission-relay.ts +66 -0
  152. package/runtime/node_modules/@metro-labs/mcp/src/mcp/raw-get-stream.ts +207 -0
  153. package/runtime/node_modules/@metro-labs/mcp/src/mcp/request-identity.ts +47 -0
  154. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-registry.ts +172 -0
  155. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-route.ts +43 -0
  156. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session.ts +215 -0
  157. package/runtime/node_modules/@metro-labs/mcp/src/mcp/str.ts +5 -0
  158. package/runtime/node_modules/@metro-labs/mcp/src/mcp/tool-dispatch.ts +215 -0
  159. package/runtime/node_modules/@metro-labs/mcp/src/mcp/tool-schemas.ts +400 -0
  160. package/runtime/node_modules/@metro-labs/mcp/src/mcp/upload-tool.ts +66 -0
  161. package/runtime/node_modules/@metro-labs/mcp/src/monitor/api.ts +237 -0
  162. package/runtime/node_modules/@metro-labs/mcp/src/server.ts +2 -0
  163. package/runtime/node_modules/@metro-labs/mcp/src/stations/account-store.ts +60 -0
  164. package/runtime/node_modules/@metro-labs/mcp/src/stations/attach-inline.ts +100 -0
  165. package/runtime/node_modules/@metro-labs/mcp/src/stations/attach-interactive.ts +161 -0
  166. package/runtime/node_modules/@metro-labs/mcp/src/stations/attach-resolve.ts +200 -0
  167. package/runtime/node_modules/@metro-labs/mcp/src/stations/attach-xmtp.ts +111 -0
  168. package/runtime/node_modules/@metro-labs/mcp/src/stations/attach.ts +184 -0
  169. package/runtime/node_modules/@metro-labs/mcp/src/stations/attachments.ts +196 -0
  170. package/runtime/node_modules/@metro-labs/mcp/src/stations/lines.ts +82 -0
  171. package/runtime/node_modules/@metro-labs/mcp/src/stations/messaging-normalize.ts +88 -0
  172. package/runtime/node_modules/@metro-labs/mcp/src/stations/registry.ts +35 -0
  173. package/runtime/node_modules/@metro-labs/mcp/src/stations/station-runtime.ts +64 -0
  174. package/runtime/node_modules/@metro-labs/mcp/src/stations/types.ts +107 -0
  175. package/runtime/node_modules/@metro-labs/telegram/package.json +26 -0
  176. package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +80 -0
  177. package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +254 -0
  178. package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +87 -0
  179. package/runtime/node_modules/@metro-labs/telegram/src/client.ts +77 -0
  180. package/runtime/node_modules/@metro-labs/telegram/src/format.ts +156 -0
  181. package/runtime/node_modules/@metro-labs/telegram/src/group.ts +261 -0
  182. package/runtime/node_modules/@metro-labs/telegram/src/history.ts +52 -0
  183. package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +78 -0
  184. package/runtime/node_modules/@metro-labs/telegram/src/index.ts +46 -0
  185. package/runtime/node_modules/@metro-labs/telegram/src/login.ts +166 -0
  186. package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +80 -0
  187. package/runtime/node_modules/@metro-labs/telegram/src/members.ts +75 -0
  188. package/runtime/node_modules/@metro-labs/telegram/src/normalize.ts +22 -0
  189. package/runtime/node_modules/@metro-labs/telegram/src/reactions.ts +167 -0
  190. package/runtime/node_modules/@metro-labs/telegram/src/station.ts +24 -0
  191. package/runtime/node_modules/@metro-labs/telegram/src/types.ts +7 -0
  192. package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +1 -0
  193. package/runtime/node_modules/@metro-labs/telegram-bot/package.json +25 -0
  194. package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +120 -0
  195. package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +295 -0
  196. package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +128 -0
  197. package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +201 -0
  198. package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +109 -0
  199. package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +166 -0
  200. package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +47 -0
  201. package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +17 -0
  202. package/runtime/node_modules/@metro-labs/telegram-bot/src/types.ts +58 -0
  203. package/runtime/node_modules/@metro-labs/telegram-bot/src/verify.ts +38 -0
  204. package/runtime/node_modules/@metro-labs/telegram-bot/src/wire.ts +3 -0
  205. package/runtime/node_modules/@metro-labs/webhook/package.json +23 -0
  206. package/runtime/node_modules/@metro-labs/webhook/src/station.ts +37 -0
  207. package/runtime/node_modules/@metro-labs/whatsapp/package.json +27 -0
  208. package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +66 -0
  209. package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +101 -0
  210. package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +178 -0
  211. package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +72 -0
  212. package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +129 -0
  213. package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +327 -0
  214. package/runtime/node_modules/@metro-labs/whatsapp/src/delivery.ts +49 -0
  215. package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +138 -0
  216. package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +57 -0
  217. package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +40 -0
  218. package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +59 -0
  219. package/runtime/node_modules/@metro-labs/whatsapp/src/logger.ts +60 -0
  220. package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +176 -0
  221. package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +84 -0
  222. package/runtime/node_modules/@metro-labs/whatsapp/src/normalize.ts +22 -0
  223. package/runtime/node_modules/@metro-labs/whatsapp/src/outbox.ts +38 -0
  224. package/runtime/node_modules/@metro-labs/whatsapp/src/parse.ts +185 -0
  225. package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +17 -0
  226. package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +98 -0
  227. package/runtime/node_modules/@metro-labs/whatsapp/src/types.ts +6 -0
  228. package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +5 -0
  229. package/runtime/node_modules/@metro-labs/xmtp/package.json +33 -0
  230. package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +112 -0
  231. package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +110 -0
  232. package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +299 -0
  233. package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +157 -0
  234. package/runtime/node_modules/@metro-labs/xmtp/src/actions-push.ts +87 -0
  235. package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +375 -0
  236. package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +107 -0
  237. package/runtime/node_modules/@metro-labs/xmtp/src/codecs.ts +171 -0
  238. package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +239 -0
  239. package/runtime/node_modules/@metro-labs/xmtp/src/emit-core.ts +55 -0
  240. package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +335 -0
  241. package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +80 -0
  242. package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +34 -0
  243. package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +56 -0
  244. package/runtime/node_modules/@metro-labs/xmtp/src/identity.ts +33 -0
  245. package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +125 -0
  246. package/runtime/node_modules/@metro-labs/xmtp/src/labels.ts +157 -0
  247. package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +40 -0
  248. package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +349 -0
  249. package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +13 -0
  250. package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +126 -0
  251. package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +212 -0
  252. package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +90 -0
  253. package/runtime/node_modules/@metro-labs/xmtp/src/verify.ts +84 -0
  254. package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +53 -0
  255. package/runtime/runtime.json +3 -0
  256. package/runtime/stations.json +36 -0
  257. package/runtime/trains/.keep +0 -0
  258. package/LICENSE +0 -21
  259. package/README.md +0 -193
  260. package/dist/cache.js +0 -75
  261. package/dist/cli/actions.js +0 -139
  262. package/dist/cli/config.js +0 -185
  263. package/dist/cli/index.js +0 -159
  264. package/dist/cli/skill.js +0 -62
  265. package/dist/cli/util.js +0 -72
  266. package/dist/codex-rc.js +0 -236
  267. package/dist/dispatcher.js +0 -95
  268. package/dist/history.js +0 -84
  269. package/dist/ipc.js +0 -72
  270. package/dist/log.js +0 -15
  271. package/dist/paths.js +0 -68
  272. package/dist/stations/discord.js +0 -200
  273. package/dist/stations/index.js +0 -73
  274. package/dist/stations/telegram-md.js +0 -34
  275. package/dist/stations/telegram-upload.js +0 -113
  276. package/dist/stations/telegram.js +0 -213
  277. package/docs/agents.md +0 -185
  278. package/docs/uri-scheme.md +0 -71
  279. package/skills/metro/SKILL.md +0 -241
@@ -0,0 +1,157 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { errMsg, log } from './log.js';
3
+ import { bodyField, readJsonBody, sendJson, type ApiSession } from './api-http.js';
4
+ import {
5
+ beginOAuth,
6
+ completeOAuth,
7
+ takePending,
8
+ type PendingAuth,
9
+ } from './connector-oauth.js';
10
+ import { parseConnectorUrl } from './connector-verify.js';
11
+ import type { OAuthAuth } from './connector-verify.js';
12
+ import type { Connector } from '../db/connectors.js';
13
+
14
+ const asText = (value: unknown): string =>
15
+ typeof value === 'string' ? value : '';
16
+
17
+ export function hostOf(url: string): string {
18
+ try {
19
+ return new URL(url).hostname;
20
+ } catch {
21
+ return '';
22
+ }
23
+ }
24
+
25
+ export interface OAuthRouteDeps {
26
+ createPendingConnector: (
27
+ subject: string,
28
+ project: string,
29
+ input: { name: unknown; url: unknown },
30
+ ) => Promise<Connector>;
31
+ reconnectConnector: (
32
+ subject: string,
33
+ id: string,
34
+ auth: OAuthAuth,
35
+ ) => Promise<Connector>;
36
+ getConnector: (subject: string, id: string) => Promise<Connector>;
37
+ }
38
+
39
+ export async function startOAuth(
40
+ req: IncomingMessage,
41
+ res: ServerResponse,
42
+ deps: OAuthRouteDeps,
43
+ session: ApiSession,
44
+ project: string,
45
+ body: unknown,
46
+ payload: (row: Connector) => Record<string, unknown>,
47
+ ): Promise<void> {
48
+ const url = parseConnectorUrl(bodyField(body, 'url'));
49
+ const row = await deps.createPendingConnector(session.subject, project, {
50
+ name: bodyField(body, 'name'),
51
+ url: bodyField(body, 'url'),
52
+ });
53
+ const authorize = await beginOAuth({
54
+ subject: session.subject,
55
+ name: row.name,
56
+ url,
57
+ returnTo: asText(bodyField(body, 'returnTo')),
58
+ connectorId: row.id,
59
+ });
60
+ log.info(
61
+ { id: row.id, host: url.hostname },
62
+ 'connector-api: stored unconnected, sending the user to sign in',
63
+ );
64
+ sendJson(req, res, 201, { ...payload(row), authorizeUrl: authorize });
65
+ }
66
+
67
+ export async function handleConnect(
68
+ req: IncomingMessage,
69
+ res: ServerResponse,
70
+ deps: OAuthRouteDeps,
71
+ session: ApiSession,
72
+ id: string,
73
+ ): Promise<void> {
74
+ const row = await deps.getConnector(session.subject, id);
75
+ const url = parseConnectorUrl(row.url);
76
+ const body = await readJsonBody(req);
77
+ const authorize = await beginOAuth({
78
+ subject: session.subject,
79
+ name: row.name,
80
+ url,
81
+ returnTo: asText(bodyField(body, 'returnTo')),
82
+ connectorId: row.id,
83
+ });
84
+ log.info(
85
+ { id: row.id, host: url.hostname },
86
+ 'connector-api: sending the user back to sign in',
87
+ );
88
+ sendJson(req, res, 202, { status: 'oauth', authorizeUrl: authorize });
89
+ }
90
+
91
+ function landing(entry: PendingAuth, id?: string): string {
92
+ const target = id ?? entry.connectorId;
93
+ return target === undefined ? '#/connectors' : `#/connector/${target}`;
94
+ }
95
+
96
+ function backTo(entry: PendingAuth, error?: string, id?: string): string {
97
+ const suffix =
98
+ error === undefined
99
+ ? ''
100
+ : `?connector_error=${encodeURIComponent(error)}`;
101
+ return `${entry.returnTo}${suffix}${landing(entry, id)}`;
102
+ }
103
+
104
+ function redirect(res: ServerResponse, location: string): void {
105
+ res.writeHead(302, { location, 'cache-control': 'no-store' }).end();
106
+ }
107
+
108
+ async function saveOAuth(
109
+ deps: OAuthRouteDeps,
110
+ entry: PendingAuth,
111
+ auth: OAuthAuth,
112
+ ): Promise<Connector> {
113
+ return deps.reconnectConnector(entry.subject, entry.connectorId, auth);
114
+ }
115
+
116
+ async function settleCallback(
117
+ res: ServerResponse,
118
+ deps: OAuthRouteDeps,
119
+ entry: PendingAuth,
120
+ code: string,
121
+ ): Promise<void> {
122
+ try {
123
+ const auth = await completeOAuth(entry, code);
124
+ const saved = await saveOAuth(deps, entry, auth);
125
+ log.info(
126
+ { id: saved.id, name: saved.name, host: hostOf(saved.url) },
127
+ 'connector-api: oauth sign-in completed',
128
+ );
129
+ redirect(res, backTo(entry, undefined, saved.id));
130
+ } catch (err) {
131
+ log.warn({ err: errMsg(err) }, 'connector-api: oauth sign-in failed');
132
+ redirect(res, backTo(entry, errMsg(err)));
133
+ }
134
+ }
135
+
136
+ export function handleCallback(
137
+ req: IncomingMessage,
138
+ res: ServerResponse,
139
+ deps: OAuthRouteDeps,
140
+ ): void {
141
+ const query = new URLSearchParams((req.url ?? '').split('?')[1] ?? '');
142
+ const entry = takePending(query.get('state') ?? '');
143
+ if (entry === undefined) {
144
+ sendJson(req, res, 400, { error: 'that sign-in has expired — start it again' });
145
+ return;
146
+ }
147
+ const denied = query.get('error');
148
+ const code = query.get('code') ?? '';
149
+ if (denied !== null || code === '') {
150
+ redirect(res, backTo(entry, denied ?? 'no authorization code came back'));
151
+ return;
152
+ }
153
+ settleCallback(res, deps, entry, code).catch((err: unknown) => {
154
+ log.warn({ err: errMsg(err) }, 'connector-api: oauth callback failed');
155
+ if (!res.headersSent) redirect(res, backTo(entry, 'sign-in failed'));
156
+ });
157
+ }
@@ -0,0 +1,127 @@
1
+ import { publicBaseOrDefault } from './attach-serve.js';
2
+ import {
3
+ ConnectorVerifyError,
4
+ type OAuthAuth,
5
+ type OAuthTokens,
6
+ } from './connector-verify.js';
7
+ import { validateReturnTo } from './return-to.js';
8
+ import {
9
+ authorizeUrl,
10
+ exchangeCode,
11
+ newVerifier,
12
+ refreshTokens,
13
+ registerClient,
14
+ } from './oauth-client.js';
15
+ import { discoverOAuth } from './oauth-discovery.js';
16
+ import { startPending, takePending, type PendingAuth } from './oauth-pending.js';
17
+
18
+ export { takePending, type PendingAuth };
19
+
20
+ const REFRESH_SKEW_MS = 300_000;
21
+
22
+ const CALLBACK_PATH = '/api/connectors/callback';
23
+
24
+ const callbackUri = (): string =>
25
+ `${publicBaseOrDefault()}${CALLBACK_PATH}`;
26
+
27
+ function refused(message: string): ConnectorVerifyError {
28
+ return new ConnectorVerifyError(message, 400);
29
+ }
30
+
31
+ const resourceOf = (url: URL): string => url.toString();
32
+
33
+ export interface BeginInput {
34
+ connectorId: string;
35
+ subject: string;
36
+ name: string;
37
+ url: URL;
38
+ returnTo: string;
39
+ }
40
+
41
+ export async function beginOAuth(input: BeginInput): Promise<string> {
42
+ if (!validateReturnTo(input.returnTo))
43
+ throw refused('that return address is not one Metro will send you back to');
44
+ const server = await discoverOAuth(input.url);
45
+ const redirectUri = callbackUri();
46
+ const client = await registerClient(server, redirectUri);
47
+ const verifier = newVerifier();
48
+ const resource = resourceOf(input.url);
49
+ const state = startPending({
50
+ subject: input.subject,
51
+ name: input.name,
52
+ url: input.url.toString(),
53
+ resource,
54
+ returnTo: input.returnTo,
55
+ verifier,
56
+ server,
57
+ client,
58
+ connectorId: input.connectorId,
59
+ });
60
+ return authorizeUrl({
61
+ server,
62
+ client,
63
+ redirectUri,
64
+ state,
65
+ verifier,
66
+ resource,
67
+ });
68
+ }
69
+
70
+ function authOf(pendingAuth: PendingAuth, tokens: OAuthTokens): OAuthAuth {
71
+ return {
72
+ kind: 'oauth',
73
+ issuer: pendingAuth.server.issuer,
74
+ tokenEndpoint: pendingAuth.server.tokenEndpoint,
75
+ clientId: pendingAuth.client.clientId,
76
+ ...(pendingAuth.client.clientSecret === undefined
77
+ ? {}
78
+ : { clientSecret: pendingAuth.client.clientSecret }),
79
+ ...tokens,
80
+ };
81
+ }
82
+
83
+ export async function completeOAuth(
84
+ entry: PendingAuth,
85
+ code: string,
86
+ ): Promise<OAuthAuth> {
87
+ const tokens = await exchangeCode(entry.server, entry.client, {
88
+ code,
89
+ redirectUri: callbackUri(),
90
+ verifier: entry.verifier,
91
+ resource: entry.resource,
92
+ });
93
+ return authOf(entry, tokens);
94
+ }
95
+
96
+ export function oauthExpired(auth: OAuthAuth, now = Date.now()): boolean {
97
+ return auth.expiresAt !== undefined && auth.expiresAt - REFRESH_SKEW_MS <= now;
98
+ }
99
+
100
+ export async function refreshOAuth(
101
+ auth: OAuthAuth,
102
+ resource: string,
103
+ ): Promise<OAuthAuth> {
104
+ if (auth.refreshToken === undefined)
105
+ throw refused('that connector needs signing in again');
106
+ const server = {
107
+ issuer: auth.issuer,
108
+ authorizationEndpoint: '',
109
+ tokenEndpoint: auth.tokenEndpoint,
110
+ registrationEndpoint: null,
111
+ supportsS256: true,
112
+ };
113
+ const client = {
114
+ clientId: auth.clientId,
115
+ ...(auth.clientSecret === undefined
116
+ ? {}
117
+ : { clientSecret: auth.clientSecret }),
118
+ };
119
+ const tokens = await refreshTokens(server, client, auth.refreshToken, resource);
120
+ return {
121
+ ...auth,
122
+ ...tokens,
123
+ ...(tokens.refreshToken === undefined
124
+ ? { refreshToken: auth.refreshToken }
125
+ : {}),
126
+ };
127
+ }
@@ -0,0 +1,98 @@
1
+ import { isRecord } from './is-record.js';
2
+
3
+ export const TOOL_KINDS = ['read', 'write'] as const;
4
+
5
+ export type ToolKind = (typeof TOOL_KINDS)[number];
6
+
7
+ export interface ToolInfo {
8
+ name: string;
9
+ title: string;
10
+ description: string;
11
+ kind: ToolKind;
12
+ annotated: boolean;
13
+ destructive: boolean;
14
+ idempotent: boolean;
15
+ openWorld: boolean;
16
+ }
17
+
18
+ const MAX_TOOLS = 500;
19
+ const MAX_DESCRIPTION = 400;
20
+
21
+ const str = (value: unknown, cap: number): string =>
22
+ typeof value === 'string' ? value.slice(0, cap) : '';
23
+
24
+ const flag = (value: unknown, fallback: boolean): boolean =>
25
+ typeof value === 'boolean' ? value : fallback;
26
+
27
+ export function classifyTool(annotations: unknown): ToolKind {
28
+ return isRecord(annotations) && annotations.readOnlyHint === true
29
+ ? 'read'
30
+ : 'write';
31
+ }
32
+
33
+ export function isDestructive(annotations: unknown): boolean {
34
+ if (!isRecord(annotations)) return true;
35
+ if (annotations.readOnlyHint === true) return false;
36
+ return annotations.destructiveHint !== false;
37
+ }
38
+
39
+ export function toToolInfo(raw: unknown): ToolInfo | null {
40
+ if (!isRecord(raw)) return null;
41
+ const name = str(raw.name, 200);
42
+ if (name === '') return null;
43
+ const annotations = isRecord(raw.annotations) ? raw.annotations : undefined;
44
+ return {
45
+ name,
46
+ title: str(annotations?.title ?? raw.title, 200),
47
+ description: str(raw.description, MAX_DESCRIPTION),
48
+ kind: classifyTool(raw.annotations),
49
+ annotated: annotations !== undefined,
50
+ destructive: isDestructive(raw.annotations),
51
+ idempotent: flag(annotations?.idempotentHint, false),
52
+ openWorld: flag(annotations?.openWorldHint, true),
53
+ };
54
+ }
55
+
56
+ export function toToolList(raw: unknown): ToolInfo[] {
57
+ if (!Array.isArray(raw)) return [];
58
+ const out: ToolInfo[] = [];
59
+ for (const entry of raw) {
60
+ if (out.length >= MAX_TOOLS) break;
61
+ const tool = toToolInfo(entry);
62
+ if (tool !== null) out.push(tool);
63
+ }
64
+ return out;
65
+ }
66
+
67
+ function toStoredTool(raw: unknown): ToolInfo | null {
68
+ if (!isRecord(raw)) return null;
69
+ const name = str(raw.name, 200);
70
+ if (name === '') return null;
71
+ return {
72
+ name,
73
+ title: str(raw.title, 200),
74
+ description: str(raw.description, MAX_DESCRIPTION),
75
+ kind: raw.kind === 'read' ? 'read' : 'write',
76
+ annotated: raw.annotated === true,
77
+ destructive: raw.destructive !== false,
78
+ idempotent: raw.idempotent === true,
79
+ openWorld: raw.openWorld !== false,
80
+ };
81
+ }
82
+
83
+ export function readStoredTools(raw: unknown): ToolInfo[] {
84
+ if (!Array.isArray(raw)) return [];
85
+ const out: ToolInfo[] = [];
86
+ for (const entry of raw) {
87
+ if (out.length >= MAX_TOOLS) break;
88
+ const tool = toStoredTool(entry);
89
+ if (tool !== null) out.push(tool);
90
+ }
91
+ return out;
92
+ }
93
+
94
+ export function countByKind(tools: ToolInfo[]): Record<ToolKind, number> {
95
+ const counts: Record<ToolKind, number> = { read: 0, write: 0 };
96
+ for (const tool of tools) counts[tool.kind] += 1;
97
+ return counts;
98
+ }
@@ -0,0 +1,70 @@
1
+ import { ApiError } from './api-error.js';
2
+
3
+ export class ConnectorVerifyError extends ApiError {}
4
+
5
+ export class ConnectorUnauthorized extends ConnectorVerifyError {}
6
+
7
+ export class ConnectorNotMcp extends ConnectorVerifyError {}
8
+
9
+ export const POLICY_MESSAGE =
10
+ 'Metro connects from its own server, so it cannot reach a URL on your machine. localhost and private addresses are not usable as connectors.';
11
+
12
+ let localAllowed = false;
13
+
14
+ export function allowLocalConnectors(on: boolean): void {
15
+ localAllowed = on;
16
+ }
17
+
18
+ const IPV4 = /^\d{1,3}(?:\.\d{1,3}){3}$/;
19
+ const PRIVATE_SUFFIX = /(?:^|\.)(?:localhost|local|internal|flycast)$/;
20
+
21
+ export function refused(message: string): ConnectorVerifyError {
22
+ return new ConnectorVerifyError(message, 400);
23
+ }
24
+
25
+ function hostAllowed(host: string): boolean {
26
+ if (host === '' || host.startsWith('[')) return false;
27
+ if (IPV4.test(host) || !host.includes('.')) return false;
28
+ return !PRIVATE_SUFFIX.test(host);
29
+ }
30
+
31
+ function schemeAllowed(url: URL): boolean {
32
+ return url.protocol === 'https:' || (localAllowed && url.protocol === 'http:');
33
+ }
34
+
35
+ function refuseShape(url: URL): void {
36
+ if (!schemeAllowed(url)) throw refused('a connector url must start with https://');
37
+ if (url.username !== '' || url.password !== '')
38
+ throw refused('a connector url must not carry a user:password');
39
+ if (url.hash !== '')
40
+ throw refused('a connector url must not carry a #fragment');
41
+ if (!localAllowed && !hostAllowed(url.hostname.toLowerCase())) throw refused(POLICY_MESSAGE);
42
+ }
43
+
44
+ export function parseConnectorUrl(raw: unknown): URL {
45
+ const text = typeof raw === 'string' ? raw.trim() : '';
46
+ if (text === '') throw refused('a connector url is required');
47
+ let url: URL;
48
+ try {
49
+ url = new URL(text);
50
+ } catch {
51
+ throw refused('that is not a valid url');
52
+ }
53
+ refuseShape(url);
54
+ return url;
55
+ }
56
+
57
+ export function connectorUrlText(url: URL): string {
58
+ const text = url.toString();
59
+ if (url.pathname !== '/' || url.search !== '') return text;
60
+ return text.endsWith('/') ? text.slice(0, -1) : text;
61
+ }
62
+
63
+ export function safeIconSrc(raw: unknown): string {
64
+ if (typeof raw !== 'string' || raw === '') return '';
65
+ try {
66
+ return new URL(raw).protocol === 'https:' ? raw.slice(0, 500) : '';
67
+ } catch {
68
+ return '';
69
+ }
70
+ }