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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/dist/agent.js +123 -0
  2. package/dist/api.js +9 -129
  3. package/dist/automation.js +56 -0
  4. package/dist/child.js +33 -0
  5. package/dist/claude-env.js +113 -0
  6. package/dist/claude-settings.js +40 -0
  7. package/dist/cli.js +60 -139
  8. package/dist/control.js +19 -103
  9. package/dist/hold.js +210 -0
  10. package/dist/local.js +43 -0
  11. package/dist/lock.js +62 -0
  12. package/dist/memory.js +206 -0
  13. package/dist/node-name.js +71 -0
  14. package/dist/provider-flags.js +9 -0
  15. package/dist/root-release-io.js +160 -0
  16. package/dist/root-release.js +74 -0
  17. package/dist/route.js +65 -0
  18. package/dist/runtime-install.js +106 -0
  19. package/dist/runtime.js +29 -55
  20. package/dist/serve.js +117 -17
  21. package/dist/service.js +328 -0
  22. package/dist/tail.js +10 -11
  23. package/dist/update.js +13 -1
  24. package/hooks/guard.mjs +77 -0
  25. package/hooks/policy.mjs +74 -0
  26. package/hooks/session-start.mjs +31 -0
  27. package/package.json +6 -25
  28. package/runtime/node_modules/@metro-labs/core/package.json +61 -0
  29. package/runtime/node_modules/@metro-labs/core/src/automation-files.ts +216 -0
  30. package/runtime/node_modules/@metro-labs/core/src/automation-store.ts +171 -0
  31. package/runtime/node_modules/@metro-labs/core/src/automation-types.ts +141 -0
  32. package/runtime/node_modules/@metro-labs/core/src/call.ts +81 -0
  33. package/runtime/node_modules/@metro-labs/core/src/claude-token.ts +3 -0
  34. package/runtime/node_modules/@metro-labs/core/src/effort.ts +21 -0
  35. package/runtime/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  36. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/events.ts +54 -6
  37. package/runtime/node_modules/@metro-labs/{mcp/src/db → core/src}/ids.ts +8 -1
  38. package/runtime/node_modules/@metro-labs/core/src/is-record.ts +2 -0
  39. package/runtime/node_modules/@metro-labs/{mcp/src/stations → core/src}/lines.ts +22 -26
  40. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/protocol.ts +7 -4
  41. package/runtime/node_modules/@metro-labs/core/src/runner-activity.ts +270 -0
  42. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/secure-fs.ts +17 -0
  43. package/runtime/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
  44. package/runtime/node_modules/@metro-labs/core/src/station-names.ts +14 -0
  45. package/runtime/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
  46. package/runtime/node_modules/@metro-labs/core/src/stations/account-status.ts +26 -0
  47. package/runtime/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
  48. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/attachments.ts +9 -3
  49. package/runtime/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
  50. package/runtime/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
  51. package/runtime/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
  52. package/runtime/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
  53. package/runtime/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
  54. package/runtime/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
  55. package/runtime/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
  56. package/runtime/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
  57. package/runtime/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
  58. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/station-runtime.ts +6 -11
  59. package/runtime/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
  60. package/runtime/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
  61. package/runtime/node_modules/@metro-labs/{mcp → core}/src/stations/types.ts +22 -1
  62. package/runtime/node_modules/@metro-labs/core/src/tickets.ts +44 -0
  63. package/runtime/node_modules/@metro-labs/core/src/version.ts +2 -0
  64. package/runtime/node_modules/@metro-labs/daemon/package.json +51 -0
  65. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/agent-fs.ts +246 -0
  66. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/crontab.ts +38 -0
  67. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files-api.ts +12 -0
  68. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/files.ts +89 -0
  69. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/home-fs.ts +86 -0
  70. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/metro-home.ts +42 -0
  71. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/provision.ts +57 -0
  72. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedule-detail.ts +93 -0
  73. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules-api.ts +27 -0
  74. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/schedules.ts +144 -0
  75. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/unit-files.ts +29 -0
  76. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/user.ts +101 -0
  77. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/view.ts +90 -0
  78. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-attach.ts +19 -0
  79. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-lookups.ts +55 -0
  80. package/runtime/node_modules/@metro-labs/daemon/src/agents/account-routes.ts +78 -0
  81. package/runtime/node_modules/@metro-labs/daemon/src/agents/accounts-api.ts +383 -0
  82. package/runtime/node_modules/@metro-labs/daemon/src/agents/admin.ts +30 -0
  83. package/runtime/node_modules/@metro-labs/daemon/src/agents/allowlist.ts +59 -0
  84. package/runtime/node_modules/@metro-labs/daemon/src/agents/api.ts +134 -0
  85. package/runtime/node_modules/@metro-labs/daemon/src/agents/bundle.ts +124 -0
  86. package/runtime/node_modules/@metro-labs/daemon/src/agents/file-admin.ts +334 -0
  87. package/runtime/node_modules/@metro-labs/{mcp/src/db/file-source.ts → daemon/src/agents/files.ts} +40 -50
  88. package/runtime/node_modules/@metro-labs/{mcp/src/db/key-map.ts → daemon/src/agents/keys.ts} +1 -11
  89. package/runtime/node_modules/@metro-labs/daemon/src/agents/map.ts +135 -0
  90. package/runtime/node_modules/@metro-labs/daemon/src/agents/policy-route.ts +27 -0
  91. package/runtime/node_modules/@metro-labs/{mcp/src/db/agent-scope.ts → daemon/src/agents/scope.ts} +2 -2
  92. package/runtime/node_modules/@metro-labs/daemon/src/agents/sender-cards.ts +94 -0
  93. package/runtime/node_modules/@metro-labs/daemon/src/agents/senders.ts +38 -0
  94. package/runtime/node_modules/@metro-labs/daemon/src/approvals/api.ts +55 -0
  95. package/runtime/node_modules/@metro-labs/daemon/src/approvals/owner-line.ts +45 -0
  96. package/runtime/node_modules/@metro-labs/daemon/src/approvals/pending.ts +190 -0
  97. package/runtime/node_modules/@metro-labs/daemon/src/approvals/preview.ts +66 -0
  98. package/runtime/node_modules/@metro-labs/daemon/src/boot/boot.ts +259 -0
  99. package/runtime/node_modules/@metro-labs/daemon/src/boot/connect-hint.ts +36 -0
  100. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/crash-guard.ts +1 -1
  101. package/runtime/node_modules/@metro-labs/daemon/src/boot/local-owner.ts +21 -0
  102. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/boot}/paths.ts +3 -41
  103. package/runtime/node_modules/@metro-labs/daemon/src/channels/addressed.ts +26 -0
  104. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/inbound.ts +99 -73
  105. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/media-note.ts +11 -7
  106. package/runtime/node_modules/@metro-labs/daemon/src/channels/notice.ts +22 -0
  107. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/pending.ts +13 -1
  108. package/runtime/node_modules/@metro-labs/daemon/src/channels/react-note.ts +13 -0
  109. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/relay.ts +6 -2
  110. package/runtime/node_modules/@metro-labs/daemon/src/claude/api.ts +269 -0
  111. package/runtime/node_modules/@metro-labs/daemon/src/claude/cli-files.ts +28 -0
  112. package/runtime/node_modules/@metro-labs/daemon/src/claude/files.ts +359 -0
  113. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-api.ts +12 -0
  114. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-fetch.ts +160 -0
  115. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-skills.ts +255 -0
  116. package/runtime/node_modules/@metro-labs/daemon/src/claude/github-validate.ts +53 -0
  117. package/runtime/node_modules/@metro-labs/daemon/src/claude/hooks.ts +60 -0
  118. package/runtime/node_modules/@metro-labs/daemon/src/claude/memory-routine.ts +123 -0
  119. package/runtime/node_modules/@metro-labs/daemon/src/claude/memory.ts +32 -0
  120. package/runtime/node_modules/@metro-labs/daemon/src/claude/runner-activity.ts +17 -0
  121. package/runtime/node_modules/@metro-labs/daemon/src/claude/runner-process.ts +52 -0
  122. package/runtime/node_modules/@metro-labs/daemon/src/claude/session-files.ts +75 -0
  123. package/runtime/node_modules/@metro-labs/daemon/src/claude/session.ts +294 -0
  124. package/runtime/node_modules/@metro-labs/daemon/src/claude/settings.ts +109 -0
  125. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup-api.ts +114 -0
  126. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup-state.ts +18 -0
  127. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup.ts +325 -0
  128. package/runtime/node_modules/@metro-labs/daemon/src/claude/skills.ts +123 -0
  129. package/runtime/node_modules/@metro-labs/daemon/src/connectors/agent-key.ts +145 -0
  130. package/runtime/node_modules/@metro-labs/daemon/src/connectors/enroll-api.ts +99 -0
  131. package/runtime/node_modules/@metro-labs/daemon/src/connectors/leftovers.ts +59 -0
  132. package/runtime/node_modules/@metro-labs/daemon/src/connectors/metro-api.ts +93 -0
  133. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-grant.ts +4 -4
  134. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-owner.ts +3 -3
  135. package/runtime/node_modules/@metro-labs/daemon/src/files/attach-reaper.ts +174 -0
  136. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/attach-serve.ts +11 -19
  137. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-api.ts +10 -27
  138. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/files}/upload-store.ts +4 -4
  139. package/runtime/node_modules/@metro-labs/daemon/src/gateway/bedrock.ts +253 -0
  140. package/runtime/node_modules/@metro-labs/daemon/src/gateway/cache-ttl.ts +43 -0
  141. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-stream.ts +186 -0
  142. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-translate.ts +209 -0
  143. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex-version.ts +44 -0
  144. package/runtime/node_modules/@metro-labs/daemon/src/gateway/codex.ts +137 -0
  145. package/runtime/node_modules/@metro-labs/daemon/src/gateway/delivered.ts +102 -0
  146. package/runtime/node_modules/@metro-labs/daemon/src/gateway/effective.ts +32 -0
  147. package/runtime/node_modules/@metro-labs/daemon/src/gateway/effort.ts +130 -0
  148. package/runtime/node_modules/@metro-labs/daemon/src/gateway/eventstream.ts +123 -0
  149. package/runtime/node_modules/@metro-labs/daemon/src/gateway/failures.ts +40 -0
  150. package/runtime/node_modules/@metro-labs/daemon/src/gateway/fallback.ts +149 -0
  151. package/runtime/node_modules/@metro-labs/daemon/src/gateway/forward.ts +305 -0
  152. package/runtime/node_modules/@metro-labs/daemon/src/gateway/frames.ts +118 -0
  153. package/runtime/node_modules/@metro-labs/daemon/src/gateway/gateway.ts +372 -0
  154. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-api.ts +121 -0
  155. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-config.ts +150 -0
  156. package/runtime/node_modules/@metro-labs/daemon/src/gateway/model-leftovers.ts +63 -0
  157. package/runtime/node_modules/@metro-labs/daemon/src/gateway/openrouter.ts +25 -0
  158. package/runtime/node_modules/@metro-labs/daemon/src/gateway/org-models.ts +203 -0
  159. package/runtime/node_modules/@metro-labs/daemon/src/gateway/routeway.ts +88 -0
  160. package/runtime/node_modules/@metro-labs/daemon/src/gateway/served.ts +18 -0
  161. package/runtime/node_modules/@metro-labs/daemon/src/gateway/subscription.ts +60 -0
  162. package/runtime/node_modules/@metro-labs/daemon/src/gateway/text.ts +33 -0
  163. package/runtime/node_modules/@metro-labs/daemon/src/gateway/tool-search.ts +126 -0
  164. package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage-refresh.ts +51 -0
  165. package/runtime/node_modules/@metro-labs/daemon/src/gateway/usage.ts +265 -0
  166. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/accounts.ts +66 -19
  167. package/runtime/node_modules/@metro-labs/daemon/src/mcp/attachment-schema.ts +91 -0
  168. package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-bridge.ts +45 -0
  169. package/runtime/node_modules/@metro-labs/daemon/src/mcp/call-permission.ts +25 -0
  170. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/call-tools.ts +88 -38
  171. package/runtime/node_modules/@metro-labs/daemon/src/mcp/channel-tool.ts +80 -0
  172. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/ctx.ts +4 -4
  173. package/runtime/node_modules/@metro-labs/daemon/src/mcp/diagnostics.ts +102 -0
  174. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/event-store.ts +24 -18
  175. package/runtime/node_modules/@metro-labs/daemon/src/mcp/frame-schema.ts +44 -0
  176. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/group-tools.ts +2 -2
  177. package/runtime/node_modules/@metro-labs/daemon/src/mcp/index.ts +167 -0
  178. package/runtime/node_modules/@metro-labs/daemon/src/mcp/instructions.ts +21 -0
  179. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/member-tools.ts +2 -2
  180. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-prompt.ts +115 -0
  181. package/runtime/node_modules/@metro-labs/daemon/src/mcp/permission-relay.ts +111 -0
  182. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-gate.ts +88 -0
  183. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-snapshot.ts +65 -0
  184. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-lookup.ts +60 -0
  185. package/runtime/node_modules/@metro-labs/daemon/src/mcp/profile-tool.ts +96 -0
  186. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/raw-get-stream.ts +55 -17
  187. package/runtime/node_modules/@metro-labs/daemon/src/mcp/read-tool.ts +87 -0
  188. package/runtime/node_modules/@metro-labs/daemon/src/mcp/request-identity.ts +48 -0
  189. package/runtime/node_modules/@metro-labs/daemon/src/mcp/server-approvals.ts +118 -0
  190. package/runtime/node_modules/@metro-labs/daemon/src/mcp/session-slot.ts +137 -0
  191. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/session.ts +103 -52
  192. package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-schema.ts +11 -0
  193. package/runtime/node_modules/@metro-labs/daemon/src/mcp/speech-send.ts +15 -0
  194. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-catalog.ts +108 -0
  195. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-def.ts +9 -0
  196. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-dispatch.ts +74 -48
  197. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/tool-schemas.ts +87 -114
  198. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/mcp/upload-tool.ts +6 -11
  199. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/announced.ts +68 -0
  200. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/config.ts +29 -0
  201. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/connector-tools.ts +114 -0
  202. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/link.ts +197 -0
  203. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/rpc.ts +67 -0
  204. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/token.ts +50 -0
  205. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/helper-script.ts +183 -0
  206. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/imds.ts +16 -0
  207. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/install.ts +78 -0
  208. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/privilege.ts +50 -0
  209. package/runtime/node_modules/@metro-labs/daemon/src/metro-user/root-follow.ts +16 -0
  210. package/runtime/node_modules/@metro-labs/daemon/src/monitor/api.ts +132 -0
  211. package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-event.ts +139 -0
  212. package/runtime/node_modules/@metro-labs/daemon/src/monitor/run-events.ts +101 -0
  213. package/runtime/node_modules/@metro-labs/daemon/src/net/tunnel.ts +323 -0
  214. package/runtime/node_modules/@metro-labs/daemon/src/policy/policy.ts +120 -0
  215. package/runtime/node_modules/@metro-labs/daemon/src/routes/bearer.ts +35 -0
  216. package/runtime/node_modules/@metro-labs/daemon/src/routes/body.ts +24 -0
  217. package/runtime/node_modules/@metro-labs/daemon/src/routes/gmail-attach.ts +67 -0
  218. package/runtime/node_modules/@metro-labs/daemon/src/routes/gmail-detach.ts +37 -0
  219. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/routes}/http.ts +55 -56
  220. package/runtime/node_modules/@metro-labs/daemon/src/routes/local-mode.ts +155 -0
  221. package/runtime/node_modules/@metro-labs/daemon/src/routes/pair-again.ts +23 -0
  222. package/runtime/node_modules/@metro-labs/daemon/src/routes/session-apis.ts +63 -0
  223. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-api.ts → daemon/src/routes/session.ts} +9 -7
  224. package/runtime/node_modules/@metro-labs/daemon/src/routes/threema-callback.ts +103 -0
  225. package/runtime/node_modules/@metro-labs/daemon/src/server/cloudwatch.ts +178 -0
  226. package/runtime/node_modules/@metro-labs/daemon/src/server/control.ts +39 -0
  227. package/runtime/node_modules/@metro-labs/daemon/src/server/machine.ts +58 -0
  228. package/runtime/node_modules/@metro-labs/daemon/src/server/owner.ts +26 -0
  229. package/runtime/node_modules/@metro-labs/daemon/src/server/update.ts +90 -0
  230. package/runtime/node_modules/@metro-labs/daemon/src/server.ts +2 -0
  231. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-browser.ts +107 -0
  232. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-driver.ts +42 -0
  233. package/runtime/node_modules/@metro-labs/daemon/src/stations/attach-gmail.ts +78 -0
  234. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-inline.ts +29 -1
  235. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-interactive.ts +6 -32
  236. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-resolve.ts +84 -13
  237. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/attach-session.ts +70 -27
  238. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach-xmtp.ts +8 -9
  239. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/attach.ts +69 -3
  240. package/runtime/node_modules/@metro-labs/{mcp/src/db → daemon/src/stations}/materialize.ts +50 -181
  241. package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/stations/registry.ts +26 -2
  242. package/runtime/node_modules/@metro-labs/daemon/src/stations/runtime-deps.ts +135 -0
  243. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor-io.ts +3 -3
  244. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/supervisor.ts +5 -5
  245. package/runtime/node_modules/@metro-labs/daemon/src/stations/threema-callbacks.ts +32 -0
  246. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → daemon/src/stations}/train-call.ts +1 -1
  247. package/runtime/node_modules/@metro-labs/daemon/src/stations/webhook-endpoints.ts +51 -0
  248. package/runtime/node_modules/@metro-labs/daemon/src/terminal/api.ts +84 -0
  249. package/runtime/node_modules/@metro-labs/daemon/src/terminal/socket.ts +124 -0
  250. package/runtime/node_modules/@metro-labs/daemon/src/terminal/tickets.ts +15 -0
  251. package/runtime/node_modules/@metro-labs/daemon/src/voice/api.ts +14 -0
  252. package/runtime/node_modules/@metro-labs/daemon/src/voice/audio.ts +193 -0
  253. package/runtime/node_modules/@metro-labs/daemon/src/voice/call.ts +191 -0
  254. package/runtime/node_modules/@metro-labs/daemon/src/voice/calls.ts +153 -0
  255. package/runtime/node_modules/@metro-labs/daemon/src/voice/peer.ts +85 -0
  256. package/runtime/node_modules/@metro-labs/daemon/src/voice/scribe.ts +115 -0
  257. package/runtime/node_modules/@metro-labs/daemon/src/voice/shared-talk.ts +85 -0
  258. package/runtime/node_modules/@metro-labs/daemon/src/voice/shared.ts +198 -0
  259. package/runtime/node_modules/@metro-labs/daemon/src/voice/speech-queue.ts +200 -0
  260. package/runtime/node_modules/@metro-labs/daemon/src/voice/speech.ts +125 -0
  261. package/runtime/node_modules/@metro-labs/daemon/src/voice/store.ts +103 -0
  262. package/runtime/node_modules/@metro-labs/discord-bot/package.json +3 -5
  263. package/runtime/node_modules/@metro-labs/discord-bot/src/accounts.ts +3 -23
  264. package/runtime/node_modules/@metro-labs/discord-bot/src/actions.ts +21 -187
  265. package/runtime/node_modules/@metro-labs/discord-bot/src/attachments.ts +2 -2
  266. package/runtime/node_modules/@metro-labs/discord-bot/src/channel-source.ts +79 -0
  267. package/runtime/node_modules/@metro-labs/discord-bot/src/channels.ts +186 -0
  268. package/runtime/node_modules/@metro-labs/discord-bot/src/format.ts +26 -67
  269. package/runtime/node_modules/@metro-labs/discord-bot/src/group-actions.ts +1 -1
  270. package/runtime/node_modules/@metro-labs/discord-bot/src/group.ts +2 -2
  271. package/runtime/node_modules/@metro-labs/discord-bot/src/index.ts +8 -14
  272. package/runtime/node_modules/@metro-labs/discord-bot/src/members.ts +2 -2
  273. package/runtime/node_modules/@metro-labs/discord-bot/src/profile.ts +68 -0
  274. package/runtime/node_modules/@metro-labs/discord-bot/src/send-files.ts +12 -13
  275. package/runtime/node_modules/@metro-labs/discord-bot/src/station.ts +6 -1
  276. package/runtime/node_modules/@metro-labs/gmail/package.json +27 -0
  277. package/runtime/node_modules/@metro-labs/gmail/src/accounts.ts +133 -0
  278. package/runtime/node_modules/@metro-labs/gmail/src/actions.ts +20 -0
  279. package/runtime/node_modules/@metro-labs/gmail/src/api.ts +34 -0
  280. package/runtime/node_modules/@metro-labs/gmail/src/attachments.ts +38 -0
  281. package/runtime/node_modules/@metro-labs/gmail/src/auth.ts +115 -0
  282. package/runtime/node_modules/@metro-labs/gmail/src/channels.ts +66 -0
  283. package/runtime/node_modules/@metro-labs/gmail/src/config.ts +15 -0
  284. package/runtime/node_modules/@metro-labs/gmail/src/inbound.ts +97 -0
  285. package/runtime/node_modules/@metro-labs/gmail/src/index.ts +12 -0
  286. package/runtime/node_modules/@metro-labs/gmail/src/login.ts +39 -0
  287. package/runtime/node_modules/@metro-labs/gmail/src/managed-binding.ts +33 -0
  288. package/runtime/node_modules/@metro-labs/gmail/src/managed.ts +45 -0
  289. package/runtime/node_modules/@metro-labs/gmail/src/message.ts +125 -0
  290. package/runtime/node_modules/@metro-labs/gmail/src/mime.ts +70 -0
  291. package/runtime/node_modules/@metro-labs/gmail/src/outbound.ts +125 -0
  292. package/runtime/node_modules/@metro-labs/gmail/src/query.ts +101 -0
  293. package/runtime/node_modules/@metro-labs/gmail/src/state.ts +30 -0
  294. package/runtime/node_modules/@metro-labs/gmail/src/station.ts +16 -0
  295. package/runtime/node_modules/@metro-labs/gmail/src/trust.ts +42 -0
  296. package/runtime/node_modules/@metro-labs/http/package.json +44 -0
  297. package/runtime/node_modules/@metro-labs/http/src/agent-signature.ts +95 -0
  298. package/runtime/node_modules/@metro-labs/http/src/api-http.ts +146 -0
  299. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-discovery.ts → http/src/connector-discovery.ts} +57 -27
  300. package/runtime/node_modules/@metro-labs/http/src/connector-grant.ts +8 -0
  301. package/runtime/node_modules/@metro-labs/http/src/connector-input.ts +73 -0
  302. package/runtime/node_modules/@metro-labs/http/src/connector-mcp.ts +108 -0
  303. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/oauth-client.ts → http/src/connector-oauth.ts} +60 -31
  304. package/runtime/node_modules/@metro-labs/http/src/connector-policy.ts +92 -0
  305. package/runtime/node_modules/@metro-labs/http/src/connector-public-url.ts +64 -0
  306. package/runtime/node_modules/@metro-labs/http/src/connector-reach.ts +27 -0
  307. package/runtime/node_modules/@metro-labs/http/src/connector-resource.ts +108 -0
  308. package/runtime/node_modules/@metro-labs/http/src/connector-tools.ts +101 -0
  309. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/connector-url.ts +8 -28
  310. package/runtime/node_modules/@metro-labs/http/src/ed25519.ts +56 -0
  311. package/runtime/node_modules/@metro-labs/http/src/mcp-server-protocol.ts +99 -0
  312. package/runtime/node_modules/@metro-labs/http/src/mcp-server-tools.ts +104 -0
  313. package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/mode-api.ts +2 -2
  314. package/runtime/node_modules/@metro-labs/{mcp/src/daemon/session-config.ts → http/src/return-to.ts} +4 -6
  315. package/runtime/node_modules/@metro-labs/http/src/sigv4.ts +90 -0
  316. package/runtime/node_modules/@metro-labs/http/src/workos-token.ts +149 -0
  317. package/runtime/node_modules/@metro-labs/outlook/package.json +25 -0
  318. package/runtime/node_modules/@metro-labs/outlook/src/accounts.ts +78 -0
  319. package/runtime/node_modules/@metro-labs/outlook/src/actions.ts +15 -0
  320. package/runtime/node_modules/@metro-labs/outlook/src/attachments.ts +81 -0
  321. package/runtime/node_modules/@metro-labs/outlook/src/auth.ts +120 -0
  322. package/runtime/node_modules/@metro-labs/outlook/src/browser.ts +42 -0
  323. package/runtime/node_modules/@metro-labs/outlook/src/channels.ts +60 -0
  324. package/runtime/node_modules/@metro-labs/outlook/src/config.ts +23 -0
  325. package/runtime/node_modules/@metro-labs/outlook/src/format.ts +59 -0
  326. package/runtime/node_modules/@metro-labs/outlook/src/graph.ts +55 -0
  327. package/runtime/node_modules/@metro-labs/outlook/src/inbound.ts +96 -0
  328. package/runtime/node_modules/@metro-labs/outlook/src/index.ts +12 -0
  329. package/runtime/node_modules/@metro-labs/outlook/src/login.ts +129 -0
  330. package/runtime/node_modules/@metro-labs/outlook/src/me.ts +31 -0
  331. package/runtime/node_modules/@metro-labs/outlook/src/outbound.ts +103 -0
  332. package/runtime/node_modules/@metro-labs/outlook/src/query.ts +84 -0
  333. package/runtime/node_modules/@metro-labs/outlook/src/state.ts +28 -0
  334. package/runtime/node_modules/@metro-labs/outlook/src/station.ts +16 -0
  335. package/runtime/node_modules/@metro-labs/outlook/src/trust.ts +41 -0
  336. package/runtime/node_modules/@metro-labs/telegram/package.json +2 -4
  337. package/runtime/node_modules/@metro-labs/telegram/src/accounts.ts +5 -24
  338. package/runtime/node_modules/@metro-labs/telegram/src/actions.ts +27 -6
  339. package/runtime/node_modules/@metro-labs/telegram/src/attachments.ts +1 -1
  340. package/runtime/node_modules/@metro-labs/telegram/src/channels.ts +58 -0
  341. package/runtime/node_modules/@metro-labs/telegram/src/client.ts +4 -4
  342. package/runtime/node_modules/@metro-labs/telegram/src/format.ts +19 -34
  343. package/runtime/node_modules/@metro-labs/telegram/src/group.ts +3 -3
  344. package/runtime/node_modules/@metro-labs/telegram/src/inbound.ts +13 -34
  345. package/runtime/node_modules/@metro-labs/telegram/src/index.ts +4 -43
  346. package/runtime/node_modules/@metro-labs/telegram/src/media-actions.ts +2 -3
  347. package/runtime/node_modules/@metro-labs/telegram/src/members.ts +1 -1
  348. package/runtime/node_modules/@metro-labs/telegram/src/profile.ts +70 -0
  349. package/runtime/node_modules/@metro-labs/telegram/src/reactions.ts +2 -2
  350. package/runtime/node_modules/@metro-labs/telegram/src/station.ts +5 -1
  351. package/runtime/node_modules/@metro-labs/telegram/src/types.ts +0 -1
  352. package/runtime/node_modules/@metro-labs/telegram-bot/package.json +2 -2
  353. package/runtime/node_modules/@metro-labs/telegram-bot/src/accounts.ts +7 -41
  354. package/runtime/node_modules/@metro-labs/telegram-bot/src/actions.ts +24 -77
  355. package/runtime/node_modules/@metro-labs/telegram-bot/src/attachments.ts +2 -2
  356. package/runtime/node_modules/@metro-labs/telegram-bot/src/channel-files.ts +3 -0
  357. package/runtime/node_modules/@metro-labs/telegram-bot/src/channels.ts +43 -0
  358. package/runtime/node_modules/@metro-labs/telegram-bot/src/format.ts +46 -48
  359. package/runtime/node_modules/@metro-labs/telegram-bot/src/index.ts +15 -44
  360. package/runtime/node_modules/@metro-labs/telegram-bot/src/media-actions.ts +6 -82
  361. package/runtime/node_modules/@metro-labs/telegram-bot/src/members.ts +1 -1
  362. package/runtime/node_modules/@metro-labs/telegram-bot/src/observed-chats.ts +172 -0
  363. package/runtime/node_modules/@metro-labs/telegram-bot/src/profile.ts +85 -0
  364. package/runtime/node_modules/@metro-labs/telegram-bot/src/station.ts +9 -1
  365. package/runtime/node_modules/@metro-labs/telegram-bot/src/types.ts +50 -15
  366. package/runtime/node_modules/@metro-labs/telegram-bot/src/updates.ts +26 -0
  367. package/runtime/node_modules/@metro-labs/threema/package.json +26 -0
  368. package/runtime/node_modules/@metro-labs/threema/src/accounts.ts +108 -0
  369. package/runtime/node_modules/@metro-labs/threema/src/actions.ts +130 -0
  370. package/runtime/node_modules/@metro-labs/threema/src/api.ts +152 -0
  371. package/runtime/node_modules/@metro-labs/threema/src/channels.ts +37 -0
  372. package/runtime/node_modules/@metro-labs/threema/src/chats.ts +88 -0
  373. package/runtime/node_modules/@metro-labs/threema/src/crypto.ts +100 -0
  374. package/runtime/node_modules/@metro-labs/threema/src/files.ts +47 -0
  375. package/runtime/node_modules/@metro-labs/threema/src/format.ts +164 -0
  376. package/runtime/node_modules/@metro-labs/threema/src/groups.ts +96 -0
  377. package/runtime/node_modules/@metro-labs/threema/src/ids.ts +21 -0
  378. package/runtime/node_modules/@metro-labs/threema/src/inbound.ts +92 -0
  379. package/runtime/node_modules/@metro-labs/threema/src/index.ts +24 -0
  380. package/runtime/node_modules/@metro-labs/threema/src/messages.ts +264 -0
  381. package/runtime/node_modules/@metro-labs/threema/src/outbound.ts +161 -0
  382. package/runtime/node_modules/@metro-labs/threema/src/station.ts +21 -0
  383. package/runtime/node_modules/@metro-labs/threema/src/verify.ts +117 -0
  384. package/runtime/node_modules/@metro-labs/webhook/package.json +2 -2
  385. package/runtime/node_modules/@metro-labs/webhook/src/station.ts +5 -8
  386. package/runtime/node_modules/@metro-labs/whatsapp/package.json +3 -6
  387. package/runtime/node_modules/@metro-labs/whatsapp/src/accounts.ts +6 -28
  388. package/runtime/node_modules/@metro-labs/whatsapp/src/ack.ts +1 -1
  389. package/runtime/node_modules/@metro-labs/whatsapp/src/actions.ts +100 -14
  390. package/runtime/node_modules/@metro-labs/whatsapp/src/app-state.ts +49 -0
  391. package/runtime/node_modules/@metro-labs/whatsapp/src/attachments.ts +2 -2
  392. package/runtime/node_modules/@metro-labs/whatsapp/src/auth-state.ts +1 -1
  393. package/runtime/node_modules/@metro-labs/whatsapp/src/channel-chats.ts +137 -0
  394. package/runtime/node_modules/@metro-labs/whatsapp/src/channels.ts +48 -0
  395. package/runtime/node_modules/@metro-labs/whatsapp/src/client-history.ts +31 -0
  396. package/runtime/node_modules/@metro-labs/whatsapp/src/client-types.ts +50 -0
  397. package/runtime/node_modules/@metro-labs/whatsapp/src/client.ts +161 -84
  398. package/runtime/node_modules/@metro-labs/whatsapp/src/connection.ts +139 -0
  399. package/runtime/node_modules/@metro-labs/whatsapp/src/format.ts +7 -58
  400. package/runtime/node_modules/@metro-labs/whatsapp/src/history-events.ts +127 -0
  401. package/runtime/node_modules/@metro-labs/whatsapp/src/history-files.ts +39 -0
  402. package/runtime/node_modules/@metro-labs/whatsapp/src/history-identity.ts +58 -0
  403. package/runtime/node_modules/@metro-labs/whatsapp/src/history-message.ts +161 -0
  404. package/runtime/node_modules/@metro-labs/whatsapp/src/history-state.ts +344 -0
  405. package/runtime/node_modules/@metro-labs/whatsapp/src/history-types.ts +91 -0
  406. package/runtime/node_modules/@metro-labs/whatsapp/src/history.ts +195 -0
  407. package/runtime/node_modules/@metro-labs/whatsapp/src/inbound.ts +11 -28
  408. package/runtime/node_modules/@metro-labs/whatsapp/src/index.ts +4 -37
  409. package/runtime/node_modules/@metro-labs/whatsapp/src/keys.ts +1 -1
  410. package/runtime/node_modules/@metro-labs/whatsapp/src/login.ts +37 -4
  411. package/runtime/node_modules/@metro-labs/whatsapp/src/media.ts +1 -1
  412. package/runtime/node_modules/@metro-labs/whatsapp/src/members.ts +94 -0
  413. package/runtime/node_modules/@metro-labs/whatsapp/src/messages.ts +91 -0
  414. package/runtime/node_modules/@metro-labs/whatsapp/src/names.ts +106 -0
  415. package/runtime/node_modules/@metro-labs/whatsapp/src/parse.ts +44 -0
  416. package/runtime/node_modules/@metro-labs/whatsapp/src/profile.ts +158 -0
  417. package/runtime/node_modules/@metro-labs/whatsapp/src/resolve.ts +52 -0
  418. package/runtime/node_modules/@metro-labs/whatsapp/src/send-expiry.ts +65 -0
  419. package/runtime/node_modules/@metro-labs/whatsapp/src/station.ts +26 -1
  420. package/runtime/node_modules/@metro-labs/whatsapp/src/token-store.ts +5 -9
  421. package/runtime/node_modules/@metro-labs/whatsapp/src/types.ts +0 -1
  422. package/runtime/node_modules/@metro-labs/xmtp/package.json +4 -3
  423. package/runtime/node_modules/@metro-labs/xmtp/src/accounts.ts +10 -20
  424. package/runtime/node_modules/@metro-labs/xmtp/src/actions-close.ts +2 -2
  425. package/runtime/node_modules/@metro-labs/xmtp/src/actions-conv.ts +55 -224
  426. package/runtime/node_modules/@metro-labs/xmtp/src/actions-meta.ts +55 -54
  427. package/runtime/node_modules/@metro-labs/xmtp/src/actions.ts +114 -223
  428. package/runtime/node_modules/@metro-labs/xmtp/src/attachments.ts +58 -15
  429. package/runtime/node_modules/@metro-labs/xmtp/src/call-leftovers.ts +48 -0
  430. package/runtime/node_modules/@metro-labs/xmtp/src/channels.ts +56 -0
  431. package/runtime/node_modules/@metro-labs/xmtp/src/codecs.ts +114 -3
  432. package/runtime/node_modules/@metro-labs/xmtp/src/conv-helpers.ts +36 -20
  433. package/runtime/node_modules/@metro-labs/xmtp/src/delete-requests.ts +34 -0
  434. package/runtime/node_modules/@metro-labs/xmtp/src/emit-payloads.ts +38 -25
  435. package/runtime/node_modules/@metro-labs/xmtp/src/emit.ts +8 -18
  436. package/runtime/node_modules/@metro-labs/xmtp/src/frames.ts +190 -0
  437. package/runtime/node_modules/@metro-labs/xmtp/src/group-members.ts +1 -1
  438. package/runtime/node_modules/@metro-labs/xmtp/src/group.ts +2 -2
  439. package/runtime/node_modules/@metro-labs/xmtp/src/identity.ts +30 -16
  440. package/runtime/node_modules/@metro-labs/xmtp/src/index.ts +18 -70
  441. package/runtime/node_modules/@metro-labs/xmtp/src/labels.ts +102 -50
  442. package/runtime/node_modules/@metro-labs/xmtp/src/member-args.ts +1 -1
  443. package/runtime/node_modules/@metro-labs/xmtp/src/names.ts +61 -0
  444. package/runtime/node_modules/@metro-labs/xmtp/src/network.ts +114 -0
  445. package/runtime/node_modules/@metro-labs/xmtp/src/profile.ts +160 -0
  446. package/runtime/node_modules/@metro-labs/xmtp/src/read-attachments.ts +37 -0
  447. package/runtime/node_modules/@metro-labs/xmtp/src/resolve.ts +44 -0
  448. package/runtime/node_modules/@metro-labs/xmtp/src/sender.ts +112 -0
  449. package/runtime/node_modules/@metro-labs/xmtp/src/smart.ts +79 -0
  450. package/runtime/node_modules/@metro-labs/xmtp/src/station.ts +10 -2
  451. package/runtime/node_modules/@metro-labs/xmtp/src/stream.ts +66 -0
  452. package/runtime/node_modules/@metro-labs/xmtp/src/tools-handlers.ts +32 -60
  453. package/runtime/node_modules/@metro-labs/xmtp/src/tools.ts +78 -49
  454. package/runtime/node_modules/@metro-labs/xmtp/src/transcribe.ts +4 -6
  455. package/runtime/node_modules/@metro-labs/xmtp/src/verify.ts +19 -5
  456. package/runtime/node_modules/@metro-labs/xmtp/src/wallet.ts +28 -0
  457. package/runtime/node_modules/@metro-labs/xmtp/src/wire.ts +14 -4
  458. package/runtime/patches/5bca2c07d5852d3f58453cff0448dd85da13d3665b61e3d758905b298d432d7c.patch +31 -0
  459. package/runtime/runtime.json +1 -1
  460. package/runtime/sdk-runner/node_modules/@metro-labs/core/package.json +61 -0
  461. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-files.ts +216 -0
  462. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-store.ts +171 -0
  463. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/automation-types.ts +141 -0
  464. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/call.ts +81 -0
  465. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/claude-token.ts +3 -0
  466. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/effort.ts +21 -0
  467. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/endpoints.ts +7 -0
  468. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/events.ts +165 -0
  469. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/ids.ts +28 -0
  470. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/is-record.ts +2 -0
  471. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/lines.ts +78 -0
  472. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/log.ts +42 -0
  473. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/protocol.ts +227 -0
  474. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/runner-activity.ts +270 -0
  475. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/secure-fs.ts +74 -0
  476. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/skill-source.ts +96 -0
  477. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/station-names.ts +14 -0
  478. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-files.ts +41 -0
  479. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-status.ts +26 -0
  480. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/account-store.ts +83 -0
  481. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/attachments.ts +202 -0
  482. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-directory.ts +159 -0
  483. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/channel-pages.ts +129 -0
  484. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-text.ts +72 -0
  485. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail-trust.ts +29 -0
  486. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/mail.ts +212 -0
  487. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/messaging-normalize.ts +16 -0
  488. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/oauth.ts +126 -0
  489. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/profile.ts +58 -0
  490. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/sender-profile.ts +64 -0
  491. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/station-runtime.ts +59 -0
  492. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-boot.ts +63 -0
  493. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/train-events.ts +84 -0
  494. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/stations/types.ts +128 -0
  495. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/str.ts +5 -0
  496. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/tickets.ts +44 -0
  497. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/train-error.ts +53 -0
  498. package/runtime/sdk-runner/node_modules/@metro-labs/core/src/version.ts +2 -0
  499. package/runtime/sdk-runner/runner.json +10 -0
  500. package/runtime/sdk-runner/src/activity-tasks.ts +194 -0
  501. package/runtime/sdk-runner/src/activity.ts +392 -0
  502. package/runtime/sdk-runner/src/app.ts +87 -0
  503. package/runtime/sdk-runner/src/approvals.ts +37 -0
  504. package/runtime/sdk-runner/src/automation-cli.ts +10 -0
  505. package/runtime/sdk-runner/src/automation-command.ts +151 -0
  506. package/runtime/sdk-runner/src/automation.ts +145 -0
  507. package/runtime/sdk-runner/src/calls.ts +133 -0
  508. package/runtime/sdk-runner/src/channel-text.ts +26 -0
  509. package/runtime/sdk-runner/src/config.ts +50 -0
  510. package/runtime/sdk-runner/src/errors.ts +142 -0
  511. package/runtime/sdk-runner/src/inbox.ts +168 -0
  512. package/runtime/sdk-runner/src/input-queue.ts +77 -0
  513. package/runtime/sdk-runner/src/input-timing.ts +68 -0
  514. package/runtime/sdk-runner/src/link.ts +154 -0
  515. package/runtime/sdk-runner/src/main.ts +57 -0
  516. package/runtime/sdk-runner/src/recovery.ts +46 -0
  517. package/runtime/sdk-runner/src/rules.ts +28 -0
  518. package/runtime/sdk-runner/src/runner.ts +358 -0
  519. package/runtime/sdk-runner/src/session-store.ts +129 -0
  520. package/runtime/sdk-runner/src/session-watch.ts +158 -0
  521. package/runtime/sdk-runner/src/singleton.ts +15 -0
  522. package/runtime/sdk-runner/src/skill-work.ts +76 -0
  523. package/runtime/sdk-runner/src/skills-files.ts +169 -0
  524. package/runtime/sdk-runner/src/skills.ts +150 -0
  525. package/runtime/sdk-runner/src/task-ledger.ts +244 -0
  526. package/runtime/sdk-runner/src/task-recovery.ts +203 -0
  527. package/runtime/sdk-runner/src/task-state.ts +77 -0
  528. package/runtime/sdk-runner/src/tool-proxy.ts +40 -0
  529. package/runtime/server.ts +1 -0
  530. package/runtime/stations.json +43 -0
  531. package/skills/MEMORY.md +78 -0
  532. package/skills/METRO.md +35 -0
  533. package/skills/STAGE.md +110 -0
  534. package/dist/bedrock-eventstream.js +0 -120
  535. package/dist/bedrock-proxy.js +0 -260
  536. package/dist/bedrock-upstream.js +0 -72
  537. package/dist/bedrock.js +0 -106
  538. package/dist/claude.js +0 -15
  539. package/dist/plugin.js +0 -82
  540. package/dist/prompt.js +0 -61
  541. package/dist/store.js +0 -93
  542. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-speak.ts +0 -195
  543. package/runtime/node_modules/@metro-labs/discord-bot/src/voice-transcribe.ts +0 -292
  544. package/runtime/node_modules/@metro-labs/discord-bot/src/voice.ts +0 -197
  545. package/runtime/node_modules/@metro-labs/discord-bot/src/wire.ts +0 -5
  546. package/runtime/node_modules/@metro-labs/mcp/package.json +0 -67
  547. package/runtime/node_modules/@metro-labs/mcp/src/channels/dedupe.ts +0 -24
  548. package/runtime/node_modules/@metro-labs/mcp/src/daemon/account-api.ts +0 -311
  549. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-api.ts +0 -333
  550. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-connector-api.ts +0 -150
  551. package/runtime/node_modules/@metro-labs/mcp/src/daemon/agent-pair.ts +0 -20
  552. package/runtime/node_modules/@metro-labs/mcp/src/daemon/api-http.ts +0 -153
  553. package/runtime/node_modules/@metro-labs/mcp/src/daemon/boot.ts +0 -368
  554. package/runtime/node_modules/@metro-labs/mcp/src/daemon/cli-pair-api.ts +0 -134
  555. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-api.ts +0 -313
  556. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-json.ts +0 -21
  557. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-oauth-routes.ts +0 -157
  558. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-oauth.ts +0 -127
  559. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-tools.ts +0 -100
  560. package/runtime/node_modules/@metro-labs/mcp/src/daemon/connector-verify.ts +0 -333
  561. package/runtime/node_modules/@metro-labs/mcp/src/daemon/identity.ts +0 -86
  562. package/runtime/node_modules/@metro-labs/mcp/src/daemon/local-mode.ts +0 -158
  563. package/runtime/node_modules/@metro-labs/mcp/src/daemon/local-secret.ts +0 -21
  564. package/runtime/node_modules/@metro-labs/mcp/src/daemon/oauth-pending.ts +0 -65
  565. package/runtime/node_modules/@metro-labs/mcp/src/daemon/pair-codes.ts +0 -58
  566. package/runtime/node_modules/@metro-labs/mcp/src/daemon/project-api.ts +0 -214
  567. package/runtime/node_modules/@metro-labs/mcp/src/daemon/relay.ts +0 -303
  568. package/runtime/node_modules/@metro-labs/mcp/src/daemon/run-api.ts +0 -139
  569. package/runtime/node_modules/@metro-labs/mcp/src/daemon/runtime-source.ts +0 -105
  570. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session-apis.ts +0 -52
  571. package/runtime/node_modules/@metro-labs/mcp/src/daemon/session.ts +0 -218
  572. package/runtime/node_modules/@metro-labs/mcp/src/daemon/siwe-auth.ts +0 -82
  573. package/runtime/node_modules/@metro-labs/mcp/src/daemon/siwe-nonces.ts +0 -43
  574. package/runtime/node_modules/@metro-labs/mcp/src/daemon/siwe-routes.ts +0 -89
  575. package/runtime/node_modules/@metro-labs/mcp/src/daemon/tunnel.ts +0 -169
  576. package/runtime/node_modules/@metro-labs/mcp/src/db/account-attach.ts +0 -91
  577. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-admin.ts +0 -214
  578. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-connectors.ts +0 -143
  579. package/runtime/node_modules/@metro-labs/mcp/src/db/agent-map.ts +0 -71
  580. package/runtime/node_modules/@metro-labs/mcp/src/db/client.ts +0 -37
  581. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-config.ts +0 -147
  582. package/runtime/node_modules/@metro-labs/mcp/src/db/connector-relay.ts +0 -126
  583. package/runtime/node_modules/@metro-labs/mcp/src/db/connectors.ts +0 -308
  584. package/runtime/node_modules/@metro-labs/mcp/src/db/file-admin.ts +0 -250
  585. package/runtime/node_modules/@metro-labs/mcp/src/db/projects.ts +0 -309
  586. package/runtime/node_modules/@metro-labs/mcp/src/db/runtime-admin.ts +0 -24
  587. package/runtime/node_modules/@metro-labs/mcp/src/db/runtimes.ts +0 -105
  588. package/runtime/node_modules/@metro-labs/mcp/src/db/schema.ts +0 -118
  589. package/runtime/node_modules/@metro-labs/mcp/src/db/token-carry.ts +0 -45
  590. package/runtime/node_modules/@metro-labs/mcp/src/db/users.ts +0 -72
  591. package/runtime/node_modules/@metro-labs/mcp/src/db/whatsapp-login.ts +0 -18
  592. package/runtime/node_modules/@metro-labs/mcp/src/mcp/channel-owner.ts +0 -29
  593. package/runtime/node_modules/@metro-labs/mcp/src/mcp/frame-scope.ts +0 -21
  594. package/runtime/node_modules/@metro-labs/mcp/src/mcp/index.ts +0 -192
  595. package/runtime/node_modules/@metro-labs/mcp/src/mcp/permission-relay.ts +0 -66
  596. package/runtime/node_modules/@metro-labs/mcp/src/mcp/request-identity.ts +0 -73
  597. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-registry.ts +0 -172
  598. package/runtime/node_modules/@metro-labs/mcp/src/mcp/session-route.ts +0 -43
  599. package/runtime/node_modules/@metro-labs/mcp/src/monitor/api.ts +0 -240
  600. package/runtime/node_modules/@metro-labs/mcp/src/server.ts +0 -2
  601. package/runtime/node_modules/@metro-labs/mcp/src/stations/account-store.ts +0 -80
  602. package/runtime/node_modules/@metro-labs/mcp/src/stations/messaging-normalize.ts +0 -88
  603. package/runtime/node_modules/@metro-labs/telegram/src/normalize.ts +0 -22
  604. package/runtime/node_modules/@metro-labs/telegram/src/wire.ts +0 -1
  605. package/runtime/node_modules/@metro-labs/telegram-bot/src/wire.ts +0 -3
  606. package/runtime/node_modules/@metro-labs/whatsapp/src/normalize.ts +0 -22
  607. package/runtime/node_modules/@metro-labs/whatsapp/src/wire.ts +0 -5
  608. package/runtime/node_modules/@metro-labs/xmtp/src/actions-push.ts +0 -87
  609. package/runtime/node_modules/@metro-labs/xmtp/src/emit-core.ts +0 -55
  610. package/runtime/node_modules/@metro-labs/xmtp/src/push.ts +0 -349
  611. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/log.ts +0 -0
  612. /package/runtime/node_modules/@metro-labs/{mcp/src/mcp → core/src}/str.ts +0 -0
  613. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → core/src}/train-error.ts +0 -0
  614. /package/runtime/node_modules/@metro-labs/{mcp → daemon}/src/channels/webhook-note.ts +0 -0
  615. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/api-error.ts +0 -0
  616. /package/runtime/node_modules/@metro-labs/{mcp/src/daemon → http/src}/cors.ts +0 -0
@@ -0,0 +1,114 @@
1
+ import type { IncomingMessage } from 'node:http';
2
+ import { isRecord } from '@metro-labs/core/is-record';
3
+ import { ApiError } from '@metro-labs/http/api-error';
4
+ import { readJsonBody } from '@metro-labs/http/api-http';
5
+ import {
6
+ claudeSetupStatus,
7
+ ensureClaudeSetup,
8
+ isPermissionMode,
9
+ liveEvents,
10
+ permissionMode,
11
+ setLiveEvents,
12
+ setMemoryRoutine,
13
+ setPermissionMode,
14
+ setPrivacy,
15
+ setSystemPrompt,
16
+ systemPrompt,
17
+ SYSTEM_PROMPT_MAX,
18
+ type PermissionMode,
19
+ type SetupDeps,
20
+ } from './setup.js';
21
+ import { assertSessionStopped, type SessionDeps } from './session.js';
22
+ import { tryMemoryJob } from './memory-routine.js';
23
+
24
+ const SETUP_BODY_MAX = SYSTEM_PROMPT_MAX * 2;
25
+
26
+ export interface SetupApiDeps {
27
+ session?: SessionDeps;
28
+ setup?: SetupDeps;
29
+ liveEvents?: (on: boolean) => void;
30
+ memoryJob?: (on: boolean) => void;
31
+ }
32
+
33
+ interface SetupChange {
34
+ privacy?: boolean;
35
+ permissionMode?: PermissionMode;
36
+ systemPrompt?: string;
37
+ liveEvents?: boolean;
38
+ memoryRoutine?: boolean;
39
+ }
40
+
41
+ function promptChange(raw: unknown): string | undefined {
42
+ if (raw === undefined) return undefined;
43
+ if (typeof raw !== 'string') throw new ApiError('systemPrompt must be text', 400);
44
+ if (Buffer.byteLength(raw) > SYSTEM_PROMPT_MAX) throw new ApiError(`systemPrompt must be under ${String(SYSTEM_PROMPT_MAX / 1024)} KiB`, 400);
45
+ return raw;
46
+ }
47
+
48
+ function flagChange(raw: unknown, name: string): boolean | undefined {
49
+ if (raw === undefined) return undefined;
50
+ if (typeof raw !== 'boolean') throw new ApiError(`${name} must be true or false`, 400);
51
+ return raw;
52
+ }
53
+
54
+ function modeChange(raw: unknown): PermissionMode | undefined {
55
+ if (raw === undefined) return undefined;
56
+ if (!isPermissionMode(raw)) throw new ApiError('permissionMode must be auto or bypass', 400);
57
+ return raw;
58
+ }
59
+
60
+ function setupChange(body: unknown): SetupChange {
61
+ if (!isRecord(body)) throw new ApiError('a body is required', 400);
62
+ const change: SetupChange = {
63
+ privacy: flagChange(body.privacy, 'privacy'),
64
+ permissionMode: modeChange(body.permissionMode),
65
+ systemPrompt: promptChange(body.systemPrompt),
66
+ liveEvents: flagChange(body.liveEvents, 'liveEvents'),
67
+ memoryRoutine: flagChange(body.memoryRoutine, 'memoryRoutine'),
68
+ };
69
+ const given = Object.fromEntries(Object.entries(change).filter(([, value]) => value !== undefined)) as SetupChange;
70
+ if (Object.keys(given).length === 0) throw new ApiError('nothing to change', 400);
71
+ return given;
72
+ }
73
+
74
+ function changesSession(change: SetupChange, agents: string | undefined): boolean {
75
+ return (change.permissionMode !== undefined && change.permissionMode !== permissionMode(agents))
76
+ || (change.systemPrompt !== undefined && change.systemPrompt.trim() !== systemPrompt(agents));
77
+ }
78
+
79
+ function applyLiveEvents(on: boolean, deps: SetupApiDeps): void {
80
+ const agents = deps.setup?.agents;
81
+ if (on !== liveEvents(agents)) setLiveEvents(on, agents);
82
+ deps.liveEvents?.(on);
83
+ }
84
+
85
+ function applyMemoryRoutine(on: boolean, deps: SetupApiDeps): void {
86
+ setMemoryRoutine(on, deps.setup?.agents);
87
+ (deps.memoryJob ?? tryMemoryJob)(on);
88
+ }
89
+
90
+ function saveSessionSettings(change: SetupChange, deps: SetupApiDeps): void {
91
+ const agents = deps.setup?.agents;
92
+ if (changesSession(change, agents)) assertSessionStopped({ ...deps.session, agents: deps.session?.agents ?? agents });
93
+ if (change.permissionMode !== undefined) setPermissionMode(change.permissionMode, agents);
94
+ if (change.systemPrompt !== undefined) setSystemPrompt(change.systemPrompt, agents);
95
+ }
96
+
97
+ function applySetupChange(change: SetupChange, deps: SetupApiDeps): void {
98
+ const setup = deps.setup ?? {};
99
+ saveSessionSettings(change, deps);
100
+ if (change.privacy !== undefined) setPrivacy(change.privacy, setup.agents);
101
+ if (change.liveEvents !== undefined) applyLiveEvents(change.liveEvents, deps);
102
+ if (change.memoryRoutine !== undefined) applyMemoryRoutine(change.memoryRoutine, deps);
103
+ ensureClaudeSetup(setup);
104
+ }
105
+
106
+ export async function setupAnswer(req: IncomingMessage, deps: SetupApiDeps): Promise<unknown> {
107
+ const setup = deps.setup ?? {};
108
+ const method = req.method ?? 'GET';
109
+ if (method === 'GET') return claudeSetupStatus(setup);
110
+ if (method !== 'POST') throw new ApiError('method not allowed', 405);
111
+ const change = setupChange(await readJsonBody(req, SETUP_BODY_MAX));
112
+ applySetupChange(change, deps);
113
+ return claudeSetupStatus(setup);
114
+ }
@@ -0,0 +1,18 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { isRecord } from '@metro-labs/core/is-record';
4
+ import { readJson, writeJson } from '@metro-labs/core/secure-fs';
5
+
6
+ const STATE_FILE = 'claude-setup.json';
7
+
8
+ const statePath = (agents: string): string => join(agents, STATE_FILE);
9
+
10
+ export function readSetupState(agents: string): Record<string, unknown> {
11
+ const raw = readJson<unknown>(statePath(agents), null);
12
+ return isRecord(raw) ? raw : {};
13
+ }
14
+
15
+ export function writeSetupState(agents: string, patch: Record<string, unknown>): void {
16
+ mkdirSync(agents, { recursive: true });
17
+ writeJson(statePath(agents), { ...readSetupState(agents), ...patch });
18
+ }
@@ -0,0 +1,325 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { rmSync } from 'node:fs';
3
+ import { existsSync, readFileSync, statSync } from '../agent-user/agent-fs.js';
4
+ import { join } from 'node:path';
5
+ import { errMsg, log } from '@metro-labs/core/log';
6
+ import { isRecord } from '@metro-labs/core/is-record';
7
+ import { writeAtomic } from '@metro-labs/core/secure-fs';
8
+ import { agentsDir } from '../agents/files.js';
9
+ import { moveHome, removeHome, writeHomeText } from '../agent-user/home-fs.js';
10
+ import { claudeDir } from './files.js';
11
+ import { memoryJobStatus, type MemoryJob } from './memory-routine.js';
12
+ import { cliPackageDir, hooksDir, skillsDir } from './cli-files.js';
13
+ import { hasMetroGuard, withMetroHooks } from './hooks.js';
14
+ import { readSetupState, writeSetupState } from './setup-state.js';
15
+
16
+ export const PRIVACY_ENV: Record<string, string> = {
17
+ DISABLE_TELEMETRY: '1',
18
+ DISABLE_ERROR_REPORTING: '1',
19
+ CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',
20
+ CLAUDE_CODE_GB_DISK_CACHE_WHEN_TELEMETRY_OFF: '1',
21
+ };
22
+ export const RETENTION_DAYS = 7;
23
+ const RULES_FILE = 'METRO.md';
24
+ const RULES_SKILL = 'metro';
25
+ const RENAMED_SKILL = 'metro-orchestrator';
26
+ const RENAMED_NAME = /^name:[ \t]*(["']?)metro-orchestrator\1[ \t]*$/m;
27
+ const SYSTEM_PROMPT_FILE = 'system-prompt.md';
28
+ export const SYSTEM_PROMPT_MAX = 64 * 1024;
29
+
30
+ const WORKER_AGENT = `---
31
+ name: worker
32
+ description: Default execution agent for delegated work. Full tool access and maximum reasoning effort. Use for any substantive task the orchestrator main thread cannot perform itself - reading and writing code, running commands, research, analysis.
33
+ effort: xhigh
34
+ ---
35
+
36
+ You are a worker agent. The main thread that dispatched you is an orchestrator with no file, shell or network access; it can only delegate and relay messages. That means you are where the actual work happens, and the quality of your output is the quality of the result.
37
+
38
+ Work to completion. Do not hand back a partial answer with a suggestion that someone else finish it; there is no one else. If part of the task is genuinely blocked, complete every other part in full and say plainly what you left undone and why. Before you finish, read your own last paragraph: if it is a plan, a question or a promise about work you have not done, do that work now.
39
+
40
+ Keep the change to what the task asks for. A pre-existing bug, a performance problem or behaviour the task does not mention is a follow-up to report at the end, not something to fix now, unless the requested behaviour cannot work without it. Where the task is ambiguous, build the reading its wording and the surrounding code support best, and state that assumption. Commit tests only where the task asks for them or the repository already keeps tests for that kind of change, sized like the neighbouring test files; scratch checks you used to verify yourself need not be kept. This is about extras only: every behaviour the task does ask for, implement completely.
41
+
42
+ Never call AskUserQuestion or ExitPlanMode. They are blocked by policy, because nobody is watching the terminal around the clock and a blocking prompt stalls indefinitely. When you hit an ambiguity: do everything that does not depend on it, then choose the most reasonable interpretation, state the assumption explicitly in your report, and continue.
43
+
44
+ Your final message is a report to the orchestrator, not a message to a human. It gets relayed onward, so make it self-contained and concise. Lead with the outcome. Include concrete evidence, command output, file paths with line numbers, test results, for anything you claim to have verified. Report failures faithfully: if a test failed, say so and show the output; if you skipped a step, say that too.
45
+ `;
46
+
47
+ export interface SetupDeps {
48
+ dir?: string;
49
+ agents?: string;
50
+ cli?: string;
51
+ env?: NodeJS.ProcessEnv;
52
+ }
53
+
54
+ export type Placed = 'written' | 'present' | 'updated' | 'missing';
55
+ export type SettingsOutcome = 'written' | 'unchanged' | 'unreadable';
56
+
57
+ export interface SetupReport {
58
+ privacy: boolean;
59
+ guard: boolean;
60
+ worker: Placed;
61
+ skill: Placed;
62
+ stage: Placed;
63
+ memory: Placed;
64
+ settings: SettingsOutcome;
65
+ }
66
+
67
+ export interface SetupStatus {
68
+ privacy: boolean;
69
+ permissionMode: PermissionMode;
70
+ systemPrompt: string;
71
+ liveEvents: boolean;
72
+ memoryRoutine: boolean;
73
+ memoryJob: MemoryJob;
74
+ guard: boolean;
75
+ worker: boolean;
76
+ skill: boolean;
77
+ stage: boolean;
78
+ memory: boolean;
79
+ privacyApplied: boolean;
80
+ retentionDays: number | null;
81
+ }
82
+
83
+ const PERMISSION_MODES = ['auto', 'bypass'] as const;
84
+ export type PermissionMode = (typeof PERMISSION_MODES)[number];
85
+
86
+ const privacyEnabled = (agents = agentsDir()): boolean => readSetupState(agents).privacy !== false;
87
+
88
+ export function setPrivacy(enabled: boolean, agents = agentsDir()): void {
89
+ writeSetupState(agents, { privacy: enabled });
90
+ }
91
+
92
+ export const isPermissionMode = (value: unknown): value is PermissionMode => PERMISSION_MODES.some((m) => m === value);
93
+
94
+ export function permissionMode(agents = agentsDir()): PermissionMode {
95
+ const mode = readSetupState(agents).permissionMode;
96
+ return isPermissionMode(mode) ? mode : 'auto';
97
+ }
98
+
99
+ export function setPermissionMode(mode: PermissionMode, agents = agentsDir()): void {
100
+ writeSetupState(agents, { permissionMode: mode });
101
+ }
102
+
103
+ export const liveEvents = (agents = agentsDir()): boolean => readSetupState(agents).liveEvents !== false;
104
+
105
+ export function setLiveEvents(on: boolean, agents = agentsDir()): void {
106
+ writeSetupState(agents, { liveEvents: on });
107
+ }
108
+
109
+ export const memoryRoutine = (agents = agentsDir()): boolean => readSetupState(agents).memoryRoutine !== false;
110
+
111
+ export function setMemoryRoutine(on: boolean, agents = agentsDir()): void {
112
+ writeSetupState(agents, { memoryRoutine: on });
113
+ }
114
+
115
+ const promptPath = (agents: string): string => join(agents, SYSTEM_PROMPT_FILE);
116
+
117
+ export function systemPrompt(agents = agentsDir()): string {
118
+ const path = promptPath(agents);
119
+ if (!existsSync(path)) return '';
120
+ return readFileSync(path, 'utf8').trim();
121
+ }
122
+
123
+ export function setSystemPrompt(text: string, agents = agentsDir()): void {
124
+ const trimmed = text.trim();
125
+ if (trimmed === '') {
126
+ rmSync(promptPath(agents), { force: true });
127
+ return;
128
+ }
129
+ writeAtomic(promptPath(agents), `${trimmed}\n`, 0o600);
130
+ }
131
+
132
+ const PRIOR_WORKER: ReadonlySet<string> = new Set(['08a0cd8710df285d6512245246bb8b658b7cfc7f3e89490514ee5376779eb2ef']);
133
+ const PRIOR_METRO: ReadonlySet<string> = new Set([
134
+ '0b3d122ed95beff09d579cf912cd4238e1db524c41fce4b314de57d6ff5908ad',
135
+ '36f4fb57f231a119d717b5e3d6ccb654f94960fcca708683f376679aead8df25',
136
+ '3840bc50253e51f431691376cf29a925b8245d87b77b8b20804a159e378a6e67',
137
+ 'e6b59eba825b4568dfa9ace5049fd9568a2e10d731719976ad2657084fd4e5f9',
138
+ '5ce3f76d610aae91adc922d0edc6c8be1f27aa2fec4a5e3a6d6231a04fb9310b',
139
+ 'b910597d24f31fa479b130a2545f94dd23684d802d99e36b637fc57c818a33be',
140
+ 'd3f7ed0f5175b9a7a77f06f6204ae0020369d0c8f6e2724196bb3c5822d4d8ba',
141
+ '587a1334f91a8b61541573cef16eaf44fbe63049a8d8b461fa9f5cc55bacbcb8',
142
+ '256c711a6175266c216e32c88b7190d0f98f5e6b702abe03220b422aba426574',
143
+ '9e164a956437d60d30ea1984115a17d303940d191f5efed04954f244fc89d48f',
144
+ '8b6d7c5a9bc8d02d5e3ae5e5931b36aba9f3d0eb7fd38b371294c2abaa0c94ee',
145
+ ]);
146
+ const PRIOR_STAGE: ReadonlySet<string> = new Set([
147
+ 'dd7d30474765de3865ddc87c1cf3220161ded09502027cdff18597e5df0aab43',
148
+ '47439ecbe661ca70471a6839ab30a963714c296ad8c14ca23c6eebc3929038cc',
149
+ 'e3b8f9bbdb205311bc643aaf91d9d903a91204fd5b55ca949b85cdfa6fd00136',
150
+ '08a30f5cd5cf8013ab70c1fa9e1109018c0337552296a8efe5c0cf543b284991',
151
+ 'f87e9494ea6151d140b742c1b88b4f435ae653559be641fddc2160cd24dd4e1b',
152
+ 'cb4307b016855c1a09d48bc8b3924a3080bd78b205963df3d6f20401d0486df9',
153
+ 'd25a8575b1c27ee725ff3a3ec6e1ba42aebd08ba545012c4807c072627c5dd4a',
154
+ 'f2be51c5290d2e61b47f10c379fa45d051a59a6b3f06d99174c2a170074bc8f5',
155
+ '4c727aa110c9023371cfb364f3304ad9db22cdf2501208ef1e42e6ccc245b00f',
156
+ 'f3901d8a4537441b1d7fe8e4073322a97b779472df6b4a8e0f2091ab5ab0ae09',
157
+ 'af22c346df478fd249cc6931d4cf1dab4e091682e422f1bd27af0a08781e189d',
158
+ ]);
159
+ const PRIOR_MEMORY: ReadonlySet<string> = new Set(['08795399635c8cdec2b50cb4e336f89ae880f3997ae52560ef647a9cdc8f1b08']);
160
+
161
+ interface ShippedSkill {
162
+ name: string;
163
+ file: string;
164
+ prior: ReadonlySet<string>;
165
+ }
166
+
167
+ const METRO_SKILL: ShippedSkill = { name: RULES_SKILL, file: RULES_FILE, prior: PRIOR_METRO };
168
+ const STAGE_SKILL: ShippedSkill = { name: 'stage', file: 'STAGE.md', prior: PRIOR_STAGE };
169
+ const MEMORY_SKILL: ShippedSkill = { name: 'memory', file: 'MEMORY.md', prior: PRIOR_MEMORY };
170
+
171
+ const digest = (text: string): string => createHash('sha256').update(text).digest('hex');
172
+
173
+ export function placeFile(path: string, text: string, prior: ReadonlySet<string> = new Set()): Placed {
174
+ if (!existsSync(path)) {
175
+ writeHomeText(path, text, 0o644);
176
+ return 'written';
177
+ }
178
+ const current = readFileSync(path, 'utf8');
179
+ if (current === text || !prior.has(digest(current))) return 'present';
180
+ writeHomeText(path, text, 0o644);
181
+ return 'updated';
182
+ }
183
+
184
+ function readSettings(path: string): Record<string, unknown> | null {
185
+ if (!existsSync(path)) return {};
186
+ try {
187
+ const parsed: unknown = JSON.parse(readFileSync(path, 'utf8'));
188
+ return isRecord(parsed) ? parsed : null;
189
+ } catch {
190
+ return null;
191
+ }
192
+ }
193
+
194
+ function withPrivacy(settings: Record<string, unknown>, enabled: boolean): Record<string, unknown> {
195
+ const current = isRecord(settings.env) ? settings.env : {};
196
+ if (enabled)
197
+ return { ...settings, env: { ...current, ...PRIVACY_ENV }, cleanupPeriodDays: settings.cleanupPeriodDays ?? RETENTION_DAYS };
198
+ const env = Object.fromEntries(Object.entries(current).filter(([key]) => !(key in PRIVACY_ENV)));
199
+ const rest = Object.fromEntries(Object.entries(settings).filter(([key]) => key !== 'env'));
200
+ return Object.keys(env).length === 0 ? rest : { ...rest, env };
201
+ }
202
+
203
+ function mergeSettings(dir: string, change: (settings: Record<string, unknown>) => Record<string, unknown>): SettingsOutcome {
204
+ const path = join(dir, 'settings.json');
205
+ const current = readSettings(path);
206
+ if (current === null) return 'unreadable';
207
+ const next = change(current);
208
+ if (existsSync(path) && JSON.stringify(next) === JSON.stringify(current)) return 'unchanged';
209
+ writeHomeText(path, `${JSON.stringify(next, null, 2)}\n`, existsSync(path) ? statSync(path).mode & 0o777 : 0o644);
210
+ return 'written';
211
+ }
212
+
213
+ interface SettingsApplied {
214
+ settings: SettingsOutcome;
215
+ guard: boolean;
216
+ }
217
+
218
+ const MODELS_KEYS = new Set(['availableModels', 'enforceAvailableModels']);
219
+
220
+ const withoutMetroModels = (settings: Record<string, unknown>, metroWrote: boolean): Record<string, unknown> =>
221
+ metroWrote ? Object.fromEntries(Object.entries(settings).filter(([key]) => !MODELS_KEYS.has(key))) : settings;
222
+
223
+ function applySettings(dir: string, agents: string, privacy: boolean, hooks: string | null): SettingsApplied {
224
+ const metroModels = readSetupState(agents).modelsByMetro === true;
225
+ let guard = false;
226
+ const settings = mergeSettings(dir, (current) => {
227
+ const next = withPrivacy(withoutMetroModels(current, metroModels), privacy);
228
+ const hooked = hooks === null ? null : withMetroHooks(next, hooks);
229
+ if (hooks !== null && hooked === null)
230
+ log.warn({ path: join(dir, 'settings.json') }, 'claude-setup: the hooks in settings.json are not in the shape Claude Code reads, so metro did not add its own');
231
+ guard = hasMetroGuard(hooked ?? next);
232
+ return hooked ?? next;
233
+ });
234
+ if (metroModels && settings !== 'unreadable') writeSetupState(agents, { modelsByMetro: false });
235
+ return { settings, guard };
236
+ }
237
+
238
+ const skillPath = (dir: string, name: string): string => join(dir, 'skills', name, 'SKILL.md');
239
+ const workerPath = (dir: string): string => join(dir, 'agents', 'worker.md');
240
+
241
+ function placeSkill(dir: string, skills: string, skill: ShippedSkill): Placed {
242
+ const source = join(skills, skill.file);
243
+ if (!existsSync(source)) return 'missing';
244
+ return placeFile(skillPath(dir, skill.name), readFileSync(source, 'utf8'), skill.prior);
245
+ }
246
+
247
+ function moveRenamedSkill(dir: string): void {
248
+ const from = join(dir, 'skills', RENAMED_SKILL);
249
+ const old = skillPath(dir, RENAMED_SKILL);
250
+ if (!existsSync(old)) return;
251
+ const shipped = PRIOR_METRO.has(digest(readFileSync(old, 'utf8')));
252
+ if (existsSync(join(dir, 'skills', RULES_SKILL))) {
253
+ if (shipped) removeHome(from, true);
254
+ return;
255
+ }
256
+ moveHome(from, join(dir, 'skills', RULES_SKILL));
257
+ log.info({ from, shipped }, 'claude-setup: moved the metro-orchestrator skill to metro');
258
+ if (shipped) return;
259
+ const path = skillPath(dir, RULES_SKILL);
260
+ const text = readFileSync(path, 'utf8');
261
+ const renamed = text.replace(RENAMED_NAME, `name: ${RULES_SKILL}`);
262
+ if (renamed !== text) writeHomeText(path, renamed, statSync(path).mode & 0o777);
263
+ }
264
+
265
+ function tryMoveRenamedSkill(dir: string): void {
266
+ try {
267
+ moveRenamedSkill(dir);
268
+ } catch (err) {
269
+ log.warn({ err: errMsg(err) }, 'claude-setup: could not move the metro-orchestrator skill to metro');
270
+ }
271
+ }
272
+
273
+ const written = (placed: Placed): boolean => placed === 'written' || placed === 'updated';
274
+
275
+ export function ensureClaudeSetup(deps: SetupDeps = {}): SetupReport {
276
+ const dir = deps.dir ?? claudeDir();
277
+ const agents = deps.agents ?? agentsDir();
278
+ const privacy = privacyEnabled(agents);
279
+ const cli = deps.cli ?? cliPackageDir(deps.env);
280
+ const hooks = hooksDir(cli);
281
+ tryMoveRenamedSkill(dir);
282
+ const worker = placeFile(workerPath(dir), WORKER_AGENT, PRIOR_WORKER);
283
+ const skills = skillsDir(cli);
284
+ const skill = placeSkill(dir, skills, METRO_SKILL);
285
+ const stage = placeSkill(dir, skills, STAGE_SKILL);
286
+ const memory = placeSkill(dir, skills, MEMORY_SKILL);
287
+ const applied = applySettings(dir, agents, privacy, hooks);
288
+ const report: SetupReport = { privacy, guard: applied.guard, worker, skill, stage, memory, settings: applied.settings };
289
+ if ([report.worker, report.skill, report.stage, report.memory].some(written) || report.settings === 'written')
290
+ log.info(report, 'claude-setup: applied the Claude Code setup for a metro box');
291
+ if (report.settings === 'unreadable') log.warn({ path: join(dir, 'settings.json') }, 'claude-setup: settings.json is not valid JSON, so the privacy settings and metro hooks were not written');
292
+ if (hooks === null) log.warn({ cli }, 'claude-setup: metro hooks were not found next to the CLI, so the guard and the standing rules are not in settings.json');
293
+ return report;
294
+ }
295
+
296
+ export function claudeSetupStatus(deps: SetupDeps = {}): SetupStatus {
297
+ const dir = deps.dir ?? claudeDir();
298
+ const agents = deps.agents ?? agentsDir();
299
+ const settings = readSettings(join(dir, 'settings.json'));
300
+ const env = settings !== null && isRecord(settings.env) ? settings.env : {};
301
+ const days = settings?.cleanupPeriodDays;
302
+ return {
303
+ privacy: privacyEnabled(agents),
304
+ permissionMode: permissionMode(agents),
305
+ systemPrompt: systemPrompt(agents),
306
+ liveEvents: liveEvents(agents),
307
+ memoryRoutine: memoryRoutine(agents),
308
+ memoryJob: memoryJobStatus(),
309
+ guard: hasMetroGuard(settings),
310
+ worker: existsSync(workerPath(dir)),
311
+ skill: existsSync(skillPath(dir, METRO_SKILL.name)),
312
+ stage: existsSync(skillPath(dir, STAGE_SKILL.name)),
313
+ memory: existsSync(skillPath(dir, MEMORY_SKILL.name)),
314
+ privacyApplied: Object.keys(PRIVACY_ENV).every((key) => env[key] === '1'),
315
+ retentionDays: typeof days === 'number' ? days : null,
316
+ };
317
+ }
318
+
319
+ export function tryClaudeSetup(deps: SetupDeps = {}): void {
320
+ try {
321
+ ensureClaudeSetup(deps);
322
+ } catch (err) {
323
+ log.warn({ err: errMsg(err) }, 'claude-setup: could not apply the Claude Code setup');
324
+ }
325
+ }
@@ -0,0 +1,123 @@
1
+ import { existsSync, readdirNames, readFileSync, statSync } from '../agent-user/agent-fs.js';
2
+ import { basename, dirname, join } from 'node:path';
3
+ import { ApiError } from '@metro-labs/http/api-error';
4
+ import { claudeDir } from './files.js';
5
+ import { removeHome, writeHomeText } from '../agent-user/home-fs.js';
6
+
7
+ const SKILL_MAX = 256 * 1024;
8
+ const SKILL_NAME_RE = /^[a-z0-9][a-z0-9-]{0,63}$/;
9
+ const FILE = 'SKILL.md';
10
+ const DEFAULT_MODE = 0o644;
11
+ const SUMMARY_MAX = 300;
12
+
13
+ export interface ClaudeSkill {
14
+ id: string;
15
+ name: string;
16
+ title: string;
17
+ description: string;
18
+ path: string;
19
+ editable: boolean;
20
+ updatedAt: string | null;
21
+ managed?: boolean;
22
+ shadowed?: boolean;
23
+ github?: { repository: string; commit: string; folder: string };
24
+ }
25
+
26
+ const frontmatterField = (text: string, field: string): string => {
27
+ const head = text.startsWith('---') ? text.slice(3, text.indexOf('\n---', 3)) : '';
28
+ for (const line of head.split('\n')) {
29
+ const at = line.indexOf(':');
30
+ if (at > 0 && line.slice(0, at).trim() === field) return line.slice(at + 1).trim().replace(/^["']|["']$/g, '').slice(0, SUMMARY_MAX);
31
+ }
32
+ return '';
33
+ };
34
+
35
+ function entryOf(name: string, path: string): ClaudeSkill {
36
+ const stat = statSync(path);
37
+ const editable = stat.size <= SKILL_MAX;
38
+ const text = editable ? readFileSync(path, 'utf8') : '';
39
+ return {
40
+ id: `user:${name}`,
41
+ name,
42
+ title: frontmatterField(text, 'name') || name,
43
+ description: frontmatterField(text, 'description'),
44
+ path,
45
+ editable,
46
+ updatedAt: stat.mtime.toISOString(),
47
+ };
48
+ }
49
+
50
+ const userSkillsRoot = (dir: string): string => join(dir, 'skills');
51
+
52
+ function isFolder(path: string): boolean {
53
+ try {
54
+ return statSync(path).isDirectory();
55
+ } catch {
56
+ return false;
57
+ }
58
+ }
59
+
60
+ export function listClaudeSkills(dir = claudeDir()): ClaudeSkill[] {
61
+ const root = userSkillsRoot(dir);
62
+ if (!existsSync(root)) return [];
63
+ const out: ClaudeSkill[] = [];
64
+ for (const name of readdirNames(root)) {
65
+ if (!SKILL_NAME_RE.test(name) || !isFolder(join(root, name))) continue;
66
+ const path = join(root, name, FILE);
67
+ if (existsSync(path)) out.push(entryOf(name, path));
68
+ }
69
+ return out.sort((a, b) => (b.updatedAt ?? '').localeCompare(a.updatedAt ?? '') || a.name.localeCompare(b.name));
70
+ }
71
+
72
+ function found(id: string, dir: string): ClaudeSkill {
73
+ const skill = listClaudeSkills(dir).find((entry) => entry.id === id);
74
+ if (skill === undefined) throw new ApiError('no such skill', 404);
75
+ return skill;
76
+ }
77
+
78
+ export function readClaudeSkill(id: string, dir = claudeDir()): ClaudeSkill & { text: string } {
79
+ const skill = found(id, dir);
80
+ return { ...skill, text: skill.editable ? readFileSync(skill.path, 'utf8') : '' };
81
+ }
82
+
83
+ function assertText(text: string): void {
84
+ if (text.length > SKILL_MAX) throw new ApiError('that is more text than a skill may hold', 413);
85
+ if (text.trim() === '') throw new ApiError('a skill needs some text', 400);
86
+ }
87
+
88
+ export function writeClaudeSkill(
89
+ id: string,
90
+ text: string,
91
+ seenAt: string | null | undefined,
92
+ dir = claudeDir(),
93
+ ): ClaudeSkill {
94
+ const skill = found(id, dir);
95
+ if (!skill.editable) throw new ApiError('that skill is too large to edit here', 409);
96
+ assertText(text);
97
+ if (seenAt !== undefined && seenAt !== skill.updatedAt)
98
+ throw new ApiError('that skill changed on disk since you opened it; reload it before saving', 409);
99
+ writeHomeText(skill.path, text, DEFAULT_MODE);
100
+ return entryOf(skill.name, skill.path);
101
+ }
102
+
103
+ const skillTemplate = (name: string): string =>
104
+ ['---', `name: ${name}`, 'description: what this skill does, and when Claude should reach for it', '---', '', `# ${name}`, '', 'Write the instructions here.', ''].join('\n');
105
+
106
+ export function createClaudeSkill(name: string, text: string | undefined, dir = claudeDir()): ClaudeSkill {
107
+ if (typeof name !== 'string' || !SKILL_NAME_RE.test(name))
108
+ throw new ApiError('a skill name is lowercase letters, digits and dashes, up to 64 characters', 400);
109
+ const path = join(userSkillsRoot(dir), name, FILE);
110
+ if (existsSync(path)) throw new ApiError('a skill by that name already lives there', 409);
111
+ const body = text === undefined || text.trim() === '' ? skillTemplate(name) : text;
112
+ assertText(body);
113
+ writeHomeText(path, body, DEFAULT_MODE);
114
+ return entryOf(name, path);
115
+ }
116
+
117
+ export function deleteClaudeSkill(id: string, dir = claudeDir()): string {
118
+ const skill = found(id, dir);
119
+ const folder = dirname(skill.path);
120
+ if (basename(folder) !== skill.name) throw new ApiError('that skill does not live in its own folder', 409);
121
+ removeHome(folder, true);
122
+ return id;
123
+ }