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
@@ -1,1088 +0,0 @@
1
- /**
2
- * RelayPtyOrchestrator - Orchestrates the relay-pty Rust binary
3
- *
4
- * This wrapper spawns the relay-pty binary and communicates via Unix socket.
5
- * It provides the same interface as PtyWrapper but with improved latency
6
- * (~550ms vs ~1700ms) by using direct PTY writes instead of tmux send-keys.
7
- *
8
- * Architecture:
9
- * 1. Spawn relay-pty --name {agentName} -- {command} as child process
10
- * 2. Connect to socket for injection:
11
- * - With WORKSPACE_ID: /tmp/relay/{workspaceId}/sockets/{agentName}.sock
12
- * - Without: /tmp/relay-pty-{agentName}.sock (legacy)
13
- * 3. Parse stdout for relay commands (relay-pty echoes all output)
14
- * 4. Translate SEND envelopes → inject messages via socket
15
- *
16
- * @see docs/RUST_WRAPPER_DESIGN.md for protocol details
17
- */
18
- import { spawn } from 'node:child_process';
19
- import { createConnection } from 'node:net';
20
- import { createHash } from 'node:crypto';
21
- import { join, dirname } from 'node:path';
22
- import { existsSync, unlinkSync, mkdirSync } from 'node:fs';
23
- import { getProjectPaths } from '../utils/project-namespace.js';
24
- import { fileURLToPath } from 'node:url';
25
- // Get the directory where this module is located
26
- const __filename = fileURLToPath(import.meta.url);
27
- const __dirname = dirname(__filename);
28
- import { BaseWrapper } from './base-wrapper.js';
29
- import { parseSummaryWithDetails, parseSessionEndFromOutput } from './parser.js';
30
- import { stripAnsi, sleep, buildInjectionString, INJECTION_CONSTANTS, } from './shared.js';
31
- // ============================================================================
32
- // Types for relay-pty socket protocol
33
- // ============================================================================
34
- const MAX_SOCKET_PATH_LENGTH = 107;
35
- function hashWorkspaceId(workspaceId) {
36
- return createHash('sha256').update(workspaceId).digest('hex').slice(0, 12);
37
- }
38
- /**
39
- * Orchestrator for relay-pty Rust binary
40
- *
41
- * Extends BaseWrapper to provide the same interface as PtyWrapper
42
- * but uses the relay-pty binary for improved injection reliability.
43
- */
44
- export class RelayPtyOrchestrator extends BaseWrapper {
45
- config;
46
- // Process management
47
- relayPtyProcess;
48
- socketPath;
49
- _logPath;
50
- _outboxPath;
51
- socket;
52
- socketConnected = false;
53
- // Output buffering
54
- outputBuffer = '';
55
- rawBuffer = '';
56
- lastParsedLength = 0;
57
- // Interactive mode (show output to terminal)
58
- isInteractive = false;
59
- // Injection state
60
- pendingInjections = new Map();
61
- backpressureActive = false;
62
- readyForMessages = false;
63
- // Unread message indicator state
64
- lastUnreadIndicatorTime = 0;
65
- UNREAD_INDICATOR_COOLDOWN_MS = 5000; // Don't spam indicators
66
- // Track whether any output has been received from the CLI
67
- hasReceivedOutput = false;
68
- // Note: sessionEndProcessed and lastSummaryRawContent are inherited from BaseWrapper
69
- constructor(config) {
70
- super(config);
71
- this.config = config;
72
- // Check for workspace namespacing (for multi-tenant cloud deployment)
73
- // WORKSPACE_ID can be in process.env or passed via config.env
74
- const workspaceId = config.env?.WORKSPACE_ID || process.env.WORKSPACE_ID;
75
- if (workspaceId) {
76
- // Workspace-namespaced paths for cloud multi-tenant isolation
77
- const getWorkspacePaths = (id) => {
78
- const workspaceDir = `/tmp/relay/${id}`;
79
- return {
80
- workspaceDir,
81
- socketPath: `${workspaceDir}/sockets/${config.name}.sock`,
82
- outboxPath: `${workspaceDir}/outbox/${config.name}`,
83
- };
84
- };
85
- let paths = getWorkspacePaths(workspaceId);
86
- if (paths.socketPath.length > MAX_SOCKET_PATH_LENGTH) {
87
- const hashedWorkspaceId = hashWorkspaceId(workspaceId);
88
- const hashedPaths = getWorkspacePaths(hashedWorkspaceId);
89
- console.warn(`[relay-pty-orchestrator:${config.name}] Socket path too long (${paths.socketPath.length} chars); using hashed workspace id ${hashedWorkspaceId}`);
90
- paths = hashedPaths;
91
- }
92
- if (paths.socketPath.length > MAX_SOCKET_PATH_LENGTH) {
93
- throw new Error(`Socket path exceeds ${MAX_SOCKET_PATH_LENGTH} chars: ${paths.socketPath.length}`);
94
- }
95
- this.socketPath = paths.socketPath;
96
- this._outboxPath = paths.outboxPath;
97
- }
98
- else {
99
- // Legacy paths for local development
100
- this.socketPath = `/tmp/relay-pty-${config.name}.sock`;
101
- this._outboxPath = `/tmp/relay-outbox/${config.name}`;
102
- }
103
- if (this.socketPath.length > MAX_SOCKET_PATH_LENGTH) {
104
- throw new Error(`Socket path exceeds ${MAX_SOCKET_PATH_LENGTH} chars: ${this.socketPath.length}`);
105
- }
106
- // Generate log path using same project paths as daemon
107
- // Use cwd from config if specified, otherwise detect from current directory
108
- const paths = getProjectPaths(config.cwd);
109
- this._logPath = join(paths.teamDir, 'worker-logs', `${config.name}.log`);
110
- // Check if we're running interactively (stdin is a TTY)
111
- this.isInteractive = process.stdin.isTTY === true;
112
- }
113
- /**
114
- * Debug log - only outputs when debug is enabled
115
- */
116
- log(message) {
117
- if (this.config.debug) {
118
- console.log(`[relay-pty-orchestrator:${this.config.name}] ${message}`);
119
- }
120
- }
121
- /**
122
- * Error log - always outputs (errors are important)
123
- */
124
- logError(message) {
125
- console.error(`[relay-pty-orchestrator:${this.config.name}] ERROR: ${message}`);
126
- }
127
- /**
128
- * Get the outbox path for this agent (for documentation purposes)
129
- */
130
- get outboxPath() {
131
- return this._outboxPath;
132
- }
133
- // =========================================================================
134
- // Abstract method implementations (required by BaseWrapper)
135
- // =========================================================================
136
- /**
137
- * Start the relay-pty process and connect to socket
138
- */
139
- async start() {
140
- if (this.running)
141
- return;
142
- this.log(` Starting...`);
143
- // Ensure socket directory exists (for workspace-namespaced paths)
144
- const socketDir = dirname(this.socketPath);
145
- try {
146
- if (!existsSync(socketDir)) {
147
- mkdirSync(socketDir, { recursive: true });
148
- this.log(` Created socket directory: ${socketDir}`);
149
- }
150
- }
151
- catch (err) {
152
- this.logError(` Failed to create socket directory: ${err.message}`);
153
- }
154
- // Clean up any stale socket from previous crashed process
155
- try {
156
- if (existsSync(this.socketPath)) {
157
- this.log(` Removing stale socket: ${this.socketPath}`);
158
- unlinkSync(this.socketPath);
159
- }
160
- }
161
- catch (err) {
162
- this.logError(` Failed to clean up socket: ${err.message}`);
163
- }
164
- // Find relay-pty binary
165
- const binaryPath = this.findRelayPtyBinary();
166
- if (!binaryPath) {
167
- throw new Error('relay-pty binary not found. Build with: cd relay-pty && cargo build --release');
168
- }
169
- this.log(` Using binary: ${binaryPath}`);
170
- // Connect to relay daemon first
171
- try {
172
- await this.client.connect();
173
- this.log(` Relay daemon connected`);
174
- }
175
- catch (err) {
176
- this.logError(` Relay connect failed: ${err.message}`);
177
- }
178
- // Spawn relay-pty process
179
- await this.spawnRelayPty(binaryPath);
180
- // Wait for socket to become available and connect
181
- await this.connectToSocket();
182
- this.running = true;
183
- this.readyForMessages = true;
184
- this.startStuckDetection();
185
- this.log(` Ready for messages`);
186
- this.log(` Socket connected: ${this.socketConnected}`);
187
- this.log(` Relay client state: ${this.client.state}`);
188
- // Process any queued messages
189
- this.processMessageQueue();
190
- }
191
- /**
192
- * Stop the relay-pty process gracefully
193
- */
194
- async stop() {
195
- if (!this.running)
196
- return;
197
- this.running = false;
198
- this.stopStuckDetection();
199
- this.log(` Stopping...`);
200
- // Send shutdown command via socket
201
- if (this.socket && this.socketConnected) {
202
- try {
203
- await this.sendSocketRequest({ type: 'shutdown' });
204
- }
205
- catch {
206
- // Ignore errors during shutdown
207
- }
208
- }
209
- // Close socket
210
- this.disconnectSocket();
211
- // Kill process if still running
212
- if (this.relayPtyProcess && !this.relayPtyProcess.killed) {
213
- this.relayPtyProcess.kill('SIGTERM');
214
- // Force kill after timeout
215
- await Promise.race([
216
- new Promise((resolve) => {
217
- this.relayPtyProcess?.on('exit', () => resolve());
218
- }),
219
- sleep(5000).then(() => {
220
- if (this.relayPtyProcess && !this.relayPtyProcess.killed) {
221
- this.relayPtyProcess.kill('SIGKILL');
222
- }
223
- }),
224
- ]);
225
- }
226
- // Cleanup relay client
227
- this.destroyClient();
228
- // Clean up socket file
229
- try {
230
- if (existsSync(this.socketPath)) {
231
- unlinkSync(this.socketPath);
232
- this.log(` Cleaned up socket: ${this.socketPath}`);
233
- }
234
- }
235
- catch (err) {
236
- this.logError(` Failed to clean up socket: ${err.message}`);
237
- }
238
- this.log(` Stopped`);
239
- }
240
- /**
241
- * Inject content into the agent via socket
242
- */
243
- async performInjection(content) {
244
- // This is called by BaseWrapper but we handle injection differently
245
- // via the socket protocol in processMessageQueue
246
- throw new Error('Use injectMessage() instead of performInjection()');
247
- }
248
- /**
249
- * Get cleaned output for parsing
250
- */
251
- getCleanOutput() {
252
- return stripAnsi(this.rawBuffer);
253
- }
254
- // =========================================================================
255
- // Process management
256
- // =========================================================================
257
- /**
258
- * Find the relay-pty binary
259
- */
260
- findRelayPtyBinary() {
261
- // Check config path first
262
- if (this.config.relayPtyPath && existsSync(this.config.relayPtyPath)) {
263
- return this.config.relayPtyPath;
264
- }
265
- // Get the package root (two levels up from dist/wrapper/)
266
- const packageRoot = join(__dirname, '..', '..');
267
- // Check common locations (ordered by priority)
268
- const candidates = [
269
- // Primary: installed by postinstall from platform-specific binary
270
- join(packageRoot, 'bin', 'relay-pty'),
271
- // Development: local Rust build
272
- join(packageRoot, 'relay-pty', 'target', 'release', 'relay-pty'),
273
- join(packageRoot, 'relay-pty', 'target', 'debug', 'relay-pty'),
274
- // Local build in cwd (for development)
275
- join(process.cwd(), 'relay-pty', 'target', 'release', 'relay-pty'),
276
- join(process.cwd(), 'relay-pty', 'target', 'debug', 'relay-pty'),
277
- // Installed globally
278
- '/usr/local/bin/relay-pty',
279
- // In node_modules (when installed as dependency)
280
- join(process.cwd(), 'node_modules', 'agent-relay', 'bin', 'relay-pty'),
281
- join(process.cwd(), 'node_modules', '.bin', 'relay-pty'),
282
- ];
283
- for (const candidate of candidates) {
284
- if (existsSync(candidate)) {
285
- return candidate;
286
- }
287
- }
288
- return null;
289
- }
290
- /**
291
- * Spawn the relay-pty process
292
- */
293
- async spawnRelayPty(binaryPath) {
294
- // Get terminal dimensions for proper rendering
295
- const rows = process.stdout.rows || 24;
296
- const cols = process.stdout.columns || 80;
297
- const args = [
298
- '--name', this.config.name,
299
- '--socket', this.socketPath,
300
- '--idle-timeout', String(this.config.idleBeforeInjectMs ?? 500),
301
- '--json-output', // Enable Rust parsing output
302
- '--rows', String(rows),
303
- '--cols', String(cols),
304
- '--log-level', 'warn', // Only show warnings and errors
305
- '--log-file', this._logPath, // Enable output logging
306
- '--outbox', this._outboxPath, // Enable file-based relay messages
307
- '--', this.config.command,
308
- ...(this.config.args ?? []),
309
- ];
310
- this.log(` Spawning: ${binaryPath} ${args.join(' ')}`);
311
- // For interactive mode, let Rust directly inherit stdin/stdout from the terminal
312
- // This is more robust than manual forwarding through pipes
313
- // We still pipe stderr to capture JSON parsed commands
314
- const stdio = this.isInteractive
315
- ? ['inherit', 'inherit', 'pipe'] // Rust handles terminal directly
316
- : ['pipe', 'pipe', 'pipe']; // Headless mode - we handle I/O
317
- const proc = spawn(binaryPath, args, {
318
- cwd: this.config.cwd ?? process.cwd(),
319
- env: {
320
- ...process.env,
321
- ...this.config.env,
322
- AGENT_RELAY_NAME: this.config.name,
323
- TERM: 'xterm-256color',
324
- },
325
- stdio,
326
- });
327
- this.relayPtyProcess = proc;
328
- // Handle stdout (agent output) - only in headless mode
329
- if (!this.isInteractive && proc.stdout) {
330
- proc.stdout.on('data', (data) => {
331
- const text = data.toString();
332
- this.handleOutput(text);
333
- });
334
- }
335
- // Handle stderr (relay-pty logs and JSON output) - always needed
336
- if (proc.stderr) {
337
- proc.stderr.on('data', (data) => {
338
- const text = data.toString();
339
- this.handleStderr(text);
340
- });
341
- }
342
- // Handle exit
343
- proc.on('exit', (code, signal) => {
344
- const exitCode = code ?? (signal === 'SIGKILL' ? 137 : 1);
345
- this.log(` Process exited: code=${exitCode} signal=${signal}`);
346
- this.running = false;
347
- this.emit('exit', exitCode);
348
- this.config.onExit?.(exitCode);
349
- });
350
- // Handle error
351
- proc.on('error', (err) => {
352
- this.logError(` Process error: ${err.message}`);
353
- this.emit('error', err);
354
- });
355
- // Wait for process to start
356
- await sleep(500);
357
- if (proc.exitCode !== null) {
358
- throw new Error(`relay-pty exited immediately with code ${proc.exitCode}`);
359
- }
360
- }
361
- /**
362
- * Handle output from relay-pty stdout (headless mode only)
363
- * In interactive mode, stdout goes directly to terminal via inherited stdio
364
- */
365
- handleOutput(data) {
366
- this.rawBuffer += data;
367
- this.outputBuffer += data;
368
- this.hasReceivedOutput = true;
369
- // Feed to idle detector
370
- this.feedIdleDetectorOutput(data);
371
- // Check for unread messages and append indicator if needed
372
- const indicator = this.formatUnreadIndicator();
373
- const outputWithIndicator = indicator ? data + indicator : data;
374
- // Emit output event (with indicator if present)
375
- this.emit('output', outputWithIndicator);
376
- // Stream to daemon if configured
377
- if (this.config.streamLogs !== false && this.client.state === 'READY') {
378
- this.client.sendLog(outputWithIndicator);
379
- }
380
- // Parse for relay commands
381
- this.parseRelayCommands();
382
- // Check for summary and session end
383
- const cleanContent = stripAnsi(this.rawBuffer);
384
- this.checkForSummary(cleanContent);
385
- this.checkForSessionEnd(cleanContent);
386
- }
387
- /**
388
- * Format an unread message indicator if there are pending messages.
389
- * Returns empty string if no pending messages or within cooldown period.
390
- *
391
- * Example output:
392
- * ───────────────────────────
393
- * 📬 2 unread messages (from: Alice, Bob)
394
- */
395
- formatUnreadIndicator() {
396
- const queueLength = this.messageQueue.length;
397
- if (queueLength === 0) {
398
- return '';
399
- }
400
- // Check cooldown to avoid spamming
401
- const now = Date.now();
402
- if (now - this.lastUnreadIndicatorTime < this.UNREAD_INDICATOR_COOLDOWN_MS) {
403
- return '';
404
- }
405
- this.lastUnreadIndicatorTime = now;
406
- // Collect unique sender names
407
- const senders = [...new Set(this.messageQueue.map(m => m.from))];
408
- const senderList = senders.slice(0, 3).join(', ');
409
- const moreCount = senders.length > 3 ? ` +${senders.length - 3} more` : '';
410
- const line = '─'.repeat(27);
411
- const messageWord = queueLength === 1 ? 'message' : 'messages';
412
- return `\n${line}\n📬 ${queueLength} unread ${messageWord} (from: ${senderList}${moreCount})\n`;
413
- }
414
- /**
415
- * Handle stderr from relay-pty (logs and JSON parsed commands)
416
- */
417
- handleStderr(data) {
418
- // relay-pty outputs JSON parsed commands to stderr with --json-output
419
- const lines = data.split('\n').filter(l => l.trim());
420
- for (const line of lines) {
421
- if (line.startsWith('{')) {
422
- // JSON output - parsed relay command from Rust
423
- try {
424
- const parsed = JSON.parse(line);
425
- if (parsed.type === 'relay_command' && parsed.kind) {
426
- this.log(`Rust parsed [${parsed.kind}]: ${parsed.from} -> ${parsed.to}`);
427
- this.handleRustParsedCommand(parsed);
428
- }
429
- }
430
- catch {
431
- // Not JSON, just log (only in debug mode)
432
- if (this.config.debug) {
433
- console.error(`[relay-pty:${this.config.name}] ${line}`);
434
- }
435
- }
436
- }
437
- else {
438
- // Non-JSON stderr - only show in debug mode (logs, info messages)
439
- if (this.config.debug) {
440
- console.error(`[relay-pty:${this.config.name}] ${line}`);
441
- }
442
- }
443
- }
444
- }
445
- /**
446
- * Handle a parsed command from Rust relay-pty
447
- * Rust outputs structured JSON with 'kind' field: "message", "spawn", "release"
448
- */
449
- handleRustParsedCommand(parsed) {
450
- switch (parsed.kind) {
451
- case 'spawn':
452
- if (parsed.spawn_name && parsed.spawn_cli) {
453
- this.log(` Spawn detected: ${parsed.spawn_name} (${parsed.spawn_cli})`);
454
- this.handleSpawnCommand(parsed.spawn_name, parsed.spawn_cli, parsed.spawn_task || '');
455
- }
456
- break;
457
- case 'release':
458
- if (parsed.release_name) {
459
- this.log(`Release: ${parsed.release_name}`);
460
- this.handleReleaseCommand(parsed.release_name);
461
- }
462
- else {
463
- this.logError(`Missing release_name in parsed command: ${JSON.stringify(parsed)}`);
464
- }
465
- break;
466
- case 'message':
467
- default:
468
- this.sendRelayCommand({
469
- to: parsed.to,
470
- kind: 'message',
471
- body: parsed.body,
472
- thread: parsed.thread,
473
- raw: parsed.raw,
474
- });
475
- break;
476
- }
477
- }
478
- /**
479
- * Handle spawn command (from Rust stderr JSON parsing)
480
- *
481
- * Note: We do NOT send the initial task message here because the spawner
482
- * now handles it after waitUntilCliReady(). Sending it here would cause
483
- * duplicate task delivery.
484
- */
485
- handleSpawnCommand(name, cli, task) {
486
- const key = `spawn:${name}:${cli}`;
487
- if (this.processedSpawnCommands.has(key)) {
488
- this.log(` Spawn already processed: ${key}`);
489
- return;
490
- }
491
- this.processedSpawnCommands.add(key);
492
- this.log(` Spawn: ${name} (${cli})`);
493
- this.log(` dashboardPort=${this.config.dashboardPort}, onSpawn=${!!this.config.onSpawn}`);
494
- // Try dashboard API first, fall back to callback
495
- // The spawner will send the task after waitUntilCliReady()
496
- if (this.config.dashboardPort) {
497
- this.log(` Calling dashboard API at port ${this.config.dashboardPort}`);
498
- this.spawnViaDashboardApi(name, cli, task)
499
- .then(() => {
500
- this.log(` Dashboard spawn succeeded for ${name}`);
501
- })
502
- .catch(err => {
503
- this.logError(` Dashboard spawn failed: ${err.message}`);
504
- if (this.config.onSpawn) {
505
- this.log(` Falling back to onSpawn callback`);
506
- Promise.resolve(this.config.onSpawn(name, cli, task))
507
- .catch(e => this.logError(` onSpawn callback failed: ${e.message}`));
508
- }
509
- });
510
- }
511
- else if (this.config.onSpawn) {
512
- this.log(` Using onSpawn callback directly`);
513
- Promise.resolve(this.config.onSpawn(name, cli, task))
514
- .catch(e => this.logError(` onSpawn callback failed: ${e.message}`));
515
- }
516
- else {
517
- this.logError(` No spawn mechanism available!`);
518
- }
519
- }
520
- /**
521
- * Handle release command
522
- */
523
- handleReleaseCommand(name) {
524
- const key = `release:${name}`;
525
- if (this.processedReleaseCommands.has(key)) {
526
- return;
527
- }
528
- this.processedReleaseCommands.add(key);
529
- this.log(` Release: ${name}`);
530
- // Try dashboard API first, fall back to callback
531
- if (this.config.dashboardPort) {
532
- this.releaseViaDashboardApi(name).catch(err => {
533
- this.logError(` Dashboard release failed: ${err.message}`);
534
- this.config.onRelease?.(name);
535
- });
536
- }
537
- else if (this.config.onRelease) {
538
- this.config.onRelease(name);
539
- }
540
- }
541
- /**
542
- * Spawn agent via dashboard API
543
- */
544
- async spawnViaDashboardApi(name, cli, task) {
545
- const response = await fetch(`http://localhost:${this.config.dashboardPort}/api/spawn`, {
546
- method: 'POST',
547
- headers: { 'Content-Type': 'application/json' },
548
- body: JSON.stringify({
549
- name,
550
- cli,
551
- task,
552
- spawnerName: this.config.name, // Include spawner name so task appears from correct agent
553
- }),
554
- });
555
- if (!response.ok) {
556
- throw new Error(`HTTP ${response.status}`);
557
- }
558
- }
559
- /**
560
- * Release agent via dashboard API
561
- */
562
- async releaseViaDashboardApi(name) {
563
- const response = await fetch(`http://localhost:${this.config.dashboardPort}/api/spawned/${encodeURIComponent(name)}`, {
564
- method: 'DELETE',
565
- });
566
- if (!response.ok) {
567
- const body = await response.json().catch(() => ({ error: 'Unknown' }));
568
- throw new Error(`HTTP ${response.status}: ${body.error || 'Unknown error'}`);
569
- }
570
- this.log(`Released ${name} via dashboard API`);
571
- }
572
- // =========================================================================
573
- // Socket communication
574
- // =========================================================================
575
- /**
576
- * Connect to the relay-pty socket
577
- */
578
- async connectToSocket() {
579
- const timeout = this.config.socketConnectTimeoutMs ?? 5000;
580
- const maxAttempts = this.config.socketReconnectAttempts ?? 3;
581
- for (let attempt = 1; attempt <= maxAttempts; attempt++) {
582
- try {
583
- await this.attemptSocketConnection(timeout);
584
- this.log(` Socket connected`);
585
- return;
586
- }
587
- catch (err) {
588
- this.logError(` Socket connect attempt ${attempt}/${maxAttempts} failed: ${err.message}`);
589
- if (attempt < maxAttempts) {
590
- await sleep(1000 * attempt); // Exponential backoff
591
- }
592
- }
593
- }
594
- throw new Error(`Failed to connect to socket after ${maxAttempts} attempts`);
595
- }
596
- /**
597
- * Attempt a single socket connection
598
- */
599
- attemptSocketConnection(timeout) {
600
- return new Promise((resolve, reject) => {
601
- const timer = setTimeout(() => {
602
- reject(new Error('Socket connection timeout'));
603
- }, timeout);
604
- this.socket = createConnection(this.socketPath, () => {
605
- clearTimeout(timer);
606
- this.socketConnected = true;
607
- resolve();
608
- });
609
- this.socket.on('error', (err) => {
610
- clearTimeout(timer);
611
- this.socketConnected = false;
612
- reject(err);
613
- });
614
- this.socket.on('close', () => {
615
- this.socketConnected = false;
616
- this.log(` Socket closed`);
617
- });
618
- // Handle incoming data (responses)
619
- let buffer = '';
620
- this.socket.on('data', (data) => {
621
- buffer += data.toString();
622
- // Process complete lines
623
- const lines = buffer.split('\n');
624
- buffer = lines.pop() ?? ''; // Keep incomplete line in buffer
625
- for (const line of lines) {
626
- if (line.trim()) {
627
- this.handleSocketResponse(line);
628
- }
629
- }
630
- });
631
- });
632
- }
633
- /**
634
- * Disconnect from socket
635
- */
636
- disconnectSocket() {
637
- if (this.socket) {
638
- this.socket.destroy();
639
- this.socket = undefined;
640
- this.socketConnected = false;
641
- }
642
- // Reject all pending injections
643
- for (const [id, pending] of this.pendingInjections) {
644
- clearTimeout(pending.timeout);
645
- pending.reject(new Error('Socket disconnected'));
646
- }
647
- this.pendingInjections.clear();
648
- }
649
- /**
650
- * Send a request to the socket and optionally wait for response
651
- */
652
- sendSocketRequest(request) {
653
- return new Promise((resolve, reject) => {
654
- if (!this.socket || !this.socketConnected) {
655
- reject(new Error('Socket not connected'));
656
- return;
657
- }
658
- const json = JSON.stringify(request) + '\n';
659
- this.socket.write(json, (err) => {
660
- if (err) {
661
- reject(err);
662
- }
663
- else {
664
- resolve();
665
- }
666
- });
667
- });
668
- }
669
- /**
670
- * Handle a response from the socket
671
- */
672
- handleSocketResponse(line) {
673
- try {
674
- const response = JSON.parse(line);
675
- switch (response.type) {
676
- case 'inject_result':
677
- this.handleInjectResult(response);
678
- break;
679
- case 'status':
680
- // Status responses are typically requested explicitly
681
- this.log(` Status: idle=${response.agent_idle} queue=${response.queue_length}`);
682
- break;
683
- case 'backpressure':
684
- this.handleBackpressure(response);
685
- break;
686
- case 'error':
687
- this.logError(` Socket error: ${response.message}`);
688
- break;
689
- case 'shutdown_ack':
690
- this.log(` Shutdown acknowledged`);
691
- break;
692
- }
693
- }
694
- catch (err) {
695
- this.logError(` Failed to parse socket response: ${err.message}`);
696
- }
697
- }
698
- /**
699
- * Handle injection result response
700
- */
701
- handleInjectResult(response) {
702
- this.log(` handleInjectResult: id=${response.id.substring(0, 8)} status=${response.status}`);
703
- const pending = this.pendingInjections.get(response.id);
704
- if (!pending) {
705
- // Response for unknown message - might be from a previous session
706
- this.log(` No pending injection found for ${response.id.substring(0, 8)}`);
707
- return;
708
- }
709
- if (response.status === 'delivered') {
710
- clearTimeout(pending.timeout);
711
- this.pendingInjections.delete(response.id);
712
- pending.resolve(true);
713
- this.log(` Message ${response.id.substring(0, 8)} delivered`);
714
- }
715
- else if (response.status === 'failed') {
716
- clearTimeout(pending.timeout);
717
- this.pendingInjections.delete(response.id);
718
- pending.resolve(false);
719
- this.logError(` Message ${response.id.substring(0, 8)} failed: ${response.error}`);
720
- this.emit('injection-failed', {
721
- messageId: response.id,
722
- from: 'unknown',
723
- error: response.error ?? 'Unknown error',
724
- });
725
- }
726
- // queued/injecting are intermediate states - wait for final status
727
- }
728
- /**
729
- * Handle backpressure notification
730
- */
731
- handleBackpressure(response) {
732
- const wasActive = this.backpressureActive;
733
- this.backpressureActive = !response.accept;
734
- if (this.backpressureActive !== wasActive) {
735
- this.log(` Backpressure: ${this.backpressureActive ? 'ACTIVE' : 'cleared'} (queue=${response.queue_length})`);
736
- this.emit('backpressure', { queueLength: response.queue_length, accept: response.accept });
737
- // Resume processing if backpressure cleared
738
- if (!this.backpressureActive) {
739
- this.processMessageQueue();
740
- }
741
- }
742
- }
743
- // =========================================================================
744
- // Message handling
745
- // =========================================================================
746
- /**
747
- * Inject a message into the agent via socket
748
- */
749
- async injectMessage(msg) {
750
- this.log(` === INJECT START: ${msg.messageId.substring(0, 8)} from ${msg.from} ===`);
751
- if (!this.socket || !this.socketConnected) {
752
- this.logError(` Cannot inject - socket not connected`);
753
- return false;
754
- }
755
- // Build injection content
756
- const content = buildInjectionString(msg);
757
- this.log(` Injection content (${content.length} bytes): ${content.substring(0, 100)}...`);
758
- // Create request
759
- const request = {
760
- type: 'inject',
761
- id: msg.messageId,
762
- from: msg.from,
763
- body: content,
764
- priority: msg.importance ?? 0,
765
- };
766
- this.log(` Sending inject request to socket...`);
767
- // Create promise for result
768
- return new Promise((resolve, reject) => {
769
- const timeout = setTimeout(() => {
770
- this.logError(` Inject timeout for ${msg.messageId.substring(0, 8)} after 30s`);
771
- this.pendingInjections.delete(msg.messageId);
772
- resolve(false); // Timeout = failure
773
- }, 30000); // 30 second timeout for injection
774
- this.pendingInjections.set(msg.messageId, { resolve, reject, timeout });
775
- // Send request
776
- this.sendSocketRequest(request)
777
- .then(() => {
778
- this.log(` Socket request sent for ${msg.messageId.substring(0, 8)}`);
779
- })
780
- .catch((err) => {
781
- this.logError(` Socket request failed for ${msg.messageId.substring(0, 8)}: ${err.message}`);
782
- clearTimeout(timeout);
783
- this.pendingInjections.delete(msg.messageId);
784
- resolve(false);
785
- });
786
- });
787
- }
788
- /**
789
- * Process queued messages
790
- */
791
- async processMessageQueue() {
792
- if (!this.readyForMessages || this.backpressureActive || this.isInjecting) {
793
- return;
794
- }
795
- if (this.messageQueue.length === 0) {
796
- return;
797
- }
798
- this.isInjecting = true;
799
- const msg = this.messageQueue.shift();
800
- const bodyPreview = msg.body.substring(0, 50).replace(/\n/g, '\\n');
801
- this.log(` Processing message from ${msg.from}: "${bodyPreview}..." (remaining=${this.messageQueue.length})`);
802
- try {
803
- const success = await this.injectMessage(msg);
804
- if (!success) {
805
- this.logError(` Injection failed for message ${msg.messageId.substring(0, 8)}`);
806
- this.injectionMetrics.failed++;
807
- this.config.onInjectionFailed?.(msg.messageId, 'Injection failed');
808
- }
809
- else {
810
- this.injectionMetrics.successFirstTry++;
811
- }
812
- this.injectionMetrics.total++;
813
- }
814
- catch (err) {
815
- this.logError(` Injection error: ${err.message}`);
816
- this.injectionMetrics.failed++;
817
- this.injectionMetrics.total++;
818
- }
819
- finally {
820
- this.isInjecting = false;
821
- // Process next message after delay
822
- if (this.messageQueue.length > 0 && !this.backpressureActive) {
823
- setTimeout(() => this.processMessageQueue(), INJECTION_CONSTANTS.QUEUE_PROCESS_DELAY_MS);
824
- }
825
- }
826
- }
827
- /**
828
- * Override handleIncomingMessage to trigger queue processing
829
- */
830
- handleIncomingMessage(from, payload, messageId, meta, originalTo) {
831
- this.log(` === MESSAGE RECEIVED: ${messageId.substring(0, 8)} from ${from} ===`);
832
- this.log(` Body preview: ${payload.body?.substring(0, 100) ?? '(no body)'}...`);
833
- super.handleIncomingMessage(from, payload, messageId, meta, originalTo);
834
- this.log(` Queue length after add: ${this.messageQueue.length}`);
835
- this.processMessageQueue();
836
- }
837
- // =========================================================================
838
- // Output parsing
839
- // =========================================================================
840
- /**
841
- * Parse relay commands from output
842
- */
843
- parseRelayCommands() {
844
- const cleanContent = stripAnsi(this.rawBuffer);
845
- if (cleanContent.length <= this.lastParsedLength) {
846
- return;
847
- }
848
- // Parse new content with lookback for fenced messages
849
- const lookbackStart = Math.max(0, this.lastParsedLength - 500);
850
- const contentToParse = cleanContent.substring(lookbackStart);
851
- // Parse fenced messages
852
- this.parseFencedMessages(contentToParse);
853
- // Parse single-line messages
854
- this.parseSingleLineMessages(contentToParse);
855
- // Parse spawn/release commands
856
- this.parseSpawnReleaseCommands(contentToParse);
857
- this.lastParsedLength = cleanContent.length;
858
- }
859
- /**
860
- * Parse fenced multi-line messages
861
- */
862
- parseFencedMessages(content) {
863
- const escapedPrefix = this.relayPrefix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
864
- const fencePattern = new RegExp(`${escapedPrefix}(\\S+)(?:\\s+\\[thread:([\\w-]+)\\])?\\s*<<<([\\s\\S]*?)>>>`, 'g');
865
- let match;
866
- while ((match = fencePattern.exec(content)) !== null) {
867
- const target = match[1];
868
- const thread = match[2];
869
- const body = match[3].trim();
870
- if (!body || target === 'spawn' || target === 'release') {
871
- continue;
872
- }
873
- this.sendRelayCommand({
874
- to: target,
875
- kind: 'message',
876
- body,
877
- thread,
878
- raw: match[0],
879
- });
880
- }
881
- }
882
- /**
883
- * Parse single-line messages
884
- */
885
- parseSingleLineMessages(content) {
886
- const lines = content.split('\n');
887
- const escapedPrefix = this.relayPrefix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
888
- const pattern = new RegExp(`${escapedPrefix}(\\S+)(?:\\s+\\[thread:([\\w-]+)\\])?\\s+(.+)$`);
889
- for (const line of lines) {
890
- // Skip fenced messages
891
- if (line.includes('<<<') || line.includes('>>>')) {
892
- continue;
893
- }
894
- const match = line.match(pattern);
895
- if (!match) {
896
- continue;
897
- }
898
- const target = match[1];
899
- const thread = match[2];
900
- const body = match[3].trim();
901
- if (!body || target === 'spawn' || target === 'release') {
902
- continue;
903
- }
904
- this.sendRelayCommand({
905
- to: target,
906
- kind: 'message',
907
- body,
908
- thread,
909
- raw: line,
910
- });
911
- }
912
- }
913
- // =========================================================================
914
- // Summary and session end detection
915
- // =========================================================================
916
- /**
917
- * Check for [[SUMMARY]] blocks
918
- */
919
- checkForSummary(content) {
920
- const result = parseSummaryWithDetails(content);
921
- if (!result.found || !result.valid) {
922
- return;
923
- }
924
- if (result.rawContent === this.lastSummaryRawContent) {
925
- return;
926
- }
927
- this.lastSummaryRawContent = result.rawContent ?? '';
928
- this.emit('summary', {
929
- agentName: this.config.name,
930
- summary: result.summary,
931
- });
932
- }
933
- /**
934
- * Check for [[SESSION_END]] blocks
935
- */
936
- checkForSessionEnd(content) {
937
- if (this.sessionEndProcessed) {
938
- return;
939
- }
940
- const sessionEnd = parseSessionEndFromOutput(content);
941
- if (!sessionEnd) {
942
- return;
943
- }
944
- this.sessionEndProcessed = true;
945
- this.emit('session-end', {
946
- agentName: this.config.name,
947
- marker: sessionEnd,
948
- });
949
- }
950
- // =========================================================================
951
- // Public API
952
- // =========================================================================
953
- /**
954
- * Query status from relay-pty
955
- */
956
- async queryStatus() {
957
- if (!this.socket || !this.socketConnected) {
958
- return null;
959
- }
960
- try {
961
- await this.sendSocketRequest({ type: 'status' });
962
- // Response will come asynchronously via handleSocketResponse
963
- // For now, return null - could implement request/response matching
964
- return null;
965
- }
966
- catch {
967
- return null;
968
- }
969
- }
970
- /**
971
- * Wait for the CLI to be ready to receive messages.
972
- * This waits for:
973
- * 1. The CLI to produce at least one output (it has started)
974
- * 2. The CLI to become idle (it's ready for input)
975
- *
976
- * This is more reliable than a random sleep because it waits for
977
- * actual signals from the CLI rather than guessing how long it takes to start.
978
- *
979
- * @param timeoutMs Maximum time to wait (default: 30s)
980
- * @param pollMs Polling interval (default: 100ms)
981
- * @returns true if CLI is ready, false if timeout
982
- */
983
- async waitUntilCliReady(timeoutMs = 30000, pollMs = 100) {
984
- const startTime = Date.now();
985
- this.log(` Waiting for CLI to be ready (timeout: ${timeoutMs}ms)`);
986
- // Phase 1: Wait for first output (CLI has started)
987
- while (Date.now() - startTime < timeoutMs) {
988
- if (this.hasReceivedOutput) {
989
- this.log(` CLI has started producing output`);
990
- break;
991
- }
992
- await sleep(pollMs);
993
- }
994
- if (!this.hasReceivedOutput) {
995
- this.log(` Timeout waiting for CLI to produce output`);
996
- return false;
997
- }
998
- // Phase 2: Wait for idle state (CLI is ready for input)
999
- const remainingTime = timeoutMs - (Date.now() - startTime);
1000
- if (remainingTime <= 0) {
1001
- return false;
1002
- }
1003
- const idleResult = await this.waitForIdleState(remainingTime, pollMs);
1004
- if (idleResult.isIdle) {
1005
- this.log(` CLI is idle and ready (confidence: ${idleResult.confidence.toFixed(2)})`);
1006
- return true;
1007
- }
1008
- this.log(` Timeout waiting for CLI to become idle`);
1009
- return false;
1010
- }
1011
- /**
1012
- * Check if the CLI has produced any output yet.
1013
- * Useful for checking if the CLI has started without blocking.
1014
- */
1015
- hasCliStarted() {
1016
- return this.hasReceivedOutput;
1017
- }
1018
- /**
1019
- * Get raw output buffer
1020
- */
1021
- getRawOutput() {
1022
- return this.rawBuffer;
1023
- }
1024
- /**
1025
- * Check if backpressure is active
1026
- */
1027
- isBackpressureActive() {
1028
- return this.backpressureActive;
1029
- }
1030
- /**
1031
- * Get the socket path
1032
- */
1033
- getSocketPath() {
1034
- return this.socketPath;
1035
- }
1036
- /**
1037
- * Get the relay-pty process PID
1038
- */
1039
- get pid() {
1040
- return this.relayPtyProcess?.pid;
1041
- }
1042
- /**
1043
- * Get the log file path (not used by relay-pty, returns undefined)
1044
- */
1045
- get logPath() {
1046
- return this._logPath;
1047
- }
1048
- /**
1049
- * Kill the process forcefully
1050
- */
1051
- async kill() {
1052
- if (this.relayPtyProcess && !this.relayPtyProcess.killed) {
1053
- this.relayPtyProcess.kill('SIGKILL');
1054
- }
1055
- this.running = false;
1056
- this.disconnectSocket();
1057
- this.destroyClient();
1058
- }
1059
- /**
1060
- * Get output lines (for compatibility with PtyWrapper)
1061
- * @param limit Maximum number of lines to return
1062
- */
1063
- getOutput(limit) {
1064
- const lines = this.rawBuffer.split('\n');
1065
- if (limit && limit > 0) {
1066
- return lines.slice(-limit);
1067
- }
1068
- return lines;
1069
- }
1070
- /**
1071
- * Write data directly to the process stdin
1072
- * @param data Data to write
1073
- */
1074
- async write(data) {
1075
- if (!this.relayPtyProcess || !this.relayPtyProcess.stdin) {
1076
- throw new Error('Process not running');
1077
- }
1078
- const buffer = typeof data === 'string' ? Buffer.from(data) : data;
1079
- this.relayPtyProcess.stdin.write(buffer);
1080
- }
1081
- /**
1082
- * Get the agent ID (from continuity if available)
1083
- */
1084
- getAgentId() {
1085
- return this.agentId;
1086
- }
1087
- }
1088
- //# sourceMappingURL=relay-pty-orchestrator.js.map