@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,216 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import fs, { closeSync, constants, fstatSync, lstatSync, mkdirSync, openSync, type Stats } from 'node:fs';
3
+ import { dirname, join, parse, resolve, sep } from 'node:path';
4
+ import { DatabaseSync } from 'node:sqlite';
5
+ import { AutomationError } from './automation-types.js';
6
+ import { isRecord } from './is-record.js';
7
+
8
+ const FILE = 'automation.sqlite';
9
+ const SCHEMA = `
10
+ CREATE TABLE requests (
11
+ uuid TEXT PRIMARY KEY NOT NULL,
12
+ routine TEXT NOT NULL,
13
+ slot INTEGER NOT NULL,
14
+ payload TEXT NOT NULL,
15
+ UNIQUE (routine, slot)
16
+ );
17
+ CREATE TABLE statuses (
18
+ uuid TEXT PRIMARY KEY NOT NULL REFERENCES requests(uuid) ON DELETE CASCADE,
19
+ payload TEXT NOT NULL
20
+ );
21
+ CREATE TABLE resolutions (
22
+ uuid TEXT NOT NULL REFERENCES requests(uuid) ON DELETE CASCADE,
23
+ outcome TEXT NOT NULL,
24
+ payload TEXT NOT NULL,
25
+ PRIMARY KEY (uuid, outcome)
26
+ );
27
+ PRAGMA user_version = 1;
28
+ `;
29
+
30
+ function hasCode(error: unknown, code: string): boolean {
31
+ return isRecord(error) && error.code === code;
32
+ }
33
+
34
+ function metadata(path: string): Stats | null {
35
+ try {
36
+ return lstatSync(path);
37
+ } catch (error) {
38
+ if (hasCode(error, 'ENOENT')) return null;
39
+ throw error;
40
+ }
41
+ }
42
+
43
+ function uid(): number {
44
+ if (process.getuid === undefined) throw new AutomationError('unsafe-storage');
45
+ return process.getuid();
46
+ }
47
+
48
+ function checkDirectory(info: Stats, privateDirectory: boolean): void {
49
+ if (!info.isDirectory() || info.isSymbolicLink()) throw new AutomationError('unsafe-storage');
50
+ if (privateDirectory) {
51
+ if (info.uid !== uid() || (info.mode & 0o7777) !== 0o700) throw new AutomationError('unsafe-storage');
52
+ return;
53
+ }
54
+ if (info.uid !== uid() && info.uid !== 0) throw new AutomationError('unsafe-storage');
55
+ if ((info.mode & 0o022) !== 0 && (info.mode & 0o1000) === 0) throw new AutomationError('unsafe-storage');
56
+ }
57
+
58
+ function syncDirectory(path: string): void {
59
+ const fd = openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
60
+ try {
61
+ fs.fsyncSync(fd);
62
+ } finally {
63
+ closeSync(fd);
64
+ }
65
+ }
66
+
67
+ function directory(root: string, create: boolean): boolean {
68
+ let current = parse(root).root;
69
+ const base = metadata(current);
70
+ if (base === null) throw new AutomationError('unsafe-storage');
71
+ checkDirectory(base, current === root);
72
+ for (const component of root.slice(current.length).split(sep).filter(Boolean)) {
73
+ current = join(current, component);
74
+ let info = metadata(current);
75
+ if (info === null) {
76
+ if (!create) return false;
77
+ try {
78
+ mkdirSync(current, { mode: 0o700 });
79
+ syncDirectory(dirname(current));
80
+ } catch (error) {
81
+ if (!hasCode(error, 'EEXIST')) throw error;
82
+ }
83
+ info = metadata(current);
84
+ }
85
+ if (info === null) throw new AutomationError('unsafe-storage');
86
+ checkDirectory(info, current === root);
87
+ }
88
+ return true;
89
+ }
90
+
91
+ function checkFile(info: Stats, singleLink = false): void {
92
+ if (!info.isFile() || info.uid !== uid() || (info.mode & 0o7777) !== 0o600 || (singleLink && info.nlink !== 1)) throw new AutomationError('unsafe-storage');
93
+ }
94
+
95
+ function companions(path: string): void {
96
+ for (const suffix of ['-journal', '-wal', '-shm']) {
97
+ const info = metadata(`${path}${suffix}`);
98
+ if (info !== null) checkFile(info, true);
99
+ }
100
+ }
101
+
102
+ function sameFile(path: string, opened: Stats): void {
103
+ const current = metadata(path);
104
+ if (current === null || current.dev !== opened.dev || current.ino !== opened.ino) throw new AutomationError('unsafe-storage');
105
+ checkFile(current);
106
+ }
107
+
108
+ function initializeFile(path: string, fd: number): void {
109
+ const opened = fstatSync(fd);
110
+ checkFile(opened);
111
+ const db = new DatabaseSync(path);
112
+ try {
113
+ sameFile(path, opened);
114
+ db.exec('PRAGMA trusted_schema = OFF');
115
+ transaction(db, (database) => { database.exec(SCHEMA); });
116
+ } finally {
117
+ db.close();
118
+ }
119
+ fs.fsyncSync(fd);
120
+ }
121
+
122
+ function createFile(path: string): void {
123
+ if (metadata(path) !== null) return;
124
+ const temporary = `${path}.${randomUUID()}.tmp`;
125
+ const fd = openSync(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
126
+ try {
127
+ initializeFile(temporary, fd);
128
+ try {
129
+ fs.linkSync(temporary, path);
130
+ } catch (error) {
131
+ if (!hasCode(error, 'EEXIST')) throw error;
132
+ }
133
+ } finally {
134
+ closeSync(fd);
135
+ fs.unlinkSync(temporary);
136
+ }
137
+ syncDirectory(dirname(path));
138
+ }
139
+
140
+ function transaction<T>(db: DatabaseSync, action: (database: DatabaseSync) => T): T {
141
+ db.exec('PRAGMA journal_mode = DELETE; PRAGMA synchronous = FULL; PRAGMA foreign_keys = ON; BEGIN IMMEDIATE');
142
+ try {
143
+ const result = action(db);
144
+ db.exec('COMMIT');
145
+ return result;
146
+ } catch (error) {
147
+ db.exec('ROLLBACK');
148
+ throw error;
149
+ }
150
+ }
151
+
152
+ function useDatabase<T>(path: string, writable: boolean, action: (database: DatabaseSync) => T): T {
153
+ const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
154
+ let db: DatabaseSync | undefined;
155
+ try {
156
+ const opened = fstatSync(fd);
157
+ checkFile(opened);
158
+ companions(path);
159
+ db = new DatabaseSync(path, { readOnly: !writable });
160
+ sameFile(path, opened);
161
+ db.exec('PRAGMA busy_timeout = 5000; PRAGMA trusted_schema = OFF');
162
+ if (db.prepare('PRAGMA user_version').get()?.user_version !== 1) throw new AutomationError('corrupt-storage');
163
+ if (writable) return transaction(db, action);
164
+ if (db.prepare('PRAGMA journal_mode').get()?.journal_mode !== 'delete') throw new AutomationError('corrupt-storage');
165
+ db.exec('BEGIN');
166
+ try {
167
+ return action(db);
168
+ } finally {
169
+ db.exec('ROLLBACK');
170
+ }
171
+ } finally {
172
+ db?.close();
173
+ closeSync(fd);
174
+ }
175
+ }
176
+
177
+ function databasePath(root: string, writable: boolean, existingOnly: boolean): string | null {
178
+ const create = writable && !existingOnly;
179
+ const absolute = resolve(root);
180
+ if (!directory(absolute, create)) return null;
181
+ const path = join(absolute, FILE);
182
+ companions(path);
183
+ if (create) createFile(path);
184
+ const info = metadata(path);
185
+ if (info === null) {
186
+ if (create) throw new AutomationError('storage-unavailable');
187
+ return null;
188
+ }
189
+ checkFile(info);
190
+ return path;
191
+ }
192
+
193
+ export function validateAutomationDirectory(root: string): void {
194
+ try {
195
+ databasePath(root, false, false);
196
+ } catch (error) {
197
+ if (error instanceof AutomationError) throw error;
198
+ throw new AutomationError('storage-unavailable', { cause: error });
199
+ }
200
+ }
201
+
202
+ export function automationDatabase<T>(root: string, writable: boolean, action: (database: DatabaseSync) => T, missing: T, existingOnly = false): T {
203
+ try {
204
+ const path = databasePath(root, writable, existingOnly);
205
+ if (path === null) return missing;
206
+ const result = useDatabase(path, writable, action);
207
+ if (writable) {
208
+ companions(path);
209
+ syncDirectory(dirname(path));
210
+ }
211
+ return result;
212
+ } catch (error) {
213
+ if (error instanceof AutomationError) throw error;
214
+ throw new AutomationError('storage-unavailable', { cause: error });
215
+ }
216
+ }
@@ -0,0 +1,171 @@
1
+ import { resolve } from 'node:path';
2
+ import type { DatabaseSync } from 'node:sqlite';
3
+ import { automationDatabase, validateAutomationDirectory } from './automation-files.js';
4
+ import {
5
+ AUTOMATION_REQUEST_MAX, AUTOMATION_RETENTION_MS, AutomationError, assertAutomationUuid,
6
+ automationRequest, automationTerminal, parseAutomationRequest, parseAutomationResolution, parseAutomationStatus,
7
+ type AutomationOutcome, type AutomationRequest, type AutomationResolution, type AutomationStatus,
8
+ } from './automation-types.js';
9
+ import { isRecord } from './is-record.js';
10
+
11
+ export type { AutomationOutcome, AutomationRequest, AutomationResolution, AutomationStatus, AutomationState, AutomationUuid } from './automation-types.js';
12
+
13
+ function payload<T extends { uuid: string }>(row: unknown, parse: (value: unknown) => T): T {
14
+ try {
15
+ if (!isRecord(row) || typeof row.payload !== 'string') throw new AutomationError('corrupt-storage');
16
+ const value: unknown = JSON.parse(row.payload);
17
+ const parsed = parse(value);
18
+ if (parsed.uuid !== row.uuid) throw new AutomationError('corrupt-storage');
19
+ return parsed;
20
+ } catch (error) {
21
+ throw new AutomationError('corrupt-storage', { cause: error });
22
+ }
23
+ }
24
+
25
+ function request(row: unknown): AutomationRequest {
26
+ const parsed = payload(row, parseAutomationRequest);
27
+ if (!isRecord(row) || parsed.routine !== row.routine || parsed.slot !== row.slot) throw new AutomationError('corrupt-storage');
28
+ return parsed;
29
+ }
30
+
31
+ function requests(db: DatabaseSync): AutomationRequest[] {
32
+ const rows = db.prepare('SELECT * FROM requests ORDER BY slot, routine LIMIT 513').all();
33
+ if (rows.length > AUTOMATION_REQUEST_MAX) throw new AutomationError('corrupt-storage');
34
+ return rows.map(request);
35
+ }
36
+
37
+ function status(db: DatabaseSync, uuid: string): AutomationStatus | null {
38
+ const row = db.prepare('SELECT * FROM statuses WHERE uuid = ?').get(uuid);
39
+ return row === undefined ? null : payload(row, parseAutomationStatus);
40
+ }
41
+
42
+ function statuses(db: DatabaseSync): AutomationStatus[] {
43
+ const rows = db.prepare('SELECT * FROM statuses LIMIT 513').all();
44
+ if (rows.length > AUTOMATION_REQUEST_MAX) throw new AutomationError('corrupt-storage');
45
+ return rows.map((row) => payload(row, parseAutomationStatus));
46
+ }
47
+
48
+ function resolution(row: unknown): AutomationResolution {
49
+ const parsed = payload(row, parseAutomationResolution);
50
+ if (!isRecord(row) || parsed.outcome !== row.outcome) throw new AutomationError('corrupt-storage');
51
+ return parsed;
52
+ }
53
+
54
+ function resolutions(db: DatabaseSync): AutomationResolution[] {
55
+ const rows = db.prepare('SELECT * FROM resolutions ORDER BY uuid, outcome LIMIT 1025').all();
56
+ if (rows.length > 2 * AUTOMATION_REQUEST_MAX) throw new AutomationError('corrupt-storage');
57
+ return rows.map(resolution);
58
+ }
59
+
60
+ function requireRequest(db: DatabaseSync, uuid: string): AutomationRequest {
61
+ const row = db.prepare('SELECT * FROM requests WHERE uuid = ?').get(uuid);
62
+ if (row === undefined) throw new AutomationError('unknown-request');
63
+ return request(row);
64
+ }
65
+
66
+ function validate(db: DatabaseSync): void {
67
+ const known = new Set(requests(db).map((entry) => entry.uuid));
68
+ for (const entry of [...statuses(db), ...resolutions(db)]) {
69
+ if (!known.has(entry.uuid)) throw new AutomationError('corrupt-storage');
70
+ }
71
+ if (db.prepare('PRAGMA quick_check').get()?.quick_check !== 'ok') throw new AutomationError('corrupt-storage');
72
+ }
73
+
74
+ function expiredRequests(db: DatabaseSync, cutoff: number): AutomationRequest[] {
75
+ const saved = new Map(statuses(db).map((entry) => [entry.uuid, entry]));
76
+ return requests(db).filter((entry) => {
77
+ const current = saved.get(entry.uuid);
78
+ return current !== undefined && automationTerminal(current.state) && entry.slot < cutoff && current.updatedAt < cutoff;
79
+ });
80
+ }
81
+
82
+ export class AutomationStore {
83
+ readonly root: string;
84
+
85
+ constructor(root: string, private readonly now: () => number = Date.now) {
86
+ this.root = resolve(root);
87
+ }
88
+
89
+ validate(): void {
90
+ validateAutomationDirectory(this.root);
91
+ }
92
+
93
+ recover(): void {
94
+ automationDatabase(this.root, true, validate, undefined, true);
95
+ }
96
+
97
+ submit(routine: string, slot: number, prompt: string): AutomationRequest {
98
+ const proposed = automationRequest(routine, slot, prompt, this.now());
99
+ return automationDatabase(this.root, true, (db) => {
100
+ const accepted = automationRequest(routine, slot, prompt, this.now());
101
+ const existing = requests(db);
102
+ const found = existing.find((entry) => entry.routine === routine && entry.slot === slot);
103
+ if (found !== undefined) {
104
+ if (found.prompt !== prompt) throw new AutomationError('conflict');
105
+ return found;
106
+ }
107
+ if (existing.length >= AUTOMATION_REQUEST_MAX) throw new AutomationError('full');
108
+ db.prepare('INSERT INTO requests (uuid, routine, slot, payload) VALUES (?, ?, ?, ?)')
109
+ .run(accepted.uuid, routine, slot, JSON.stringify(accepted));
110
+ return accepted;
111
+ }, proposed);
112
+ }
113
+
114
+ requests(): AutomationRequest[] {
115
+ return automationDatabase(this.root, false, requests, []);
116
+ }
117
+
118
+ status(uuid: string): AutomationStatus | null {
119
+ assertAutomationUuid(uuid);
120
+ return automationDatabase(this.root, false, (db) => status(db, uuid), null);
121
+ }
122
+
123
+ statuses(): AutomationStatus[] {
124
+ return automationDatabase(this.root, false, statuses, []);
125
+ }
126
+
127
+ saveStatus(value: AutomationStatus): void {
128
+ const parsed = parseAutomationStatus(value);
129
+ automationDatabase(this.root, true, (db) => {
130
+ requireRequest(db, parsed.uuid);
131
+ db.prepare('INSERT INTO statuses (uuid, payload) VALUES (?, ?) ON CONFLICT(uuid) DO UPDATE SET payload = excluded.payload')
132
+ .run(parsed.uuid, JSON.stringify(parsed));
133
+ }, undefined);
134
+ }
135
+
136
+ finish(uuid: string, token: string, outcome: AutomationOutcome): AutomationResolution {
137
+ const proposed = parseAutomationResolution({ uuid, token, outcome, createdAt: this.now() });
138
+ const current = this.status(uuid);
139
+ if (current === null) throw new AutomationError('unknown-request');
140
+ if (current.token !== token) throw new AutomationError('invalid-token');
141
+ return automationDatabase(this.root, true, (db) => {
142
+ requireRequest(db, uuid);
143
+ if (status(db, uuid)?.token !== token) throw new AutomationError('invalid-token');
144
+ const row = db.prepare('SELECT * FROM resolutions WHERE uuid = ? AND outcome = ?').get(uuid, outcome);
145
+ if (row !== undefined) {
146
+ const found = resolution(row);
147
+ if (found.token !== token) throw new AutomationError('invalid-token');
148
+ return found;
149
+ }
150
+ db.prepare('INSERT INTO resolutions (uuid, outcome, payload) VALUES (?, ?, ?)').run(uuid, outcome, JSON.stringify(proposed));
151
+ return proposed;
152
+ }, proposed);
153
+ }
154
+
155
+ resolutions(): AutomationResolution[] {
156
+ return automationDatabase(this.root, false, resolutions, []);
157
+ }
158
+
159
+ prune(): number {
160
+ const cutoff = this.now() - AUTOMATION_RETENTION_MS;
161
+ if (!Number.isSafeInteger(cutoff)) throw new AutomationError('invalid-slot');
162
+ const eligible = automationDatabase(this.root, false, (db) => expiredRequests(db, cutoff).length > 0, false);
163
+ if (!eligible) return 0;
164
+ return automationDatabase(this.root, true, (db) => {
165
+ validate(db);
166
+ const expired = expiredRequests(db, cutoff);
167
+ for (const entry of expired) db.prepare('DELETE FROM requests WHERE uuid = ?').run(entry.uuid);
168
+ return expired.length;
169
+ }, 0);
170
+ }
171
+ }
@@ -0,0 +1,141 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { isRecord } from './is-record.js';
3
+
4
+ export const AUTOMATION_PROMPT_MAX = 64 * 1024;
5
+ const PROMPT_JSON_MAX = 128 * 1024 + 2;
6
+ export const AUTOMATION_REQUEST_MAX = 512;
7
+ export const AUTOMATION_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
8
+ export const AUTOMATION_ROUTINE_RE = /^[a-z][a-z0-9-]{0,63}$/;
9
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
10
+ const STATES = ['dispatched', 'consumed', 'awaiting-completion', 'completed', 'failed', 'interrupted', 'coalesced', 'cancelled'] as const;
11
+ const DETAILS = ['sdk-completed', 'sdk-failed', 'runner-interrupted', 'newer-slot', 'owner-cancelled', 'worker-blocked', 'worker-completed'] as const;
12
+ const TERMINAL = new Set<AutomationState>(['completed', 'coalesced', 'cancelled']);
13
+ const ERRORS = {
14
+ 'invalid-routine': 'Routine must be a lowercase name of at most 64 characters.',
15
+ 'invalid-slot': 'Slot must be an integer timestamp within the past seven days or next five minutes.',
16
+ 'invalid-prompt': 'Prompt must be text no larger than 64 KiB and 128 KiB plus quotes when JSON-encoded.',
17
+ 'invalid-uuid': 'Automation identifier must be a canonical UUID.',
18
+ 'invalid-request': 'Automation request is invalid.',
19
+ 'invalid-status': 'Automation status is invalid.',
20
+ 'invalid-resolution': 'Automation completion receipt is invalid.',
21
+ conflict: 'This routine and slot already have a different prompt.',
22
+ full: 'Automation queue is full. Only old terminal requests may be pruned.',
23
+ 'unknown-request': 'Automation request does not exist.',
24
+ 'invalid-token': 'Completion token does not match the dispatched request.',
25
+ 'unsafe-storage': 'Automation storage must be private, owned by this user, and free of symlinks.',
26
+ 'corrupt-storage': 'Automation storage is corrupt. No requests were discarded.',
27
+ 'storage-unavailable': 'Automation storage is unavailable. No acceptance is confirmed.',
28
+ } as const;
29
+
30
+ export type AutomationUuid = `${string}-${string}-${string}-${string}-${string}`;
31
+ export type AutomationState = (typeof STATES)[number];
32
+ export type AutomationDetail = (typeof DETAILS)[number];
33
+ export type AutomationOutcome = 'completed' | 'blocked';
34
+ export type AutomationErrorCode = keyof typeof ERRORS;
35
+
36
+ export class AutomationError extends Error {
37
+ constructor(readonly code: AutomationErrorCode, options?: ErrorOptions) {
38
+ super(ERRORS[code], options);
39
+ this.name = 'AutomationError';
40
+ }
41
+ }
42
+
43
+ export interface AutomationRequest {
44
+ version: 1;
45
+ routine: string;
46
+ slot: number;
47
+ uuid: AutomationUuid;
48
+ createdAt: number;
49
+ prompt: string;
50
+ digest: string;
51
+ }
52
+
53
+ export interface AutomationStatus {
54
+ uuid: AutomationUuid;
55
+ state: AutomationState;
56
+ updatedAt: number;
57
+ token: AutomationUuid;
58
+ detail?: AutomationDetail;
59
+ }
60
+
61
+ export interface AutomationResolution {
62
+ uuid: AutomationUuid;
63
+ token: AutomationUuid;
64
+ outcome: AutomationOutcome;
65
+ createdAt: number;
66
+ }
67
+
68
+ export function assertRoutine(routine: unknown): asserts routine is string {
69
+ if (typeof routine !== 'string' || !AUTOMATION_ROUTINE_RE.test(routine)) throw new AutomationError('invalid-routine');
70
+ }
71
+
72
+ export function assertAutomationUuid(uuid: unknown): asserts uuid is AutomationUuid {
73
+ if (typeof uuid !== 'string' || !UUID_RE.test(uuid)) throw new AutomationError('invalid-uuid');
74
+ }
75
+
76
+ function timestamp(value: unknown): value is number {
77
+ return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 && value <= 8_640_000_000_000_000;
78
+ }
79
+
80
+ function promptValid(value: unknown): value is string {
81
+ return typeof value === 'string' && Buffer.byteLength(value, 'utf8') <= AUTOMATION_PROMPT_MAX && Buffer.byteLength(JSON.stringify(value), 'utf8') <= PROMPT_JSON_MAX;
82
+ }
83
+
84
+ function validSlot(slot: number, now: number): boolean {
85
+ return slot >= now - AUTOMATION_RETENTION_MS && slot <= now + 300_000;
86
+ }
87
+
88
+ function hash(text: string): string {
89
+ return createHash('sha256').update(text).digest('hex');
90
+ }
91
+
92
+ function requestUuid(routine: string, slot: number): AutomationUuid {
93
+ const bytes = createHash('sha256').update(`${routine}\n${slot}`).digest();
94
+ bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x80;
95
+ bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;
96
+ const hex = bytes.subarray(0, 16).toString('hex');
97
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
98
+ }
99
+
100
+ export function automationRequest(routine: string, slot: number, prompt: string, now = Date.now()): AutomationRequest {
101
+ assertRoutine(routine);
102
+ if (!timestamp(now) || !timestamp(slot) || !validSlot(slot, now)) throw new AutomationError('invalid-slot');
103
+ if (!promptValid(prompt)) throw new AutomationError('invalid-prompt');
104
+ return { version: 1, routine, slot, uuid: requestUuid(routine, slot), createdAt: now, prompt, digest: hash(prompt) };
105
+ }
106
+
107
+ function fields(raw: Record<string, unknown>, required: string[], optional: string[] = []): boolean {
108
+ return required.every((key) => Object.hasOwn(raw, key)) && Object.keys(raw).every((key) => required.includes(key) || optional.includes(key));
109
+ }
110
+
111
+ export function parseAutomationRequest(raw: unknown): AutomationRequest {
112
+ if (!isRecord(raw) || !fields(raw, ['version', 'routine', 'slot', 'uuid', 'createdAt', 'prompt', 'digest'])) throw new AutomationError('invalid-request');
113
+ assertRoutine(raw.routine);
114
+ assertAutomationUuid(raw.uuid);
115
+ if (raw.version !== 1 || !timestamp(raw.slot) || !timestamp(raw.createdAt) || !promptValid(raw.prompt)) throw new AutomationError('invalid-request');
116
+ if (!validSlot(raw.slot, raw.createdAt) || raw.uuid !== requestUuid(raw.routine, raw.slot) || raw.digest !== hash(raw.prompt)) throw new AutomationError('invalid-request');
117
+ return { version: 1, routine: raw.routine, slot: raw.slot, uuid: raw.uuid, createdAt: raw.createdAt, prompt: raw.prompt, digest: raw.digest };
118
+ }
119
+
120
+ export function parseAutomationStatus(raw: unknown): AutomationStatus {
121
+ if (!isRecord(raw) || !fields(raw, ['uuid', 'state', 'updatedAt', 'token'], ['detail'])) throw new AutomationError('invalid-status');
122
+ assertAutomationUuid(raw.uuid);
123
+ assertAutomationUuid(raw.token);
124
+ const state = STATES.find((entry) => entry === raw.state);
125
+ if (state === undefined || !timestamp(raw.updatedAt)) throw new AutomationError('invalid-status');
126
+ const detail = DETAILS.find((entry) => entry === raw.detail);
127
+ if (raw.detail !== undefined && detail === undefined) throw new AutomationError('invalid-status');
128
+ return { uuid: raw.uuid, state, updatedAt: raw.updatedAt, token: raw.token, ...(detail === undefined ? {} : { detail }) };
129
+ }
130
+
131
+ export function parseAutomationResolution(raw: unknown): AutomationResolution {
132
+ if (!isRecord(raw) || !fields(raw, ['uuid', 'token', 'outcome', 'createdAt'])) throw new AutomationError('invalid-resolution');
133
+ assertAutomationUuid(raw.uuid);
134
+ assertAutomationUuid(raw.token);
135
+ if (!timestamp(raw.createdAt) || (raw.outcome !== 'completed' && raw.outcome !== 'blocked')) throw new AutomationError('invalid-resolution');
136
+ return { uuid: raw.uuid, token: raw.token, outcome: raw.outcome, createdAt: raw.createdAt };
137
+ }
138
+
139
+ export function automationTerminal(state: AutomationState): boolean {
140
+ return TERMINAL.has(state);
141
+ }
@@ -0,0 +1,81 @@
1
+ import { isRecord } from './is-record.js';
2
+
3
+ export const CALL_NOTICE = 'notifications/metro/call';
4
+ export const CALL_STATE = 'notifications/metro/call_state';
5
+
6
+ export interface CallState {
7
+ route: CallRoute | null;
8
+ }
9
+
10
+ export interface CallRoute {
11
+ agentId: string;
12
+ line: string;
13
+ from: string;
14
+ callId: string;
15
+ generation: string;
16
+ }
17
+
18
+ export interface SpeechTarget {
19
+ callId: string;
20
+ generation: string;
21
+ sourceId: string;
22
+ }
23
+
24
+ export interface CallSource {
25
+ route: CallRoute;
26
+ sourceId: string;
27
+ }
28
+
29
+ export type SpeechStatus = 'accepted' | 'queued' | 'started' | 'completed' | 'interrupted' | 'failed';
30
+
31
+ export type CallNotice =
32
+ | { type: 'started'; route: CallRoute; sourceId: string }
33
+ | { type: 'heard'; route: CallRoute; sourceId: string; text: string }
34
+ | { type: 'ended'; route: CallRoute }
35
+ | { type: 'speech'; route: CallRoute; sourceId: string; actionId: string; status: SpeechStatus };
36
+
37
+ const filled = (value: unknown): value is string => typeof value === 'string' && value.length > 0 && value.length <= 2048;
38
+
39
+ export function callRoute(value: unknown): CallRoute | null {
40
+ if (!isRecord(value)) return null;
41
+ const { agentId, line, from, callId, generation } = value;
42
+ return filled(agentId) && filled(line) && filled(from) && filled(callId) && filled(generation)
43
+ ? { agentId, line, from, callId, generation }
44
+ : null;
45
+ }
46
+
47
+ export function callState(value: unknown): CallState | null {
48
+ if (!isRecord(value)) return null;
49
+ if (value.route === null) return { route: null };
50
+ const route = callRoute(value.route);
51
+ return route === null ? null : { route };
52
+ }
53
+
54
+ export function speechTarget(value: unknown): SpeechTarget | null {
55
+ if (!isRecord(value)) return null;
56
+ const { callId, generation, sourceId } = value;
57
+ return filled(callId) && filled(generation) && filled(sourceId) ? { callId, generation, sourceId } : null;
58
+ }
59
+
60
+ const STATUSES: readonly SpeechStatus[] = ['accepted', 'queued', 'started', 'completed', 'interrupted', 'failed'];
61
+
62
+ const speechStatus = (value: unknown): SpeechStatus | null => STATUSES.find((status) => status === value) ?? null;
63
+
64
+ function sourcedNotice(value: Record<string, unknown>, route: CallRoute, sourceId: string): CallNotice | null {
65
+ if (value.type === 'started') return { type: 'started', route, sourceId };
66
+ if (value.type === 'heard') return typeof value.text === 'string' && value.text.length <= 32_000 ? { type: 'heard', route, sourceId, text: value.text } : null;
67
+ if (value.type !== 'speech' || !filled(value.actionId)) return null;
68
+ const status = speechStatus(value.status);
69
+ return status === null ? null : { type: 'speech', route, sourceId, actionId: value.actionId, status };
70
+ }
71
+
72
+ export function callNotice(value: unknown): CallNotice | null {
73
+ if (!isRecord(value)) return null;
74
+ const route = callRoute(value.route);
75
+ if (route === null) return null;
76
+ if (value.type === 'ended') return { type: 'ended', route };
77
+ return filled(value.sourceId) ? sourcedNotice(value, route, value.sourceId) : null;
78
+ }
79
+
80
+ export const sameCall = (a: CallRoute, b: CallRoute): boolean =>
81
+ a.agentId === b.agentId && a.line === b.line && a.from === b.from && a.callId === b.callId && a.generation === b.generation;
@@ -0,0 +1,3 @@
1
+ const TOKEN_RE = /^sk-ant-oat01-[A-Za-z0-9_-]{32,512}$/;
2
+
3
+ export const isClaudeToken = (value: string): boolean => TOKEN_RE.test(value);
@@ -0,0 +1,21 @@
1
+ import { isRecord } from './is-record.js';
2
+
3
+ export const EFFORT_LEVELS = ['low', 'medium', 'high', 'max', 'asked'] as const;
4
+
5
+ export type EffortLevel = (typeof EFFORT_LEVELS)[number];
6
+
7
+ export interface RouteEffort {
8
+ main?: EffortLevel;
9
+ helpers?: EffortLevel;
10
+ }
11
+
12
+ export const EFFORT_DEFAULTS: Required<RouteEffort> = { main: 'low', helpers: 'max' };
13
+
14
+ export const isEffortLevel = (value: unknown): value is EffortLevel => typeof value === 'string' && (EFFORT_LEVELS as readonly string[]).includes(value);
15
+
16
+ export function readEffort(raw: unknown): RouteEffort {
17
+ if (!isRecord(raw)) return {};
18
+ return { ...(isEffortLevel(raw.main) ? { main: raw.main } : {}), ...(isEffortLevel(raw.helpers) ? { helpers: raw.helpers } : {}) };
19
+ }
20
+
21
+ export const effortSet = (effort: RouteEffort): boolean => effort.main !== undefined || effort.helpers !== undefined;
@@ -0,0 +1,7 @@
1
+ export interface Endpoint {
2
+ id: string;
3
+ webhookId?: string;
4
+ label: string;
5
+ secret?: string;
6
+ createdAt: string;
7
+ }