agent-relay 1.6.0 → 2.0.4

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 (1074) hide show
  1. package/.cursor/mcp.json +11 -0
  2. package/.gitleaks.toml +26 -0
  3. package/.mcp.json +11 -0
  4. package/.nvmrc +1 -1
  5. package/ARCHITECTURE.md +10 -10
  6. package/CHANGELOG.md +38 -0
  7. package/LICENSE +185 -17
  8. package/README.md +43 -5
  9. package/SESSION_HANDOFF.md +67 -0
  10. package/bin/relay-pty-darwin-arm64 +0 -0
  11. package/bin/relay-pty-darwin-x64 +0 -0
  12. package/bin/relay-pty-linux-x64 +0 -0
  13. package/deploy/workspace/entrypoint.sh +83 -11
  14. package/deploy/workspace/git-credential-relay +152 -27
  15. package/deploy/workspace/git-credential-relay.test.sh +230 -0
  16. package/dist/dashboard/out/404.html +1 -1
  17. package/dist/dashboard/out/_next/static/chunks/116-a883fca163f3a5bc.js +1 -0
  18. package/dist/dashboard/out/_next/static/chunks/320-900169c942e31422.js +1 -0
  19. package/dist/dashboard/out/_next/static/chunks/631-af51bad94027527a.js +1 -0
  20. package/dist/dashboard/out/_next/static/chunks/766-2aea80818f7eb0d8.js +1 -0
  21. package/dist/dashboard/out/_next/static/chunks/891-5cb1513eeb97a891.js +1 -0
  22. package/dist/dashboard/out/_next/static/chunks/app/app/page-2e525b1dcc790967.js +1 -0
  23. package/dist/dashboard/out/_next/static/chunks/app/page-4e64923d73c35bc9.js +1 -0
  24. package/dist/dashboard/out/_next/static/chunks/app/providers/page-e65a0010da6ea5be.js +1 -0
  25. package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-84161c802b020a1f.js +1 -0
  26. package/dist/dashboard/out/_next/static/css/99c2552394077586.css +1 -0
  27. package/dist/dashboard/out/app/onboarding.html +1 -1
  28. package/dist/dashboard/out/app/onboarding.txt +1 -1
  29. package/dist/dashboard/out/app.html +1 -1
  30. package/dist/dashboard/out/app.txt +2 -2
  31. package/dist/dashboard/out/cloud/link.html +1 -1
  32. package/dist/dashboard/out/cloud/link.txt +2 -2
  33. package/dist/dashboard/out/connect-repos.html +1 -1
  34. package/dist/dashboard/out/connect-repos.txt +1 -1
  35. package/dist/dashboard/out/history.html +1 -1
  36. package/dist/dashboard/out/history.txt +2 -2
  37. package/dist/dashboard/out/index.html +1 -1
  38. package/dist/dashboard/out/index.txt +2 -2
  39. package/dist/dashboard/out/login.html +2 -2
  40. package/dist/dashboard/out/login.txt +1 -1
  41. package/dist/dashboard/out/metrics.html +1 -1
  42. package/dist/dashboard/out/metrics.txt +2 -2
  43. package/dist/dashboard/out/pricing.html +3 -3
  44. package/dist/dashboard/out/pricing.txt +2 -2
  45. package/dist/dashboard/out/providers/setup/claude.html +1 -1
  46. package/dist/dashboard/out/providers/setup/claude.txt +2 -2
  47. package/dist/dashboard/out/providers/setup/codex.html +1 -1
  48. package/dist/dashboard/out/providers/setup/codex.txt +2 -2
  49. package/dist/dashboard/out/providers/setup/cursor.html +1 -0
  50. package/dist/dashboard/out/providers/setup/cursor.txt +8 -0
  51. package/dist/dashboard/out/providers.html +1 -1
  52. package/dist/dashboard/out/providers.txt +2 -2
  53. package/dist/dashboard/out/signup.html +2 -2
  54. package/dist/dashboard/out/signup.txt +1 -1
  55. package/dist/src/bridge/index.d.ts +8 -0
  56. package/dist/src/bridge/index.js +8 -0
  57. package/dist/src/cli/index.js +3091 -0
  58. package/dist/src/cloud/index.d.ts +8 -0
  59. package/dist/src/cloud/index.js +8 -0
  60. package/dist/src/config/relay-config.d.ts +5 -0
  61. package/dist/src/config/relay-config.js +5 -0
  62. package/dist/src/continuity/index.d.ts +5 -0
  63. package/dist/src/continuity/index.js +5 -0
  64. package/dist/src/daemon/index.d.ts +8 -0
  65. package/dist/src/daemon/index.js +9 -0
  66. package/dist/src/dashboard-server/index.d.ts +8 -0
  67. package/dist/src/dashboard-server/index.js +8 -0
  68. package/dist/src/hooks/index.d.ts +10 -0
  69. package/dist/src/hooks/index.js +10 -0
  70. package/dist/src/index.d.ts +13 -0
  71. package/dist/src/index.js +16 -0
  72. package/dist/src/memory/index.d.ts +5 -0
  73. package/dist/src/memory/index.js +5 -0
  74. package/dist/src/policy/index.d.ts +5 -0
  75. package/dist/src/policy/index.js +5 -0
  76. package/dist/src/protocol/index.d.ts +8 -0
  77. package/dist/src/protocol/index.js +8 -0
  78. package/dist/src/resiliency/index.d.ts +5 -0
  79. package/dist/src/resiliency/index.js +5 -0
  80. package/dist/src/shared/cli-auth-config.d.ts +5 -0
  81. package/dist/src/shared/cli-auth-config.js +5 -0
  82. package/dist/src/state/index.d.ts +5 -0
  83. package/dist/src/state/index.js +5 -0
  84. package/dist/src/storage/index.d.ts +8 -0
  85. package/dist/src/storage/index.js +8 -0
  86. package/dist/src/trajectory/index.d.ts +5 -0
  87. package/dist/src/trajectory/index.js +5 -0
  88. package/dist/src/utils/index.d.ts +5 -0
  89. package/dist/src/utils/index.js +5 -0
  90. package/dist/src/wrapper/index.d.ts +8 -0
  91. package/dist/src/wrapper/index.js +11 -0
  92. package/package.json +64 -19
  93. package/packages/api-types/dist/index.d.ts +21 -0
  94. package/packages/api-types/dist/index.js +22 -0
  95. package/packages/api-types/dist/schemas/agent.d.ts +259 -0
  96. package/packages/api-types/dist/schemas/agent.js +102 -0
  97. package/packages/api-types/dist/schemas/api.d.ts +290 -0
  98. package/packages/api-types/dist/schemas/api.js +162 -0
  99. package/packages/api-types/dist/schemas/decision.d.ts +230 -0
  100. package/packages/api-types/dist/schemas/decision.js +104 -0
  101. package/packages/api-types/dist/schemas/fleet.d.ts +615 -0
  102. package/packages/api-types/dist/schemas/fleet.js +71 -0
  103. package/packages/api-types/dist/schemas/history.d.ts +180 -0
  104. package/packages/api-types/dist/schemas/history.js +72 -0
  105. package/packages/api-types/dist/schemas/index.d.ts +14 -0
  106. package/packages/api-types/dist/schemas/index.js +22 -0
  107. package/packages/api-types/dist/schemas/message.d.ts +456 -0
  108. package/packages/api-types/dist/schemas/message.js +88 -0
  109. package/packages/api-types/dist/schemas/session.d.ts +60 -0
  110. package/packages/api-types/dist/schemas/session.js +36 -0
  111. package/packages/api-types/dist/schemas/task.d.ts +111 -0
  112. package/packages/api-types/dist/schemas/task.js +64 -0
  113. package/packages/api-types/package.json +61 -0
  114. package/packages/api-types/scripts/generate-openapi.ts +106 -0
  115. package/packages/bridge/dist/index.d.ts +8 -0
  116. package/packages/bridge/dist/index.js +9 -0
  117. package/packages/bridge/dist/multi-project-client.d.ts +99 -0
  118. package/packages/bridge/dist/multi-project-client.js +389 -0
  119. package/packages/bridge/dist/shadow-cli.js +75 -0
  120. package/packages/bridge/dist/spawner.d.ts +210 -0
  121. package/packages/bridge/dist/spawner.js +1278 -0
  122. package/packages/bridge/dist/types.d.ts +131 -0
  123. package/packages/bridge/dist/utils.d.ts +15 -0
  124. package/packages/bridge/dist/utils.js +60 -0
  125. package/packages/bridge/package.json +45 -0
  126. package/packages/cloud/dist/api/admin.js +225 -0
  127. package/packages/cloud/dist/api/billing.js +564 -0
  128. package/packages/cloud/dist/api/cli-pty-runner.d.ts +53 -0
  129. package/packages/cloud/dist/api/cli-pty-runner.js +193 -0
  130. package/packages/cloud/dist/api/codex-auth-helper.js +327 -0
  131. package/packages/cloud/dist/api/consensus.js +261 -0
  132. package/packages/cloud/dist/api/coordinators.js +750 -0
  133. package/packages/cloud/dist/api/daemons.js +535 -0
  134. package/packages/cloud/dist/api/generic-webhooks.js +129 -0
  135. package/packages/cloud/dist/api/github-app.js +223 -0
  136. package/packages/cloud/dist/api/monitoring.js +578 -0
  137. package/packages/cloud/dist/api/nango-auth.js +674 -0
  138. package/packages/cloud/dist/api/onboarding.d.ts +15 -0
  139. package/packages/cloud/dist/api/onboarding.js +679 -0
  140. package/packages/cloud/dist/api/policy.js +229 -0
  141. package/packages/cloud/dist/api/provider-env.d.ts +14 -0
  142. package/packages/cloud/dist/api/provider-env.js +75 -0
  143. package/packages/cloud/dist/api/providers.js +564 -0
  144. package/packages/cloud/dist/api/repos.js +577 -0
  145. package/packages/cloud/dist/api/sessions.d.ts +11 -0
  146. package/packages/cloud/dist/api/sessions.js +302 -0
  147. package/packages/cloud/dist/api/teams.js +281 -0
  148. package/packages/cloud/dist/api/test-helpers.js +745 -0
  149. package/packages/cloud/dist/api/workspaces.js +1799 -0
  150. package/packages/cloud/dist/billing/plans.js +245 -0
  151. package/packages/cloud/dist/config.d.ts +5 -0
  152. package/packages/cloud/dist/config.js +5 -0
  153. package/packages/cloud/dist/db/drizzle.d.ts +256 -0
  154. package/packages/cloud/dist/db/drizzle.js +1286 -0
  155. package/packages/cloud/dist/db/schema.d.ts +4873 -0
  156. package/packages/cloud/dist/db/schema.js +620 -0
  157. package/packages/cloud/dist/index.d.ts +11 -0
  158. package/packages/cloud/dist/index.js +38 -0
  159. package/packages/cloud/dist/provisioner/index.d.ts +207 -0
  160. package/packages/cloud/dist/provisioner/index.js +2114 -0
  161. package/packages/cloud/dist/server.js +1924 -0
  162. package/packages/cloud/dist/services/index.d.ts +17 -0
  163. package/packages/cloud/dist/services/index.js +25 -0
  164. package/packages/cloud/dist/services/intro-expiration.d.ts +60 -0
  165. package/packages/cloud/dist/services/intro-expiration.js +252 -0
  166. package/packages/cloud/dist/services/nango.d.ts +201 -0
  167. package/packages/cloud/dist/services/nango.js +392 -0
  168. package/packages/cloud/dist/services/persistence.d.ts +131 -0
  169. package/packages/cloud/dist/shims/consensus.d.ts +23 -0
  170. package/packages/cloud/dist/shims/consensus.js +5 -0
  171. package/packages/cloud/package.json +60 -0
  172. package/packages/config/dist/bridge-config.d.ts +52 -0
  173. package/packages/config/dist/bridge-config.js +143 -0
  174. package/packages/config/dist/bridge-utils.d.ts +30 -0
  175. package/packages/config/dist/bridge-utils.js +54 -0
  176. package/packages/config/dist/cli-auth-config.js +391 -0
  177. package/packages/config/dist/cloud-config.d.ts +75 -0
  178. package/packages/config/dist/cloud-config.js +109 -0
  179. package/packages/config/dist/index.d.ts +13 -0
  180. package/packages/config/dist/index.js +13 -0
  181. package/packages/config/dist/project-namespace.d.ts +77 -0
  182. package/packages/config/dist/project-namespace.js +288 -0
  183. package/packages/config/dist/relay-config.d.ts +33 -0
  184. package/packages/config/dist/relay-config.js +33 -0
  185. package/packages/config/dist/relay-file-writer.d.ts +200 -0
  186. package/packages/config/dist/relay-file-writer.js +407 -0
  187. package/packages/config/dist/schemas.d.ts +672 -0
  188. package/packages/config/dist/schemas.js +180 -0
  189. package/packages/config/dist/shadow-config.d.ts +87 -0
  190. package/packages/config/dist/trajectory-config.d.ts +102 -0
  191. package/packages/config/dist/trajectory-config.js +185 -0
  192. package/packages/config/package.json +103 -0
  193. package/packages/continuity/dist/index.d.ts +9 -0
  194. package/packages/continuity/dist/index.js +9 -0
  195. package/packages/continuity/dist/types.d.ts +180 -0
  196. package/packages/continuity/dist/types.js +2 -0
  197. package/packages/continuity/package.json +37 -0
  198. package/packages/daemon/dist/agent-manager.d.ts +134 -0
  199. package/packages/daemon/dist/agent-manager.js +578 -0
  200. package/packages/daemon/dist/agent-registry.js +213 -0
  201. package/packages/daemon/dist/api.d.ts +106 -0
  202. package/packages/daemon/dist/api.js +876 -0
  203. package/packages/daemon/dist/channel-membership-store.d.ts +55 -0
  204. package/packages/daemon/dist/channel-membership-store.js +176 -0
  205. package/packages/daemon/dist/cli-auth.d.ts +89 -0
  206. package/packages/daemon/dist/cli-auth.js +792 -0
  207. package/packages/daemon/dist/cloud-sync.d.ts +150 -0
  208. package/packages/daemon/dist/cloud-sync.js +446 -0
  209. package/packages/daemon/dist/connection.d.ts +130 -0
  210. package/packages/daemon/dist/connection.js +438 -0
  211. package/packages/daemon/dist/consensus-integration.js +371 -0
  212. package/packages/daemon/dist/delivery-tracker.d.ts +34 -0
  213. package/packages/daemon/dist/delivery-tracker.js +104 -0
  214. package/packages/daemon/dist/enhanced-features.d.ts +118 -0
  215. package/packages/daemon/dist/enhanced-features.js +176 -0
  216. package/packages/daemon/dist/index.d.ts +31 -0
  217. package/packages/daemon/dist/index.js +37 -0
  218. package/packages/daemon/dist/migrations/index.d.ts +73 -0
  219. package/packages/daemon/dist/migrations/index.js +241 -0
  220. package/packages/daemon/dist/orchestrator.d.ts +217 -0
  221. package/packages/daemon/dist/orchestrator.js +1143 -0
  222. package/packages/daemon/dist/relay-ledger.d.ts +261 -0
  223. package/packages/daemon/dist/relay-ledger.js +532 -0
  224. package/packages/daemon/dist/relay-watchdog.d.ts +125 -0
  225. package/packages/daemon/dist/relay-watchdog.js +611 -0
  226. package/packages/daemon/dist/repo-manager.js +384 -0
  227. package/packages/daemon/dist/router.d.ts +370 -0
  228. package/packages/daemon/dist/router.js +1437 -0
  229. package/packages/daemon/dist/server.d.ts +174 -0
  230. package/packages/daemon/dist/server.js +1001 -0
  231. package/packages/daemon/dist/spawn-manager.d.ts +78 -0
  232. package/packages/daemon/dist/spawn-manager.js +165 -0
  233. package/packages/daemon/dist/sync-queue.d.ts +116 -0
  234. package/packages/daemon/dist/sync-queue.js +361 -0
  235. package/packages/daemon/dist/types.d.ts +133 -0
  236. package/packages/daemon/dist/workspace-manager.js +314 -0
  237. package/packages/daemon/package.json +57 -0
  238. package/packages/dashboard/README.md +48 -0
  239. package/packages/dashboard/dist/health-worker-manager.d.ts +62 -0
  240. package/packages/dashboard/dist/health-worker-manager.js +144 -0
  241. package/packages/dashboard/dist/health-worker.d.ts +9 -0
  242. package/packages/dashboard/dist/health-worker.js +79 -0
  243. package/packages/dashboard/dist/index.d.ts +20 -0
  244. package/packages/dashboard/dist/index.js +19 -0
  245. package/packages/dashboard/dist/metrics.d.ts +105 -0
  246. package/packages/dashboard/dist/metrics.js +193 -0
  247. package/packages/dashboard/dist/needs-attention.d.ts +24 -0
  248. package/packages/dashboard/dist/needs-attention.js +78 -0
  249. package/packages/dashboard/dist/server.d.ts +25 -0
  250. package/packages/dashboard/dist/server.js +5179 -0
  251. package/packages/dashboard/dist/start.d.ts +6 -0
  252. package/packages/dashboard/dist/start.js +13 -0
  253. package/packages/dashboard/dist/types/threading.d.ts +8 -0
  254. package/packages/dashboard/dist/types/threading.js +2 -0
  255. package/packages/dashboard/dist/user-bridge.d.ts +154 -0
  256. package/packages/dashboard/dist/user-bridge.js +372 -0
  257. package/packages/dashboard/package.json +64 -0
  258. package/packages/dashboard/ui/app/app/onboarding/page.tsx +394 -0
  259. package/packages/dashboard/ui/app/app/page.tsx +667 -0
  260. package/packages/dashboard/ui/app/apple-icon.png +0 -0
  261. package/packages/dashboard/ui/app/cloud/link/page.tsx +464 -0
  262. package/packages/dashboard/ui/app/connect-repos/page.tsx +410 -0
  263. package/packages/dashboard/ui/app/favicon.png +0 -0
  264. package/packages/dashboard/ui/app/globals.css +59 -0
  265. package/packages/dashboard/ui/app/history/page.tsx +658 -0
  266. package/packages/dashboard/ui/app/layout.tsx +25 -0
  267. package/packages/dashboard/ui/app/login/page.tsx +280 -0
  268. package/packages/dashboard/ui/app/metrics/page.tsx +751 -0
  269. package/packages/dashboard/ui/app/page.tsx +59 -0
  270. package/packages/dashboard/ui/app/pricing/page.tsx +7 -0
  271. package/packages/dashboard/ui/app/providers/page.tsx +193 -0
  272. package/packages/dashboard/ui/app/providers/setup/[provider]/ProviderSetupClient.tsx +148 -0
  273. package/packages/dashboard/ui/app/providers/setup/[provider]/constants.ts +35 -0
  274. package/packages/dashboard/ui/app/providers/setup/[provider]/page.tsx +42 -0
  275. package/packages/dashboard/ui/app/signup/page.tsx +343 -0
  276. package/packages/dashboard/ui/index.ts +49 -0
  277. package/packages/dashboard/ui/landing/LandingPage.tsx +713 -0
  278. package/packages/dashboard/ui/landing/PricingPage.tsx +559 -0
  279. package/packages/dashboard/ui/landing/index.ts +6 -0
  280. package/packages/dashboard/ui/landing/styles.css +2850 -0
  281. package/packages/dashboard/ui/lib/agent-merge.ts +35 -0
  282. package/packages/dashboard/ui/lib/api.ts +1155 -0
  283. package/packages/dashboard/ui/lib/cloudApi.ts +876 -0
  284. package/packages/dashboard/ui/lib/colors.ts +218 -0
  285. package/packages/dashboard/ui/lib/hierarchy.ts +242 -0
  286. package/packages/dashboard/ui/lib/stuckDetection.ts +142 -0
  287. package/packages/dashboard/ui/next-env.d.ts +5 -0
  288. package/packages/dashboard/ui/next.config.js +41 -0
  289. package/packages/dashboard/ui/package-lock.json +2882 -0
  290. package/packages/dashboard/ui/package.json +33 -0
  291. package/packages/dashboard/ui/postcss.config.js +5 -0
  292. package/packages/dashboard/ui/react-components/ActivityFeed.tsx +216 -0
  293. package/packages/dashboard/ui/react-components/AddWorkspaceModal.tsx +170 -0
  294. package/packages/dashboard/ui/react-components/AgentCard.tsx +587 -0
  295. package/packages/dashboard/ui/react-components/AgentList.tsx +411 -0
  296. package/packages/dashboard/ui/react-components/AgentProfilePanel.tsx +564 -0
  297. package/packages/dashboard/ui/react-components/App.tsx +3447 -0
  298. package/packages/dashboard/ui/react-components/BillingPanel.tsx +922 -0
  299. package/packages/dashboard/ui/react-components/BillingResult.tsx +447 -0
  300. package/packages/dashboard/ui/react-components/BroadcastComposer.tsx +690 -0
  301. package/packages/dashboard/ui/react-components/ChannelAdminPanel.tsx +773 -0
  302. package/packages/dashboard/ui/react-components/ChannelBrowser.tsx +385 -0
  303. package/packages/dashboard/ui/react-components/ChannelChat.tsx +307 -0
  304. package/packages/dashboard/ui/react-components/ChannelSidebar.tsx +399 -0
  305. package/packages/dashboard/ui/react-components/CloudSessionProvider.tsx +130 -0
  306. package/packages/dashboard/ui/react-components/CommandPalette.tsx +815 -0
  307. package/packages/dashboard/ui/react-components/ConfirmationDialog.tsx +133 -0
  308. package/packages/dashboard/ui/react-components/ConversationHistory.tsx +518 -0
  309. package/packages/dashboard/ui/react-components/CoordinatorPanel.tsx +944 -0
  310. package/packages/dashboard/ui/react-components/DecisionQueue.tsx +717 -0
  311. package/packages/dashboard/ui/react-components/DirectMessageView.tsx +164 -0
  312. package/packages/dashboard/ui/react-components/FileAutocomplete.tsx +368 -0
  313. package/packages/dashboard/ui/react-components/FleetOverview.tsx +278 -0
  314. package/packages/dashboard/ui/react-components/LogViewer.tsx +310 -0
  315. package/packages/dashboard/ui/react-components/LogViewerPanel.tsx +482 -0
  316. package/packages/dashboard/ui/react-components/Logo.tsx +284 -0
  317. package/packages/dashboard/ui/react-components/MentionAutocomplete.tsx +384 -0
  318. package/packages/dashboard/ui/react-components/MessageList.tsx +649 -0
  319. package/packages/dashboard/ui/react-components/MessageSenderName.tsx +91 -0
  320. package/packages/dashboard/ui/react-components/MessageStatusIndicator.tsx +142 -0
  321. package/packages/dashboard/ui/react-components/NewConversationModal.tsx +400 -0
  322. package/packages/dashboard/ui/react-components/NotificationToast.tsx +488 -0
  323. package/packages/dashboard/ui/react-components/OnlineUsersIndicator.tsx +164 -0
  324. package/packages/dashboard/ui/react-components/Pagination.tsx +124 -0
  325. package/packages/dashboard/ui/react-components/PricingPlans.tsx +386 -0
  326. package/packages/dashboard/ui/react-components/ProjectList.tsx +625 -0
  327. package/packages/dashboard/ui/react-components/ProviderAuthFlow.tsx +843 -0
  328. package/packages/dashboard/ui/react-components/ProviderConnectionList.tsx +363 -0
  329. package/packages/dashboard/ui/react-components/ProvisioningProgress.tsx +730 -0
  330. package/packages/dashboard/ui/react-components/RepoAccessPanel.tsx +392 -0
  331. package/packages/dashboard/ui/react-components/ServerCard.tsx +202 -0
  332. package/packages/dashboard/ui/react-components/SessionExpiredModal.tsx +128 -0
  333. package/packages/dashboard/ui/react-components/SpawnModal.tsx +794 -0
  334. package/packages/dashboard/ui/react-components/TaskAssignmentUI.tsx +375 -0
  335. package/packages/dashboard/ui/react-components/TerminalProviderSetup.tsx +608 -0
  336. package/packages/dashboard/ui/react-components/ThemeProvider.tsx +325 -0
  337. package/packages/dashboard/ui/react-components/ThinkingIndicator.tsx +231 -0
  338. package/packages/dashboard/ui/react-components/ThreadList.tsx +198 -0
  339. package/packages/dashboard/ui/react-components/ThreadPanel.tsx +346 -0
  340. package/packages/dashboard/ui/react-components/TrajectoryViewer.tsx +698 -0
  341. package/packages/dashboard/ui/react-components/TypingIndicator.tsx +69 -0
  342. package/packages/dashboard/ui/react-components/UsageBanner.tsx +231 -0
  343. package/packages/dashboard/ui/react-components/UserProfilePanel.tsx +233 -0
  344. package/packages/dashboard/ui/react-components/WorkspaceContext.tsx +107 -0
  345. package/packages/dashboard/ui/react-components/WorkspaceSelector.tsx +234 -0
  346. package/packages/dashboard/ui/react-components/WorkspaceStatusIndicator.tsx +370 -0
  347. package/packages/dashboard/ui/react-components/XTermInteractive.tsx +510 -0
  348. package/packages/dashboard/ui/react-components/XTermLogViewer.tsx +719 -0
  349. package/packages/dashboard/ui/react-components/channels/ChannelDialogs.tsx +1411 -0
  350. package/packages/dashboard/ui/react-components/channels/ChannelHeader.tsx +317 -0
  351. package/packages/dashboard/ui/react-components/channels/ChannelMessageList.tsx +463 -0
  352. package/packages/dashboard/ui/react-components/channels/ChannelViewV1.tsx +146 -0
  353. package/packages/dashboard/ui/react-components/channels/MessageInput.tsx +288 -0
  354. package/packages/dashboard/ui/react-components/channels/SearchInput.tsx +172 -0
  355. package/packages/dashboard/ui/react-components/channels/SearchResults.tsx +336 -0
  356. package/packages/dashboard/ui/react-components/channels/api.ts +697 -0
  357. package/packages/dashboard/ui/react-components/channels/index.ts +76 -0
  358. package/packages/dashboard/ui/react-components/channels/mockApi.ts +344 -0
  359. package/packages/dashboard/ui/react-components/channels/types.ts +566 -0
  360. package/packages/dashboard/ui/react-components/hooks/index.ts +57 -0
  361. package/packages/dashboard/ui/react-components/hooks/useAgentLogs.ts +394 -0
  362. package/packages/dashboard/ui/react-components/hooks/useAgents.ts +127 -0
  363. package/packages/dashboard/ui/react-components/hooks/useBroadcastDedup.ts +86 -0
  364. package/packages/dashboard/ui/react-components/hooks/useChannelAdmin.ts +329 -0
  365. package/packages/dashboard/ui/react-components/hooks/useChannelBrowser.ts +239 -0
  366. package/packages/dashboard/ui/react-components/hooks/useChannelCommands.ts +138 -0
  367. package/packages/dashboard/ui/react-components/hooks/useChannels.ts +328 -0
  368. package/packages/dashboard/ui/react-components/hooks/useDebounce.ts +29 -0
  369. package/packages/dashboard/ui/react-components/hooks/useDirectMessage.ts +141 -0
  370. package/packages/dashboard/ui/react-components/hooks/useMessages.ts +309 -0
  371. package/packages/dashboard/ui/react-components/hooks/useOrchestrator.ts +364 -0
  372. package/packages/dashboard/ui/react-components/hooks/usePinnedAgents.ts +140 -0
  373. package/packages/dashboard/ui/react-components/hooks/usePresence.ts +340 -0
  374. package/packages/dashboard/ui/react-components/hooks/useRecentRepos.ts +130 -0
  375. package/packages/dashboard/ui/react-components/hooks/useSession.ts +209 -0
  376. package/packages/dashboard/ui/react-components/hooks/useTrajectory.ts +265 -0
  377. package/packages/dashboard/ui/react-components/hooks/useWebSocket.ts +169 -0
  378. package/packages/dashboard/ui/react-components/hooks/useWorkspaceMembers.ts +120 -0
  379. package/packages/dashboard/ui/react-components/hooks/useWorkspaceRepos.ts +73 -0
  380. package/packages/dashboard/ui/react-components/hooks/useWorkspaceStatus.ts +237 -0
  381. package/packages/dashboard/ui/react-components/index.ts +81 -0
  382. package/packages/dashboard/ui/react-components/layout/Header.tsx +355 -0
  383. package/packages/dashboard/ui/react-components/layout/RepoContextHeader.tsx +361 -0
  384. package/packages/dashboard/ui/react-components/layout/Sidebar.archive.test.tsx +126 -0
  385. package/packages/dashboard/ui/react-components/layout/Sidebar.test.tsx +691 -0
  386. package/packages/dashboard/ui/react-components/layout/Sidebar.tsx +930 -0
  387. package/packages/dashboard/ui/react-components/layout/index.ts +7 -0
  388. package/packages/dashboard/ui/react-components/settings/BillingSettingsPanel.tsx +564 -0
  389. package/packages/dashboard/ui/react-components/settings/SettingsPage.tsx +544 -0
  390. package/packages/dashboard/ui/react-components/settings/TeamSettingsPanel.tsx +560 -0
  391. package/packages/dashboard/ui/react-components/settings/WorkspaceSettingsPanel.tsx +1329 -0
  392. package/packages/dashboard/ui/react-components/settings/index.ts +11 -0
  393. package/packages/dashboard/ui/react-components/settings/types.ts +53 -0
  394. package/packages/dashboard/ui/react-components/utils/messageFormatting.tsx +370 -0
  395. package/packages/dashboard/ui/tailwind.config.js +148 -0
  396. package/packages/dashboard/ui/types/index.ts +304 -0
  397. package/packages/dashboard/ui/types/threading.ts +7 -0
  398. package/packages/dashboard/ui-dist/404.html +1 -0
  399. package/packages/dashboard/ui-dist/_next/static/0AsOfRemPXJmtynCKT-rx/_buildManifest.js +1 -0
  400. package/packages/dashboard/ui-dist/_next/static/0AsOfRemPXJmtynCKT-rx/_ssgManifest.js +1 -0
  401. package/packages/dashboard/ui-dist/_next/static/72btMIJ64BCAB4UgVkpaq/_buildManifest.js +1 -0
  402. package/packages/dashboard/ui-dist/_next/static/72btMIJ64BCAB4UgVkpaq/_ssgManifest.js +1 -0
  403. package/packages/dashboard/ui-dist/_next/static/chunks/116-a883fca163f3a5bc.js +1 -0
  404. package/packages/dashboard/ui-dist/_next/static/chunks/117-c8afed19e821a35d.js +2 -0
  405. package/packages/dashboard/ui-dist/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
  406. package/packages/dashboard/ui-dist/_next/static/chunks/320-900169c942e31422.js +1 -0
  407. package/packages/dashboard/ui-dist/_next/static/chunks/532-bace199897eeab37.js +9 -0
  408. package/packages/dashboard/ui-dist/_next/static/chunks/631-af51bad94027527a.js +1 -0
  409. package/packages/dashboard/ui-dist/_next/static/chunks/648-acb2ff9f77cbfbd3.js +1 -0
  410. package/packages/dashboard/ui-dist/_next/static/chunks/677-7323947c23b35979.js +1 -0
  411. package/packages/dashboard/ui-dist/_next/static/chunks/766-2aea80818f7eb0d8.js +1 -0
  412. package/packages/dashboard/ui-dist/_next/static/chunks/83-4f08122d4e7e79a6.js +1 -0
  413. package/packages/dashboard/ui-dist/_next/static/chunks/847-f1f467060f32afff.js +1 -0
  414. package/packages/dashboard/ui-dist/_next/static/chunks/891-5cb1513eeb97a891.js +1 -0
  415. package/packages/dashboard/ui-dist/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +1 -0
  416. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +1 -0
  417. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/onboarding/page-f746f29e01fffc43.js +1 -0
  418. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/page-2e525b1dcc790967.js +1 -0
  419. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/page-44813aa26ad19681.js +1 -0
  420. package/packages/dashboard/ui-dist/_next/static/chunks/app/cloud/link/page-5011ae044b90449d.js +1 -0
  421. package/packages/dashboard/ui-dist/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +1 -0
  422. package/packages/dashboard/ui-dist/_next/static/chunks/app/connect-repos/page-03ac6f35a6654ea6.js +1 -0
  423. package/packages/dashboard/ui-dist/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +1 -0
  424. package/packages/dashboard/ui-dist/_next/static/chunks/app/history/page-9965d2483011b846.js +1 -0
  425. package/packages/dashboard/ui-dist/_next/static/chunks/app/history/page-b2ce7c96ed0931da.js +1 -0
  426. package/packages/dashboard/ui-dist/_next/static/chunks/app/layout-6b91e33784c20610.js +1 -0
  427. package/packages/dashboard/ui-dist/_next/static/chunks/app/layout-c0d118c0f92d969c.js +1 -0
  428. package/packages/dashboard/ui-dist/_next/static/chunks/app/login/page-6ec54eee75877971.js +1 -0
  429. package/packages/dashboard/ui-dist/_next/static/chunks/app/login/page-a0ca6f7ca6a100b8.js +1 -0
  430. package/packages/dashboard/ui-dist/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +1 -0
  431. package/packages/dashboard/ui-dist/_next/static/chunks/app/metrics/page-bf2cb1e5915bc92d.js +1 -0
  432. package/packages/dashboard/ui-dist/_next/static/chunks/app/page-4e64923d73c35bc9.js +1 -0
  433. package/packages/dashboard/ui-dist/_next/static/chunks/app/page-7993778218818ace.js +1 -0
  434. package/packages/dashboard/ui-dist/_next/static/chunks/app/pricing/page-0efa024c28ba4597.js +1 -0
  435. package/packages/dashboard/ui-dist/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +1 -0
  436. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-bcf46064ac4474ce.js +1 -0
  437. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-e65a0010da6ea5be.js +1 -0
  438. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +1 -0
  439. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/setup/[provider]/page-84161c802b020a1f.js +1 -0
  440. package/packages/dashboard/ui-dist/_next/static/chunks/app/signup/page-18a4665665f6be11.js +1 -0
  441. package/packages/dashboard/ui-dist/_next/static/chunks/app/signup/page-1ede2205b58649ca.js +1 -0
  442. package/packages/dashboard/ui-dist/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
  443. package/packages/dashboard/ui-dist/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +1 -0
  444. package/packages/dashboard/ui-dist/_next/static/chunks/framework-f66176bb897dc684.js +1 -0
  445. package/packages/dashboard/ui-dist/_next/static/chunks/main-5a40a5ae29646e1b.js +1 -0
  446. package/packages/dashboard/ui-dist/_next/static/chunks/main-app-6e8e8d3ef4e0192a.js +1 -0
  447. package/packages/dashboard/ui-dist/_next/static/chunks/main-app-fdbeb09028f57c9f.js +1 -0
  448. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
  449. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
  450. package/packages/dashboard/ui-dist/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  451. package/packages/dashboard/ui-dist/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
  452. package/packages/dashboard/ui-dist/_next/static/clUN2n0bz9HCjKI0qlOxU/_buildManifest.js +1 -0
  453. package/packages/dashboard/ui-dist/_next/static/clUN2n0bz9HCjKI0qlOxU/_ssgManifest.js +1 -0
  454. package/packages/dashboard/ui-dist/_next/static/css/4034f236dd1a3178.css +1 -0
  455. package/packages/dashboard/ui-dist/_next/static/css/99c2552394077586.css +1 -0
  456. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-128.png +0 -0
  457. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-256.png +0 -0
  458. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-32.png +0 -0
  459. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-512.png +0 -0
  460. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-64.png +0 -0
  461. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo.svg +45 -0
  462. package/packages/dashboard/ui-dist/alt-logos/logo.svg +38 -0
  463. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-128.png +0 -0
  464. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-256.png +0 -0
  465. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-32.png +0 -0
  466. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-512.png +0 -0
  467. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-64.png +0 -0
  468. package/packages/dashboard/ui-dist/alt-logos/monogram-logo.svg +38 -0
  469. package/packages/dashboard/ui-dist/app/onboarding.html +1 -0
  470. package/packages/dashboard/ui-dist/app/onboarding.txt +7 -0
  471. package/packages/dashboard/ui-dist/app.html +1 -0
  472. package/packages/dashboard/ui-dist/app.txt +7 -0
  473. package/packages/dashboard/ui-dist/apple-icon.png +0 -0
  474. package/packages/dashboard/ui-dist/cloud/link.html +1 -0
  475. package/packages/dashboard/ui-dist/cloud/link.txt +7 -0
  476. package/packages/dashboard/ui-dist/connect-repos.html +1 -0
  477. package/packages/dashboard/ui-dist/connect-repos.txt +7 -0
  478. package/packages/dashboard/ui-dist/history.html +1 -0
  479. package/packages/dashboard/ui-dist/history.txt +7 -0
  480. package/packages/dashboard/ui-dist/index.html +1 -0
  481. package/packages/dashboard/ui-dist/index.txt +7 -0
  482. package/packages/dashboard/ui-dist/login.html +5 -0
  483. package/packages/dashboard/ui-dist/login.txt +7 -0
  484. package/packages/dashboard/ui-dist/metrics.html +1 -0
  485. package/packages/dashboard/ui-dist/metrics.txt +7 -0
  486. package/packages/dashboard/ui-dist/pricing.html +13 -0
  487. package/packages/dashboard/ui-dist/pricing.txt +7 -0
  488. package/packages/dashboard/ui-dist/providers/setup/claude.html +1 -0
  489. package/packages/dashboard/ui-dist/providers/setup/claude.txt +8 -0
  490. package/packages/dashboard/ui-dist/providers/setup/codex.html +1 -0
  491. package/packages/dashboard/ui-dist/providers/setup/codex.txt +8 -0
  492. package/packages/dashboard/ui-dist/providers/setup/cursor.html +1 -0
  493. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +8 -0
  494. package/packages/dashboard/ui-dist/providers.html +1 -0
  495. package/packages/dashboard/ui-dist/providers.txt +7 -0
  496. package/packages/dashboard/ui-dist/signup.html +6 -0
  497. package/packages/dashboard/ui-dist/signup.txt +7 -0
  498. package/packages/dashboard-server/dist/health-worker-manager.d.ts +62 -0
  499. package/packages/dashboard-server/dist/health-worker-manager.js +144 -0
  500. package/packages/dashboard-server/dist/health-worker.d.ts +9 -0
  501. package/packages/dashboard-server/dist/health-worker.js +79 -0
  502. package/packages/dashboard-server/dist/index.d.ts +18 -0
  503. package/packages/dashboard-server/dist/index.js +17 -0
  504. package/packages/dashboard-server/dist/server.js +5099 -0
  505. package/packages/dashboard-server/dist/start.js +13 -0
  506. package/packages/dashboard-server/dist/types/threading.d.ts +8 -0
  507. package/packages/dashboard-server/dist/types/threading.js +2 -0
  508. package/packages/dashboard-server/dist/user-bridge.d.ts +154 -0
  509. package/packages/dashboard-server/dist/user-bridge.js +372 -0
  510. package/packages/dashboard-server/package.json +55 -0
  511. package/packages/hooks/dist/browser.d.ts +2 -0
  512. package/packages/hooks/dist/browser.js +3 -0
  513. package/packages/hooks/dist/index.d.ts +11 -0
  514. package/packages/hooks/dist/index.js +11 -0
  515. package/packages/hooks/dist/registry.js +476 -0
  516. package/packages/hooks/dist/trajectory-hooks.js +183 -0
  517. package/packages/hooks/dist/types.d.ts +285 -0
  518. package/packages/hooks/dist/types.js +10 -0
  519. package/packages/hooks/package.json +57 -0
  520. package/packages/mcp/LICENSE +190 -0
  521. package/packages/mcp/README.md +330 -0
  522. package/packages/mcp/SPEC.md +1922 -0
  523. package/packages/mcp/STAFFING_PLAN.md +294 -0
  524. package/packages/mcp/dist/bin.d.ts +12 -0
  525. package/packages/mcp/dist/bin.js +127 -0
  526. package/packages/mcp/dist/client.d.ts +68 -0
  527. package/packages/mcp/dist/client.js +115 -0
  528. package/packages/mcp/dist/cloud.d.ts +108 -0
  529. package/packages/mcp/dist/cloud.js +328 -0
  530. package/packages/mcp/dist/errors.d.ts +27 -0
  531. package/packages/mcp/dist/errors.js +48 -0
  532. package/packages/mcp/dist/index.d.ts +10 -0
  533. package/packages/mcp/dist/index.js +16 -0
  534. package/packages/mcp/dist/install-cli.d.ts +35 -0
  535. package/packages/mcp/dist/install-cli.js +157 -0
  536. package/packages/mcp/dist/install.d.ts +101 -0
  537. package/packages/mcp/dist/install.js +398 -0
  538. package/packages/mcp/dist/prompts/index.d.ts +2 -0
  539. package/packages/mcp/dist/prompts/index.js +2 -0
  540. package/packages/mcp/dist/prompts/protocol.d.ts +11 -0
  541. package/packages/mcp/dist/prompts/protocol.js +168 -0
  542. package/packages/mcp/dist/resources/agents.d.ts +11 -0
  543. package/packages/mcp/dist/resources/agents.js +17 -0
  544. package/packages/mcp/dist/resources/inbox.d.ts +11 -0
  545. package/packages/mcp/dist/resources/inbox.js +17 -0
  546. package/packages/mcp/dist/resources/index.d.ts +4 -0
  547. package/packages/mcp/dist/resources/index.js +4 -0
  548. package/packages/mcp/dist/resources/project.d.ts +11 -0
  549. package/packages/mcp/dist/resources/project.js +21 -0
  550. package/packages/mcp/dist/server.d.ts +19 -0
  551. package/packages/mcp/dist/server.js +215 -0
  552. package/packages/mcp/dist/simple.d.ts +173 -0
  553. package/packages/mcp/dist/simple.js +120 -0
  554. package/packages/mcp/dist/tools/index.d.ts +10 -0
  555. package/packages/mcp/dist/tools/index.js +10 -0
  556. package/packages/mcp/dist/tools/relay-health.d.ts +23 -0
  557. package/packages/mcp/dist/tools/relay-health.js +138 -0
  558. package/packages/mcp/dist/tools/relay-inbox.d.ts +26 -0
  559. package/packages/mcp/dist/tools/relay-inbox.js +58 -0
  560. package/packages/mcp/dist/tools/relay-logs.d.ts +20 -0
  561. package/packages/mcp/dist/tools/relay-logs.js +88 -0
  562. package/packages/mcp/dist/tools/relay-metrics.d.ts +20 -0
  563. package/packages/mcp/dist/tools/relay-metrics.js +135 -0
  564. package/packages/mcp/dist/tools/relay-release.d.ts +20 -0
  565. package/packages/mcp/dist/tools/relay-release.js +44 -0
  566. package/packages/mcp/dist/tools/relay-send.d.ts +29 -0
  567. package/packages/mcp/dist/tools/relay-send.js +71 -0
  568. package/packages/mcp/dist/tools/relay-spawn.d.ts +36 -0
  569. package/packages/mcp/dist/tools/relay-spawn.js +73 -0
  570. package/packages/mcp/dist/tools/relay-status.d.ts +11 -0
  571. package/packages/mcp/dist/tools/relay-status.js +43 -0
  572. package/packages/mcp/dist/tools/relay-who.d.ts +20 -0
  573. package/packages/mcp/dist/tools/relay-who.js +47 -0
  574. package/packages/mcp/package.json +69 -0
  575. package/packages/memory/dist/memory-hooks.d.ts +60 -0
  576. package/packages/memory/package.json +40 -0
  577. package/packages/policy/dist/agent-policy.js +665 -0
  578. package/packages/policy/dist/index.d.ts +12 -0
  579. package/packages/policy/dist/index.js +12 -0
  580. package/packages/policy/package.json +40 -0
  581. package/packages/protocol/dist/channels.d.ts +137 -0
  582. package/packages/protocol/dist/channels.js +154 -0
  583. package/packages/protocol/dist/framing.d.ts +80 -0
  584. package/packages/protocol/dist/framing.js +206 -0
  585. package/packages/protocol/dist/index.d.ts +5 -0
  586. package/packages/protocol/dist/index.js +5 -0
  587. package/packages/protocol/dist/relay-pty-schemas.d.ts +258 -0
  588. package/packages/protocol/dist/types.d.ts +341 -0
  589. package/packages/protocol/dist/types.js +8 -0
  590. package/packages/protocol/package.json +61 -0
  591. package/packages/resiliency/dist/memory-monitor.js +599 -0
  592. package/packages/resiliency/dist/provider-context.d.ts +100 -0
  593. package/packages/resiliency/package.json +38 -0
  594. package/packages/sdk/README.md +288 -0
  595. package/packages/sdk/dist/client.d.ts +277 -0
  596. package/packages/sdk/dist/client.js +802 -0
  597. package/packages/sdk/dist/discovery.d.ts +29 -0
  598. package/packages/sdk/dist/discovery.js +126 -0
  599. package/packages/sdk/dist/index.d.ts +33 -0
  600. package/packages/sdk/dist/index.js +38 -0
  601. package/packages/sdk/dist/protocol/framing.d.ts +80 -0
  602. package/packages/sdk/dist/protocol/framing.js +206 -0
  603. package/packages/sdk/dist/protocol/index.d.ts +6 -0
  604. package/packages/sdk/dist/protocol/index.js +6 -0
  605. package/packages/sdk/dist/protocol/types.d.ts +341 -0
  606. package/packages/sdk/dist/protocol/types.js +8 -0
  607. package/packages/sdk/dist/standalone.d.ts +87 -0
  608. package/packages/sdk/dist/standalone.js +127 -0
  609. package/packages/sdk/package.json +80 -0
  610. package/packages/spawner/API.md +256 -0
  611. package/packages/spawner/dist/index.d.ts +8 -0
  612. package/packages/spawner/dist/index.js +8 -0
  613. package/packages/spawner/dist/types.d.ts +552 -0
  614. package/packages/spawner/dist/types.js +193 -0
  615. package/packages/spawner/package.json +47 -0
  616. package/packages/state/dist/agent-state.js +120 -0
  617. package/packages/state/dist/index.d.ts +8 -0
  618. package/packages/state/dist/index.js +8 -0
  619. package/packages/state/package.json +37 -0
  620. package/packages/storage/dist/adapter.d.ts +156 -0
  621. package/packages/storage/dist/batched-sqlite-adapter.d.ts +75 -0
  622. package/packages/storage/dist/batched-sqlite-adapter.js +189 -0
  623. package/packages/storage/dist/index.d.ts +5 -0
  624. package/packages/storage/dist/index.js +6 -0
  625. package/packages/storage/dist/sqlite-adapter.d.ts +113 -0
  626. package/packages/storage/dist/sqlite-adapter.js +752 -0
  627. package/packages/storage/package.json +74 -0
  628. package/packages/trajectory/dist/index.d.ts +2 -0
  629. package/packages/trajectory/dist/index.js +2 -0
  630. package/packages/trajectory/dist/integration.js +987 -0
  631. package/packages/trajectory/package.json +40 -0
  632. package/packages/user-directory/dist/index.d.ts +7 -0
  633. package/packages/user-directory/dist/index.js +7 -0
  634. package/packages/user-directory/dist/user-directory.d.ts +121 -0
  635. package/packages/user-directory/dist/user-directory.js +267 -0
  636. package/packages/user-directory/package.json +40 -0
  637. package/packages/utils/dist/command-resolver.js +80 -0
  638. package/packages/utils/dist/error-tracking.d.ts +103 -0
  639. package/packages/utils/dist/error-tracking.js +149 -0
  640. package/packages/utils/dist/index.d.ts +9 -0
  641. package/packages/utils/dist/index.js +9 -0
  642. package/packages/utils/dist/model-mapping.d.ts +28 -0
  643. package/packages/utils/dist/model-mapping.js +55 -0
  644. package/packages/utils/package.json +80 -0
  645. package/packages/wrapper/dist/__fixtures__/claude-outputs.d.ts +49 -0
  646. package/packages/wrapper/dist/__fixtures__/claude-outputs.js +443 -0
  647. package/packages/wrapper/dist/__fixtures__/codex-outputs.d.ts +9 -0
  648. package/packages/wrapper/dist/__fixtures__/codex-outputs.js +94 -0
  649. package/packages/wrapper/dist/__fixtures__/gemini-outputs.d.ts +19 -0
  650. package/packages/wrapper/dist/__fixtures__/gemini-outputs.js +144 -0
  651. package/packages/wrapper/dist/__fixtures__/index.d.ts +68 -0
  652. package/packages/wrapper/dist/__fixtures__/index.js +44 -0
  653. package/packages/wrapper/dist/base-wrapper.d.ts +249 -0
  654. package/packages/wrapper/dist/base-wrapper.js +614 -0
  655. package/packages/wrapper/dist/client.d.ts +254 -0
  656. package/packages/wrapper/dist/client.js +801 -0
  657. package/packages/wrapper/dist/id-generator.d.ts +35 -0
  658. package/packages/wrapper/dist/id-generator.js +60 -0
  659. package/packages/wrapper/dist/idle-detector.d.ts +110 -0
  660. package/packages/wrapper/dist/idle-detector.js +304 -0
  661. package/packages/wrapper/dist/index.d.ts +37 -0
  662. package/packages/wrapper/dist/index.js +47 -0
  663. package/packages/wrapper/dist/parser.d.ts +236 -0
  664. package/packages/wrapper/dist/parser.js +1238 -0
  665. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +409 -0
  666. package/packages/wrapper/dist/relay-pty-orchestrator.js +1930 -0
  667. package/packages/wrapper/dist/shared.d.ts +226 -0
  668. package/packages/wrapper/dist/shared.js +381 -0
  669. package/packages/wrapper/dist/stuck-detector.d.ts +161 -0
  670. package/packages/wrapper/dist/stuck-detector.js +402 -0
  671. package/packages/wrapper/dist/tmux-wrapper.d.ts +352 -0
  672. package/packages/wrapper/dist/tmux-wrapper.js +1800 -0
  673. package/packages/wrapper/dist/trajectory-integration.d.ts +292 -0
  674. package/packages/wrapper/dist/trajectory-integration.js +979 -0
  675. package/packages/wrapper/dist/wrapper-types.d.ts +41 -0
  676. package/packages/wrapper/dist/wrapper-types.js +7 -0
  677. package/packages/wrapper/package.json +63 -0
  678. package/scripts/setup-stripe-products.ts +312 -0
  679. package/scripts/stress-test-orchestrator-integration.mts +1366 -0
  680. package/scripts/stress-test-orchestrator.mjs +584 -0
  681. package/scripts/stress-test-relay-pty.sh +452 -0
  682. package/scripts/verify-schema.js +1 -1
  683. package/turbo.json +37 -0
  684. package/bin/relay-pty +0 -0
  685. package/dist/bridge/config.d.ts +0 -41
  686. package/dist/bridge/config.js +0 -143
  687. package/dist/bridge/index.d.ts +0 -10
  688. package/dist/bridge/index.js +0 -10
  689. package/dist/bridge/multi-project-client.d.ts +0 -99
  690. package/dist/bridge/multi-project-client.js +0 -389
  691. package/dist/bridge/shadow-cli.js +0 -75
  692. package/dist/bridge/shadow-config.d.ts +0 -87
  693. package/dist/bridge/spawner.d.ts +0 -186
  694. package/dist/bridge/spawner.js +0 -920
  695. package/dist/bridge/types.d.ts +0 -129
  696. package/dist/bridge/utils.d.ts +0 -30
  697. package/dist/bridge/utils.js +0 -54
  698. package/dist/cli/index.js +0 -2784
  699. package/dist/cloud/api/admin.js +0 -225
  700. package/dist/cloud/api/billing.js +0 -564
  701. package/dist/cloud/api/cli-pty-runner.d.ts +0 -54
  702. package/dist/cloud/api/cli-pty-runner.js +0 -119
  703. package/dist/cloud/api/codex-auth-helper.js +0 -327
  704. package/dist/cloud/api/consensus.js +0 -259
  705. package/dist/cloud/api/coordinators.js +0 -749
  706. package/dist/cloud/api/daemons.js +0 -535
  707. package/dist/cloud/api/generic-webhooks.js +0 -129
  708. package/dist/cloud/api/github-app.js +0 -223
  709. package/dist/cloud/api/monitoring.js +0 -578
  710. package/dist/cloud/api/nango-auth.js +0 -658
  711. package/dist/cloud/api/onboarding.d.ts +0 -15
  712. package/dist/cloud/api/onboarding.js +0 -666
  713. package/dist/cloud/api/policy.js +0 -229
  714. package/dist/cloud/api/provider-env.d.ts +0 -5
  715. package/dist/cloud/api/provider-env.js +0 -27
  716. package/dist/cloud/api/providers.js +0 -511
  717. package/dist/cloud/api/repos.js +0 -576
  718. package/dist/cloud/api/teams.js +0 -279
  719. package/dist/cloud/api/test-helpers.js +0 -745
  720. package/dist/cloud/api/workspaces.js +0 -1783
  721. package/dist/cloud/billing/plans.js +0 -245
  722. package/dist/cloud/config.d.ts +0 -75
  723. package/dist/cloud/config.js +0 -109
  724. package/dist/cloud/db/drizzle.d.ts +0 -246
  725. package/dist/cloud/db/drizzle.js +0 -1249
  726. package/dist/cloud/db/schema.d.ts +0 -4854
  727. package/dist/cloud/db/schema.js +0 -610
  728. package/dist/cloud/index.d.ts +0 -11
  729. package/dist/cloud/index.js +0 -38
  730. package/dist/cloud/provisioner/index.d.ts +0 -207
  731. package/dist/cloud/provisioner/index.js +0 -2069
  732. package/dist/cloud/server.js +0 -1599
  733. package/dist/cloud/services/index.d.ts +0 -17
  734. package/dist/cloud/services/index.js +0 -25
  735. package/dist/cloud/services/intro-expiration.d.ts +0 -55
  736. package/dist/cloud/services/intro-expiration.js +0 -211
  737. package/dist/cloud/services/nango.d.ts +0 -199
  738. package/dist/cloud/services/nango.js +0 -382
  739. package/dist/cloud/services/persistence.d.ts +0 -131
  740. package/dist/config/relay-config.d.ts +0 -23
  741. package/dist/config/relay-config.js +0 -23
  742. package/dist/continuity/index.d.ts +0 -45
  743. package/dist/continuity/index.js +0 -48
  744. package/dist/continuity/types.d.ts +0 -180
  745. package/dist/continuity/types.js +0 -9
  746. package/dist/daemon/agent-manager.d.ts +0 -134
  747. package/dist/daemon/agent-manager.js +0 -564
  748. package/dist/daemon/agent-registry.js +0 -213
  749. package/dist/daemon/api.d.ts +0 -83
  750. package/dist/daemon/api.js +0 -780
  751. package/dist/daemon/channel-membership-store.d.ts +0 -48
  752. package/dist/daemon/channel-membership-store.js +0 -149
  753. package/dist/daemon/cli-auth.d.ts +0 -82
  754. package/dist/daemon/cli-auth.js +0 -700
  755. package/dist/daemon/cloud-sync.d.ts +0 -150
  756. package/dist/daemon/cloud-sync.js +0 -424
  757. package/dist/daemon/connection.d.ts +0 -130
  758. package/dist/daemon/connection.js +0 -438
  759. package/dist/daemon/consensus-integration.js +0 -371
  760. package/dist/daemon/delivery-tracker.d.ts +0 -34
  761. package/dist/daemon/delivery-tracker.js +0 -104
  762. package/dist/daemon/enhanced-features.d.ts +0 -118
  763. package/dist/daemon/enhanced-features.js +0 -178
  764. package/dist/daemon/index.d.ts +0 -14
  765. package/dist/daemon/index.js +0 -17
  766. package/dist/daemon/orchestrator.d.ts +0 -157
  767. package/dist/daemon/orchestrator.js +0 -792
  768. package/dist/daemon/repo-manager.js +0 -384
  769. package/dist/daemon/router.d.ts +0 -358
  770. package/dist/daemon/router.js +0 -1333
  771. package/dist/daemon/server.d.ts +0 -159
  772. package/dist/daemon/server.js +0 -788
  773. package/dist/daemon/services/browser-testing.d.ts +0 -88
  774. package/dist/daemon/services/browser-testing.js +0 -244
  775. package/dist/daemon/services/container-spawner.d.ts +0 -135
  776. package/dist/daemon/services/container-spawner.js +0 -313
  777. package/dist/daemon/sync-queue.d.ts +0 -116
  778. package/dist/daemon/sync-queue.js +0 -361
  779. package/dist/daemon/types.d.ts +0 -131
  780. package/dist/daemon/user-directory.d.ts +0 -111
  781. package/dist/daemon/user-directory.js +0 -233
  782. package/dist/daemon/workspace-manager.js +0 -314
  783. package/dist/dashboard/out/_next/static/chunks/116-eacf84a131b80db9.js +0 -1
  784. package/dist/dashboard/out/_next/static/chunks/64-f4268c2ac6f4d7d4.js +0 -1
  785. package/dist/dashboard/out/_next/static/chunks/766-aa7c8c9900ff5f53.js +0 -1
  786. package/dist/dashboard/out/_next/static/chunks/891-a024fbe4b619cf6f.js +0 -1
  787. package/dist/dashboard/out/_next/static/chunks/app/app/page-ffad986adfcc8b31.js +0 -1
  788. package/dist/dashboard/out/_next/static/chunks/app/page-671037943b2f2e43.js +0 -1
  789. package/dist/dashboard/out/_next/static/chunks/app/providers/page-57cbd738c6a73859.js +0 -1
  790. package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-5ab0854472b402b0.js +0 -1
  791. package/dist/dashboard/out/_next/static/css/8f9ed310f454e5a5.css +0 -1
  792. package/dist/dashboard-server/server.js +0 -4806
  793. package/dist/dashboard-server/start.js +0 -13
  794. package/dist/dashboard-server/user-bridge.d.ts +0 -138
  795. package/dist/dashboard-server/user-bridge.js +0 -348
  796. package/dist/hooks/index.d.ts +0 -10
  797. package/dist/hooks/index.js +0 -10
  798. package/dist/hooks/registry.js +0 -476
  799. package/dist/hooks/trajectory-hooks.js +0 -183
  800. package/dist/hooks/types.d.ts +0 -284
  801. package/dist/hooks/types.js +0 -8
  802. package/dist/index.d.ts +0 -13
  803. package/dist/index.js +0 -16
  804. package/dist/memory/memory-hooks.d.ts +0 -60
  805. package/dist/policy/agent-policy.js +0 -665
  806. package/dist/protocol/channels.d.ts +0 -211
  807. package/dist/protocol/channels.js +0 -154
  808. package/dist/protocol/framing.d.ts +0 -94
  809. package/dist/protocol/framing.js +0 -240
  810. package/dist/protocol/index.d.ts +0 -4
  811. package/dist/protocol/index.js +0 -4
  812. package/dist/protocol/relay-pty-schemas.d.ts +0 -209
  813. package/dist/protocol/types.d.ts +0 -168
  814. package/dist/protocol/types.js +0 -6
  815. package/dist/resiliency/memory-monitor.js +0 -593
  816. package/dist/resiliency/provider-context.d.ts +0 -100
  817. package/dist/shared/cli-auth-config.js +0 -320
  818. package/dist/state/agent-state.js +0 -120
  819. package/dist/storage/adapter.d.ts +0 -154
  820. package/dist/storage/batched-sqlite-adapter.d.ts +0 -71
  821. package/dist/storage/batched-sqlite-adapter.js +0 -183
  822. package/dist/storage/sqlite-adapter.d.ts +0 -107
  823. package/dist/storage/sqlite-adapter.js +0 -717
  824. package/dist/trajectory/config.d.ts +0 -102
  825. package/dist/trajectory/config.js +0 -185
  826. package/dist/trajectory/index.d.ts +0 -8
  827. package/dist/trajectory/index.js +0 -8
  828. package/dist/trajectory/integration.js +0 -987
  829. package/dist/utils/command-resolver.js +0 -76
  830. package/dist/utils/index.d.ts +0 -4
  831. package/dist/utils/index.js +0 -4
  832. package/dist/utils/project-namespace.d.ts +0 -70
  833. package/dist/utils/project-namespace.js +0 -216
  834. package/dist/wrapper/base-wrapper.d.ts +0 -217
  835. package/dist/wrapper/base-wrapper.js +0 -538
  836. package/dist/wrapper/client.d.ts +0 -199
  837. package/dist/wrapper/client.js +0 -677
  838. package/dist/wrapper/idle-detector.d.ts +0 -102
  839. package/dist/wrapper/idle-detector.js +0 -279
  840. package/dist/wrapper/index.d.ts +0 -4
  841. package/dist/wrapper/index.js +0 -7
  842. package/dist/wrapper/parser.d.ts +0 -230
  843. package/dist/wrapper/parser.js +0 -1178
  844. package/dist/wrapper/pty-wrapper.d.ts +0 -343
  845. package/dist/wrapper/pty-wrapper.js +0 -1593
  846. package/dist/wrapper/relay-pty-orchestrator.d.ts +0 -296
  847. package/dist/wrapper/relay-pty-orchestrator.js +0 -1088
  848. package/dist/wrapper/shared.d.ts +0 -168
  849. package/dist/wrapper/shared.js +0 -291
  850. package/dist/wrapper/stuck-detector.d.ts +0 -101
  851. package/dist/wrapper/stuck-detector.js +0 -228
  852. package/dist/wrapper/tmux-wrapper.d.ts +0 -344
  853. package/dist/wrapper/tmux-wrapper.js +0 -1711
  854. /package/dist/dashboard/out/_next/static/{BffXAqxm-_rUlj2mAnK26 → 72btMIJ64BCAB4UgVkpaq}/_buildManifest.js +0 -0
  855. /package/dist/dashboard/out/_next/static/{BffXAqxm-_rUlj2mAnK26 → 72btMIJ64BCAB4UgVkpaq}/_ssgManifest.js +0 -0
  856. /package/dist/dashboard/out/_next/static/chunks/app/cloud/link/{page-cfeb437f08a12ed9.js → page-5011ae044b90449d.js} +0 -0
  857. /package/dist/dashboard/out/_next/static/chunks/app/history/{page-240f91e8b06ba8ac.js → page-b2ce7c96ed0931da.js} +0 -0
  858. /package/dist/dashboard/out/_next/static/chunks/app/metrics/{page-82938ab8fcf44694.js → page-bf2cb1e5915bc92d.js} +0 -0
  859. /package/dist/{cli → src/cli}/index.d.ts +0 -0
  860. /package/dist/{health-worker-manager.d.ts → src/health-worker-manager.d.ts} +0 -0
  861. /package/dist/{health-worker-manager.js → src/health-worker-manager.js} +0 -0
  862. /package/dist/{health-worker.d.ts → src/health-worker.d.ts} +0 -0
  863. /package/dist/{health-worker.js → src/health-worker.js} +0 -0
  864. /package/{dist/bridge → packages/bridge/dist}/shadow-cli.d.ts +0 -0
  865. /package/{dist/bridge → packages/bridge/dist}/types.js +0 -0
  866. /package/{dist/cloud → packages/cloud/dist}/api/admin.d.ts +0 -0
  867. /package/{dist/cloud → packages/cloud/dist}/api/auth.d.ts +0 -0
  868. /package/{dist/cloud → packages/cloud/dist}/api/auth.js +0 -0
  869. /package/{dist/cloud → packages/cloud/dist}/api/billing.d.ts +0 -0
  870. /package/{dist/cloud → packages/cloud/dist}/api/codex-auth-helper.d.ts +0 -0
  871. /package/{dist/cloud → packages/cloud/dist}/api/consensus.d.ts +0 -0
  872. /package/{dist/cloud → packages/cloud/dist}/api/coordinators.d.ts +0 -0
  873. /package/{dist/cloud → packages/cloud/dist}/api/daemons.d.ts +0 -0
  874. /package/{dist/cloud → packages/cloud/dist}/api/generic-webhooks.d.ts +0 -0
  875. /package/{dist/cloud → packages/cloud/dist}/api/git.d.ts +0 -0
  876. /package/{dist/cloud → packages/cloud/dist}/api/git.js +0 -0
  877. /package/{dist/cloud → packages/cloud/dist}/api/github-app.d.ts +0 -0
  878. /package/{dist/cloud → packages/cloud/dist}/api/middleware/planLimits.d.ts +0 -0
  879. /package/{dist/cloud → packages/cloud/dist}/api/middleware/planLimits.js +0 -0
  880. /package/{dist/cloud → packages/cloud/dist}/api/monitoring.d.ts +0 -0
  881. /package/{dist/cloud → packages/cloud/dist}/api/nango-auth.d.ts +0 -0
  882. /package/{dist/cloud → packages/cloud/dist}/api/policy.d.ts +0 -0
  883. /package/{dist/cloud → packages/cloud/dist}/api/providers.d.ts +0 -0
  884. /package/{dist/cloud → packages/cloud/dist}/api/repos.d.ts +0 -0
  885. /package/{dist/cloud → packages/cloud/dist}/api/teams.d.ts +0 -0
  886. /package/{dist/cloud → packages/cloud/dist}/api/test-helpers.d.ts +0 -0
  887. /package/{dist/cloud → packages/cloud/dist}/api/usage.d.ts +0 -0
  888. /package/{dist/cloud → packages/cloud/dist}/api/usage.js +0 -0
  889. /package/{dist/cloud → packages/cloud/dist}/api/webhooks.d.ts +0 -0
  890. /package/{dist/cloud → packages/cloud/dist}/api/webhooks.js +0 -0
  891. /package/{dist/cloud → packages/cloud/dist}/api/workspaces.d.ts +0 -0
  892. /package/{dist/cloud → packages/cloud/dist}/billing/index.d.ts +0 -0
  893. /package/{dist/cloud → packages/cloud/dist}/billing/index.js +0 -0
  894. /package/{dist/cloud → packages/cloud/dist}/billing/plans.d.ts +0 -0
  895. /package/{dist/cloud → packages/cloud/dist}/billing/service.d.ts +0 -0
  896. /package/{dist/cloud → packages/cloud/dist}/billing/service.js +0 -0
  897. /package/{dist/cloud → packages/cloud/dist}/billing/types.d.ts +0 -0
  898. /package/{dist/cloud → packages/cloud/dist}/billing/types.js +0 -0
  899. /package/{dist/cloud → packages/cloud/dist}/db/bulk-ingest.d.ts +0 -0
  900. /package/{dist/cloud → packages/cloud/dist}/db/bulk-ingest.js +0 -0
  901. /package/{dist/cloud → packages/cloud/dist}/db/index.d.ts +0 -0
  902. /package/{dist/cloud → packages/cloud/dist}/db/index.js +0 -0
  903. /package/{dist/cloud → packages/cloud/dist}/server.d.ts +0 -0
  904. /package/{dist/cloud → packages/cloud/dist}/services/auto-scaler.d.ts +0 -0
  905. /package/{dist/cloud → packages/cloud/dist}/services/auto-scaler.js +0 -0
  906. /package/{dist/cloud → packages/cloud/dist}/services/capacity-manager.d.ts +0 -0
  907. /package/{dist/cloud → packages/cloud/dist}/services/capacity-manager.js +0 -0
  908. /package/{dist/cloud → packages/cloud/dist}/services/ci-agent-spawner.d.ts +0 -0
  909. /package/{dist/cloud → packages/cloud/dist}/services/ci-agent-spawner.js +0 -0
  910. /package/{dist/cloud → packages/cloud/dist}/services/cloud-message-bus.d.ts +0 -0
  911. /package/{dist/cloud → packages/cloud/dist}/services/cloud-message-bus.js +0 -0
  912. /package/{dist/cloud → packages/cloud/dist}/services/compute-enforcement.d.ts +0 -0
  913. /package/{dist/cloud → packages/cloud/dist}/services/compute-enforcement.js +0 -0
  914. /package/{dist/cloud → packages/cloud/dist}/services/coordinator.d.ts +0 -0
  915. /package/{dist/cloud → packages/cloud/dist}/services/coordinator.js +0 -0
  916. /package/{dist/cloud → packages/cloud/dist}/services/mention-handler.d.ts +0 -0
  917. /package/{dist/cloud → packages/cloud/dist}/services/mention-handler.js +0 -0
  918. /package/{dist/cloud → packages/cloud/dist}/services/persistence.js +0 -0
  919. /package/{dist/cloud → packages/cloud/dist}/services/planLimits.d.ts +0 -0
  920. /package/{dist/cloud → packages/cloud/dist}/services/planLimits.js +0 -0
  921. /package/{dist/cloud → packages/cloud/dist}/services/presence-registry.d.ts +0 -0
  922. /package/{dist/cloud → packages/cloud/dist}/services/presence-registry.js +0 -0
  923. /package/{dist/cloud → packages/cloud/dist}/services/scaling-orchestrator.d.ts +0 -0
  924. /package/{dist/cloud → packages/cloud/dist}/services/scaling-orchestrator.js +0 -0
  925. /package/{dist/cloud → packages/cloud/dist}/services/scaling-policy.d.ts +0 -0
  926. /package/{dist/cloud → packages/cloud/dist}/services/scaling-policy.js +0 -0
  927. /package/{dist/cloud → packages/cloud/dist}/services/ssh-security.d.ts +0 -0
  928. /package/{dist/cloud → packages/cloud/dist}/services/ssh-security.js +0 -0
  929. /package/{dist/cloud → packages/cloud/dist}/services/workspace-keepalive.d.ts +0 -0
  930. /package/{dist/cloud → packages/cloud/dist}/services/workspace-keepalive.js +0 -0
  931. /package/{dist/cloud → packages/cloud/dist}/webhooks/index.d.ts +0 -0
  932. /package/{dist/cloud → packages/cloud/dist}/webhooks/index.js +0 -0
  933. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/github.d.ts +0 -0
  934. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/github.js +0 -0
  935. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/index.d.ts +0 -0
  936. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/index.js +0 -0
  937. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/linear.d.ts +0 -0
  938. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/linear.js +0 -0
  939. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/slack.d.ts +0 -0
  940. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/slack.js +0 -0
  941. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/github.d.ts +0 -0
  942. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/github.js +0 -0
  943. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/index.d.ts +0 -0
  944. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/index.js +0 -0
  945. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/linear.d.ts +0 -0
  946. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/linear.js +0 -0
  947. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/slack.d.ts +0 -0
  948. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/slack.js +0 -0
  949. /package/{dist/cloud → packages/cloud/dist}/webhooks/router.d.ts +0 -0
  950. /package/{dist/cloud → packages/cloud/dist}/webhooks/router.js +0 -0
  951. /package/{dist/cloud → packages/cloud/dist}/webhooks/rules-engine.d.ts +0 -0
  952. /package/{dist/cloud → packages/cloud/dist}/webhooks/rules-engine.js +0 -0
  953. /package/{dist/cloud → packages/cloud/dist}/webhooks/types.d.ts +0 -0
  954. /package/{dist/cloud → packages/cloud/dist}/webhooks/types.js +0 -0
  955. /package/{dist/utils → packages/config/dist}/agent-config.d.ts +0 -0
  956. /package/{dist/utils → packages/config/dist}/agent-config.js +0 -0
  957. /package/{dist/shared → packages/config/dist}/cli-auth-config.d.ts +0 -0
  958. /package/{dist/bridge → packages/config/dist}/shadow-config.js +0 -0
  959. /package/{dist/bridge → packages/config/dist}/teams-config.d.ts +0 -0
  960. /package/{dist/bridge → packages/config/dist}/teams-config.js +0 -0
  961. /package/{dist/continuity → packages/continuity/dist}/formatter.d.ts +0 -0
  962. /package/{dist/continuity → packages/continuity/dist}/formatter.js +0 -0
  963. /package/{dist/continuity → packages/continuity/dist}/handoff-store.d.ts +0 -0
  964. /package/{dist/continuity → packages/continuity/dist}/handoff-store.js +0 -0
  965. /package/{dist/continuity → packages/continuity/dist}/ledger-store.d.ts +0 -0
  966. /package/{dist/continuity → packages/continuity/dist}/ledger-store.js +0 -0
  967. /package/{dist/continuity → packages/continuity/dist}/manager.d.ts +0 -0
  968. /package/{dist/continuity → packages/continuity/dist}/manager.js +0 -0
  969. /package/{dist/continuity → packages/continuity/dist}/parser.d.ts +0 -0
  970. /package/{dist/continuity → packages/continuity/dist}/parser.js +0 -0
  971. /package/{dist/daemon → packages/daemon/dist}/agent-registry.d.ts +0 -0
  972. /package/{dist/daemon → packages/daemon/dist}/agent-signing.d.ts +0 -0
  973. /package/{dist/daemon → packages/daemon/dist}/agent-signing.js +0 -0
  974. /package/{dist/daemon → packages/daemon/dist}/auth.d.ts +0 -0
  975. /package/{dist/daemon → packages/daemon/dist}/auth.js +0 -0
  976. /package/{dist/daemon → packages/daemon/dist}/consensus-integration.d.ts +0 -0
  977. /package/{dist/daemon → packages/daemon/dist}/consensus.d.ts +0 -0
  978. /package/{dist/daemon → packages/daemon/dist}/consensus.js +0 -0
  979. /package/{dist/daemon → packages/daemon/dist}/rate-limiter.d.ts +0 -0
  980. /package/{dist/daemon → packages/daemon/dist}/rate-limiter.js +0 -0
  981. /package/{dist/daemon → packages/daemon/dist}/registry.d.ts +0 -0
  982. /package/{dist/daemon → packages/daemon/dist}/registry.js +0 -0
  983. /package/{dist/daemon → packages/daemon/dist}/repo-manager.d.ts +0 -0
  984. /package/{dist/daemon → packages/daemon/dist}/types.js +0 -0
  985. /package/{dist/daemon → packages/daemon/dist}/workspace-manager.d.ts +0 -0
  986. /package/{dist/dashboard-server → packages/dashboard-server/dist}/metrics.d.ts +0 -0
  987. /package/{dist/dashboard-server → packages/dashboard-server/dist}/metrics.js +0 -0
  988. /package/{dist/dashboard-server → packages/dashboard-server/dist}/needs-attention.d.ts +0 -0
  989. /package/{dist/dashboard-server → packages/dashboard-server/dist}/needs-attention.js +0 -0
  990. /package/{dist/dashboard-server → packages/dashboard-server/dist}/server.d.ts +0 -0
  991. /package/{dist/dashboard-server → packages/dashboard-server/dist}/start.d.ts +0 -0
  992. /package/{dist/hooks → packages/hooks/dist}/emitter.d.ts +0 -0
  993. /package/{dist/hooks → packages/hooks/dist}/emitter.js +0 -0
  994. /package/{dist/hooks → packages/hooks/dist}/inbox-check/hook.d.ts +0 -0
  995. /package/{dist/hooks → packages/hooks/dist}/inbox-check/hook.js +0 -0
  996. /package/{dist/hooks → packages/hooks/dist}/inbox-check/index.d.ts +0 -0
  997. /package/{dist/hooks → packages/hooks/dist}/inbox-check/index.js +0 -0
  998. /package/{dist/hooks → packages/hooks/dist}/inbox-check/types.d.ts +0 -0
  999. /package/{dist/hooks → packages/hooks/dist}/inbox-check/types.js +0 -0
  1000. /package/{dist/hooks → packages/hooks/dist}/inbox-check/utils.d.ts +0 -0
  1001. /package/{dist/hooks → packages/hooks/dist}/inbox-check/utils.js +0 -0
  1002. /package/{dist/hooks → packages/hooks/dist}/registry.d.ts +0 -0
  1003. /package/{dist/hooks → packages/hooks/dist}/trajectory-hooks.d.ts +0 -0
  1004. /package/{dist/memory → packages/memory/dist}/adapters/index.d.ts +0 -0
  1005. /package/{dist/memory → packages/memory/dist}/adapters/index.js +0 -0
  1006. /package/{dist/memory → packages/memory/dist}/adapters/inmemory.d.ts +0 -0
  1007. /package/{dist/memory → packages/memory/dist}/adapters/inmemory.js +0 -0
  1008. /package/{dist/memory → packages/memory/dist}/adapters/supermemory.d.ts +0 -0
  1009. /package/{dist/memory → packages/memory/dist}/adapters/supermemory.js +0 -0
  1010. /package/{dist/memory → packages/memory/dist}/context-compaction.d.ts +0 -0
  1011. /package/{dist/memory → packages/memory/dist}/context-compaction.js +0 -0
  1012. /package/{dist/memory → packages/memory/dist}/factory.d.ts +0 -0
  1013. /package/{dist/memory → packages/memory/dist}/factory.js +0 -0
  1014. /package/{dist/memory → packages/memory/dist}/index.d.ts +0 -0
  1015. /package/{dist/memory → packages/memory/dist}/index.js +0 -0
  1016. /package/{dist/memory → packages/memory/dist}/memory-hooks.js +0 -0
  1017. /package/{dist/memory → packages/memory/dist}/service.d.ts +0 -0
  1018. /package/{dist/memory → packages/memory/dist}/service.js +0 -0
  1019. /package/{dist/memory → packages/memory/dist}/types.d.ts +0 -0
  1020. /package/{dist/memory → packages/memory/dist}/types.js +0 -0
  1021. /package/{dist/policy → packages/policy/dist}/agent-policy.d.ts +0 -0
  1022. /package/{dist/policy → packages/policy/dist}/cloud-policy-fetcher.d.ts +0 -0
  1023. /package/{dist/policy → packages/policy/dist}/cloud-policy-fetcher.js +0 -0
  1024. /package/{dist/utils → packages/protocol/dist}/id-generator.d.ts +0 -0
  1025. /package/{dist/utils → packages/protocol/dist}/id-generator.js +0 -0
  1026. /package/{dist/protocol → packages/protocol/dist}/relay-pty-schemas.js +0 -0
  1027. /package/{dist/resiliency → packages/resiliency/dist}/context-persistence.d.ts +0 -0
  1028. /package/{dist/resiliency → packages/resiliency/dist}/context-persistence.js +0 -0
  1029. /package/{dist/resiliency → packages/resiliency/dist}/crash-insights.d.ts +0 -0
  1030. /package/{dist/resiliency → packages/resiliency/dist}/crash-insights.js +0 -0
  1031. /package/{dist/resiliency → packages/resiliency/dist}/gossip-health.d.ts +0 -0
  1032. /package/{dist/resiliency → packages/resiliency/dist}/gossip-health.js +0 -0
  1033. /package/{dist/resiliency → packages/resiliency/dist}/health-monitor.d.ts +0 -0
  1034. /package/{dist/resiliency → packages/resiliency/dist}/health-monitor.js +0 -0
  1035. /package/{dist/resiliency → packages/resiliency/dist}/index.d.ts +0 -0
  1036. /package/{dist/resiliency → packages/resiliency/dist}/index.js +0 -0
  1037. /package/{dist/resiliency → packages/resiliency/dist}/leader-watchdog.d.ts +0 -0
  1038. /package/{dist/resiliency → packages/resiliency/dist}/leader-watchdog.js +0 -0
  1039. /package/{dist/resiliency → packages/resiliency/dist}/logger.d.ts +0 -0
  1040. /package/{dist/resiliency → packages/resiliency/dist}/logger.js +0 -0
  1041. /package/{dist/resiliency → packages/resiliency/dist}/memory-monitor.d.ts +0 -0
  1042. /package/{dist/resiliency → packages/resiliency/dist}/metrics.d.ts +0 -0
  1043. /package/{dist/resiliency → packages/resiliency/dist}/metrics.js +0 -0
  1044. /package/{dist/resiliency → packages/resiliency/dist}/provider-context.js +0 -0
  1045. /package/{dist/resiliency → packages/resiliency/dist}/stateless-lead.d.ts +0 -0
  1046. /package/{dist/resiliency → packages/resiliency/dist}/stateless-lead.js +0 -0
  1047. /package/{dist/resiliency → packages/resiliency/dist}/supervisor.d.ts +0 -0
  1048. /package/{dist/resiliency → packages/resiliency/dist}/supervisor.js +0 -0
  1049. /package/{dist/state → packages/state/dist}/agent-state.d.ts +0 -0
  1050. /package/{dist/storage → packages/storage/dist}/adapter.js +0 -0
  1051. /package/{dist/storage → packages/storage/dist}/dead-letter-queue.d.ts +0 -0
  1052. /package/{dist/storage → packages/storage/dist}/dead-letter-queue.js +0 -0
  1053. /package/{dist/storage → packages/storage/dist}/dlq-adapter.d.ts +0 -0
  1054. /package/{dist/storage → packages/storage/dist}/dlq-adapter.js +0 -0
  1055. /package/{dist/trajectory → packages/trajectory/dist}/integration.d.ts +0 -0
  1056. /package/{dist/utils → packages/utils/dist}/command-resolver.d.ts +0 -0
  1057. /package/{dist/utils → packages/utils/dist}/git-remote.d.ts +0 -0
  1058. /package/{dist/utils → packages/utils/dist}/git-remote.js +0 -0
  1059. /package/{dist/utils → packages/utils/dist}/logger.d.ts +0 -0
  1060. /package/{dist/utils → packages/utils/dist}/logger.js +0 -0
  1061. /package/{dist/utils → packages/utils/dist}/name-generator.d.ts +0 -0
  1062. /package/{dist/utils → packages/utils/dist}/name-generator.js +0 -0
  1063. /package/{dist/utils → packages/utils/dist}/precompiled-patterns.d.ts +0 -0
  1064. /package/{dist/utils → packages/utils/dist}/precompiled-patterns.js +0 -0
  1065. /package/{dist/utils → packages/utils/dist}/update-checker.d.ts +0 -0
  1066. /package/{dist/utils → packages/utils/dist}/update-checker.js +0 -0
  1067. /package/{dist/wrapper → packages/wrapper/dist}/auth-detection.d.ts +0 -0
  1068. /package/{dist/wrapper → packages/wrapper/dist}/auth-detection.js +0 -0
  1069. /package/{dist/wrapper → packages/wrapper/dist}/inbox.d.ts +0 -0
  1070. /package/{dist/wrapper → packages/wrapper/dist}/inbox.js +0 -0
  1071. /package/{dist/wrapper → packages/wrapper/dist}/prompt-composer.d.ts +0 -0
  1072. /package/{dist/wrapper → packages/wrapper/dist}/prompt-composer.js +0 -0
  1073. /package/{dist/utils → packages/wrapper/dist}/tmux-resolver.d.ts +0 -0
  1074. /package/{dist/utils → packages/wrapper/dist}/tmux-resolver.js +0 -0
@@ -0,0 +1,1001 @@
1
+ /**
2
+ * Agent Relay Daemon Server
3
+ * Main entry point for the relay daemon.
4
+ */
5
+ import net from 'node:net';
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import os from 'node:os';
9
+ import { Connection, DEFAULT_CONFIG } from './connection.js';
10
+ import { Router } from './router.js';
11
+ import { PROTOCOL_VERSION, } from '@agent-relay/protocol/types';
12
+ import { SpawnManager } from './spawn-manager.js';
13
+ import { createStorageAdapter } from '@agent-relay/storage/adapter';
14
+ import { SqliteStorageAdapter } from '@agent-relay/storage/sqlite-adapter';
15
+ import { getProjectPaths } from '@agent-relay/config';
16
+ import { AgentRegistry } from './agent-registry.js';
17
+ import { daemonLog as log } from '@agent-relay/utils/logger';
18
+ import { getCloudSync } from './cloud-sync.js';
19
+ import { generateId } from '@agent-relay/wrapper';
20
+ import { createConsensusIntegration, } from './consensus-integration.js';
21
+ export const DEFAULT_SOCKET_PATH = '/tmp/agent-relay.sock';
22
+ export const DEFAULT_DAEMON_CONFIG = {
23
+ ...DEFAULT_CONFIG,
24
+ socketPath: DEFAULT_SOCKET_PATH,
25
+ pidFilePath: `${DEFAULT_SOCKET_PATH}.pid`,
26
+ };
27
+ export class Daemon {
28
+ server;
29
+ router;
30
+ config;
31
+ running = false;
32
+ connections = new Set();
33
+ pendingAcks = new Map();
34
+ storage;
35
+ storageInitialized = false;
36
+ registry;
37
+ processingStateInterval;
38
+ cloudSync;
39
+ remoteAgents = [];
40
+ remoteUsers = [];
41
+ consensus;
42
+ cloudSyncDebounceTimer;
43
+ spawnManager;
44
+ /** Callback for log output from agents (used by dashboard for streaming) */
45
+ onLogOutput;
46
+ /** Interval for writing processing state file (500ms for responsive UI) */
47
+ static PROCESSING_STATE_INTERVAL_MS = 500;
48
+ static DEFAULT_SYNC_TIMEOUT_MS = 30000;
49
+ constructor(config = {}) {
50
+ this.config = { ...DEFAULT_DAEMON_CONFIG, ...config };
51
+ if (config.socketPath && !config.pidFilePath) {
52
+ this.config.pidFilePath = `${config.socketPath}.pid`;
53
+ }
54
+ // Default teamDir to same directory as socket
55
+ if (!this.config.teamDir) {
56
+ this.config.teamDir = path.dirname(this.config.socketPath);
57
+ }
58
+ if (this.config.teamDir) {
59
+ this.registry = new AgentRegistry(this.config.teamDir);
60
+ }
61
+ // Initialize SpawnManager if enabled
62
+ if (this.config.spawnManager) {
63
+ const spawnConfig = typeof this.config.spawnManager === 'object'
64
+ ? this.config.spawnManager
65
+ : {};
66
+ // Derive projectRoot from teamDir (teamDir is typically {projectRoot}/.agent-relay/)
67
+ const projectRoot = spawnConfig.projectRoot || path.dirname(this.config.teamDir || this.config.socketPath);
68
+ this.spawnManager = new SpawnManager({
69
+ projectRoot,
70
+ socketPath: this.config.socketPath,
71
+ ...spawnConfig,
72
+ });
73
+ }
74
+ // Storage is initialized lazily in start() to support async createStorageAdapter
75
+ this.server = net.createServer(this.handleConnection.bind(this));
76
+ }
77
+ /**
78
+ * Write current agents to agents.json for dashboard consumption.
79
+ */
80
+ writeAgentsFile() {
81
+ if (!this.registry)
82
+ return;
83
+ // The registry persists on every update; this is a no-op helper for symmetry.
84
+ const agents = this.registry.getAgents();
85
+ try {
86
+ const targetPath = path.join(this.config.teamDir ?? path.dirname(this.config.socketPath), 'agents.json');
87
+ const data = JSON.stringify({ agents }, null, 2);
88
+ // Write atomically: write to temp file first, then rename
89
+ // This prevents race conditions where readers see partial/empty data
90
+ const tempPath = `${targetPath}.tmp`;
91
+ fs.writeFileSync(tempPath, data, 'utf-8');
92
+ fs.renameSync(tempPath, targetPath);
93
+ }
94
+ catch (err) {
95
+ log.error('Failed to write agents.json', { error: String(err) });
96
+ }
97
+ }
98
+ /**
99
+ * Write processing state to processing-state.json for dashboard consumption.
100
+ * This file contains agents currently processing/thinking after receiving a message.
101
+ */
102
+ writeProcessingStateFile() {
103
+ try {
104
+ const processingAgents = this.router.getProcessingAgents();
105
+ const targetPath = path.join(this.config.teamDir ?? path.dirname(this.config.socketPath), 'processing-state.json');
106
+ const data = JSON.stringify({ processingAgents, updatedAt: Date.now() }, null, 2);
107
+ const tempPath = `${targetPath}.tmp`;
108
+ fs.writeFileSync(tempPath, data, 'utf-8');
109
+ fs.renameSync(tempPath, targetPath);
110
+ }
111
+ catch (err) {
112
+ log.error('Failed to write processing-state.json', { error: String(err) });
113
+ }
114
+ }
115
+ /**
116
+ * Write currently connected agents to connected-agents.json for CLI consumption.
117
+ * This file contains agents with active socket connections (vs agents.json which is historical).
118
+ */
119
+ writeConnectedAgentsFile() {
120
+ try {
121
+ const connectedAgents = this.router.getAgents();
122
+ const connectedUsers = this.router.getUsers();
123
+ const targetPath = path.join(this.config.teamDir ?? path.dirname(this.config.socketPath), 'connected-agents.json');
124
+ const data = JSON.stringify({
125
+ agents: connectedAgents,
126
+ users: connectedUsers,
127
+ updatedAt: Date.now(),
128
+ }, null, 2);
129
+ const tempPath = `${targetPath}.tmp`;
130
+ fs.writeFileSync(tempPath, data, 'utf-8');
131
+ fs.renameSync(tempPath, targetPath);
132
+ }
133
+ catch (err) {
134
+ log.error('Failed to write connected-agents.json', { error: String(err) });
135
+ }
136
+ }
137
+ /**
138
+ * Mark an agent as spawning (before HELLO completes).
139
+ * Messages sent to this agent will be queued for delivery after registration.
140
+ * Call this before starting the agent's PTY process.
141
+ */
142
+ markSpawning(agentName) {
143
+ this.router.markSpawning(agentName);
144
+ }
145
+ /**
146
+ * Clear the spawning flag for an agent.
147
+ * Called when spawn fails or is cancelled (successful registration clears automatically).
148
+ */
149
+ clearSpawning(agentName) {
150
+ this.router.clearSpawning(agentName);
151
+ }
152
+ /**
153
+ * Initialize storage adapter (called during start).
154
+ */
155
+ async initStorage() {
156
+ if (this.storageInitialized)
157
+ return;
158
+ if (this.config.storageAdapter) {
159
+ // Use explicitly provided adapter
160
+ this.storage = this.config.storageAdapter;
161
+ }
162
+ else {
163
+ // Create adapter based on config/env
164
+ const storagePath = this.config.storagePath ??
165
+ path.join(path.dirname(this.config.socketPath), 'agent-relay.sqlite');
166
+ this.storage = await createStorageAdapter(storagePath, this.config.storageConfig);
167
+ }
168
+ let channelMembershipStore;
169
+ const workspaceId = process.env.RELAY_WORKSPACE_ID
170
+ || process.env.AGENT_RELAY_WORKSPACE_ID
171
+ || process.env.WORKSPACE_ID;
172
+ const databaseUrl = process.env.CLOUD_DATABASE_URL
173
+ || process.env.DATABASE_URL
174
+ || process.env.AGENT_RELAY_STORAGE_URL;
175
+ const isPostgresUrl = databaseUrl?.startsWith('postgres://') || databaseUrl?.startsWith('postgresql://');
176
+ if (workspaceId && isPostgresUrl && databaseUrl) {
177
+ try {
178
+ const { CloudChannelMembershipStore } = await import('./channel-membership-store.js');
179
+ channelMembershipStore = new CloudChannelMembershipStore({ workspaceId, databaseUrl });
180
+ log.info('Channel membership store enabled (cloud DB)', { workspaceId });
181
+ }
182
+ catch (err) {
183
+ log.error('Failed to initialize channel membership store', { error: String(err) });
184
+ }
185
+ }
186
+ else {
187
+ log.debug('Channel membership store disabled (missing workspaceId or Postgres database URL)');
188
+ }
189
+ this.router = new Router({
190
+ storage: this.storage,
191
+ registry: this.registry,
192
+ onProcessingStateChange: () => this.writeProcessingStateFile(),
193
+ crossMachineHandler: {
194
+ sendCrossMachineMessage: this.sendCrossMachineMessage.bind(this),
195
+ isRemoteAgent: this.isRemoteAgent.bind(this),
196
+ isRemoteUser: this.isRemoteUser.bind(this),
197
+ },
198
+ channelMembershipStore,
199
+ });
200
+ // Initialize consensus (enabled by default, can be disabled with consensus: false)
201
+ if (this.config.consensus !== false) {
202
+ const consensusConfig = typeof this.config.consensus === 'object'
203
+ ? this.config.consensus
204
+ : {};
205
+ this.consensus = createConsensusIntegration(this.router, consensusConfig);
206
+ log.info('Consensus mechanism enabled');
207
+ }
208
+ this.storageInitialized = true;
209
+ }
210
+ /**
211
+ * Start the daemon.
212
+ */
213
+ async start() {
214
+ if (this.running)
215
+ return;
216
+ // Initialize storage
217
+ await this.initStorage();
218
+ // Restore channel memberships from persisted storage (cloud DB or SQLite)
219
+ await this.router.restoreChannelMemberships();
220
+ // Initialize cloud sync if configured
221
+ await this.initCloudSync();
222
+ // Clean up stale socket (only if it's actually a socket)
223
+ if (fs.existsSync(this.config.socketPath)) {
224
+ const stat = fs.lstatSync(this.config.socketPath);
225
+ if (!stat.isSocket()) {
226
+ throw new Error(`Refusing to unlink non-socket at ${this.config.socketPath}`);
227
+ }
228
+ fs.unlinkSync(this.config.socketPath);
229
+ }
230
+ // Ensure directory exists
231
+ const socketDir = path.dirname(this.config.socketPath);
232
+ if (!fs.existsSync(socketDir)) {
233
+ fs.mkdirSync(socketDir, { recursive: true });
234
+ }
235
+ // Set up inbox symlink for workspace namespacing
236
+ // Daemon delivers to legacy path (/tmp/relay-inbox), symlink points to workspace path
237
+ // This allows agents to use simple instructions while maintaining workspace isolation
238
+ const workspaceId = process.env.RELAY_WORKSPACE_ID
239
+ || process.env.AGENT_RELAY_WORKSPACE_ID
240
+ || process.env.WORKSPACE_ID;
241
+ const legacyInboxPath = '/tmp/relay-inbox';
242
+ let inboxPath = legacyInboxPath;
243
+ if (workspaceId) {
244
+ // Workspace-namespaced inbox directory
245
+ inboxPath = `/tmp/relay/${workspaceId}/inbox`;
246
+ try {
247
+ // Ensure workspace inbox directory exists
248
+ const inboxDir = path.dirname(inboxPath);
249
+ if (!fs.existsSync(inboxDir)) {
250
+ fs.mkdirSync(inboxDir, { recursive: true });
251
+ }
252
+ if (!fs.existsSync(inboxPath)) {
253
+ fs.mkdirSync(inboxPath, { recursive: true });
254
+ }
255
+ // Ensure legacy inbox parent directory exists
256
+ const legacyInboxParent = path.dirname(legacyInboxPath);
257
+ if (!fs.existsSync(legacyInboxParent)) {
258
+ fs.mkdirSync(legacyInboxParent, { recursive: true });
259
+ }
260
+ // Create symlink from legacy path to workspace path
261
+ // If legacy path exists as a regular directory, remove it first
262
+ if (fs.existsSync(legacyInboxPath)) {
263
+ try {
264
+ const stats = fs.lstatSync(legacyInboxPath);
265
+ if (stats.isSymbolicLink()) {
266
+ // Already a symlink - remove and recreate to ensure correct target
267
+ fs.unlinkSync(legacyInboxPath);
268
+ }
269
+ else if (stats.isDirectory()) {
270
+ // Regular directory - remove it (may have stale files from previous run)
271
+ fs.rmSync(legacyInboxPath, { recursive: true, force: true });
272
+ }
273
+ }
274
+ catch {
275
+ // Ignore errors during cleanup
276
+ }
277
+ }
278
+ // Create the symlink: legacy path -> workspace path
279
+ fs.symlinkSync(inboxPath, legacyInboxPath);
280
+ log.info('Created inbox symlink', { from: legacyInboxPath, to: inboxPath });
281
+ }
282
+ catch (err) {
283
+ log.error('Failed to set up inbox symlink', { error: err.message });
284
+ // Fall back to creating legacy directory directly
285
+ try {
286
+ if (!fs.existsSync(legacyInboxPath)) {
287
+ fs.mkdirSync(legacyInboxPath, { recursive: true });
288
+ }
289
+ }
290
+ catch {
291
+ // Ignore
292
+ }
293
+ }
294
+ }
295
+ else {
296
+ // No workspace ID - just ensure legacy inbox directory exists
297
+ try {
298
+ if (!fs.existsSync(legacyInboxPath)) {
299
+ fs.mkdirSync(legacyInboxPath, { recursive: true });
300
+ }
301
+ }
302
+ catch (err) {
303
+ log.error('Failed to create inbox directory', { error: err.message });
304
+ }
305
+ }
306
+ return new Promise((resolve, reject) => {
307
+ this.server.on('error', reject);
308
+ this.server.listen(this.config.socketPath, () => {
309
+ this.running = true;
310
+ // Set restrictive permissions
311
+ fs.chmodSync(this.config.socketPath, 0o600);
312
+ fs.writeFileSync(this.config.pidFilePath, `${process.pid}\n`, 'utf-8');
313
+ // Start periodic processing state updates for dashboard
314
+ this.processingStateInterval = setInterval(() => {
315
+ this.writeProcessingStateFile();
316
+ }, Daemon.PROCESSING_STATE_INTERVAL_MS);
317
+ log.info('Listening', { socketPath: this.config.socketPath });
318
+ resolve();
319
+ });
320
+ });
321
+ }
322
+ /**
323
+ * Initialize cloud sync service for cross-machine agent communication.
324
+ */
325
+ async initCloudSync() {
326
+ // Check for cloud config file OR environment variables
327
+ const dataDir = process.env.AGENT_RELAY_DATA_DIR ||
328
+ path.join(os.homedir(), '.local', 'share', 'agent-relay');
329
+ const configPath = path.join(dataDir, 'cloud-config.json');
330
+ const hasConfigFile = fs.existsSync(configPath);
331
+ const hasEnvApiKey = !!process.env.AGENT_RELAY_API_KEY;
332
+ // Allow cloud sync if config file exists OR API key is set via env var
333
+ // This enables cloud-hosted workspaces (Fly.io) to sync messages without a config file
334
+ if (!hasConfigFile && !hasEnvApiKey) {
335
+ log.info('Cloud sync disabled (not linked to cloud)');
336
+ return;
337
+ }
338
+ try {
339
+ let apiKey;
340
+ let cloudUrl;
341
+ if (hasConfigFile) {
342
+ // Use config file (local daemons linked via CLI)
343
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
344
+ apiKey = config.apiKey;
345
+ cloudUrl = config.cloudUrl;
346
+ }
347
+ else {
348
+ // Use env vars (cloud-hosted workspaces like Fly.io)
349
+ apiKey = process.env.AGENT_RELAY_API_KEY;
350
+ // CLOUD_API_URL is set by Fly.io provisioner, AGENT_RELAY_CLOUD_URL is the standard
351
+ cloudUrl = process.env.AGENT_RELAY_CLOUD_URL || process.env.CLOUD_API_URL;
352
+ log.info('Using environment variables for cloud sync', { hasApiKey: !!apiKey, hasCloudUrl: !!cloudUrl });
353
+ }
354
+ // Get project root for workspace detection via git remote
355
+ const projectPaths = getProjectPaths();
356
+ this.cloudSync = getCloudSync({
357
+ apiKey,
358
+ cloudUrl: cloudUrl || this.config.cloudUrl,
359
+ enabled: this.config.cloudSync !== false,
360
+ projectDirectory: projectPaths.projectRoot,
361
+ });
362
+ // Listen for remote agent updates
363
+ this.cloudSync.on('remote-agents-updated', (agents) => {
364
+ this.remoteAgents = agents;
365
+ log.info('Remote agents updated', { count: agents.length });
366
+ this.writeRemoteAgentsFile();
367
+ });
368
+ // Listen for remote user updates (humans connected via cloud dashboard)
369
+ this.cloudSync.on('remote-users-updated', (users) => {
370
+ this.remoteUsers = users;
371
+ log.info('Remote users updated', { count: users.length });
372
+ this.writeRemoteUsersFile();
373
+ });
374
+ // Listen for cross-machine messages
375
+ this.cloudSync.on('cross-machine-message', (msg) => {
376
+ this.handleCrossMachineMessage(msg);
377
+ });
378
+ // Listen for cloud commands (e.g., credential refresh)
379
+ this.cloudSync.on('command', (cmd) => {
380
+ log.info('Cloud command received', { type: cmd.type });
381
+ // Handle commands like credential updates, config changes, etc.
382
+ });
383
+ await this.cloudSync.start();
384
+ // Set storage adapter for message sync to cloud
385
+ if (this.storage) {
386
+ this.cloudSync.setStorage(this.storage);
387
+ }
388
+ log.info('Cloud sync enabled');
389
+ }
390
+ catch (err) {
391
+ log.error('Failed to initialize cloud sync', { error: String(err) });
392
+ }
393
+ }
394
+ /**
395
+ * Write remote agents to file for dashboard consumption.
396
+ */
397
+ writeRemoteAgentsFile() {
398
+ try {
399
+ const targetPath = path.join(this.config.teamDir ?? path.dirname(this.config.socketPath), 'remote-agents.json');
400
+ const data = JSON.stringify({
401
+ agents: this.remoteAgents,
402
+ updatedAt: Date.now(),
403
+ }, null, 2);
404
+ const tempPath = `${targetPath}.tmp`;
405
+ fs.writeFileSync(tempPath, data, 'utf-8');
406
+ fs.renameSync(tempPath, targetPath);
407
+ }
408
+ catch (err) {
409
+ log.error('Failed to write remote-agents.json', { error: String(err) });
410
+ }
411
+ }
412
+ /**
413
+ * Write remote users to file for dashboard consumption.
414
+ * Remote users are humans connected via the cloud dashboard.
415
+ */
416
+ writeRemoteUsersFile() {
417
+ try {
418
+ const targetPath = path.join(this.config.teamDir ?? path.dirname(this.config.socketPath), 'remote-users.json');
419
+ const data = JSON.stringify({
420
+ users: this.remoteUsers,
421
+ updatedAt: Date.now(),
422
+ }, null, 2);
423
+ const tempPath = `${targetPath}.tmp`;
424
+ fs.writeFileSync(tempPath, data, 'utf-8');
425
+ fs.renameSync(tempPath, targetPath);
426
+ }
427
+ catch (err) {
428
+ log.error('Failed to write remote-users.json', { error: String(err) });
429
+ }
430
+ }
431
+ /**
432
+ * Handle incoming message from another machine via cloud.
433
+ */
434
+ handleCrossMachineMessage(msg) {
435
+ log.info('Cross-machine message received', {
436
+ from: `${msg.from.daemonName}:${msg.from.agent}`,
437
+ to: msg.to,
438
+ });
439
+ // Find local agent
440
+ const targetConnection = Array.from(this.connections).find(c => c.agentName === msg.to);
441
+ if (!targetConnection) {
442
+ log.warn('Target agent not found locally', { agent: msg.to });
443
+ return;
444
+ }
445
+ // Inject message to local agent
446
+ const envelope = {
447
+ v: 1,
448
+ type: 'SEND',
449
+ id: generateId(),
450
+ ts: Date.now(),
451
+ from: `${msg.from.daemonName}:${msg.from.agent}`,
452
+ to: msg.to,
453
+ payload: {
454
+ kind: 'message',
455
+ body: msg.content,
456
+ data: {
457
+ _crossMachine: true,
458
+ _fromDaemon: msg.from.daemonId,
459
+ _fromDaemonName: msg.from.daemonName,
460
+ ...msg.metadata,
461
+ },
462
+ },
463
+ };
464
+ this.router.route(targetConnection, envelope);
465
+ }
466
+ /**
467
+ * Send message to agent on another machine via cloud.
468
+ */
469
+ async sendCrossMachineMessage(targetDaemonId, targetAgent, fromAgent, content, metadata) {
470
+ if (!this.cloudSync?.isConnected()) {
471
+ log.warn('Cannot send cross-machine message: not connected to cloud');
472
+ return false;
473
+ }
474
+ try {
475
+ await this.cloudSync.sendCrossMachineMessage(targetDaemonId, targetAgent, fromAgent, content, metadata);
476
+ return true;
477
+ }
478
+ catch (err) {
479
+ log.error('Failed to send cross-machine message', { error: String(err) });
480
+ return false;
481
+ }
482
+ }
483
+ /**
484
+ * Get list of remote agents (from other machines).
485
+ */
486
+ getRemoteAgents() {
487
+ return this.remoteAgents;
488
+ }
489
+ /**
490
+ * Check if an agent is on a remote machine.
491
+ */
492
+ isRemoteAgent(agentName) {
493
+ return this.remoteAgents.find(a => a.name === agentName);
494
+ }
495
+ /**
496
+ * Check if a user is on a remote machine (connected via cloud dashboard).
497
+ */
498
+ isRemoteUser(userName) {
499
+ return this.remoteUsers.find(u => u.name === userName);
500
+ }
501
+ /**
502
+ * Notify cloud sync about local agent changes.
503
+ * Debounced to prevent flooding the cloud API with rapid connect/disconnect events.
504
+ */
505
+ notifyCloudSync() {
506
+ if (!this.cloudSync?.isConnected())
507
+ return;
508
+ // Debounce: clear any pending sync and schedule a new one
509
+ if (this.cloudSyncDebounceTimer) {
510
+ clearTimeout(this.cloudSyncDebounceTimer);
511
+ }
512
+ this.cloudSyncDebounceTimer = setTimeout(() => {
513
+ this.cloudSyncDebounceTimer = undefined;
514
+ this.doCloudSync();
515
+ }, 1000); // 1 second debounce
516
+ }
517
+ /**
518
+ * Actually perform the cloud sync (called after debounce).
519
+ */
520
+ doCloudSync() {
521
+ if (!this.cloudSync?.isConnected())
522
+ return;
523
+ // Get AI agents (exclude internal ones like Dashboard)
524
+ const aiAgents = Array.from(this.connections)
525
+ .filter(c => {
526
+ if (!c.agentName)
527
+ return false;
528
+ if (c.entityType === 'user')
529
+ return false;
530
+ if (this.isInternalAgent(c.agentName))
531
+ return false;
532
+ return true;
533
+ })
534
+ .map(c => ({
535
+ name: c.agentName,
536
+ status: 'online',
537
+ isHuman: false,
538
+ }));
539
+ // Get human users (entityType === 'user', exclude Dashboard)
540
+ const humanUsers = Array.from(this.connections)
541
+ .filter(c => {
542
+ if (!c.agentName)
543
+ return false;
544
+ if (c.entityType !== 'user')
545
+ return false;
546
+ if (this.isInternalAgent(c.agentName))
547
+ return false;
548
+ return true;
549
+ })
550
+ .map(c => ({
551
+ name: c.agentName,
552
+ status: 'online',
553
+ isHuman: true,
554
+ avatarUrl: c.avatarUrl,
555
+ }));
556
+ this.cloudSync.updateAgents([...aiAgents, ...humanUsers]);
557
+ }
558
+ /**
559
+ * Check if an agent is internal (should be hidden from cloud sync and listings).
560
+ */
561
+ isInternalAgent(name) {
562
+ if (name.startsWith('__'))
563
+ return true;
564
+ // Dashboard, _DashboardUI, and cli are internal system agents
565
+ return name === 'Dashboard' || name === '_DashboardUI' || name === 'cli';
566
+ }
567
+ /**
568
+ * Stop the daemon.
569
+ */
570
+ async stop() {
571
+ if (!this.running)
572
+ return;
573
+ // Stop cloud sync
574
+ if (this.cloudSync) {
575
+ this.cloudSync.stop();
576
+ this.cloudSync = undefined;
577
+ }
578
+ // Clear cloud sync debounce timer
579
+ if (this.cloudSyncDebounceTimer) {
580
+ clearTimeout(this.cloudSyncDebounceTimer);
581
+ this.cloudSyncDebounceTimer = undefined;
582
+ }
583
+ // Stop processing state updates
584
+ if (this.processingStateInterval) {
585
+ clearInterval(this.processingStateInterval);
586
+ this.processingStateInterval = undefined;
587
+ }
588
+ // Close all active connections
589
+ for (const connection of this.connections) {
590
+ connection.close();
591
+ }
592
+ this.connections.clear();
593
+ return new Promise((resolve) => {
594
+ this.server.close(() => {
595
+ this.running = false;
596
+ // Clean up socket file
597
+ if (fs.existsSync(this.config.socketPath)) {
598
+ fs.unlinkSync(this.config.socketPath);
599
+ }
600
+ // Clean up pid file
601
+ if (fs.existsSync(this.config.pidFilePath)) {
602
+ fs.unlinkSync(this.config.pidFilePath);
603
+ }
604
+ if (this.storage?.close) {
605
+ this.storage.close().catch((err) => {
606
+ log.error('Failed to close storage', { error: String(err) });
607
+ });
608
+ }
609
+ log.info('Stopped');
610
+ resolve();
611
+ });
612
+ });
613
+ }
614
+ /**
615
+ * Handle new connection.
616
+ */
617
+ handleConnection(socket) {
618
+ log.debug('New connection');
619
+ const resumeHandler = this.storage?.getSessionByResumeToken
620
+ ? async ({ agent, resumeToken }) => {
621
+ const session = await this.storage.getSessionByResumeToken(resumeToken);
622
+ if (!session || session.agentName !== agent)
623
+ return null;
624
+ let seedSequences;
625
+ if (this.storage?.getMaxSeqByStream) {
626
+ const streams = await this.storage.getMaxSeqByStream(agent, session.id);
627
+ seedSequences = streams.map(s => ({
628
+ topic: s.topic ?? 'default',
629
+ peer: s.peer,
630
+ seq: s.maxSeq,
631
+ }));
632
+ }
633
+ return {
634
+ sessionId: session.id,
635
+ resumeToken: session.resumeToken ?? resumeToken,
636
+ seedSequences,
637
+ };
638
+ }
639
+ : undefined;
640
+ // Provide processing state callback for heartbeat exemption
641
+ const isProcessing = (agentName) => this.router.isAgentProcessing(agentName);
642
+ const connection = new Connection(socket, { ...this.config, resumeHandler, isProcessing });
643
+ this.connections.add(connection);
644
+ connection.onMessage = (envelope) => {
645
+ this.handleMessage(connection, envelope);
646
+ };
647
+ connection.onAck = (envelope) => {
648
+ this.handleAck(connection, envelope);
649
+ };
650
+ // Update lastSeen on successful heartbeat to keep agent status fresh
651
+ connection.onPong = () => {
652
+ if (connection.agentName) {
653
+ this.registry?.touch(connection.agentName);
654
+ }
655
+ };
656
+ // Register agent when connection becomes active (after successful handshake)
657
+ connection.onActive = () => {
658
+ if (connection.agentName) {
659
+ this.router.register(connection);
660
+ log.info('Agent registered', { agent: connection.agentName });
661
+ // Registry handles persistence internally via save()
662
+ this.registry?.registerOrUpdate({
663
+ name: connection.agentName,
664
+ cli: connection.cli,
665
+ program: connection.program,
666
+ model: connection.model,
667
+ task: connection.task,
668
+ workingDirectory: connection.workingDirectory,
669
+ });
670
+ // Auto-join all agents to #general channel
671
+ this.router.autoJoinChannel(connection.agentName, '#general');
672
+ // Record session start
673
+ if (this.storage instanceof SqliteStorageAdapter) {
674
+ const projectPaths = getProjectPaths();
675
+ const storage = this.storage;
676
+ const persistSession = async () => {
677
+ let startedAt = Date.now();
678
+ if (connection.isResumed && storage.getSessionByResumeToken) {
679
+ const existing = await storage.getSessionByResumeToken(connection.resumeToken);
680
+ if (existing?.startedAt) {
681
+ startedAt = existing.startedAt;
682
+ }
683
+ }
684
+ await storage.startSession({
685
+ id: connection.sessionId,
686
+ agentName: connection.agentName,
687
+ cli: connection.cli,
688
+ projectId: projectPaths.projectId,
689
+ projectRoot: projectPaths.projectRoot,
690
+ startedAt,
691
+ resumeToken: connection.resumeToken,
692
+ });
693
+ };
694
+ persistSession().catch(err => log.error('Failed to record session start', { error: String(err) }));
695
+ }
696
+ }
697
+ // Replay pending deliveries for resumed sessions (unacked messages from previous session)
698
+ if (connection.isResumed) {
699
+ this.router.replayPending(connection).catch(err => {
700
+ log.error('Failed to replay pending messages', { error: String(err) });
701
+ });
702
+ }
703
+ // Deliver any messages that were sent while this agent was offline
704
+ // This handles messages sent during spawn timing gaps or brief disconnections
705
+ this.router.deliverPendingMessages(connection).catch(err => {
706
+ log.error('Failed to deliver pending messages', { error: String(err) });
707
+ });
708
+ // Auto-rejoin channels that the agent was a member of before daemon restart
709
+ // This restores channel memberships from persisted storage (cloud DB or SQLite)
710
+ if (connection.agentName) {
711
+ this.router.autoRejoinChannelsForAgent(connection.agentName).catch(err => {
712
+ log.error('Failed to auto-rejoin channels', { error: String(err) });
713
+ });
714
+ }
715
+ // Notify cloud sync about agent changes
716
+ this.notifyCloudSync();
717
+ // Update connected agents file for CLI
718
+ this.writeConnectedAgentsFile();
719
+ };
720
+ connection.onClose = () => {
721
+ log.debug('Connection closed', { agent: connection.agentName ?? connection.id });
722
+ this.connections.delete(connection);
723
+ this.clearPendingAcksForConnection(connection.id);
724
+ this.router.unregister(connection);
725
+ // Registry handles persistence internally via touch() -> save()
726
+ if (connection.agentName) {
727
+ this.registry?.touch(connection.agentName);
728
+ }
729
+ // Record session end (disconnect - agent may still mark it closed explicitly)
730
+ if (this.storage instanceof SqliteStorageAdapter) {
731
+ this.storage.endSession(connection.sessionId, { closedBy: 'disconnect' })
732
+ .catch(err => log.error('Failed to record session end', { error: String(err) }));
733
+ }
734
+ // Notify cloud sync about agent changes
735
+ this.notifyCloudSync();
736
+ // Update connected agents file for CLI
737
+ this.writeConnectedAgentsFile();
738
+ };
739
+ connection.onError = (error) => {
740
+ log.error('Connection error', { error: error.message });
741
+ this.connections.delete(connection);
742
+ this.clearPendingAcksForConnection(connection.id);
743
+ this.router.unregister(connection);
744
+ // Registry handles persistence internally via touch() -> save()
745
+ if (connection.agentName) {
746
+ this.registry?.touch(connection.agentName);
747
+ }
748
+ // Record session end on error
749
+ if (this.storage instanceof SqliteStorageAdapter) {
750
+ this.storage.endSession(connection.sessionId, { closedBy: 'error' })
751
+ .catch(err => log.error('Failed to record session end', { error: String(err) }));
752
+ }
753
+ // Update connected agents file for CLI
754
+ this.writeConnectedAgentsFile();
755
+ };
756
+ }
757
+ /**
758
+ * Handle incoming message from a connection.
759
+ */
760
+ handleMessage(connection, envelope) {
761
+ switch (envelope.type) {
762
+ case 'SEND': {
763
+ const sendEnvelope = envelope;
764
+ const membershipUpdate = sendEnvelope.payload.data?._channelMembershipUpdate;
765
+ if (membershipUpdate && sendEnvelope.to === '_router') {
766
+ this.router.handleMembershipUpdate({
767
+ channel: membershipUpdate.channel ?? '',
768
+ member: membershipUpdate.member ?? '',
769
+ action: membershipUpdate.action ?? 'join',
770
+ });
771
+ return;
772
+ }
773
+ // Check for consensus commands (messages to _consensus)
774
+ if (this.consensus?.enabled && sendEnvelope.to === '_consensus') {
775
+ const from = connection.agentName ?? 'unknown';
776
+ const result = this.consensus.processIncomingMessage(from, sendEnvelope.payload.body);
777
+ if (result.isConsensusCommand) {
778
+ log.info(`Consensus ${result.type} from ${from}`, {
779
+ success: result.result?.success,
780
+ proposalId: result.result?.proposal?.id,
781
+ });
782
+ // Don't route consensus commands to the router
783
+ return;
784
+ }
785
+ }
786
+ const syncMeta = sendEnvelope.payload_meta?.sync;
787
+ if (syncMeta?.blocking) {
788
+ if (!syncMeta.correlationId) {
789
+ this.sendErrorEnvelope(connection, 'Missing sync correlationId for blocking SEND');
790
+ return;
791
+ }
792
+ const registered = this.registerPendingAck(connection, syncMeta.correlationId, syncMeta.timeoutMs);
793
+ if (!registered) {
794
+ return;
795
+ }
796
+ }
797
+ this.router.route(connection, sendEnvelope);
798
+ break;
799
+ }
800
+ case 'SUBSCRIBE':
801
+ if (connection.agentName && envelope.topic) {
802
+ this.router.subscribe(connection.agentName, envelope.topic);
803
+ }
804
+ break;
805
+ case 'UNSUBSCRIBE':
806
+ if (connection.agentName && envelope.topic) {
807
+ this.router.unsubscribe(connection.agentName, envelope.topic);
808
+ }
809
+ break;
810
+ case 'SHADOW_BIND':
811
+ if (connection.agentName) {
812
+ const payload = envelope.payload;
813
+ this.router.bindShadow(connection.agentName, payload.primaryAgent, {
814
+ speakOn: payload.speakOn,
815
+ receiveIncoming: payload.receiveIncoming,
816
+ receiveOutgoing: payload.receiveOutgoing,
817
+ });
818
+ }
819
+ break;
820
+ case 'SHADOW_UNBIND':
821
+ if (connection.agentName) {
822
+ const payload = envelope.payload;
823
+ // Verify the shadow is actually bound to the specified primary
824
+ const currentPrimary = this.router.getPrimaryForShadow(connection.agentName);
825
+ if (currentPrimary === payload.primaryAgent) {
826
+ this.router.unbindShadow(connection.agentName);
827
+ }
828
+ }
829
+ break;
830
+ case 'LOG':
831
+ // Handle log output from daemon-connected agents
832
+ if (connection.agentName) {
833
+ const payload = envelope.payload;
834
+ const timestamp = payload.timestamp ?? envelope.ts;
835
+ // Forward to dashboard via callback
836
+ if (this.onLogOutput) {
837
+ this.onLogOutput(connection.agentName, payload.data, timestamp);
838
+ }
839
+ }
840
+ break;
841
+ // Channel messaging handlers
842
+ case 'CHANNEL_JOIN': {
843
+ const channelEnvelope = envelope;
844
+ log.info(`Channel join: ${connection.agentName} -> ${channelEnvelope.payload.channel}`);
845
+ this.router.handleChannelJoin(connection, channelEnvelope);
846
+ break;
847
+ }
848
+ case 'CHANNEL_LEAVE': {
849
+ const channelEnvelope = envelope;
850
+ log.info(`Channel leave: ${connection.agentName} <- ${channelEnvelope.payload.channel}`);
851
+ this.router.handleChannelLeave(connection, channelEnvelope);
852
+ break;
853
+ }
854
+ case 'CHANNEL_MESSAGE': {
855
+ const channelEnvelope = envelope;
856
+ log.info(`CHANNEL_MESSAGE received: from=${connection.agentName} channel=${channelEnvelope.payload.channel}`);
857
+ this.router.routeChannelMessage(connection, channelEnvelope);
858
+ break;
859
+ }
860
+ // Spawn/release handlers (protocol-based agent spawning)
861
+ case 'SPAWN': {
862
+ if (!this.spawnManager) {
863
+ this.sendErrorEnvelope(connection, 'SpawnManager not enabled. Configure spawnManager: true in daemon config.');
864
+ break;
865
+ }
866
+ const spawnEnvelope = envelope;
867
+ log.info(`SPAWN request: from=${connection.agentName} agent=${spawnEnvelope.payload.name} cli=${spawnEnvelope.payload.cli}`);
868
+ this.spawnManager.handleSpawn(connection, spawnEnvelope);
869
+ break;
870
+ }
871
+ case 'RELEASE': {
872
+ if (!this.spawnManager) {
873
+ this.sendErrorEnvelope(connection, 'SpawnManager not enabled. Configure spawnManager: true in daemon config.');
874
+ break;
875
+ }
876
+ const releaseEnvelope = envelope;
877
+ log.info(`RELEASE request: from=${connection.agentName} agent=${releaseEnvelope.payload.name}`);
878
+ this.spawnManager.handleRelease(connection, releaseEnvelope);
879
+ break;
880
+ }
881
+ }
882
+ }
883
+ handleAck(connection, envelope) {
884
+ this.router.handleAck(connection, envelope);
885
+ const correlationId = envelope.payload.correlationId;
886
+ if (!correlationId)
887
+ return;
888
+ const pending = this.pendingAcks.get(correlationId);
889
+ if (!pending)
890
+ return;
891
+ clearTimeout(pending.timeoutHandle);
892
+ this.pendingAcks.delete(correlationId);
893
+ const forwardAck = {
894
+ v: envelope.v,
895
+ type: 'ACK',
896
+ id: generateId(),
897
+ ts: Date.now(),
898
+ from: connection.agentName,
899
+ to: pending.connection.agentName,
900
+ payload: envelope.payload,
901
+ };
902
+ pending.connection.send(forwardAck);
903
+ }
904
+ registerPendingAck(connection, correlationId, timeoutMs) {
905
+ if (this.pendingAcks.has(correlationId)) {
906
+ this.sendErrorEnvelope(connection, `Duplicate correlationId: ${correlationId}`);
907
+ return false;
908
+ }
909
+ const timeout = timeoutMs ?? Daemon.DEFAULT_SYNC_TIMEOUT_MS;
910
+ const timeoutHandle = setTimeout(() => {
911
+ this.pendingAcks.delete(correlationId);
912
+ this.sendErrorEnvelope(connection, `ACK timeout after ${timeout}ms`);
913
+ }, timeout);
914
+ this.pendingAcks.set(correlationId, {
915
+ correlationId,
916
+ connectionId: connection.id,
917
+ connection,
918
+ timeoutHandle,
919
+ });
920
+ return true;
921
+ }
922
+ clearPendingAcksForConnection(connectionId) {
923
+ for (const [correlationId, pending] of this.pendingAcks.entries()) {
924
+ if (pending.connectionId !== connectionId)
925
+ continue;
926
+ clearTimeout(pending.timeoutHandle);
927
+ this.pendingAcks.delete(correlationId);
928
+ }
929
+ }
930
+ sendErrorEnvelope(connection, message) {
931
+ const errorEnvelope = {
932
+ v: PROTOCOL_VERSION,
933
+ type: 'ERROR',
934
+ id: generateId(),
935
+ ts: Date.now(),
936
+ payload: {
937
+ code: 'INTERNAL',
938
+ message,
939
+ fatal: false,
940
+ },
941
+ };
942
+ connection.send(errorEnvelope);
943
+ }
944
+ /**
945
+ * Get list of connected agents.
946
+ */
947
+ getAgents() {
948
+ return this.router.getAgents();
949
+ }
950
+ /**
951
+ * Broadcast a system message to all connected agents.
952
+ * Used for system notifications like agent death announcements.
953
+ */
954
+ broadcastSystemMessage(message, data) {
955
+ this.router.broadcastSystemMessage(message, data);
956
+ }
957
+ /**
958
+ * Get connection count.
959
+ */
960
+ get connectionCount() {
961
+ return this.router.connectionCount;
962
+ }
963
+ /**
964
+ * Check if daemon is running.
965
+ */
966
+ get isRunning() {
967
+ return this.running;
968
+ }
969
+ /**
970
+ * Check if consensus is enabled.
971
+ */
972
+ get consensusEnabled() {
973
+ return this.consensus?.enabled ?? false;
974
+ }
975
+ /**
976
+ * Get the consensus integration (for API access).
977
+ */
978
+ getConsensus() {
979
+ return this.consensus;
980
+ }
981
+ }
982
+ // Run as standalone if executed directly
983
+ const isMainModule = import.meta.url === `file://${process.argv[1]}`;
984
+ if (isMainModule) {
985
+ const daemon = new Daemon();
986
+ process.on('SIGINT', async () => {
987
+ log.info('Shutting down (SIGINT)');
988
+ await daemon.stop();
989
+ process.exit(0);
990
+ });
991
+ process.on('SIGTERM', async () => {
992
+ log.info('Shutting down (SIGTERM)');
993
+ await daemon.stop();
994
+ process.exit(0);
995
+ });
996
+ daemon.start().catch((err) => {
997
+ log.error('Failed to start', { error: String(err) });
998
+ process.exit(1);
999
+ });
1000
+ }
1001
+ //# sourceMappingURL=server.js.map