@stage-labs/metro 0.1.0-beta.13 → 0.1.0-beta.130

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 (328) hide show
  1. package/dist/api.js +14 -0
  2. package/dist/claude-settings.js +40 -0
  3. package/dist/claude.js +176 -0
  4. package/dist/cli.js +101 -0
  5. package/dist/control.js +74 -0
  6. package/dist/hold.js +211 -0
  7. package/dist/local.js +93 -0
  8. package/dist/mcp-config.js +25 -0
  9. package/dist/node-name.js +71 -0
  10. package/dist/onboarding.js +43 -0
  11. package/dist/plugin.js +120 -0
  12. package/dist/provider-flags.js +9 -0
  13. package/dist/route.js +38 -0
  14. package/dist/runtime-install.js +97 -0
  15. package/dist/runtime.js +74 -0
  16. package/dist/serve.js +150 -0
  17. package/dist/service.js +242 -0
  18. package/dist/tail.js +119 -0
  19. package/dist/update.js +45 -0
  20. package/dist/version.js +97 -0
  21. package/package.json +14 -27
  22. package/runtime/marketplace/.claude-plugin/marketplace.json +12 -0
  23. package/runtime/marketplace/plugin/.claude-plugin/plugin.json +18 -0
  24. package/runtime/marketplace/plugin/.mcp.json +1 -0
  25. package/runtime/marketplace/plugin/bin/guard.mjs +55 -0
  26. package/runtime/marketplace/plugin/bin/metro-plugin.mjs +122 -0
  27. package/runtime/marketplace/plugin/bin/session-start.mjs +31 -0
  28. package/runtime/marketplace/plugin/hooks/hooks.json +25 -0
  29. package/runtime/marketplace/plugin/orchestrator.md +16 -0
  30. package/runtime/marketplace/plugin/skills/refresh/SKILL.md +15 -0
  31. package/runtime/node_modules/@metro-labs/core/package.json +43 -0
  32. package/runtime/node_modules/@metro-labs/core/src/address.ts +6 -0
  33. package/runtime/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  34. package/runtime/node_modules/@metro-labs/core/src/events.ts +120 -0
  35. package/runtime/node_modules/@metro-labs/core/src/identity.ts +7 -0
  36. package/runtime/node_modules/@metro-labs/core/src/ids.ts +21 -0
  37. package/runtime/node_modules/@metro-labs/core/src/is-record.ts +2 -0
  38. package/runtime/node_modules/@metro-labs/core/src/lines.ts +87 -0
  39. package/runtime/node_modules/@metro-labs/core/src/log.ts +42 -0
  40. package/runtime/node_modules/@metro-labs/core/src/protocol.ts +226 -0
  41. package/runtime/node_modules/@metro-labs/core/src/secure-fs.ts +57 -0
  42. package/runtime/node_modules/@metro-labs/core/src/station-names.ts +13 -0
  43. package/runtime/node_modules/@metro-labs/core/src/stations/account-store.ts +60 -0
  44. package/runtime/node_modules/@metro-labs/core/src/stations/attachments.ts +196 -0
  45. package/runtime/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +88 -0
  46. package/runtime/node_modules/@metro-labs/core/src/stations/station-runtime.ts +64 -0
  47. package/runtime/node_modules/@metro-labs/core/src/stations/types.ts +108 -0
  48. package/runtime/node_modules/@metro-labs/core/src/str.ts +5 -0
  49. package/runtime/node_modules/@metro-labs/core/src/train-error.ts +53 -0
  50. package/runtime/node_modules/@metro-labs/core/src/version.ts +2 -0
  51. package/runtime/node_modules/@metro-labs/daemon/package.json +48 -0
  52. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-attach.ts +19 -0
  53. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-routes.ts +70 -0
  54. package/runtime/node_modules/@metro-labs/daemon/src/agents/accounts-api.ts +365 -0
  55. package/runtime/node_modules/@metro-labs/daemon/src/agents/admin.ts +43 -0
  56. package/runtime/node_modules/@metro-labs/daemon/src/agents/allowlist.ts +37 -0
  57. package/runtime/node_modules/@metro-labs/daemon/src/agents/api.ts +300 -0
  58. package/runtime/node_modules/@metro-labs/daemon/src/agents/bundle.ts +122 -0
  59. package/runtime/node_modules/@metro-labs/daemon/src/agents/file-admin.ts +371 -0
  60. package/runtime/node_modules/@metro-labs/daemon/src/agents/files.ts +155 -0
  61. package/runtime/node_modules/@metro-labs/daemon/src/agents/keys.ts +45 -0
  62. package/runtime/node_modules/@metro-labs/daemon/src/agents/map.ts +95 -0
  63. package/runtime/node_modules/@metro-labs/daemon/src/agents/scope.ts +64 -0
  64. package/runtime/node_modules/@metro-labs/daemon/src/agents/senders.ts +38 -0
  65. package/runtime/node_modules/@metro-labs/daemon/src/boot/boot.ts +207 -0
  66. package/runtime/node_modules/@metro-labs/daemon/src/boot/connect-hint.ts +39 -0
  67. package/runtime/node_modules/@metro-labs/daemon/src/boot/crash-guard.ts +49 -0
  68. package/runtime/node_modules/@metro-labs/daemon/src/boot/local-owner.ts +14 -0
  69. package/runtime/node_modules/@metro-labs/daemon/src/boot/paths.ts +106 -0
  70. package/runtime/node_modules/@metro-labs/daemon/src/channels/addressed.ts +25 -0
  71. package/runtime/node_modules/@metro-labs/daemon/src/channels/dedupe.ts +24 -0
  72. package/runtime/node_modules/@metro-labs/daemon/src/channels/inbound.ts +377 -0
  73. package/runtime/node_modules/@metro-labs/daemon/src/channels/media-note.ts +85 -0
  74. package/runtime/node_modules/@metro-labs/daemon/src/channels/pending.ts +75 -0
  75. package/runtime/node_modules/@metro-labs/daemon/src/channels/relay.ts +129 -0
  76. package/runtime/node_modules/@metro-labs/daemon/src/channels/webhook-note.ts +51 -0
  77. package/runtime/node_modules/@metro-labs/daemon/src/claude/api.ts +309 -0
  78. package/runtime/node_modules/@metro-labs/daemon/src/claude/files.ts +358 -0
  79. package/runtime/node_modules/@metro-labs/daemon/src/claude/login.ts +169 -0
  80. package/runtime/node_modules/@metro-labs/daemon/src/claude/onboarding.ts +56 -0
  81. package/runtime/node_modules/@metro-labs/daemon/src/claude/plugin-install.ts +140 -0
  82. package/runtime/node_modules/@metro-labs/daemon/src/claude/session-files.ts +90 -0
  83. package/runtime/node_modules/@metro-labs/daemon/src/claude/session.ts +253 -0
  84. package/runtime/node_modules/@metro-labs/daemon/src/claude/settings.ts +117 -0
  85. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup.ts +239 -0
  86. package/runtime/node_modules/@metro-labs/daemon/src/claude/skills.ts +154 -0
  87. package/runtime/node_modules/@metro-labs/daemon/src/claude/version.ts +109 -0
  88. package/runtime/node_modules/@metro-labs/daemon/src/connectors/api.ts +310 -0
  89. package/runtime/node_modules/@metro-labs/daemon/src/connectors/cli-api.ts +63 -0
  90. package/runtime/node_modules/@metro-labs/daemon/src/connectors/config.ts +175 -0
  91. package/runtime/node_modules/@metro-labs/daemon/src/connectors/json.ts +21 -0
  92. package/runtime/node_modules/@metro-labs/daemon/src/connectors/model.ts +77 -0
  93. package/runtime/node_modules/@metro-labs/daemon/src/connectors/oauth-client.ts +166 -0
  94. package/runtime/node_modules/@metro-labs/daemon/src/connectors/oauth-discovery.ts +139 -0
  95. package/runtime/node_modules/@metro-labs/daemon/src/connectors/oauth-pending.ts +65 -0
  96. package/runtime/node_modules/@metro-labs/daemon/src/connectors/oauth-routes.ts +171 -0
  97. package/runtime/node_modules/@metro-labs/daemon/src/connectors/oauth.ts +155 -0
  98. package/runtime/node_modules/@metro-labs/daemon/src/connectors/plugin-sync.ts +122 -0
  99. package/runtime/node_modules/@metro-labs/daemon/src/connectors/reach.ts +27 -0
  100. package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay-target.ts +39 -0
  101. package/runtime/node_modules/@metro-labs/daemon/src/connectors/relay.ts +296 -0
  102. package/runtime/node_modules/@metro-labs/daemon/src/connectors/store.ts +286 -0
  103. package/runtime/node_modules/@metro-labs/daemon/src/connectors/tools.ts +98 -0
  104. package/runtime/node_modules/@metro-labs/daemon/src/connectors/url.ts +70 -0
  105. package/runtime/node_modules/@metro-labs/daemon/src/connectors/verify.ts +332 -0
  106. package/runtime/node_modules/@metro-labs/daemon/src/connectors/watch.ts +54 -0
  107. package/runtime/node_modules/@metro-labs/daemon/src/files/attach-grant.ts +99 -0
  108. package/runtime/node_modules/@metro-labs/daemon/src/files/attach-owner.ts +32 -0
  109. package/runtime/node_modules/@metro-labs/daemon/src/files/attach-serve.ts +121 -0
  110. package/runtime/node_modules/@metro-labs/daemon/src/files/upload-api.ts +294 -0
  111. package/runtime/node_modules/@metro-labs/daemon/src/files/upload-store.ts +181 -0
  112. package/runtime/node_modules/@metro-labs/daemon/src/gateway/bedrock.ts +259 -0
  113. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-auth.ts +231 -0
  114. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-device.ts +91 -0
  115. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-stream.ts +288 -0
  116. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-translate.ts +203 -0
  117. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex.ts +231 -0
  118. package/runtime/node_modules/@metro-labs/daemon/src/gateway/eventstream.ts +123 -0
  119. package/runtime/node_modules/@metro-labs/daemon/src/gateway/forward.ts +187 -0
  120. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gateway.ts +229 -0
  121. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-api.ts +269 -0
  122. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-config.ts +207 -0
  123. package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter.ts +90 -0
  124. package/runtime/node_modules/@metro-labs/daemon/src/gateway/provider-models.ts +65 -0
  125. package/runtime/node_modules/@metro-labs/daemon/src/gateway/served.ts +17 -0
  126. package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage.ts +229 -0
  127. package/runtime/node_modules/@metro-labs/daemon/src/mcp/accounts.ts +151 -0
  128. package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-tools.ts +216 -0
  129. package/runtime/node_modules/@metro-labs/daemon/src/mcp/channel-owner.ts +29 -0
  130. package/runtime/node_modules/@metro-labs/daemon/src/mcp/ctx.ts +62 -0
  131. package/runtime/node_modules/@metro-labs/daemon/src/mcp/event-store.ts +91 -0
  132. package/runtime/node_modules/@metro-labs/daemon/src/mcp/frame-scope.ts +21 -0
  133. package/runtime/node_modules/@metro-labs/daemon/src/mcp/group-tools.ts +129 -0
  134. package/runtime/node_modules/@metro-labs/daemon/src/mcp/index.ts +191 -0
  135. package/runtime/node_modules/@metro-labs/daemon/src/mcp/member-tools.ts +72 -0
  136. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-relay.ts +66 -0
  137. package/runtime/node_modules/@metro-labs/daemon/src/mcp/raw-get-stream.ts +207 -0
  138. package/runtime/node_modules/@metro-labs/daemon/src/mcp/request-identity.ts +47 -0
  139. package/runtime/node_modules/@metro-labs/daemon/src/mcp/session-registry.ts +172 -0
  140. package/runtime/node_modules/@metro-labs/daemon/src/mcp/session-route.ts +43 -0
  141. package/runtime/node_modules/@metro-labs/daemon/src/mcp/session.ts +215 -0
  142. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-dispatch.ts +215 -0
  143. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-schemas.ts +400 -0
  144. package/runtime/node_modules/@metro-labs/daemon/src/mcp/upload-tool.ts +66 -0
  145. package/runtime/node_modules/@metro-labs/daemon/src/monitor/api.ts +237 -0
  146. package/runtime/node_modules/@metro-labs/daemon/src/net/tunnel.ts +389 -0
  147. package/runtime/node_modules/@metro-labs/daemon/src/routes/body.ts +24 -0
  148. package/runtime/node_modules/@metro-labs/daemon/src/routes/http.ts +372 -0
  149. package/runtime/node_modules/@metro-labs/daemon/src/routes/identity.ts +54 -0
  150. package/runtime/node_modules/@metro-labs/daemon/src/routes/local-mode.ts +223 -0
  151. package/runtime/node_modules/@metro-labs/daemon/src/routes/session-apis.ts +60 -0
  152. package/runtime/node_modules/@metro-labs/daemon/src/routes/session.ts +29 -0
  153. package/runtime/node_modules/@metro-labs/daemon/src/routes/threema-callback.ts +103 -0
  154. package/runtime/node_modules/@metro-labs/daemon/src/server/control.ts +64 -0
  155. package/runtime/node_modules/@metro-labs/daemon/src/server/machine.ts +61 -0
  156. package/runtime/node_modules/@metro-labs/daemon/src/server/update.ts +116 -0
  157. package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
  158. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-inline.ts +100 -0
  159. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-interactive.ts +161 -0
  160. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-resolve.ts +202 -0
  161. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-session.ts +280 -0
  162. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-xmtp.ts +111 -0
  163. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach.ts +248 -0
  164. package/runtime/node_modules/@metro-labs/daemon/src/stations/materialize.ts +261 -0
  165. package/runtime/node_modules/@metro-labs/daemon/src/stations/registry.ts +37 -0
  166. package/runtime/node_modules/@metro-labs/daemon/src/stations/runtime-deps.ts +82 -0
  167. package/runtime/node_modules/@metro-labs/daemon/src/stations/supervisor-io.ts +97 -0
  168. package/runtime/node_modules/@metro-labs/daemon/src/stations/supervisor.ts +320 -0
  169. package/runtime/node_modules/@metro-labs/daemon/src/stations/threema-callbacks.ts +32 -0
  170. package/runtime/node_modules/@metro-labs/daemon/src/stations/train-call.ts +22 -0
  171. package/runtime/node_modules/@metro-labs/daemon/src/terminal/api.ts +96 -0
  172. package/runtime/node_modules/@metro-labs/daemon/src/terminal/socket.ts +123 -0
  173. package/runtime/node_modules/@metro-labs/daemon/src/terminal/tickets.ts +40 -0
  174. package/runtime/node_modules/@metro-labs/discord-bot/package.json +28 -0
  175. package/runtime/node_modules/@metro-labs/discord-bot/src/accounts.ts +118 -0
  176. package/runtime/node_modules/@metro-labs/discord-bot/src/actions.ts +388 -0
  177. package/runtime/node_modules/@metro-labs/discord-bot/src/api-base.ts +1 -0
  178. package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +29 -0
  179. package/runtime/node_modules/@metro-labs/discord-bot/src/format.ts +220 -0
  180. package/runtime/node_modules/@metro-labs/discord-bot/src/group-actions.ts +50 -0
  181. package/runtime/node_modules/@metro-labs/discord-bot/src/group.ts +115 -0
  182. package/runtime/node_modules/@metro-labs/discord-bot/src/index.ts +127 -0
  183. package/runtime/node_modules/@metro-labs/discord-bot/src/members.ts +215 -0
  184. package/runtime/node_modules/@metro-labs/discord-bot/src/send-files.ts +43 -0
  185. package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +19 -0
  186. package/runtime/node_modules/@metro-labs/discord-bot/src/verify.ts +82 -0
  187. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-speak.ts +195 -0
  188. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-transcribe.ts +292 -0
  189. package/runtime/node_modules/@metro-labs/discord-bot/src/voice.ts +197 -0
  190. package/runtime/node_modules/@metro-labs/discord-bot/src/wire.ts +5 -0
  191. package/runtime/node_modules/@metro-labs/http/package.json +33 -0
  192. package/runtime/node_modules/@metro-labs/http/src/api-error.ts +8 -0
  193. package/runtime/node_modules/@metro-labs/http/src/api-http.ts +95 -0
  194. package/runtime/node_modules/@metro-labs/http/src/cors.ts +29 -0
  195. package/runtime/node_modules/@metro-labs/http/src/identity-key.ts +33 -0
  196. package/runtime/node_modules/@metro-labs/http/src/identity-registry.ts +13 -0
  197. package/runtime/node_modules/@metro-labs/http/src/mode-api.ts +32 -0
  198. package/runtime/node_modules/@metro-labs/http/src/return-to.ts +21 -0
  199. package/runtime/node_modules/@metro-labs/http/src/signed-identity.ts +36 -0
  200. package/runtime/node_modules/@metro-labs/telegram/package.json +26 -0
  201. package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +80 -0
  202. package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +254 -0
  203. package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +87 -0
  204. package/runtime/node_modules/@metro-labs/telegram/src/client.ts +77 -0
  205. package/runtime/node_modules/@metro-labs/telegram/src/format.ts +156 -0
  206. package/runtime/node_modules/@metro-labs/telegram/src/group.ts +261 -0
  207. package/runtime/node_modules/@metro-labs/telegram/src/history.ts +52 -0
  208. package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +78 -0
  209. package/runtime/node_modules/@metro-labs/telegram/src/index.ts +46 -0
  210. package/runtime/node_modules/@metro-labs/telegram/src/login.ts +166 -0
  211. package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +80 -0
  212. package/runtime/node_modules/@metro-labs/telegram/src/members.ts +75 -0
  213. package/runtime/node_modules/@metro-labs/telegram/src/normalize.ts +22 -0
  214. package/runtime/node_modules/@metro-labs/telegram/src/reactions.ts +167 -0
  215. package/runtime/node_modules/@metro-labs/telegram/src/station.ts +24 -0
  216. package/runtime/node_modules/@metro-labs/telegram/src/types.ts +7 -0
  217. package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +1 -0
  218. package/runtime/node_modules/@metro-labs/telegram-bot/package.json +25 -0
  219. package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +120 -0
  220. package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +295 -0
  221. package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +128 -0
  222. package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +201 -0
  223. package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +109 -0
  224. package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +166 -0
  225. package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +47 -0
  226. package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +17 -0
  227. package/runtime/node_modules/@metro-labs/telegram-bot/src/types.ts +58 -0
  228. package/runtime/node_modules/@metro-labs/telegram-bot/src/verify.ts +38 -0
  229. package/runtime/node_modules/@metro-labs/telegram-bot/src/wire.ts +3 -0
  230. package/runtime/node_modules/@metro-labs/threema/package.json +26 -0
  231. package/runtime/node_modules/@metro-labs/threema/src/accounts.ts +100 -0
  232. package/runtime/node_modules/@metro-labs/threema/src/actions.ts +219 -0
  233. package/runtime/node_modules/@metro-labs/threema/src/api.ts +130 -0
  234. package/runtime/node_modules/@metro-labs/threema/src/crypto.ts +132 -0
  235. package/runtime/node_modules/@metro-labs/threema/src/format.ts +123 -0
  236. package/runtime/node_modules/@metro-labs/threema/src/ids.ts +21 -0
  237. package/runtime/node_modules/@metro-labs/threema/src/index.ts +29 -0
  238. package/runtime/node_modules/@metro-labs/threema/src/station.ts +10 -0
  239. package/runtime/node_modules/@metro-labs/threema/src/verify.ts +117 -0
  240. package/runtime/node_modules/@metro-labs/webhook/package.json +23 -0
  241. package/runtime/node_modules/@metro-labs/webhook/src/station.ts +37 -0
  242. package/runtime/node_modules/@metro-labs/whatsapp/package.json +27 -0
  243. package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +66 -0
  244. package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +101 -0
  245. package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +190 -0
  246. package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +72 -0
  247. package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +129 -0
  248. package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +347 -0
  249. package/runtime/node_modules/@metro-labs/whatsapp/src/delivery.ts +49 -0
  250. package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +138 -0
  251. package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +57 -0
  252. package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +40 -0
  253. package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +59 -0
  254. package/runtime/node_modules/@metro-labs/whatsapp/src/logger.ts +60 -0
  255. package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +176 -0
  256. package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +84 -0
  257. package/runtime/node_modules/@metro-labs/whatsapp/src/normalize.ts +22 -0
  258. package/runtime/node_modules/@metro-labs/whatsapp/src/outbox.ts +38 -0
  259. package/runtime/node_modules/@metro-labs/whatsapp/src/parse.ts +185 -0
  260. package/runtime/node_modules/@metro-labs/whatsapp/src/resolve.ts +52 -0
  261. package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +18 -0
  262. package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +98 -0
  263. package/runtime/node_modules/@metro-labs/whatsapp/src/types.ts +6 -0
  264. package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +5 -0
  265. package/runtime/node_modules/@metro-labs/xmtp/package.json +33 -0
  266. package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +112 -0
  267. package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +110 -0
  268. package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +299 -0
  269. package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +157 -0
  270. package/runtime/node_modules/@metro-labs/xmtp/src/actions-push.ts +87 -0
  271. package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +375 -0
  272. package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +107 -0
  273. package/runtime/node_modules/@metro-labs/xmtp/src/codecs.ts +171 -0
  274. package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +239 -0
  275. package/runtime/node_modules/@metro-labs/xmtp/src/emit-core.ts +55 -0
  276. package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +335 -0
  277. package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +80 -0
  278. package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +34 -0
  279. package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +56 -0
  280. package/runtime/node_modules/@metro-labs/xmtp/src/identity.ts +33 -0
  281. package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +125 -0
  282. package/runtime/node_modules/@metro-labs/xmtp/src/labels.ts +157 -0
  283. package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +40 -0
  284. package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +349 -0
  285. package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +13 -0
  286. package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +126 -0
  287. package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +212 -0
  288. package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +90 -0
  289. package/runtime/node_modules/@metro-labs/xmtp/src/verify.ts +84 -0
  290. package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +53 -0
  291. package/runtime/runtime.json +3 -0
  292. package/runtime/server.ts +1 -0
  293. package/runtime/stations.json +39 -0
  294. package/runtime/trains/.keep +0 -0
  295. package/LICENSE +0 -21
  296. package/README.md +0 -252
  297. package/dist/broker.js +0 -202
  298. package/dist/cache.js +0 -69
  299. package/dist/cli/actions.js +0 -206
  300. package/dist/cli/config.js +0 -185
  301. package/dist/cli/index.js +0 -188
  302. package/dist/cli/skill.js +0 -62
  303. package/dist/cli/tail.js +0 -164
  304. package/dist/cli/util.js +0 -72
  305. package/dist/cli/webhook.js +0 -81
  306. package/dist/codex-rc.js +0 -245
  307. package/dist/dispatcher.js +0 -128
  308. package/dist/history.js +0 -121
  309. package/dist/ipc.js +0 -72
  310. package/dist/log.js +0 -15
  311. package/dist/monitor.js +0 -194
  312. package/dist/paths.js +0 -68
  313. package/dist/registry.js +0 -48
  314. package/dist/stations/claude.js +0 -45
  315. package/dist/stations/codex.js +0 -68
  316. package/dist/stations/discord.js +0 -216
  317. package/dist/stations/index.js +0 -129
  318. package/dist/stations/telegram-md.js +0 -34
  319. package/dist/stations/telegram-upload.js +0 -113
  320. package/dist/stations/telegram.js +0 -234
  321. package/dist/stations/webhook.js +0 -103
  322. package/dist/tunnel.js +0 -64
  323. package/dist/webhooks.js +0 -41
  324. package/docs/broker.md +0 -214
  325. package/docs/monitor.md +0 -163
  326. package/docs/uri-scheme.md +0 -124
  327. package/docs/users.md +0 -226
  328. package/skills/metro/SKILL.md +0 -256
package/dist/codex-rc.js DELETED
@@ -1,245 +0,0 @@
1
- /**
2
- * JSON-RPC/WS client for codex app-server: each event → `turn/start` (Codex's Monitor equivalent).
3
- */
4
- import { createConnection } from 'node:net';
5
- import { WebSocket } from 'ws';
6
- import { errMsg, log } from './log.js';
7
- const RECONNECT_DELAY_MS = 2_000;
8
- const MAX_QUEUE = 100;
9
- /** Backstop in case `turn/completed` never arrives — unstick the single-flight gate. */
10
- const TURN_TIMEOUT_MS = 120_000;
11
- /** Accept ws://, wss://, unix:///abs/path, or /abs/path (shorthand for unix). */
12
- function parseUrl(input) {
13
- if (input.startsWith('ws://') || input.startsWith('wss://'))
14
- return { kind: 'tcp', url: input };
15
- if (input.startsWith('unix://'))
16
- return { kind: 'unix', path: input.replace(/^unix:\/+/, '/') };
17
- if (input.startsWith('/'))
18
- return { kind: 'unix', path: input };
19
- throw new Error(`unsupported METRO_CODEX_RC: ${input} (expected ws://, wss://, unix://, or abs path)`);
20
- }
21
- function openSocket(endpoint) {
22
- if (endpoint.kind === 'tcp')
23
- return new WebSocket(endpoint.url);
24
- return new WebSocket('ws://localhost/', {
25
- createConnection: () => createConnection({ path: endpoint.path }),
26
- });
27
- }
28
- export class CodexRC {
29
- url;
30
- clientVersion;
31
- ws = null;
32
- nextId = 1;
33
- pending = new Map();
34
- threadId = null;
35
- threadListener = null;
36
- queue = [];
37
- connected = false;
38
- connecting = false;
39
- turnInFlight = false;
40
- turnTimeout = null;
41
- closed = false;
42
- endpoint;
43
- constructor(url, clientVersion) {
44
- this.url = url;
45
- this.clientVersion = clientVersion;
46
- this.endpoint = parseUrl(url);
47
- }
48
- start() { void this.connect(); }
49
- getThreadId() { return this.threadId; }
50
- onThread(listener) { this.threadListener = listener; }
51
- setThreadId(id) {
52
- if (this.threadId === id)
53
- return;
54
- this.threadId = id;
55
- this.threadListener?.(id);
56
- }
57
- stop() {
58
- this.closed = true;
59
- this.clearTurnTimeout();
60
- this.ws?.close();
61
- this.ws = null;
62
- }
63
- push(line) {
64
- if (this.queue.length >= MAX_QUEUE) {
65
- log.warn({ url: this.url }, 'codex-rc queue full, dropping oldest');
66
- this.queue.shift();
67
- }
68
- this.queue.push(line);
69
- void this.drainQueue();
70
- }
71
- async connect() {
72
- if (this.closed || this.connected || this.connecting)
73
- return;
74
- this.connecting = true;
75
- try {
76
- const ws = openSocket(this.endpoint);
77
- this.ws = ws;
78
- ws.on('error', err => log.warn({ err: errMsg(err) }, 'codex-rc websocket error'));
79
- await new Promise((resolve, reject) => {
80
- ws.once('open', () => resolve());
81
- ws.once('error', err => reject(err));
82
- });
83
- ws.on('message', data => this.onMessage(data));
84
- ws.on('close', () => this.onClose());
85
- const clientInfo = { name: 'metro', version: this.clientVersion, title: null };
86
- await this.call('initialize', { clientInfo });
87
- this.setThreadId(await this.pickOrCreateThread());
88
- this.connected = true;
89
- log.info({ url: this.url, thread: this.threadId ?? '(none yet)' }, 'codex-rc connected');
90
- void this.drainQueue();
91
- }
92
- catch (err) {
93
- log.warn({ err: errMsg(err), url: this.url }, 'codex-rc connect failed; retrying');
94
- this.scheduleReconnect();
95
- }
96
- finally {
97
- this.connecting = false;
98
- }
99
- }
100
- onMessage(raw) {
101
- let msg;
102
- try {
103
- msg = JSON.parse(raw.toString());
104
- }
105
- catch (err) {
106
- log.warn({ err: errMsg(err) }, 'codex-rc malformed message');
107
- return;
108
- }
109
- if (msg.id !== undefined && this.pending.has(msg.id)) {
110
- const p = this.pending.get(msg.id);
111
- this.pending.delete(msg.id);
112
- if (msg.error)
113
- p.reject(new Error(msg.error.message ?? 'rpc error'));
114
- else
115
- p.resolve(msg.result);
116
- return;
117
- }
118
- switch (msg.method) {
119
- case 'thread/started': {
120
- const id = msg.params?.thread?.id;
121
- if (id) {
122
- this.setThreadId(id);
123
- log.info({ thread: id }, 'codex-rc thread started');
124
- void this.drainQueue();
125
- }
126
- break;
127
- }
128
- case 'thread/status/changed': {
129
- /* Codex 0.130+: status `{active}` means in-flight; anything else is idle. */
130
- const p = msg.params;
131
- if (p?.threadId !== this.threadId)
132
- break;
133
- const active = typeof p.status === 'object' && p.status !== null && 'active' in p.status;
134
- if (active)
135
- this.turnInFlight = true;
136
- else {
137
- this.clearTurnTimeout();
138
- this.turnInFlight = false;
139
- void this.drainQueue();
140
- }
141
- break;
142
- }
143
- case 'turn/completed':
144
- this.clearTurnTimeout();
145
- this.turnInFlight = false;
146
- void this.drainQueue();
147
- break;
148
- case 'turn/started':
149
- this.turnInFlight = true;
150
- break;
151
- case 'thread/closed':
152
- case 'thread/archived':
153
- log.warn({ method: msg.method }, 'codex-rc thread closed/archived');
154
- this.setThreadId(null);
155
- break;
156
- }
157
- }
158
- onClose() {
159
- if (this.closed)
160
- return;
161
- this.connected = false;
162
- this.ws = null;
163
- for (const p of this.pending.values())
164
- p.reject(new Error('websocket closed'));
165
- this.pending.clear();
166
- this.scheduleReconnect();
167
- }
168
- scheduleReconnect() {
169
- if (this.closed)
170
- return;
171
- this.connected = false;
172
- setTimeout(() => void this.connect(), RECONNECT_DELAY_MS);
173
- }
174
- /** Prefer the most-recently-loaded thread (the TUI's if attached); else create our own. */
175
- async pickOrCreateThread() {
176
- try {
177
- const loaded = await this.call('thread/loaded/list', {});
178
- const existing = loaded.data?.[loaded.data.length - 1];
179
- if (existing)
180
- return existing;
181
- }
182
- catch (err) {
183
- log.warn({ err: errMsg(err) }, 'codex-rc thread/loaded/list failed');
184
- }
185
- try {
186
- const created = await this.call('thread/start', {});
187
- return created.thread?.id ?? null;
188
- }
189
- catch (err) {
190
- log.warn({ err: errMsg(err) }, 'codex-rc thread/start failed');
191
- return null;
192
- }
193
- }
194
- async drainQueue() {
195
- if (!this.connected || this.turnInFlight || !this.queue.length)
196
- return;
197
- if (!this.threadId) {
198
- this.setThreadId(await this.pickOrCreateThread());
199
- if (!this.threadId)
200
- return;
201
- }
202
- const line = this.queue[0];
203
- this.turnInFlight = true;
204
- this.armTurnTimeout();
205
- try {
206
- const input = [{ type: 'text', text: line, textElements: [] }];
207
- await this.call('turn/start', { threadId: this.threadId, input });
208
- this.queue.shift();
209
- }
210
- catch (err) {
211
- const dead = errMsg(err).includes('thread not found');
212
- log.warn({ err: errMsg(err) }, dead ? 'codex-rc thread gone; will create a new one' : 'codex-rc turn/start failed; will retry');
213
- this.clearTurnTimeout();
214
- this.turnInFlight = false;
215
- if (dead)
216
- this.setThreadId(null);
217
- setTimeout(() => void this.drainQueue(), 1_000);
218
- }
219
- }
220
- armTurnTimeout() {
221
- this.clearTurnTimeout();
222
- this.turnTimeout = setTimeout(() => {
223
- log.warn({ thread: this.threadId, queue: this.queue.length }, `codex-rc turn/completed not received within ${TURN_TIMEOUT_MS}ms; force-clearing gate`);
224
- this.turnInFlight = false;
225
- this.turnTimeout = null;
226
- void this.drainQueue();
227
- }, TURN_TIMEOUT_MS);
228
- }
229
- clearTurnTimeout() {
230
- if (this.turnTimeout) {
231
- clearTimeout(this.turnTimeout);
232
- this.turnTimeout = null;
233
- }
234
- }
235
- call(method, params) {
236
- if (!this.ws)
237
- return Promise.reject(new Error('not connected'));
238
- const id = this.nextId++;
239
- const ws = this.ws;
240
- return new Promise((resolve, reject) => {
241
- this.pending.set(id, { resolve: resolve, reject });
242
- ws.send(JSON.stringify({ jsonrpc: '2.0', id, method, params }));
243
- });
244
- }
245
- }
@@ -1,128 +0,0 @@
1
- /**
2
- * Daemon: chat inbound → JSON on stdout; optional codex-rc push; cross-user `notify` over Unix socket.
3
- */
4
- import { copyFileSync } from 'node:fs';
5
- import { dirname, join } from 'node:path';
6
- import { fileURLToPath } from 'node:url';
7
- import pkg from '../package.json' with { type: 'json' };
8
- import { DiscordStation } from './stations/discord.js';
9
- import { TelegramStation } from './stations/telegram.js';
10
- import { WebhookStation } from './stations/webhook.js';
11
- import { asLine, Line } from './stations/index.js';
12
- import { CodexRC } from './codex-rc.js';
13
- import { startIpcServer, stopIpcServer } from './ipc.js';
14
- import { userSelf, appendHistory, formatDisplay, mintId, selfLine } from './history.js';
15
- import { noteSeen, saveBotId } from './cache.js';
16
- import { errMsg, log } from './log.js';
17
- import { acquireLock, configuredPlatforms, loadMetroEnv, STATE_DIR, requireConfiguredPlatform } from './paths.js';
18
- import { setCodexSessionId } from './stations/codex.js';
19
- import { noteUserFromLine } from './registry.js';
20
- import { listEndpoints, webhookPort } from './webhooks.js';
21
- import { loadTunnelConfig, Tunnel } from './tunnel.js';
22
- loadMetroEnv();
23
- const platforms = configuredPlatforms();
24
- const endpoints = listEndpoints();
25
- requireConfiguredPlatform(platforms, endpoints.length > 0);
26
- acquireLock(join(STATE_DIR, '.tail-lock'));
27
- // Fail fast if launched from Claude Code without a logged-in account.
28
- const self = userSelf();
29
- log.info({ self, line: selfLine() }, 'user identity');
30
- const seedSelf = () => { const l = selfLine(); if (l)
31
- noteUserFromLine(l); };
32
- seedSelf();
33
- const USERS_MD = join(STATE_DIR, 'USERS.md');
34
- try {
35
- copyFileSync(join(dirname(fileURLToPath(import.meta.url)), '..', 'docs', 'users.md'), USERS_MD);
36
- }
37
- catch (err) {
38
- log.warn({ err: errMsg(err), path: USERS_MD }, 'failed to install user skill');
39
- }
40
- /** Suppress EPIPE so the daemon survives the user (Monitor reader) restarting / dying. */
41
- process.stdout.on('error', err => {
42
- if (err.code !== 'EPIPE')
43
- log.warn({ err: errMsg(err) }, 'stdout error');
44
- });
45
- const codexRc = process.env.METRO_CODEX_RC ? new CodexRC(process.env.METRO_CODEX_RC, pkg.version) : null;
46
- codexRc?.onThread(id => { setCodexSessionId(id); seedSelf(); });
47
- codexRc?.start();
48
- const discord = new DiscordStation();
49
- const telegram = new TelegramStation();
50
- const webhook = new WebhookStation();
51
- const tunnelCfg = loadTunnelConfig();
52
- const tunnel = tunnelCfg ? new Tunnel(tunnelCfg, webhookPort()) : null;
53
- function emit(entry) {
54
- /** `display` first so it survives Monitor's ~500-char body truncation — the user must see it to echo it. */
55
- const enriched = { display: formatDisplay(entry), ...entry };
56
- const json = JSON.stringify(enriched);
57
- process.stdout.write(json + '\n');
58
- codexRc?.push(json);
59
- noteSeen(entry.line, entry.lineName);
60
- for (const l of [entry.line, entry.from, entry.to])
61
- if (l)
62
- noteUserFromLine(l);
63
- appendHistory(enriched);
64
- }
65
- const destinationFor = (m) => m.isPrivate ? userSelf() : m.line;
66
- const onInbound = (m) => emit({ ...m, kind: 'inbound', to: destinationFor(m) });
67
- const onReaction = (r) => emit({ ...r, kind: 'react', to: destinationFor(r) });
68
- const ipc = startIpcServer(async (req) => {
69
- if (req.op === 'notify') {
70
- const line = asLine(req.line);
71
- emit({
72
- id: mintId(), ts: new Date().toISOString(), kind: 'inbound',
73
- station: Line.station(line) ?? '?', line,
74
- from: req.from ? asLine(req.from) : userSelf(), to: line, text: req.text,
75
- });
76
- return { ok: true };
77
- }
78
- if (req.op === 'download') {
79
- const line = asLine(req.line);
80
- const station = req.line.startsWith('metro://telegram/') ? telegram : discord;
81
- const files = await station.download(line, req.messageId, req.outDir);
82
- return { ok: true, files };
83
- }
84
- return { ok: false, error: 'unknown op' };
85
- });
86
- async function main() {
87
- if (platforms.discord) {
88
- discord.onMessage(onInbound);
89
- discord.onReaction(onReaction);
90
- const [, me] = await Promise.all([discord.start(), discord.getMe()]);
91
- saveBotId('discord', me.id);
92
- log.info({ bot: me.username }, 'discord ready');
93
- }
94
- if (platforms.telegram) {
95
- telegram.onMessage(onInbound);
96
- telegram.onReaction(onReaction);
97
- const [me] = await Promise.all([telegram.getMe(), telegram.start()]);
98
- saveBotId('telegram', String(me.id));
99
- log.info({ bot: `@${me.username}` }, 'telegram ready');
100
- }
101
- /** Start the HTTP receiver only when ≥1 endpoint is registered — no point binding a port nobody listens to. */
102
- if (endpoints.length) {
103
- webhook.onMessage(onInbound);
104
- await webhook.start();
105
- tunnel?.start();
106
- }
107
- log.info({ codexRc: !!codexRc, tunnel: !!tunnel }, 'dispatcher ready');
108
- }
109
- let shuttingDown = false;
110
- async function shutdown() {
111
- if (shuttingDown)
112
- return;
113
- shuttingDown = true;
114
- log.info('dispatcher shutting down');
115
- codexRc?.stop();
116
- tunnel?.stop();
117
- await stopIpcServer(ipc).catch(() => { });
118
- await webhook.stop().catch(() => { });
119
- if (platforms.discord)
120
- await discord.stop().catch(() => { });
121
- if (platforms.telegram)
122
- await telegram.stop().catch(() => { });
123
- process.exit(0);
124
- }
125
- process.stdin.on('end', shutdown).on('close', shutdown);
126
- for (const sig of ['SIGINT', 'SIGTERM'])
127
- process.on(sig, shutdown);
128
- await main();
package/dist/history.js DELETED
@@ -1,121 +0,0 @@
1
- /** Append-only JSONL history of every message that flows through metro (inbound + outbound). */
2
- import { randomBytes } from 'node:crypto';
3
- import { appendFileSync, existsSync, readFileSync } from 'node:fs';
4
- import { join } from 'node:path';
5
- import { errMsg, log } from './log.js';
6
- import { STATE_DIR } from './paths.js';
7
- import { Line } from './stations/index.js';
8
- import { claudeUserId, claudeSessionId } from './stations/claude.js';
9
- import { codexUserId, codexSessionId } from './stations/codex.js';
10
- /** Pre-render a chat-bubble line — the user echoes `event.display` verbatim instead of composing markdown itself. */
11
- export function formatDisplay(e) {
12
- const headerFor = (icon, parts) => `**${icon} ${parts.filter(Boolean).join(' · ')}**`;
13
- const body = e.text ?? (e.emoji ? `[react ${e.emoji}]` : '');
14
- if (e.kind === 'inbound' && e.station === 'webhook') {
15
- const ev = e.payload
16
- ?.headers?.['x-github-event'] ?? e.payload
17
- ?.headers?.['x-intercom-topic'];
18
- return `${headerFor('🪝', ['webhook', e.lineName, ev])}\n> ${body}`;
19
- }
20
- if (e.kind === 'inbound' || (e.kind === 'react' && !Line.isLocal(e.from))) {
21
- const reactBody = e.kind === 'react' ? `reacted ${e.emoji ?? ''}`.trim() : body;
22
- return `${headerFor('📩', [e.station, e.fromName ?? e.from, e.lineName])}\n> ${reactBody}`;
23
- }
24
- return `${headerFor('📤', [e.station, '→', e.fromName ?? e.to])}\n> ${body}`;
25
- }
26
- const FILE = join(STATE_DIR, 'history.jsonl');
27
- /** Mint a universal metro message ID. Short, prefixed, URL-safe. */
28
- export const mintId = () => `msg_${randomBytes(6).toString('base64url')}`;
29
- /** Append one entry as a JSON line. POSIX-atomic for sub-PIPE_BUF writes (we're well under). */
30
- export function appendHistory(entry) {
31
- try {
32
- appendFileSync(FILE, JSON.stringify(entry) + '\n');
33
- }
34
- catch (err) {
35
- log.warn({ err: errMsg(err), path: FILE }, 'history append failed');
36
- }
37
- }
38
- /** Read JSONL, parse, filter (most-recent-first), apply `skip` then `limit`. Empty array if file is missing. */
39
- export function readHistory(filter = {}) {
40
- if (!existsSync(FILE))
41
- return [];
42
- const lines = readFileSync(FILE, 'utf8').split('\n');
43
- const out = [];
44
- const skip = filter.skip ?? 0;
45
- let skipped = 0;
46
- /** Walk backwards so `limit` clamps without scanning the whole file body twice. */
47
- for (let i = lines.length - 1; i >= 0; i--) {
48
- const raw = lines[i].trim();
49
- if (!raw)
50
- continue;
51
- let e;
52
- try {
53
- e = JSON.parse(raw);
54
- }
55
- catch {
56
- continue;
57
- }
58
- if (!matches(e, filter))
59
- continue;
60
- if (skipped < skip) {
61
- skipped++;
62
- continue;
63
- }
64
- out.push(e);
65
- if (filter.limit && out.length >= filter.limit)
66
- break;
67
- }
68
- return out;
69
- }
70
- function matches(e, f) {
71
- if (f.line && e.line !== f.line)
72
- return false;
73
- if (f.station && e.station !== f.station)
74
- return false;
75
- if (f.kind && e.kind !== f.kind)
76
- return false;
77
- if (f.from && e.from !== f.from)
78
- return false;
79
- if (f.textContains && !(e.text ?? '').toLowerCase().includes(f.textContains.toLowerCase()))
80
- return false;
81
- if (f.since && new Date(e.ts) < f.since)
82
- return false;
83
- return true;
84
- }
85
- /** Find an entry by universal id OR platform message id. */
86
- export function lookupEntry(id) {
87
- const entries = readHistory({ limit: 5_000 });
88
- return entries.find(e => e.id === id || e.messageId === id);
89
- }
90
- /** Look up the platform messageId for a universal `msg_*` id; returns the input unchanged otherwise. */
91
- export function resolvePlatformId(id) {
92
- if (!id.startsWith('msg_'))
93
- return id;
94
- const hit = lookupEntry(id);
95
- if (hit?.messageId)
96
- return hit.messageId;
97
- throw new Error(`unknown universal id: ${id} (run \`metro history --limit=50\` to see recent ids)`);
98
- }
99
- /** The current user's **participant** URI for `from`/`to`. Precedence: METRO_FROM > runtime env > generic. */
100
- export function userSelf() {
101
- const explicit = process.env.METRO_FROM;
102
- if (explicit)
103
- return explicit;
104
- if (process.env.CLAUDECODE)
105
- return Line.user('claude', claudeUserId());
106
- if (process.env.METRO_CODEX_RC || process.env.CODEX_HOME)
107
- return Line.user('codex', codexUserId());
108
- return 'metro://user';
109
- }
110
- /** The current user's **line** URI `<user-id>/<session>`. Null until session is known (rc thread pending). */
111
- export function selfLine() {
112
- if (process.env.CLAUDECODE) {
113
- const s = claudeSessionId();
114
- return s ? Line.claude(claudeUserId(), s) : null;
115
- }
116
- if (process.env.METRO_CODEX_RC || process.env.CODEX_HOME) {
117
- const s = codexSessionId();
118
- return s ? Line.codex(codexUserId(), s) : null;
119
- }
120
- return null;
121
- }
package/dist/ipc.js DELETED
@@ -1,72 +0,0 @@
1
- /** Unix-socket IPC: `notify` re-emits on daemon stdout; `download` resolves Telegram attachments. */
2
- import { createConnection, createServer } from 'node:net';
3
- import { existsSync, unlinkSync } from 'node:fs';
4
- import { join } from 'node:path';
5
- import { errMsg, log } from './log.js';
6
- import { STATE_DIR } from './paths.js';
7
- const SOCKET_PATH = join(STATE_DIR, 'metro.sock');
8
- export function startIpcServer(handler) {
9
- if (existsSync(SOCKET_PATH)) {
10
- try {
11
- unlinkSync(SOCKET_PATH);
12
- }
13
- catch { /* ignore */ }
14
- }
15
- /** allowHalfOpen: any `await` in the handler races Node's auto-end-on-client-FIN, dropping the response. */
16
- const server = createServer({ allowHalfOpen: true }, s => handleConnection(s, handler));
17
- server.on('error', err => log.warn({ err: errMsg(err) }, 'ipc server error'));
18
- server.listen(SOCKET_PATH, () => log.debug({ path: SOCKET_PATH }, 'ipc socket listening'));
19
- return server;
20
- }
21
- export async function stopIpcServer(server) {
22
- await new Promise(resolve => server.close(() => resolve()));
23
- try {
24
- if (existsSync(SOCKET_PATH))
25
- unlinkSync(SOCKET_PATH);
26
- }
27
- catch { /* ignore */ }
28
- }
29
- async function handleConnection(socket, handler) {
30
- let buf = '';
31
- socket.setEncoding('utf8');
32
- socket.on('data', chunk => { buf += chunk; });
33
- socket.on('end', async () => {
34
- let resp;
35
- try {
36
- const req = JSON.parse(buf.trim());
37
- resp = await handler(req);
38
- }
39
- catch (err) {
40
- resp = { ok: false, error: errMsg(err) };
41
- }
42
- socket.end(JSON.stringify(resp) + '\n');
43
- });
44
- socket.on('error', err => log.debug({ err: errMsg(err) }, 'ipc connection error'));
45
- }
46
- /** CLI-side: send one request, get one response. Throws if the daemon isn't running. */
47
- export function ipcCall(req, timeoutMs = 30_000) {
48
- return new Promise((resolve, reject) => {
49
- if (!existsSync(SOCKET_PATH)) {
50
- reject(new Error('metro daemon is not running (start it with `metro`)'));
51
- return;
52
- }
53
- const socket = createConnection({ path: SOCKET_PATH });
54
- let buf = '';
55
- const timer = setTimeout(() => {
56
- socket.destroy();
57
- reject(new Error(`ipc timeout after ${timeoutMs}ms`));
58
- }, timeoutMs);
59
- socket.on('connect', () => { socket.end(JSON.stringify(req)); });
60
- socket.on('data', chunk => { buf += chunk.toString('utf8'); });
61
- socket.on('end', () => {
62
- clearTimeout(timer);
63
- try {
64
- resolve(JSON.parse(buf.trim()));
65
- }
66
- catch (err) {
67
- reject(new Error(`ipc bad response: ${errMsg(err)}`));
68
- }
69
- });
70
- socket.on('error', err => { clearTimeout(timer); reject(err); });
71
- });
72
- }
package/dist/log.js DELETED
@@ -1,15 +0,0 @@
1
- /** Pino → stderr. TTY → pino-pretty (colorized, hostname/pid stripped); else JSON. */
2
- import pino from 'pino';
3
- import pinoPretty from 'pino-pretty';
4
- const stream = process.stderr.isTTY
5
- ? pinoPretty({ colorize: true, translateTime: 'HH:MM:ss', ignore: 'pid,hostname,name', destination: 2 })
6
- : pino.destination(2);
7
- /** `base: { name }` strips pino's default pid+hostname from JSON output too (not just from the TTY pretty stream). */
8
- export const log = pino({ base: { name: 'metro' }, level: process.env.METRO_LOG_LEVEL || 'info' }, stream);
9
- export const errMsg = (err) => {
10
- if (err instanceof Error)
11
- return err.message;
12
- if (err && typeof err === 'object' && 'message' in err)
13
- return String(err.message);
14
- return String(err);
15
- };