agent-relay 2.0.28 → 2.0.32

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 (894) hide show
  1. package/README.md +19 -0
  2. package/dist/index.cjs +85691 -0
  3. package/dist/src/bridge/index.d.ts.map +1 -0
  4. package/dist/src/bridge/index.js.map +1 -0
  5. package/dist/src/cli/commands/doctor.d.ts +2 -0
  6. package/dist/src/cli/commands/doctor.d.ts.map +1 -0
  7. package/dist/src/cli/commands/doctor.js +451 -0
  8. package/dist/src/cli/commands/doctor.js.map +1 -0
  9. package/dist/src/cli/index.d.ts.map +1 -0
  10. package/dist/src/cli/index.js +29 -1
  11. package/dist/src/cli/index.js.map +1 -0
  12. package/dist/src/config/relay-config.d.ts.map +1 -0
  13. package/dist/src/config/relay-config.js.map +1 -0
  14. package/dist/src/continuity/index.d.ts.map +1 -0
  15. package/dist/src/continuity/index.js.map +1 -0
  16. package/dist/src/daemon/index.d.ts.map +1 -0
  17. package/dist/src/daemon/index.js.map +1 -0
  18. package/dist/src/health-worker-manager.d.ts.map +1 -0
  19. package/dist/src/health-worker-manager.js.map +1 -0
  20. package/dist/src/health-worker.d.ts.map +1 -0
  21. package/dist/src/health-worker.js.map +1 -0
  22. package/dist/src/hooks/index.d.ts.map +1 -0
  23. package/dist/src/hooks/index.js.map +1 -0
  24. package/dist/src/index.d.ts.map +1 -0
  25. package/dist/src/index.js.map +1 -0
  26. package/dist/src/memory/index.d.ts.map +1 -0
  27. package/dist/src/memory/index.js.map +1 -0
  28. package/dist/src/policy/index.d.ts.map +1 -0
  29. package/dist/src/policy/index.js.map +1 -0
  30. package/dist/src/protocol/index.d.ts.map +1 -0
  31. package/dist/src/protocol/index.js.map +1 -0
  32. package/dist/src/resiliency/index.d.ts.map +1 -0
  33. package/dist/src/resiliency/index.js.map +1 -0
  34. package/dist/src/shared/cli-auth-config.d.ts.map +1 -0
  35. package/dist/src/shared/cli-auth-config.js.map +1 -0
  36. package/dist/src/state/index.d.ts.map +1 -0
  37. package/dist/src/state/index.js.map +1 -0
  38. package/dist/src/storage/index.d.ts.map +1 -0
  39. package/dist/src/storage/index.js.map +1 -0
  40. package/dist/src/trajectory/index.d.ts.map +1 -0
  41. package/dist/src/trajectory/index.js.map +1 -0
  42. package/dist/src/utils/index.d.ts.map +1 -0
  43. package/dist/src/utils/index.js.map +1 -0
  44. package/dist/src/wrapper/index.d.ts.map +1 -0
  45. package/dist/src/wrapper/index.js.map +1 -0
  46. package/package.json +83 -20
  47. package/packages/api-types/dist/index.d.ts.map +1 -0
  48. package/packages/api-types/dist/index.js.map +1 -0
  49. package/packages/api-types/dist/schemas/agent.d.ts.map +1 -0
  50. package/packages/api-types/dist/schemas/agent.js.map +1 -0
  51. package/packages/api-types/dist/schemas/api.d.ts.map +1 -0
  52. package/packages/api-types/dist/schemas/api.js.map +1 -0
  53. package/packages/api-types/dist/schemas/decision.d.ts.map +1 -0
  54. package/packages/api-types/dist/schemas/decision.js.map +1 -0
  55. package/packages/api-types/dist/schemas/fleet.d.ts.map +1 -0
  56. package/packages/api-types/dist/schemas/fleet.js.map +1 -0
  57. package/packages/api-types/dist/schemas/history.d.ts.map +1 -0
  58. package/packages/api-types/dist/schemas/history.js.map +1 -0
  59. package/packages/api-types/dist/schemas/index.d.ts.map +1 -0
  60. package/packages/api-types/dist/schemas/index.js.map +1 -0
  61. package/packages/api-types/dist/schemas/message.d.ts.map +1 -0
  62. package/packages/api-types/dist/schemas/message.js.map +1 -0
  63. package/packages/api-types/dist/schemas/session.d.ts.map +1 -0
  64. package/packages/api-types/dist/schemas/session.js.map +1 -0
  65. package/packages/api-types/dist/schemas/task.d.ts.map +1 -0
  66. package/packages/api-types/dist/schemas/task.js.map +1 -0
  67. package/packages/api-types/package.json +1 -1
  68. package/packages/api-types/src/index.ts +22 -0
  69. package/packages/api-types/src/schemas/agent.test.ts +164 -0
  70. package/packages/api-types/src/schemas/agent.ts +110 -0
  71. package/packages/api-types/src/schemas/api.test.ts +372 -0
  72. package/packages/api-types/src/schemas/api.ts +194 -0
  73. package/packages/api-types/src/schemas/decision.test.ts +324 -0
  74. package/packages/api-types/src/schemas/decision.ts +136 -0
  75. package/packages/api-types/src/schemas/fleet.test.ts +212 -0
  76. package/packages/api-types/src/schemas/fleet.ts +83 -0
  77. package/packages/api-types/src/schemas/history.test.ts +242 -0
  78. package/packages/api-types/src/schemas/history.ts +84 -0
  79. package/packages/api-types/src/schemas/index.ts +148 -0
  80. package/packages/api-types/src/schemas/message.test.ts +192 -0
  81. package/packages/api-types/src/schemas/message.ts +98 -0
  82. package/packages/api-types/src/schemas/session.test.ts +104 -0
  83. package/packages/api-types/src/schemas/session.ts +40 -0
  84. package/packages/api-types/src/schemas/task.test.ts +192 -0
  85. package/packages/api-types/src/schemas/task.ts +78 -0
  86. package/packages/api-types/tsconfig.json +19 -0
  87. package/packages/api-types/vitest.config.ts +9 -0
  88. package/packages/benchmark/README.md +200 -0
  89. package/packages/benchmark/datasets/coding-tasks.yaml +127 -0
  90. package/packages/benchmark/datasets/coordination-tasks.yaml +122 -0
  91. package/packages/benchmark/dist/benchmark.d.ts +47 -0
  92. package/packages/benchmark/dist/benchmark.d.ts.map +1 -0
  93. package/packages/benchmark/dist/benchmark.js +224 -0
  94. package/packages/benchmark/dist/benchmark.js.map +1 -0
  95. package/packages/benchmark/dist/cli.d.ts +8 -0
  96. package/packages/benchmark/dist/cli.d.ts.map +1 -0
  97. package/packages/benchmark/dist/cli.js +185 -0
  98. package/packages/benchmark/dist/cli.js.map +1 -0
  99. package/packages/benchmark/dist/harbor.d.ts +53 -0
  100. package/packages/benchmark/dist/harbor.d.ts.map +1 -0
  101. package/packages/benchmark/dist/harbor.js +127 -0
  102. package/packages/benchmark/dist/harbor.js.map +1 -0
  103. package/packages/benchmark/dist/index.d.ts +48 -0
  104. package/packages/benchmark/dist/index.d.ts.map +1 -0
  105. package/packages/benchmark/dist/index.js +50 -0
  106. package/packages/benchmark/dist/index.js.map +1 -0
  107. package/packages/benchmark/dist/runners/base.d.ts +63 -0
  108. package/packages/benchmark/dist/runners/base.d.ts.map +1 -0
  109. package/packages/benchmark/dist/runners/base.js +155 -0
  110. package/packages/benchmark/dist/runners/base.js.map +1 -0
  111. package/packages/benchmark/dist/runners/index.d.ts +10 -0
  112. package/packages/benchmark/dist/runners/index.d.ts.map +1 -0
  113. package/packages/benchmark/dist/runners/index.js +10 -0
  114. package/packages/benchmark/dist/runners/index.js.map +1 -0
  115. package/packages/benchmark/dist/runners/single.d.ts +19 -0
  116. package/packages/benchmark/dist/runners/single.d.ts.map +1 -0
  117. package/packages/benchmark/dist/runners/single.js +111 -0
  118. package/packages/benchmark/dist/runners/single.js.map +1 -0
  119. package/packages/benchmark/dist/runners/subagent.d.ts +32 -0
  120. package/packages/benchmark/dist/runners/subagent.d.ts.map +1 -0
  121. package/packages/benchmark/dist/runners/subagent.js +212 -0
  122. package/packages/benchmark/dist/runners/subagent.js.map +1 -0
  123. package/packages/benchmark/dist/runners/swarm.d.ts +36 -0
  124. package/packages/benchmark/dist/runners/swarm.d.ts.map +1 -0
  125. package/packages/benchmark/dist/runners/swarm.js +273 -0
  126. package/packages/benchmark/dist/runners/swarm.js.map +1 -0
  127. package/packages/benchmark/dist/types.d.ts +178 -0
  128. package/packages/benchmark/dist/types.d.ts.map +1 -0
  129. package/packages/benchmark/dist/types.js +16 -0
  130. package/packages/benchmark/dist/types.js.map +1 -0
  131. package/packages/benchmark/package.json +80 -0
  132. package/packages/benchmark/src/benchmark.ts +298 -0
  133. package/packages/benchmark/src/cli.ts +240 -0
  134. package/packages/benchmark/src/harbor.ts +170 -0
  135. package/packages/benchmark/src/index.ts +73 -0
  136. package/packages/benchmark/src/runners/base.ts +204 -0
  137. package/packages/benchmark/src/runners/index.ts +10 -0
  138. package/packages/benchmark/src/runners/single.ts +121 -0
  139. package/packages/benchmark/src/runners/subagent.ts +240 -0
  140. package/packages/benchmark/src/runners/swarm.ts +326 -0
  141. package/packages/benchmark/src/types.ts +205 -0
  142. package/packages/benchmark/tsconfig.json +20 -0
  143. package/packages/bridge/dist/index.d.ts.map +1 -0
  144. package/packages/bridge/dist/index.js.map +1 -0
  145. package/packages/bridge/dist/multi-project-client.d.ts.map +1 -0
  146. package/packages/bridge/dist/multi-project-client.js.map +1 -0
  147. package/packages/bridge/dist/shadow-cli.d.ts.map +1 -0
  148. package/packages/bridge/dist/shadow-cli.js.map +1 -0
  149. package/packages/bridge/dist/spawner.d.ts.map +1 -0
  150. package/packages/bridge/dist/spawner.js +15 -2
  151. package/packages/bridge/dist/spawner.js.map +1 -0
  152. package/packages/bridge/dist/types.d.ts.map +1 -0
  153. package/packages/bridge/dist/types.js.map +1 -0
  154. package/packages/bridge/dist/utils.d.ts.map +1 -0
  155. package/packages/bridge/dist/utils.js.map +1 -0
  156. package/packages/bridge/package.json +8 -8
  157. package/packages/bridge/src/index.ts +25 -0
  158. package/packages/bridge/src/multi-project-client.test.ts +340 -0
  159. package/packages/bridge/src/multi-project-client.ts +469 -0
  160. package/packages/bridge/src/shadow-cli.ts +95 -0
  161. package/packages/bridge/src/spawner-mcp.test.ts +505 -0
  162. package/packages/bridge/src/spawner.ts +1724 -0
  163. package/packages/bridge/src/types.ts +145 -0
  164. package/packages/bridge/src/utils.test.ts +98 -0
  165. package/packages/bridge/src/utils.ts +67 -0
  166. package/packages/bridge/tsconfig.json +29 -0
  167. package/packages/bridge/vitest.config.ts +9 -0
  168. package/packages/cli-tester/dist/index.d.ts.map +1 -0
  169. package/packages/cli-tester/dist/index.js.map +1 -0
  170. package/packages/cli-tester/dist/utils/credential-check.d.ts.map +1 -0
  171. package/packages/cli-tester/dist/utils/credential-check.js.map +1 -0
  172. package/packages/cli-tester/dist/utils/socket-client.d.ts.map +1 -0
  173. package/packages/cli-tester/dist/utils/socket-client.js.map +1 -0
  174. package/packages/cli-tester/docker/Dockerfile +61 -0
  175. package/packages/cli-tester/docker/docker-compose.yml +71 -0
  176. package/packages/cli-tester/package.json +1 -1
  177. package/packages/cli-tester/src/index.ts +40 -0
  178. package/packages/cli-tester/src/utils/credential-check.ts +284 -0
  179. package/packages/cli-tester/src/utils/socket-client.ts +211 -0
  180. package/packages/cli-tester/tests/credential-check.test.ts +56 -0
  181. package/packages/cli-tester/tsconfig.json +11 -0
  182. package/packages/config/dist/agent-config.d.ts.map +1 -0
  183. package/packages/config/dist/agent-config.js.map +1 -0
  184. package/packages/config/dist/bridge-config.d.ts.map +1 -0
  185. package/packages/config/dist/bridge-config.js.map +1 -0
  186. package/packages/config/dist/bridge-utils.d.ts.map +1 -0
  187. package/packages/config/dist/bridge-utils.js.map +1 -0
  188. package/packages/config/dist/cli-auth-config.d.ts.map +1 -0
  189. package/packages/config/dist/cli-auth-config.js.map +1 -0
  190. package/packages/config/dist/cloud-config.d.ts.map +1 -0
  191. package/packages/config/dist/cloud-config.js.map +1 -0
  192. package/packages/config/dist/index.d.ts.map +1 -0
  193. package/packages/config/dist/index.js.map +1 -0
  194. package/packages/config/dist/project-namespace.d.ts.map +1 -0
  195. package/packages/config/dist/project-namespace.js.map +1 -0
  196. package/packages/config/dist/relay-config.d.ts.map +1 -0
  197. package/packages/config/dist/relay-config.js.map +1 -0
  198. package/packages/config/dist/relay-file-writer.d.ts.map +1 -0
  199. package/packages/config/dist/relay-file-writer.js.map +1 -0
  200. package/packages/config/dist/schemas.d.ts.map +1 -0
  201. package/packages/config/dist/schemas.js.map +1 -0
  202. package/packages/config/dist/shadow-config.d.ts.map +1 -0
  203. package/packages/config/dist/shadow-config.js.map +1 -0
  204. package/packages/config/dist/teams-config.d.ts.map +1 -0
  205. package/packages/config/dist/teams-config.js.map +1 -0
  206. package/packages/config/dist/trajectory-config.d.ts.map +1 -0
  207. package/packages/config/dist/trajectory-config.js.map +1 -0
  208. package/packages/config/package.json +2 -2
  209. package/packages/config/src/agent-config.test.ts +245 -0
  210. package/packages/config/src/agent-config.ts +160 -0
  211. package/packages/config/src/bridge-config.test.ts +132 -0
  212. package/packages/config/src/bridge-config.ts +189 -0
  213. package/packages/config/src/bridge-utils.ts +59 -0
  214. package/packages/config/src/cli-auth-config.ts +548 -0
  215. package/packages/config/src/cloud-config.ts +208 -0
  216. package/packages/config/src/index.ts +12 -0
  217. package/packages/config/src/project-namespace.ts +344 -0
  218. package/packages/config/src/relay-config.test.ts +51 -0
  219. package/packages/config/src/relay-config.ts +36 -0
  220. package/packages/config/src/relay-file-writer.test.ts +351 -0
  221. package/packages/config/src/relay-file-writer.ts +508 -0
  222. package/packages/config/src/schemas.test.ts +59 -0
  223. package/packages/config/src/schemas.ts +201 -0
  224. package/packages/config/src/shadow-config.ts +205 -0
  225. package/packages/config/src/teams-config.ts +135 -0
  226. package/packages/config/src/trajectory-config.ts +222 -0
  227. package/packages/config/tsconfig.json +21 -0
  228. package/packages/config/vitest.config.ts +9 -0
  229. package/packages/continuity/dist/formatter.d.ts.map +1 -0
  230. package/packages/continuity/dist/formatter.js.map +1 -0
  231. package/packages/continuity/dist/handoff-store.d.ts.map +1 -0
  232. package/packages/continuity/dist/handoff-store.js.map +1 -0
  233. package/packages/continuity/dist/index.d.ts.map +1 -0
  234. package/packages/continuity/dist/index.js.map +1 -0
  235. package/packages/continuity/dist/ledger-store.d.ts.map +1 -0
  236. package/packages/continuity/dist/ledger-store.js.map +1 -0
  237. package/packages/continuity/dist/manager.d.ts.map +1 -0
  238. package/packages/continuity/dist/manager.js.map +1 -0
  239. package/packages/continuity/dist/parser.d.ts.map +1 -0
  240. package/packages/continuity/dist/parser.js.map +1 -0
  241. package/packages/continuity/dist/types.d.ts.map +1 -0
  242. package/packages/continuity/dist/types.js.map +1 -0
  243. package/packages/continuity/package.json +1 -1
  244. package/packages/continuity/src/formatter.ts +371 -0
  245. package/packages/continuity/src/handoff-store.ts +523 -0
  246. package/packages/continuity/src/index.ts +9 -0
  247. package/packages/continuity/src/ledger-store.ts +594 -0
  248. package/packages/continuity/src/manager.test.ts +291 -0
  249. package/packages/continuity/src/manager.ts +774 -0
  250. package/packages/continuity/src/parser.test.ts +292 -0
  251. package/packages/continuity/src/parser.ts +680 -0
  252. package/packages/continuity/src/types.ts +211 -0
  253. package/packages/continuity/tsconfig.json +21 -0
  254. package/packages/continuity/vitest.config.ts +9 -0
  255. package/packages/daemon/dist/agent-manager.d.ts.map +1 -0
  256. package/packages/daemon/dist/agent-manager.js.map +1 -0
  257. package/packages/daemon/dist/agent-registry.d.ts.map +1 -0
  258. package/packages/daemon/dist/agent-registry.js.map +1 -0
  259. package/packages/daemon/dist/agent-signing.d.ts.map +1 -0
  260. package/packages/daemon/dist/agent-signing.js.map +1 -0
  261. package/packages/daemon/dist/api.d.ts.map +1 -0
  262. package/packages/daemon/dist/api.js.map +1 -0
  263. package/packages/daemon/dist/auth.d.ts.map +1 -0
  264. package/packages/daemon/dist/auth.js.map +1 -0
  265. package/packages/daemon/dist/channel-membership-store.d.ts.map +1 -0
  266. package/packages/daemon/dist/channel-membership-store.js.map +1 -0
  267. package/packages/daemon/dist/cli-auth.d.ts.map +1 -0
  268. package/packages/daemon/dist/cli-auth.js.map +1 -0
  269. package/packages/daemon/dist/cloud-sync.d.ts.map +1 -0
  270. package/packages/daemon/dist/cloud-sync.js.map +1 -0
  271. package/packages/daemon/dist/connection.d.ts.map +1 -0
  272. package/packages/daemon/dist/connection.js.map +1 -0
  273. package/packages/daemon/dist/consensus-integration.d.ts.map +1 -0
  274. package/packages/daemon/dist/consensus-integration.js.map +1 -0
  275. package/packages/daemon/dist/consensus.d.ts.map +1 -0
  276. package/packages/daemon/dist/consensus.js.map +1 -0
  277. package/packages/daemon/dist/delivery-tracker.d.ts.map +1 -0
  278. package/packages/daemon/dist/delivery-tracker.js.map +1 -0
  279. package/packages/daemon/dist/enhanced-features.d.ts.map +1 -0
  280. package/packages/daemon/dist/enhanced-features.js.map +1 -0
  281. package/packages/daemon/dist/index.d.ts.map +1 -0
  282. package/packages/daemon/dist/index.js.map +1 -0
  283. package/packages/daemon/dist/migrations/index.d.ts.map +1 -0
  284. package/packages/daemon/dist/migrations/index.js.map +1 -0
  285. package/packages/daemon/dist/orchestrator.d.ts.map +1 -0
  286. package/packages/daemon/dist/orchestrator.js.map +1 -0
  287. package/packages/daemon/dist/rate-limiter.d.ts.map +1 -0
  288. package/packages/daemon/dist/rate-limiter.js.map +1 -0
  289. package/packages/daemon/dist/registry.d.ts.map +1 -0
  290. package/packages/daemon/dist/registry.js.map +1 -0
  291. package/packages/daemon/dist/relay-ledger.d.ts.map +1 -0
  292. package/packages/daemon/dist/relay-ledger.js.map +1 -0
  293. package/packages/daemon/dist/relay-watchdog.d.ts.map +1 -0
  294. package/packages/daemon/dist/relay-watchdog.js.map +1 -0
  295. package/packages/daemon/dist/repo-manager.d.ts.map +1 -0
  296. package/packages/daemon/dist/repo-manager.js.map +1 -0
  297. package/packages/daemon/dist/router.d.ts.map +1 -0
  298. package/packages/daemon/dist/router.js.map +1 -0
  299. package/packages/daemon/dist/server.d.ts +1 -0
  300. package/packages/daemon/dist/server.d.ts.map +1 -0
  301. package/packages/daemon/dist/server.js +46 -16
  302. package/packages/daemon/dist/server.js.map +1 -0
  303. package/packages/daemon/dist/spawn-manager.d.ts.map +1 -0
  304. package/packages/daemon/dist/spawn-manager.js.map +1 -0
  305. package/packages/daemon/dist/sync-queue.d.ts.map +1 -0
  306. package/packages/daemon/dist/sync-queue.js.map +1 -0
  307. package/packages/daemon/dist/types.d.ts.map +1 -0
  308. package/packages/daemon/dist/types.js.map +1 -0
  309. package/packages/daemon/dist/workspace-manager.d.ts.map +1 -0
  310. package/packages/daemon/dist/workspace-manager.js.map +1 -0
  311. package/packages/daemon/package.json +12 -12
  312. package/packages/daemon/src/agent-manager.ts +679 -0
  313. package/packages/daemon/src/agent-registry.ts +284 -0
  314. package/packages/daemon/src/agent-signing.ts +707 -0
  315. package/packages/daemon/src/api.ts +1012 -0
  316. package/packages/daemon/src/auth.ts +276 -0
  317. package/packages/daemon/src/channel-membership-store.ts +217 -0
  318. package/packages/daemon/src/cli-auth.ts +906 -0
  319. package/packages/daemon/src/cloud-sync.ts +902 -0
  320. package/packages/daemon/src/connection.ts +534 -0
  321. package/packages/daemon/src/consensus-integration.ts +510 -0
  322. package/packages/daemon/src/consensus.ts +848 -0
  323. package/packages/daemon/src/delivery-tracker.ts +145 -0
  324. package/packages/daemon/src/enhanced-features.ts +390 -0
  325. package/packages/daemon/src/index.ts +52 -0
  326. package/packages/daemon/src/migrations/0001_initial.sql +72 -0
  327. package/packages/daemon/src/migrations/index.test.ts +195 -0
  328. package/packages/daemon/src/migrations/index.ts +286 -0
  329. package/packages/daemon/src/orchestrator.test.ts +231 -0
  330. package/packages/daemon/src/orchestrator.ts +1376 -0
  331. package/packages/daemon/src/rate-limiter.ts +172 -0
  332. package/packages/daemon/src/registry.ts +8 -0
  333. package/packages/daemon/src/relay-ledger.test.ts +358 -0
  334. package/packages/daemon/src/relay-ledger.ts +713 -0
  335. package/packages/daemon/src/relay-watchdog.test.ts +881 -0
  336. package/packages/daemon/src/relay-watchdog.ts +785 -0
  337. package/packages/daemon/src/repo-manager.ts +468 -0
  338. package/packages/daemon/src/router.test.ts +149 -0
  339. package/packages/daemon/src/router.ts +1885 -0
  340. package/packages/daemon/src/server.ts +1871 -0
  341. package/packages/daemon/src/spawn-manager.ts +275 -0
  342. package/packages/daemon/src/sync-queue.ts +477 -0
  343. package/packages/daemon/src/types.ts +158 -0
  344. package/packages/daemon/src/workspace-manager.ts +371 -0
  345. package/packages/daemon/tsconfig.json +21 -0
  346. package/packages/hooks/dist/browser.d.ts.map +1 -0
  347. package/packages/hooks/dist/browser.js.map +1 -0
  348. package/packages/hooks/dist/emitter.d.ts.map +1 -0
  349. package/packages/hooks/dist/emitter.js.map +1 -0
  350. package/packages/hooks/dist/inbox-check/hook.d.ts.map +1 -0
  351. package/packages/hooks/dist/inbox-check/hook.js.map +1 -0
  352. package/packages/hooks/dist/inbox-check/index.d.ts.map +1 -0
  353. package/packages/hooks/dist/inbox-check/index.js.map +1 -0
  354. package/packages/hooks/dist/inbox-check/types.d.ts.map +1 -0
  355. package/packages/hooks/dist/inbox-check/types.js.map +1 -0
  356. package/packages/hooks/dist/inbox-check/utils.d.ts.map +1 -0
  357. package/packages/hooks/dist/inbox-check/utils.js.map +1 -0
  358. package/packages/hooks/dist/index.d.ts.map +1 -0
  359. package/packages/hooks/dist/index.js.map +1 -0
  360. package/packages/hooks/dist/registry.d.ts.map +1 -0
  361. package/packages/hooks/dist/registry.js.map +1 -0
  362. package/packages/hooks/dist/trajectory-hooks.d.ts.map +1 -0
  363. package/packages/hooks/dist/trajectory-hooks.js.map +1 -0
  364. package/packages/hooks/dist/types.d.ts.map +1 -0
  365. package/packages/hooks/dist/types.js.map +1 -0
  366. package/packages/hooks/package.json +4 -4
  367. package/packages/hooks/src/browser.ts +2 -0
  368. package/packages/hooks/src/emitter.ts +84 -0
  369. package/packages/hooks/src/inbox-check/hook.ts +114 -0
  370. package/packages/hooks/src/inbox-check/index.ts +8 -0
  371. package/packages/hooks/src/inbox-check/types.ts +39 -0
  372. package/packages/hooks/src/inbox-check/utils.test.ts +287 -0
  373. package/packages/hooks/src/inbox-check/utils.ts +125 -0
  374. package/packages/hooks/src/index.ts +11 -0
  375. package/packages/hooks/src/registry.ts +614 -0
  376. package/packages/hooks/src/shims.d.ts +3 -0
  377. package/packages/hooks/src/trajectory-hooks.ts +251 -0
  378. package/packages/hooks/src/types.ts +342 -0
  379. package/packages/hooks/tsconfig.json +21 -0
  380. package/packages/hooks/vitest.config.ts +9 -0
  381. package/packages/mcp/dist/bin.d.ts.map +1 -0
  382. package/packages/mcp/dist/bin.js.map +1 -0
  383. package/packages/mcp/dist/client.d.ts +9 -15
  384. package/packages/mcp/dist/client.d.ts.map +1 -0
  385. package/packages/mcp/dist/client.js +42 -74
  386. package/packages/mcp/dist/client.js.map +1 -0
  387. package/packages/mcp/dist/cloud.d.ts.map +1 -0
  388. package/packages/mcp/dist/cloud.js.map +1 -0
  389. package/packages/mcp/dist/errors.d.ts.map +1 -0
  390. package/packages/mcp/dist/errors.js.map +1 -0
  391. package/packages/mcp/dist/file-transport.d.ts.map +1 -0
  392. package/packages/mcp/dist/file-transport.js.map +1 -0
  393. package/packages/mcp/dist/hybrid-client.d.ts.map +1 -0
  394. package/packages/mcp/dist/hybrid-client.js.map +1 -0
  395. package/packages/mcp/dist/index.d.ts.map +1 -0
  396. package/packages/mcp/dist/index.js.map +1 -0
  397. package/packages/mcp/dist/install-cli.d.ts.map +1 -0
  398. package/packages/mcp/dist/install-cli.js.map +1 -0
  399. package/packages/mcp/dist/install.d.ts.map +1 -0
  400. package/packages/mcp/dist/install.js.map +1 -0
  401. package/packages/mcp/dist/prompts/index.d.ts.map +1 -0
  402. package/packages/mcp/dist/prompts/index.js.map +1 -0
  403. package/packages/mcp/dist/prompts/protocol.d.ts.map +1 -0
  404. package/packages/mcp/dist/prompts/protocol.js.map +1 -0
  405. package/packages/mcp/dist/resources/agents.d.ts.map +1 -0
  406. package/packages/mcp/dist/resources/agents.js.map +1 -0
  407. package/packages/mcp/dist/resources/inbox.d.ts.map +1 -0
  408. package/packages/mcp/dist/resources/inbox.js.map +1 -0
  409. package/packages/mcp/dist/resources/index.d.ts.map +1 -0
  410. package/packages/mcp/dist/resources/index.js.map +1 -0
  411. package/packages/mcp/dist/resources/project.d.ts.map +1 -0
  412. package/packages/mcp/dist/resources/project.js.map +1 -0
  413. package/packages/mcp/dist/server.d.ts.map +1 -0
  414. package/packages/mcp/dist/server.js.map +1 -0
  415. package/packages/mcp/dist/simple.d.ts +2 -5
  416. package/packages/mcp/dist/simple.d.ts.map +1 -0
  417. package/packages/mcp/dist/simple.js.map +1 -0
  418. package/packages/mcp/dist/tools/index.d.ts.map +1 -0
  419. package/packages/mcp/dist/tools/index.js.map +1 -0
  420. package/packages/mcp/dist/tools/relay-broadcast.d.ts.map +1 -0
  421. package/packages/mcp/dist/tools/relay-broadcast.js.map +1 -0
  422. package/packages/mcp/dist/tools/relay-channel.d.ts.map +1 -0
  423. package/packages/mcp/dist/tools/relay-channel.js.map +1 -0
  424. package/packages/mcp/dist/tools/relay-connected.d.ts.map +1 -0
  425. package/packages/mcp/dist/tools/relay-connected.js.map +1 -0
  426. package/packages/mcp/dist/tools/relay-consensus.d.ts.map +1 -0
  427. package/packages/mcp/dist/tools/relay-consensus.js.map +1 -0
  428. package/packages/mcp/dist/tools/relay-continuity.d.ts.map +1 -0
  429. package/packages/mcp/dist/tools/relay-continuity.js.map +1 -0
  430. package/packages/mcp/dist/tools/relay-health.d.ts.map +1 -0
  431. package/packages/mcp/dist/tools/relay-health.js.map +1 -0
  432. package/packages/mcp/dist/tools/relay-inbox.d.ts.map +1 -0
  433. package/packages/mcp/dist/tools/relay-inbox.js.map +1 -0
  434. package/packages/mcp/dist/tools/relay-logs.d.ts.map +1 -0
  435. package/packages/mcp/dist/tools/relay-logs.js.map +1 -0
  436. package/packages/mcp/dist/tools/relay-metrics.d.ts.map +1 -0
  437. package/packages/mcp/dist/tools/relay-metrics.js.map +1 -0
  438. package/packages/mcp/dist/tools/relay-release.d.ts.map +1 -0
  439. package/packages/mcp/dist/tools/relay-release.js.map +1 -0
  440. package/packages/mcp/dist/tools/relay-remove-agent.d.ts.map +1 -0
  441. package/packages/mcp/dist/tools/relay-remove-agent.js.map +1 -0
  442. package/packages/mcp/dist/tools/relay-send.d.ts.map +1 -0
  443. package/packages/mcp/dist/tools/relay-send.js +4 -2
  444. package/packages/mcp/dist/tools/relay-send.js.map +1 -0
  445. package/packages/mcp/dist/tools/relay-shadow.d.ts.map +1 -0
  446. package/packages/mcp/dist/tools/relay-shadow.js.map +1 -0
  447. package/packages/mcp/dist/tools/relay-spawn.d.ts.map +1 -0
  448. package/packages/mcp/dist/tools/relay-spawn.js.map +1 -0
  449. package/packages/mcp/dist/tools/relay-status.d.ts.map +1 -0
  450. package/packages/mcp/dist/tools/relay-status.js.map +1 -0
  451. package/packages/mcp/dist/tools/relay-subscribe.d.ts.map +1 -0
  452. package/packages/mcp/dist/tools/relay-subscribe.js.map +1 -0
  453. package/packages/mcp/dist/tools/relay-who.d.ts.map +1 -0
  454. package/packages/mcp/dist/tools/relay-who.js.map +1 -0
  455. package/packages/mcp/package.json +3 -3
  456. package/packages/mcp/src/bin.ts +149 -0
  457. package/packages/mcp/src/client.ts +400 -0
  458. package/packages/mcp/src/cloud.ts +523 -0
  459. package/packages/mcp/src/errors.ts +54 -0
  460. package/packages/mcp/src/file-transport.ts +268 -0
  461. package/packages/mcp/src/hybrid-client.ts +209 -0
  462. package/packages/mcp/src/index.ts +122 -0
  463. package/packages/mcp/src/install-cli.ts +210 -0
  464. package/packages/mcp/src/install.ts +745 -0
  465. package/packages/mcp/src/prompts/index.ts +1 -0
  466. package/packages/mcp/src/prompts/protocol.ts +164 -0
  467. package/packages/mcp/src/resources/agents.ts +21 -0
  468. package/packages/mcp/src/resources/inbox.ts +21 -0
  469. package/packages/mcp/src/resources/index.ts +3 -0
  470. package/packages/mcp/src/resources/project.ts +29 -0
  471. package/packages/mcp/src/server.ts +431 -0
  472. package/packages/mcp/src/simple.ts +214 -0
  473. package/packages/mcp/src/tools/index.ts +133 -0
  474. package/packages/mcp/src/tools/relay-broadcast.ts +32 -0
  475. package/packages/mcp/src/tools/relay-channel.ts +93 -0
  476. package/packages/mcp/src/tools/relay-connected.ts +52 -0
  477. package/packages/mcp/src/tools/relay-consensus.ts +92 -0
  478. package/packages/mcp/src/tools/relay-continuity.ts +127 -0
  479. package/packages/mcp/src/tools/relay-health.ts +148 -0
  480. package/packages/mcp/src/tools/relay-inbox.ts +70 -0
  481. package/packages/mcp/src/tools/relay-logs.ts +106 -0
  482. package/packages/mcp/src/tools/relay-metrics.ts +140 -0
  483. package/packages/mcp/src/tools/relay-release.ts +54 -0
  484. package/packages/mcp/src/tools/relay-remove-agent.ts +58 -0
  485. package/packages/mcp/src/tools/relay-send.ts +84 -0
  486. package/packages/mcp/src/tools/relay-shadow.ts +67 -0
  487. package/packages/mcp/src/tools/relay-spawn.ts +87 -0
  488. package/packages/mcp/src/tools/relay-status.ts +57 -0
  489. package/packages/mcp/src/tools/relay-subscribe.ts +61 -0
  490. package/packages/mcp/src/tools/relay-who.ts +59 -0
  491. package/packages/mcp/tests/client.test.ts +476 -0
  492. package/packages/mcp/tests/discover.test.ts +195 -0
  493. package/packages/mcp/tests/install.test.ts +123 -0
  494. package/packages/mcp/tests/prompts.test.ts +12 -0
  495. package/packages/mcp/tests/resources.test.ts +53 -0
  496. package/packages/mcp/tests/tools.test.ts +1242 -0
  497. package/packages/mcp/tsconfig.json +22 -0
  498. package/packages/mcp/vitest.config.ts +9 -0
  499. package/packages/memory/dist/adapters/index.d.ts.map +1 -0
  500. package/packages/memory/dist/adapters/index.js.map +1 -0
  501. package/packages/memory/dist/adapters/inmemory.d.ts.map +1 -0
  502. package/packages/memory/dist/adapters/inmemory.js.map +1 -0
  503. package/packages/memory/dist/adapters/supermemory.d.ts.map +1 -0
  504. package/packages/memory/dist/adapters/supermemory.js.map +1 -0
  505. package/packages/memory/dist/context-compaction.d.ts.map +1 -0
  506. package/packages/memory/dist/context-compaction.js.map +1 -0
  507. package/packages/memory/dist/factory.d.ts.map +1 -0
  508. package/packages/memory/dist/factory.js.map +1 -0
  509. package/packages/memory/dist/index.d.ts.map +1 -0
  510. package/packages/memory/dist/index.js.map +1 -0
  511. package/packages/memory/dist/memory-hooks.d.ts.map +1 -0
  512. package/packages/memory/dist/memory-hooks.js.map +1 -0
  513. package/packages/memory/dist/service.d.ts.map +1 -0
  514. package/packages/memory/dist/service.js.map +1 -0
  515. package/packages/memory/dist/types.d.ts.map +1 -0
  516. package/packages/memory/dist/types.js.map +1 -0
  517. package/packages/memory/package.json +2 -2
  518. package/packages/memory/src/adapters/index.ts +8 -0
  519. package/packages/memory/src/adapters/inmemory.ts +265 -0
  520. package/packages/memory/src/adapters/supermemory.ts +449 -0
  521. package/packages/memory/src/context-compaction.test.ts +660 -0
  522. package/packages/memory/src/context-compaction.ts +612 -0
  523. package/packages/memory/src/factory.ts +170 -0
  524. package/packages/memory/src/index.ts +33 -0
  525. package/packages/memory/src/memory-hooks.ts +410 -0
  526. package/packages/memory/src/service.ts +194 -0
  527. package/packages/memory/src/types.ts +211 -0
  528. package/packages/memory/tsconfig.json +21 -0
  529. package/packages/memory/vitest.config.ts +9 -0
  530. package/packages/policy/dist/agent-policy.d.ts.map +1 -0
  531. package/packages/policy/dist/agent-policy.js.map +1 -0
  532. package/packages/policy/dist/cloud-policy-fetcher.d.ts.map +1 -0
  533. package/packages/policy/dist/cloud-policy-fetcher.js.map +1 -0
  534. package/packages/policy/dist/index.d.ts.map +1 -0
  535. package/packages/policy/dist/index.js.map +1 -0
  536. package/packages/policy/package.json +2 -2
  537. package/packages/policy/src/agent-policy.ts +866 -0
  538. package/packages/policy/src/cloud-policy-fetcher.ts +78 -0
  539. package/packages/policy/src/index.ts +21 -0
  540. package/packages/policy/tsconfig.json +21 -0
  541. package/packages/policy/vitest.config.ts +9 -0
  542. package/packages/protocol/dist/channels.d.ts.map +1 -0
  543. package/packages/protocol/dist/channels.js.map +1 -0
  544. package/packages/protocol/dist/framing.d.ts.map +1 -0
  545. package/packages/protocol/dist/framing.js.map +1 -0
  546. package/packages/protocol/dist/id-generator.d.ts.map +1 -0
  547. package/packages/protocol/dist/id-generator.js.map +1 -0
  548. package/packages/protocol/dist/index.d.ts.map +1 -0
  549. package/packages/protocol/dist/index.js.map +1 -0
  550. package/packages/protocol/dist/relay-pty-schemas.d.ts +70 -2
  551. package/packages/protocol/dist/relay-pty-schemas.d.ts.map +1 -0
  552. package/packages/protocol/dist/relay-pty-schemas.js.map +1 -0
  553. package/packages/protocol/dist/types.d.ts +8 -0
  554. package/packages/protocol/dist/types.d.ts.map +1 -0
  555. package/packages/protocol/dist/types.js.map +1 -0
  556. package/packages/protocol/package.json +1 -1
  557. package/packages/protocol/src/channels.test.ts +330 -0
  558. package/packages/protocol/src/channels.ts +270 -0
  559. package/packages/protocol/src/framing.test.ts +164 -0
  560. package/packages/protocol/src/framing.ts +242 -0
  561. package/packages/protocol/src/id-generator.ts +69 -0
  562. package/packages/protocol/src/index.ts +4 -0
  563. package/packages/protocol/src/relay-pty-schemas.ts +400 -0
  564. package/packages/protocol/src/types.test.ts +271 -0
  565. package/packages/protocol/src/types.ts +846 -0
  566. package/packages/protocol/tsconfig.json +21 -0
  567. package/packages/protocol/vitest.config.ts +9 -0
  568. package/packages/resiliency/dist/cgroup-manager.d.ts.map +1 -0
  569. package/packages/resiliency/dist/cgroup-manager.js.map +1 -0
  570. package/packages/resiliency/dist/context-persistence.d.ts.map +1 -0
  571. package/packages/resiliency/dist/context-persistence.js.map +1 -0
  572. package/packages/resiliency/dist/crash-insights.d.ts.map +1 -0
  573. package/packages/resiliency/dist/crash-insights.js.map +1 -0
  574. package/packages/resiliency/dist/gossip-health.d.ts.map +1 -0
  575. package/packages/resiliency/dist/gossip-health.js.map +1 -0
  576. package/packages/resiliency/dist/health-monitor.d.ts.map +1 -0
  577. package/packages/resiliency/dist/health-monitor.js.map +1 -0
  578. package/packages/resiliency/dist/index.d.ts.map +1 -0
  579. package/packages/resiliency/dist/index.js.map +1 -0
  580. package/packages/resiliency/dist/leader-watchdog.d.ts.map +1 -0
  581. package/packages/resiliency/dist/leader-watchdog.js.map +1 -0
  582. package/packages/resiliency/dist/logger.d.ts.map +1 -0
  583. package/packages/resiliency/dist/logger.js.map +1 -0
  584. package/packages/resiliency/dist/memory-monitor.d.ts.map +1 -0
  585. package/packages/resiliency/dist/memory-monitor.js.map +1 -0
  586. package/packages/resiliency/dist/metrics.d.ts.map +1 -0
  587. package/packages/resiliency/dist/metrics.js.map +1 -0
  588. package/packages/resiliency/dist/provider-context.d.ts.map +1 -0
  589. package/packages/resiliency/dist/provider-context.js.map +1 -0
  590. package/packages/resiliency/dist/stateless-lead.d.ts.map +1 -0
  591. package/packages/resiliency/dist/stateless-lead.js.map +1 -0
  592. package/packages/resiliency/dist/supervisor.d.ts.map +1 -0
  593. package/packages/resiliency/dist/supervisor.js.map +1 -0
  594. package/packages/resiliency/package.json +1 -1
  595. package/packages/resiliency/src/cgroup-manager.ts +468 -0
  596. package/packages/resiliency/src/context-persistence.ts +538 -0
  597. package/packages/resiliency/src/crash-insights.test.ts +620 -0
  598. package/packages/resiliency/src/crash-insights.ts +660 -0
  599. package/packages/resiliency/src/gossip-health.ts +333 -0
  600. package/packages/resiliency/src/health-monitor.ts +371 -0
  601. package/packages/resiliency/src/index.ts +157 -0
  602. package/packages/resiliency/src/leader-watchdog.ts +260 -0
  603. package/packages/resiliency/src/logger.ts +320 -0
  604. package/packages/resiliency/src/memory-monitor.test.ts +637 -0
  605. package/packages/resiliency/src/memory-monitor.ts +740 -0
  606. package/packages/resiliency/src/metrics.ts +311 -0
  607. package/packages/resiliency/src/provider-context.ts +452 -0
  608. package/packages/resiliency/src/stateless-lead.ts +408 -0
  609. package/packages/resiliency/src/supervisor.ts +578 -0
  610. package/packages/resiliency/tsconfig.json +21 -0
  611. package/packages/resiliency/vitest.config.ts +9 -0
  612. package/packages/sdk/dist/client.d.ts.map +1 -0
  613. package/packages/sdk/dist/client.js.map +1 -0
  614. package/packages/sdk/dist/index.d.ts.map +1 -0
  615. package/packages/sdk/dist/index.js.map +1 -0
  616. package/packages/sdk/dist/logs.d.ts.map +1 -0
  617. package/packages/sdk/dist/logs.js.map +1 -0
  618. package/packages/sdk/dist/protocol/index.d.ts.map +1 -0
  619. package/packages/sdk/dist/protocol/index.js.map +1 -0
  620. package/packages/sdk/dist/standalone.d.ts.map +1 -0
  621. package/packages/sdk/dist/standalone.js.map +1 -0
  622. package/packages/sdk/examples/SWARM_CAPABILITIES.md +498 -0
  623. package/packages/sdk/examples/SWARM_PATTERNS.md +541 -0
  624. package/packages/sdk/package.json +2 -2
  625. package/packages/sdk/src/client.test.ts +568 -0
  626. package/packages/sdk/src/client.ts +1418 -0
  627. package/packages/sdk/src/index.ts +103 -0
  628. package/packages/sdk/src/logs.test.ts +98 -0
  629. package/packages/sdk/src/logs.ts +126 -0
  630. package/packages/sdk/src/protocol/framing.test.ts +164 -0
  631. package/packages/sdk/src/protocol/index.ts +8 -0
  632. package/packages/sdk/src/standalone.ts +176 -0
  633. package/packages/sdk/tsconfig.json +22 -0
  634. package/packages/sdk/vitest.config.ts +9 -0
  635. package/packages/spawner/.trajectories/index.json +5 -0
  636. package/packages/spawner/dist/index.d.ts.map +1 -0
  637. package/packages/spawner/dist/index.js.map +1 -0
  638. package/packages/spawner/dist/types.d.ts.map +1 -0
  639. package/packages/spawner/dist/types.js.map +1 -0
  640. package/packages/spawner/package.json +1 -1
  641. package/packages/spawner/src/index.ts +8 -0
  642. package/packages/spawner/src/types.test.ts +385 -0
  643. package/packages/spawner/src/types.ts +228 -0
  644. package/packages/spawner/tsconfig.json +19 -0
  645. package/packages/spawner/vitest.config.ts +9 -0
  646. package/packages/state/dist/agent-state.d.ts.map +1 -0
  647. package/packages/state/dist/agent-state.js.map +1 -0
  648. package/packages/state/dist/index.d.ts.map +1 -0
  649. package/packages/state/dist/index.js.map +1 -0
  650. package/packages/state/package.json +1 -1
  651. package/packages/state/src/agent-state.test.ts +335 -0
  652. package/packages/state/src/agent-state.ts +153 -0
  653. package/packages/state/src/index.ts +12 -0
  654. package/packages/state/tsconfig.json +21 -0
  655. package/packages/state/vitest.config.ts +9 -0
  656. package/packages/storage/dist/adapter.d.ts +28 -1
  657. package/packages/storage/dist/adapter.d.ts.map +1 -0
  658. package/packages/storage/dist/adapter.js +104 -10
  659. package/packages/storage/dist/adapter.js.map +1 -0
  660. package/packages/storage/dist/batched-sqlite-adapter.d.ts.map +1 -0
  661. package/packages/storage/dist/batched-sqlite-adapter.js.map +1 -0
  662. package/packages/storage/dist/dead-letter-queue.d.ts.map +1 -0
  663. package/packages/storage/dist/dead-letter-queue.js.map +1 -0
  664. package/packages/storage/dist/dlq-adapter.d.ts.map +1 -0
  665. package/packages/storage/dist/dlq-adapter.js.map +1 -0
  666. package/packages/storage/dist/index.d.ts +1 -0
  667. package/packages/storage/dist/index.d.ts.map +1 -0
  668. package/packages/storage/dist/index.js +1 -0
  669. package/packages/storage/dist/index.js.map +1 -0
  670. package/packages/storage/dist/jsonl-adapter.d.ts +77 -0
  671. package/packages/storage/dist/jsonl-adapter.d.ts.map +1 -0
  672. package/packages/storage/dist/jsonl-adapter.js +505 -0
  673. package/packages/storage/dist/jsonl-adapter.js.map +1 -0
  674. package/packages/storage/dist/sqlite-adapter.d.ts +6 -1
  675. package/packages/storage/dist/sqlite-adapter.d.ts.map +1 -0
  676. package/packages/storage/dist/sqlite-adapter.js +47 -0
  677. package/packages/storage/dist/sqlite-adapter.js.map +1 -0
  678. package/packages/storage/package.json +2 -2
  679. package/packages/storage/src/adapter.ts +438 -0
  680. package/packages/storage/src/batched-sqlite-adapter.test.ts +240 -0
  681. package/packages/storage/src/batched-sqlite-adapter.ts +239 -0
  682. package/packages/storage/src/dead-letter-queue.ts +643 -0
  683. package/packages/storage/src/dlq-adapter.test.ts +492 -0
  684. package/packages/storage/src/dlq-adapter.ts +954 -0
  685. package/packages/storage/src/index.ts +6 -0
  686. package/packages/storage/src/jsonl-adapter.test.ts +200 -0
  687. package/packages/storage/src/jsonl-adapter.ts +618 -0
  688. package/packages/storage/src/memory-adapter.test.ts +36 -0
  689. package/packages/storage/src/sqlite-adapter.test.ts +562 -0
  690. package/packages/storage/src/sqlite-adapter.ts +1058 -0
  691. package/packages/storage/tsconfig.json +21 -0
  692. package/packages/storage/vitest.config.ts +9 -0
  693. package/packages/telemetry/dist/client.d.ts.map +1 -0
  694. package/packages/telemetry/dist/client.js.map +1 -0
  695. package/packages/telemetry/dist/config.d.ts.map +1 -0
  696. package/packages/telemetry/dist/config.js.map +1 -0
  697. package/packages/telemetry/dist/events.d.ts.map +1 -0
  698. package/packages/telemetry/dist/events.js.map +1 -0
  699. package/packages/telemetry/dist/index.d.ts.map +1 -0
  700. package/packages/telemetry/dist/index.js.map +1 -0
  701. package/packages/telemetry/dist/machine-id.d.ts.map +1 -0
  702. package/packages/telemetry/dist/machine-id.js.map +1 -0
  703. package/packages/telemetry/dist/posthog-config.d.ts.map +1 -0
  704. package/packages/telemetry/dist/posthog-config.js.map +1 -0
  705. package/packages/telemetry/package.json +1 -1
  706. package/packages/telemetry/src/client.ts +158 -0
  707. package/packages/telemetry/src/config.ts +110 -0
  708. package/packages/telemetry/src/events.ts +137 -0
  709. package/packages/telemetry/src/index.ts +46 -0
  710. package/packages/telemetry/src/machine-id.ts +63 -0
  711. package/packages/telemetry/src/posthog-config.ts +39 -0
  712. package/packages/telemetry/tsconfig.json +21 -0
  713. package/packages/trajectory/dist/index.d.ts.map +1 -0
  714. package/packages/trajectory/dist/index.js.map +1 -0
  715. package/packages/trajectory/dist/integration.d.ts.map +1 -0
  716. package/packages/trajectory/dist/integration.js.map +1 -0
  717. package/packages/trajectory/package.json +2 -2
  718. package/packages/trajectory/src/index.ts +1 -0
  719. package/packages/trajectory/src/integration.ts +1268 -0
  720. package/packages/trajectory/tsconfig.json +21 -0
  721. package/packages/trajectory/vitest.config.ts +9 -0
  722. package/packages/user-directory/dist/index.d.ts.map +1 -0
  723. package/packages/user-directory/dist/index.js.map +1 -0
  724. package/packages/user-directory/dist/user-directory.d.ts.map +1 -0
  725. package/packages/user-directory/dist/user-directory.js.map +1 -0
  726. package/packages/user-directory/package.json +2 -2
  727. package/packages/user-directory/src/index.ts +12 -0
  728. package/packages/user-directory/src/user-directory.ts +393 -0
  729. package/packages/user-directory/tsconfig.json +21 -0
  730. package/packages/user-directory/vitest.config.ts +9 -0
  731. package/packages/utils/dist/cjs/client-helpers.js +127 -0
  732. package/packages/utils/dist/cjs/command-resolver.js +89 -0
  733. package/packages/utils/dist/cjs/error-tracking.js +106 -0
  734. package/packages/utils/dist/cjs/git-remote.js +120 -0
  735. package/packages/utils/dist/cjs/index.js +40 -0
  736. package/packages/utils/dist/cjs/logger.js +105 -0
  737. package/packages/utils/dist/cjs/model-mapping.js +54 -0
  738. package/packages/utils/dist/cjs/name-generator.js +179 -0
  739. package/packages/utils/dist/cjs/package.json +3 -0
  740. package/packages/utils/dist/cjs/precompiled-patterns.js +271 -0
  741. package/packages/utils/dist/cjs/relay-pty-path.js +143 -0
  742. package/packages/utils/dist/cjs/update-checker.js +185 -0
  743. package/packages/utils/dist/client-helpers.d.ts +73 -0
  744. package/packages/utils/dist/client-helpers.d.ts.map +1 -0
  745. package/packages/utils/dist/client-helpers.js +130 -0
  746. package/packages/utils/dist/client-helpers.js.map +1 -0
  747. package/packages/utils/dist/command-resolver.d.ts.map +1 -0
  748. package/packages/utils/dist/command-resolver.js.map +1 -0
  749. package/packages/utils/dist/error-tracking.d.ts.map +1 -0
  750. package/packages/utils/dist/error-tracking.js.map +1 -0
  751. package/packages/utils/dist/git-remote.d.ts.map +1 -0
  752. package/packages/utils/dist/git-remote.js.map +1 -0
  753. package/packages/utils/dist/index.d.ts +1 -0
  754. package/packages/utils/dist/index.d.ts.map +1 -0
  755. package/packages/utils/dist/index.js +1 -0
  756. package/packages/utils/dist/index.js.map +1 -0
  757. package/packages/utils/dist/logger.d.ts.map +1 -0
  758. package/packages/utils/dist/logger.js.map +1 -0
  759. package/packages/utils/dist/model-mapping.d.ts.map +1 -0
  760. package/packages/utils/dist/model-mapping.js.map +1 -0
  761. package/packages/utils/dist/name-generator.d.ts.map +1 -0
  762. package/packages/utils/dist/name-generator.js.map +1 -0
  763. package/packages/utils/dist/precompiled-patterns.d.ts.map +1 -0
  764. package/packages/utils/dist/precompiled-patterns.js.map +1 -0
  765. package/packages/utils/dist/relay-pty-path.d.ts +11 -5
  766. package/packages/utils/dist/relay-pty-path.d.ts.map +1 -0
  767. package/packages/utils/dist/relay-pty-path.js +60 -5
  768. package/packages/utils/dist/relay-pty-path.js.map +1 -0
  769. package/packages/utils/dist/update-checker.d.ts.map +1 -0
  770. package/packages/utils/dist/update-checker.js.map +1 -0
  771. package/packages/utils/package.json +37 -14
  772. package/packages/utils/scripts/build-cjs.mjs +24 -0
  773. package/packages/utils/src/client-helpers.ts +221 -0
  774. package/packages/utils/src/command-resolver.ts +82 -0
  775. package/packages/utils/src/error-tracking.ts +189 -0
  776. package/packages/utils/src/git-remote.ts +143 -0
  777. package/packages/utils/src/index.ts +10 -0
  778. package/packages/utils/src/logger.ts +107 -0
  779. package/packages/utils/src/model-mapping.test.ts +122 -0
  780. package/packages/utils/src/model-mapping.ts +58 -0
  781. package/packages/utils/src/name-generator.test.ts +259 -0
  782. package/packages/utils/src/name-generator.ts +56 -0
  783. package/packages/utils/src/precompiled-patterns.test.ts +452 -0
  784. package/packages/utils/src/precompiled-patterns.ts +395 -0
  785. package/packages/utils/src/relay-pty-path.ts +196 -0
  786. package/packages/utils/src/update-checker.test.ts +260 -0
  787. package/packages/utils/src/update-checker.ts +211 -0
  788. package/packages/utils/tsconfig.json +21 -0
  789. package/packages/utils/vitest.config.ts +9 -0
  790. package/packages/wrapper/dist/__fixtures__/claude-outputs.d.ts.map +1 -0
  791. package/packages/wrapper/dist/__fixtures__/claude-outputs.js.map +1 -0
  792. package/packages/wrapper/dist/__fixtures__/codex-outputs.d.ts.map +1 -0
  793. package/packages/wrapper/dist/__fixtures__/codex-outputs.js.map +1 -0
  794. package/packages/wrapper/dist/__fixtures__/gemini-outputs.d.ts.map +1 -0
  795. package/packages/wrapper/dist/__fixtures__/gemini-outputs.js.map +1 -0
  796. package/packages/wrapper/dist/__fixtures__/index.d.ts.map +1 -0
  797. package/packages/wrapper/dist/__fixtures__/index.js.map +1 -0
  798. package/packages/wrapper/dist/auth-detection.d.ts.map +1 -0
  799. package/packages/wrapper/dist/auth-detection.js.map +1 -0
  800. package/packages/wrapper/dist/base-wrapper.d.ts.map +1 -0
  801. package/packages/wrapper/dist/base-wrapper.js.map +1 -0
  802. package/packages/wrapper/dist/client.d.ts.map +1 -0
  803. package/packages/wrapper/dist/client.js.map +1 -0
  804. package/packages/wrapper/dist/id-generator.d.ts.map +1 -0
  805. package/packages/wrapper/dist/id-generator.js.map +1 -0
  806. package/packages/wrapper/dist/idle-detector.d.ts.map +1 -0
  807. package/packages/wrapper/dist/idle-detector.js.map +1 -0
  808. package/packages/wrapper/dist/inbox.d.ts.map +1 -0
  809. package/packages/wrapper/dist/inbox.js.map +1 -0
  810. package/packages/wrapper/dist/index.d.ts.map +1 -0
  811. package/packages/wrapper/dist/index.js.map +1 -0
  812. package/packages/wrapper/dist/parser.d.ts.map +1 -0
  813. package/packages/wrapper/dist/parser.js.map +1 -0
  814. package/packages/wrapper/dist/prompt-composer.d.ts.map +1 -0
  815. package/packages/wrapper/dist/prompt-composer.js.map +1 -0
  816. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +10 -0
  817. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts.map +1 -0
  818. package/packages/wrapper/dist/relay-pty-orchestrator.js +69 -0
  819. package/packages/wrapper/dist/relay-pty-orchestrator.js.map +1 -0
  820. package/packages/wrapper/dist/shared.d.ts.map +1 -0
  821. package/packages/wrapper/dist/shared.js.map +1 -0
  822. package/packages/wrapper/dist/stuck-detector.d.ts.map +1 -0
  823. package/packages/wrapper/dist/stuck-detector.js.map +1 -0
  824. package/packages/wrapper/dist/tmux-resolver.d.ts.map +1 -0
  825. package/packages/wrapper/dist/tmux-resolver.js.map +1 -0
  826. package/packages/wrapper/dist/tmux-wrapper.d.ts.map +1 -0
  827. package/packages/wrapper/dist/tmux-wrapper.js.map +1 -0
  828. package/packages/wrapper/dist/trajectory-integration.d.ts.map +1 -0
  829. package/packages/wrapper/dist/trajectory-integration.js.map +1 -0
  830. package/packages/wrapper/dist/wrapper-types.d.ts.map +1 -0
  831. package/packages/wrapper/dist/wrapper-types.js.map +1 -0
  832. package/packages/wrapper/package.json +6 -9
  833. package/packages/wrapper/src/__fixtures__/claude-outputs.ts +471 -0
  834. package/packages/wrapper/src/__fixtures__/codex-outputs.ts +99 -0
  835. package/packages/wrapper/src/__fixtures__/gemini-outputs.ts +151 -0
  836. package/packages/wrapper/src/__fixtures__/index.ts +47 -0
  837. package/packages/wrapper/src/auth-detection.ts +244 -0
  838. package/packages/wrapper/src/base-wrapper.test.ts +589 -0
  839. package/packages/wrapper/src/base-wrapper.ts +810 -0
  840. package/packages/wrapper/src/client.test.ts +262 -0
  841. package/packages/wrapper/src/client.ts +984 -0
  842. package/packages/wrapper/src/id-generator.test.ts +71 -0
  843. package/packages/wrapper/src/id-generator.ts +69 -0
  844. package/packages/wrapper/src/idle-detector.test.ts +418 -0
  845. package/packages/wrapper/src/idle-detector.ts +384 -0
  846. package/packages/wrapper/src/inbox.test.ts +233 -0
  847. package/packages/wrapper/src/inbox.ts +89 -0
  848. package/packages/wrapper/src/index.ts +170 -0
  849. package/packages/wrapper/src/parser.regression.test.ts +251 -0
  850. package/packages/wrapper/src/parser.test.ts +1359 -0
  851. package/packages/wrapper/src/parser.ts +1477 -0
  852. package/packages/wrapper/src/prompt-composer.test.ts +219 -0
  853. package/packages/wrapper/src/prompt-composer.ts +231 -0
  854. package/packages/wrapper/src/relay-pty-orchestrator.test.ts +1204 -0
  855. package/packages/wrapper/src/relay-pty-orchestrator.ts +2626 -0
  856. package/packages/wrapper/src/shared.test.ts +322 -0
  857. package/packages/wrapper/src/shared.ts +495 -0
  858. package/packages/wrapper/src/stuck-detector.test.ts +303 -0
  859. package/packages/wrapper/src/stuck-detector.ts +511 -0
  860. package/packages/wrapper/src/tmux-resolver.test.ts +104 -0
  861. package/packages/wrapper/src/tmux-resolver.ts +207 -0
  862. package/packages/wrapper/src/tmux-wrapper.test.ts +316 -0
  863. package/packages/wrapper/src/tmux-wrapper.ts +2095 -0
  864. package/packages/wrapper/src/trajectory-detection.test.ts +151 -0
  865. package/packages/wrapper/src/trajectory-integration.ts +1261 -0
  866. package/packages/wrapper/src/wrapper-types.ts +45 -0
  867. package/packages/wrapper/tsconfig.json +19 -0
  868. package/packages/wrapper/vitest.config.ts +9 -0
  869. package/scripts/build-cjs.mjs +23 -0
  870. package/scripts/postinstall.js +132 -0
  871. package/.cursor/mcp.json +0 -11
  872. package/.gitattributes +0 -3
  873. package/.gitleaks.toml +0 -26
  874. package/.mcp.json +0 -11
  875. package/.nvmrc +0 -1
  876. package/ARCHITECTURE.md +0 -1245
  877. package/CHANGELOG.md +0 -231
  878. package/TESTING.md +0 -278
  879. package/TRAIL_GIT_AUTH_FIX.md +0 -113
  880. package/scripts/demos/README.md +0 -79
  881. package/scripts/demos/server-capacity.sh +0 -69
  882. package/scripts/demos/sprint-planning.sh +0 -73
  883. package/scripts/hooks/install.sh +0 -16
  884. package/scripts/hooks/pre-commit +0 -60
  885. package/scripts/post-publish-verify/README.md +0 -80
  886. package/scripts/post-publish-verify/run-verify.sh +0 -127
  887. package/scripts/post-publish-verify/verify-install.sh +0 -249
  888. package/scripts/stress-test-orchestrator-integration.mts +0 -1366
  889. package/scripts/stress-test-orchestrator.mjs +0 -584
  890. package/scripts/stress-test-relay-pty.sh +0 -452
  891. package/scripts/test-interactive-terminal.sh +0 -248
  892. package/specs/PRIMITIVES_ROADMAP.md +0 -2154
  893. package/tests/benchmarks/protocol.bench.ts +0 -310
  894. package/turbo.json +0 -37
@@ -0,0 +1,906 @@
1
+ /**
2
+ * CLI Auth Handler for Workspace Daemon
3
+ *
4
+ * Handles CLI-based authentication (claude, codex, etc.) via PTY.
5
+ * Runs inside the workspace container where CLI tools are installed.
6
+ *
7
+ * Uses relay-pty binary for PTY emulation, providing better Node.js
8
+ * version compatibility by avoiding native module compilation.
9
+ */
10
+
11
+ import { spawn, type ChildProcess } from 'node:child_process';
12
+ import { existsSync } from 'node:fs';
13
+ import * as fs from 'fs/promises';
14
+ import * as os from 'os';
15
+ import { join, dirname } from 'node:path';
16
+ import { fileURLToPath } from 'node:url';
17
+ import * as crypto from 'crypto';
18
+ import { createLogger } from '@agent-relay/resiliency';
19
+ import {
20
+ CLI_AUTH_CONFIG,
21
+ stripAnsiCodes,
22
+ matchesSuccessPattern,
23
+ findMatchingPrompt,
24
+ findMatchingError,
25
+ getSupportedProviders,
26
+ type CLIAuthConfig,
27
+ type PromptHandler,
28
+ } from '@agent-relay/config/cli-auth-config';
29
+ import { getUserDirectoryService } from '@agent-relay/user-directory';
30
+ import { findRelayPtyBinary as findRelayPtyBinaryUtil } from '@agent-relay/utils/relay-pty-path';
31
+
32
+ // Get the directory where this module is located
33
+ const __filename = fileURLToPath(import.meta.url);
34
+ const __dirname = dirname(__filename);
35
+
36
+ const logger = createLogger('cli-auth');
37
+
38
+ // Re-export for consumers
39
+ export { CLI_AUTH_CONFIG, getSupportedProviders };
40
+ export type { CLIAuthConfig, PromptHandler };
41
+
42
+ /**
43
+ * Find the relay-pty binary path.
44
+ * Uses shared utility from @agent-relay/utils.
45
+ */
46
+ function findRelayPtyBinary(): string | null {
47
+ return findRelayPtyBinaryUtil(__dirname);
48
+ }
49
+
50
+ /** Process wrapper interface for session management */
51
+ interface ProcessWrapper {
52
+ write: (data: string) => void;
53
+ kill: () => void;
54
+ }
55
+
56
+ /**
57
+ * Auth session state
58
+ */
59
+ interface AuthSession {
60
+ id: string;
61
+ provider: string;
62
+ userId?: string;
63
+ status: 'starting' | 'waiting_auth' | 'success' | 'error';
64
+ authUrl?: string;
65
+ token?: string;
66
+ refreshToken?: string;
67
+ tokenExpiresAt?: Date;
68
+ error?: string;
69
+ /** User-friendly hint for resolving the error */
70
+ errorHint?: string;
71
+ /** Whether the error can be resolved by retrying */
72
+ recoverable?: boolean;
73
+ output: string;
74
+ promptsHandled: string[];
75
+ createdAt: Date;
76
+ process?: ProcessWrapper;
77
+ }
78
+
79
+ // Active sessions
80
+ const sessions = new Map<string, AuthSession>();
81
+
82
+ // Clean up old sessions periodically
83
+ // Use .unref() so this timer doesn't prevent the process from exiting
84
+ setInterval(() => {
85
+ const now = Date.now();
86
+ for (const [id, session] of sessions) {
87
+ if (now - session.createdAt.getTime() > 10 * 60 * 1000) {
88
+ if (session.process) {
89
+ try {
90
+ session.process.kill();
91
+ } catch {
92
+ // Process may already be dead
93
+ }
94
+ }
95
+ sessions.delete(id);
96
+ }
97
+ }
98
+ }, 60000).unref();
99
+
100
+ export interface StartCLIAuthOptions {
101
+ /** Use device flow instead of standard OAuth (if provider supports it) */
102
+ useDeviceFlow?: boolean;
103
+ /** User ID for per-user credential storage (multi-user workspaces) */
104
+ userId?: string;
105
+ }
106
+
107
+ /**
108
+ * Start CLI auth flow
109
+ *
110
+ * This function waits for the auth URL to be captured before returning,
111
+ * ensuring the caller can immediately open the OAuth popup.
112
+ */
113
+ export async function startCLIAuth(
114
+ provider: string,
115
+ options: StartCLIAuthOptions = {}
116
+ ): Promise<AuthSession> {
117
+ const config = CLI_AUTH_CONFIG[provider];
118
+ if (!config) {
119
+ throw new Error(`Unknown provider: ${provider}`);
120
+ }
121
+
122
+ const sessionId = crypto.randomUUID();
123
+ const session: AuthSession = {
124
+ id: sessionId,
125
+ provider,
126
+ userId: options.userId,
127
+ status: 'starting',
128
+ output: '',
129
+ promptsHandled: [],
130
+ createdAt: new Date(),
131
+ };
132
+ sessions.set(sessionId, session);
133
+
134
+ logger.info('CLI auth session created', {
135
+ sessionId,
136
+ provider,
137
+ totalActiveSessions: sessions.size,
138
+ allSessionIds: Array.from(sessions.keys()),
139
+ });
140
+
141
+ // Check if already authenticated (credentials exist)
142
+ try {
143
+ const existingCreds = await extractCredentials(provider, config, options.userId);
144
+ if (existingCreds?.token) {
145
+ logger.info('Already authenticated - existing credentials found', { provider, sessionId });
146
+ session.status = 'success';
147
+ session.token = existingCreds.token;
148
+ session.refreshToken = existingCreds.refreshToken;
149
+ session.tokenExpiresAt = existingCreds.expiresAt;
150
+ return session;
151
+ }
152
+ } catch {
153
+ // No existing credentials, proceed with auth flow
154
+ }
155
+
156
+ // Find relay-pty binary
157
+ const relayPtyPath = findRelayPtyBinary();
158
+ if (!relayPtyPath) {
159
+ session.status = 'error';
160
+ session.error = 'relay-pty binary not found. Build with: cd relay-pty && cargo build --release';
161
+ return session;
162
+ }
163
+
164
+ // Use device flow args if requested and supported
165
+ const args = options.useDeviceFlow && config.deviceFlowArgs
166
+ ? config.deviceFlowArgs
167
+ : config.args;
168
+
169
+ logger.info('Starting CLI auth', {
170
+ provider,
171
+ sessionId,
172
+ useDeviceFlow: options.useDeviceFlow,
173
+ args,
174
+ });
175
+
176
+ const respondedPrompts = new Set<string>();
177
+
178
+ // Create a promise that resolves when authUrl is captured or timeout
179
+ let resolveAuthUrl: () => void;
180
+ const authUrlPromise = new Promise<void>((resolve) => {
181
+ resolveAuthUrl = resolve;
182
+ });
183
+
184
+ // Timeout for waiting for auth URL (shorter than the full OAuth timeout)
185
+ const AUTH_URL_WAIT_TIMEOUT = 15000; // 15 seconds to capture auth URL
186
+ const authUrlTimeout = setTimeout(() => {
187
+ logger.warn('Auth URL wait timeout, returning session without URL', { provider, sessionId });
188
+ resolveAuthUrl();
189
+ }, AUTH_URL_WAIT_TIMEOUT);
190
+
191
+ try {
192
+ // Get per-user environment if userId provided (for multi-user workspaces)
193
+ // This sets HOME to /data/users/{userId} so CLI stores credentials per-user
194
+ let userEnv: Record<string, string> = {};
195
+ if (options.userId) {
196
+ try {
197
+ const userDirService = getUserDirectoryService();
198
+ userEnv = userDirService.getUserEnvironment(options.userId);
199
+ logger.info('Using per-user environment for CLI auth', {
200
+ provider,
201
+ userId: options.userId,
202
+ home: userEnv.HOME,
203
+ });
204
+ } catch (err) {
205
+ logger.warn('Failed to get user environment, using default', {
206
+ provider,
207
+ userId: options.userId,
208
+ error: err instanceof Error ? err.message : String(err),
209
+ });
210
+ }
211
+ }
212
+
213
+ // Build relay-pty arguments
214
+ const relayArgs = [
215
+ '--name', `auth-${sessionId.substring(0, 8)}`,
216
+ '--rows', '30',
217
+ '--cols', '120',
218
+ '--log-level', 'error', // Suppress relay-pty logs
219
+ '--', config.command,
220
+ ...args,
221
+ ];
222
+
223
+ const proc: ChildProcess = spawn(relayPtyPath, relayArgs, {
224
+ cwd: process.cwd(),
225
+ env: {
226
+ ...process.env,
227
+ ...userEnv, // Override HOME for per-user credential storage
228
+ NO_COLOR: '1',
229
+ TERM: 'xterm-256color',
230
+ // Don't set BROWSER - let CLI fail to open browser and fall back to manual paste mode
231
+ // Setting BROWSER: 'echo' caused CLI to think browser opened and wait for callback that never came
232
+ DISPLAY: '',
233
+ },
234
+ stdio: ['pipe', 'pipe', 'pipe'],
235
+ });
236
+
237
+ // Create wrapper for session management
238
+ const processWrapper: ProcessWrapper = {
239
+ write: (data: string) => proc.stdin?.write(data),
240
+ kill: () => proc.kill(),
241
+ };
242
+ session.process = processWrapper;
243
+
244
+ // Timeout handler - give user plenty of time to complete OAuth flow
245
+ // 5 minutes should be enough for even slow OAuth flows
246
+ const OAUTH_COMPLETION_TIMEOUT = 5 * 60 * 1000; // 5 minutes
247
+ const timeout = setTimeout(() => {
248
+ if (session.status === 'starting' || session.status === 'waiting_auth') {
249
+ logger.warn('CLI auth timed out', { provider, sessionId, status: session.status });
250
+ proc.kill();
251
+ session.status = 'error';
252
+ session.error = 'Timeout waiting for auth completion (5 minutes). Please try again.';
253
+ }
254
+ }, config.waitTimeout + OAUTH_COMPLETION_TIMEOUT);
255
+
256
+ // Handle data from PTY output
257
+ const handleData = (data: string) => {
258
+ session.output += data;
259
+ const cleanText = stripAnsiCodes(data);
260
+
261
+ // Check for error patterns FIRST - if error detected, don't auto-respond to prompts
262
+ // This prevents us from auto-responding to "Press Enter to retry" in error messages
263
+ const matchedError = findMatchingError(data, config.errorPatterns);
264
+ if (matchedError && session.status !== 'error') {
265
+ logger.warn('Auth error detected', {
266
+ provider,
267
+ sessionId,
268
+ errorMessage: matchedError.message,
269
+ recoverable: matchedError.recoverable,
270
+ });
271
+ session.status = 'error';
272
+ session.error = matchedError.message;
273
+ session.errorHint = matchedError.hint;
274
+ session.recoverable = matchedError.recoverable;
275
+ }
276
+
277
+ // Don't auto-respond to prompts if we're in error state
278
+ // This prevents responding to "Press Enter to retry" after an error
279
+ if (session.status !== 'error') {
280
+ const matchingPrompt = findMatchingPrompt(data, config.prompts, respondedPrompts);
281
+ if (matchingPrompt) {
282
+ respondedPrompts.add(matchingPrompt.description);
283
+ session.promptsHandled.push(matchingPrompt.description);
284
+ logger.info('Auto-responding to prompt', { description: matchingPrompt.description });
285
+
286
+ const delay = matchingPrompt.delay ?? 100;
287
+ setTimeout(() => {
288
+ try {
289
+ proc.stdin?.write(matchingPrompt.response);
290
+ } catch {
291
+ // Process may have exited
292
+ }
293
+ }, delay);
294
+ }
295
+ }
296
+
297
+ // Extract auth URL (only if not in error state and don't have URL yet)
298
+ // Use accumulated output to handle URLs that wrap across multiple lines
299
+ // Join lines that look like URL continuations (no space/newline within URLs)
300
+ const cleanAccumulated = stripAnsiCodes(session.output)
301
+ .replace(/\n(?=[a-zA-Z0-9\-_.~:/?#\[\]@!$&'()*+,;=%])/g, '');
302
+ const match = cleanAccumulated.match(config.urlPattern);
303
+ if (match && match[1] && !session.authUrl && session.status !== 'error') {
304
+ session.authUrl = match[1];
305
+ session.status = 'waiting_auth';
306
+ logger.info('Auth URL captured', { provider, url: session.authUrl });
307
+ // Signal that we have the auth URL
308
+ clearTimeout(authUrlTimeout);
309
+ resolveAuthUrl();
310
+ }
311
+
312
+ // Log all output after auth URL is captured (for debugging)
313
+ if (session.authUrl) {
314
+ const trimmedData = cleanText.trim();
315
+ if (trimmedData.length > 0) {
316
+ logger.info('PTY output after auth URL', {
317
+ provider,
318
+ sessionId,
319
+ output: trimmedData.substring(0, 500),
320
+ });
321
+ }
322
+ }
323
+
324
+ // Check for success and try to extract credentials
325
+ // Don't override error status - if there was an error, keep it
326
+ if (session.status !== 'error' && matchesSuccessPattern(data, config.successPatterns)) {
327
+ session.status = 'success';
328
+ logger.info('Success pattern detected, attempting credential extraction', { provider });
329
+
330
+ // Try to extract credentials immediately (CLI may not exit after success)
331
+ // Use a small delay to let the CLI finish writing the file
332
+ setTimeout(async () => {
333
+ // Don't extract if status changed to error (e.g., error detected after success pattern)
334
+ if (session.status === 'error') {
335
+ logger.info('Skipping credential extraction - session is in error state', { provider });
336
+ return;
337
+ }
338
+ try {
339
+ const creds = await extractCredentials(provider, config, session.userId);
340
+ if (creds) {
341
+ session.token = creds.token;
342
+ session.refreshToken = creds.refreshToken;
343
+ session.tokenExpiresAt = creds.expiresAt;
344
+ logger.info('Credentials extracted successfully', { provider, hasRefreshToken: !!creds.refreshToken });
345
+ }
346
+ } catch (err) {
347
+ logger.error('Failed to extract credentials on success', { error: String(err) });
348
+ }
349
+ }, 500);
350
+ }
351
+ };
352
+
353
+ // Handle stdout (main PTY output)
354
+ proc.stdout?.on('data', (data: Buffer) => {
355
+ handleData(data.toString());
356
+ });
357
+
358
+ // Handle stderr (relay-pty logs and some CLI output)
359
+ proc.stderr?.on('data', (data: Buffer) => {
360
+ handleData(data.toString());
361
+ });
362
+
363
+ proc.on('exit', async (exitCode) => {
364
+ clearTimeout(timeout);
365
+ clearTimeout(authUrlTimeout);
366
+
367
+ // Clear process reference so submitAuthCode knows PTY is gone
368
+ session.process = undefined;
369
+
370
+ // Log full output for debugging PTY exit issues
371
+ const cleanOutput = stripAnsiCodes(session.output);
372
+ logger.info('CLI process exited', {
373
+ provider,
374
+ exitCode,
375
+ outputLength: session.output.length,
376
+ hasAuthUrl: !!session.authUrl,
377
+ sessionStatus: session.status,
378
+ promptsHandled: session.promptsHandled,
379
+ // Last 500 chars of output for debugging
380
+ outputTail: cleanOutput.slice(-500),
381
+ });
382
+
383
+ // Try to extract credentials (but don't override error status)
384
+ // CLI might exit cleanly (code 0) even after an OAuth error
385
+ if ((session.authUrl || exitCode === 0) && session.status !== 'error') {
386
+ try {
387
+ const creds = await extractCredentials(provider, config, session.userId);
388
+ if (creds) {
389
+ session.token = creds.token;
390
+ session.refreshToken = creds.refreshToken;
391
+ session.tokenExpiresAt = creds.expiresAt;
392
+ session.status = 'success';
393
+ }
394
+ } catch (err) {
395
+ logger.error('Failed to extract credentials', { error: String(err) });
396
+ }
397
+ }
398
+
399
+ if (!session.authUrl && !session.token && session.status !== 'error') {
400
+ session.status = 'error';
401
+ session.error = 'CLI exited without auth URL or credentials';
402
+ }
403
+
404
+ // Resolve in case we're still waiting
405
+ resolveAuthUrl();
406
+ });
407
+
408
+ proc.on('error', (err) => {
409
+ clearTimeout(timeout);
410
+ clearTimeout(authUrlTimeout);
411
+ session.status = 'error';
412
+ session.error = err.message;
413
+ logger.error('CLI process error', { error: err.message });
414
+ resolveAuthUrl();
415
+ });
416
+ } catch (err) {
417
+ session.status = 'error';
418
+ session.error = err instanceof Error ? err.message : 'Failed to spawn CLI';
419
+ logger.error('Failed to start CLI auth', { error: session.error });
420
+ clearTimeout(authUrlTimeout);
421
+ resolveAuthUrl!();
422
+ }
423
+
424
+ // Wait for auth URL to be captured (or timeout)
425
+ await authUrlPromise;
426
+
427
+ return session;
428
+ }
429
+
430
+ /**
431
+ * Get auth session status
432
+ */
433
+ export function getAuthSession(sessionId: string): AuthSession | null {
434
+ return sessions.get(sessionId) || null;
435
+ }
436
+
437
+ /**
438
+ * Submit auth code to a waiting session
439
+ * This writes the code to the PTY process stdin
440
+ *
441
+ * @param sessionId - The auth session ID
442
+ * @param code - The OAuth authorization code
443
+ * @param state - Optional OAuth state parameter for CSRF validation (used by Codex)
444
+ * @returns Object with success status and optional error message
445
+ */
446
+ export async function submitAuthCode(
447
+ sessionId: string,
448
+ code: string,
449
+ state?: string
450
+ ): Promise<{ success: boolean; error?: string; needsRestart?: boolean }> {
451
+ // Log all active sessions for debugging
452
+ const activeSessionIds = Array.from(sessions.keys());
453
+ logger.info('submitAuthCode called', {
454
+ sessionId,
455
+ codeLength: code.length,
456
+ activeSessionCount: activeSessionIds.length,
457
+ activeSessionIds,
458
+ });
459
+
460
+ const session = sessions.get(sessionId);
461
+ if (!session) {
462
+ logger.warn('Auth code submission failed: session not found', {
463
+ sessionId,
464
+ activeSessionIds,
465
+ hint: 'Session may have been cleaned up or never created',
466
+ });
467
+ return { success: false, error: 'Session not found or expired', needsRestart: true };
468
+ }
469
+
470
+ logger.info('Session found for code submission', {
471
+ sessionId,
472
+ provider: session.provider,
473
+ status: session.status,
474
+ hasProcess: !!session.process,
475
+ hasAuthUrl: !!session.authUrl,
476
+ hasToken: !!session.token,
477
+ promptsHandled: session.promptsHandled,
478
+ createdAt: session.createdAt.toISOString(),
479
+ ageSeconds: Math.round((Date.now() - session.createdAt.getTime()) / 1000),
480
+ });
481
+
482
+ if (!session.process) {
483
+ logger.warn('Auth code submission failed: no PTY process', {
484
+ sessionId,
485
+ sessionStatus: session.status,
486
+ provider: session.provider,
487
+ outputLength: session.output?.length || 0,
488
+ outputTail: session.output ? stripAnsiCodes(session.output).slice(-500) : 'no output',
489
+ });
490
+
491
+ // Try to extract credentials as a fallback - maybe auth completed in browser
492
+ // But don't override error status
493
+ const config = CLI_AUTH_CONFIG[session.provider];
494
+ if (config && session.status !== 'error') {
495
+ try {
496
+ const creds = await extractCredentials(session.provider, config, session.userId);
497
+ // Re-check status after async operation (race condition protection)
498
+ // Use type assertion because TypeScript narrowing doesn't account for async race conditions
499
+ if (creds && (session.status as AuthSession['status']) !== 'error') {
500
+ session.token = creds.token;
501
+ session.refreshToken = creds.refreshToken;
502
+ session.tokenExpiresAt = creds.expiresAt;
503
+ session.status = 'success';
504
+ logger.info('Credentials found despite PTY exit', { provider: session.provider });
505
+ return { success: true };
506
+ }
507
+ } catch {
508
+ // No credentials found
509
+ }
510
+ }
511
+
512
+ // For providers like Claude that need the code pasted into CLI,
513
+ // if the PTY is gone, user needs to restart the auth flow
514
+ return {
515
+ success: false,
516
+ error: 'The authentication session has ended. The CLI process exited before the code could be entered. Please click "Try Again" to restart.',
517
+ needsRestart: true,
518
+ };
519
+ }
520
+
521
+ try {
522
+ // Clean the code - trim whitespace and strip state parameter if present
523
+ // Claude OAuth codes come as "CODE#STATE" - we only need the code part
524
+ let cleanCode = code.trim();
525
+ if (cleanCode.includes('#')) {
526
+ const originalCode = cleanCode;
527
+ cleanCode = cleanCode.split('#')[0];
528
+ logger.info('Stripped state parameter from auth code', {
529
+ sessionId,
530
+ originalLength: originalCode.length,
531
+ cleanLength: cleanCode.length,
532
+ });
533
+ }
534
+
535
+ // For Codex (openai), forward the callback to the CLI's localhost server
536
+ // instead of writing to PTY stdin. The CLI spawns a localhost server
537
+ // waiting for the OAuth callback.
538
+ if (session.provider === 'openai' && session.authUrl) {
539
+ // Extract the redirect port from the auth URL (usually 1455)
540
+ const redirectMatch = session.authUrl.match(/redirect_uri=http%3A%2F%2Flocalhost%3A(\d+)/);
541
+ const port = redirectMatch ? redirectMatch[1] : '1455';
542
+
543
+ logger.info('Forwarding OAuth callback to Codex CLI localhost server', {
544
+ sessionId,
545
+ port,
546
+ codeLength: cleanCode.length,
547
+ hasState: !!state,
548
+ });
549
+
550
+ try {
551
+ // Forward the callback to the CLI's localhost server
552
+ // Include state parameter for CSRF validation if provided
553
+ let callbackUrl = `http://localhost:${port}/auth/callback?code=${encodeURIComponent(cleanCode)}`;
554
+ if (state) {
555
+ callbackUrl += `&state=${encodeURIComponent(state)}`;
556
+ }
557
+ const response = await fetch(callbackUrl, {
558
+ method: 'GET',
559
+ signal: AbortSignal.timeout(5000),
560
+ });
561
+
562
+ if (response.ok) {
563
+ logger.info('OAuth callback forwarded successfully to Codex CLI', { sessionId, status: response.status });
564
+
565
+ // Start polling for credentials
566
+ const config = CLI_AUTH_CONFIG[session.provider];
567
+ if (config) {
568
+ pollForCredentials(session, config);
569
+ }
570
+
571
+ return { success: true };
572
+ } else {
573
+ // Try to get error details from response body
574
+ let errorBody = '';
575
+ try {
576
+ errorBody = await response.text();
577
+ } catch {
578
+ // Ignore
579
+ }
580
+ logger.warn('Codex CLI localhost server returned error', {
581
+ sessionId,
582
+ status: response.status,
583
+ statusText: response.statusText,
584
+ errorBody: errorBody.substring(0, 500), // Limit log size
585
+ callbackUrl: callbackUrl.replace(/code=[^&]+/, 'code=***'), // Redact code
586
+ });
587
+ // Fall through to PTY write as fallback
588
+ }
589
+ } catch (err) {
590
+ logger.warn('Failed to forward callback to Codex CLI localhost server', {
591
+ sessionId,
592
+ error: String(err),
593
+ });
594
+ // Fall through to PTY write as fallback
595
+ }
596
+ }
597
+
598
+ logger.info('Writing auth code to PTY', {
599
+ sessionId,
600
+ originalLength: code.length,
601
+ cleanLength: cleanCode.length,
602
+ codePreview: cleanCode.substring(0, 20) + '...',
603
+ });
604
+
605
+ // Write the auth code WITHOUT Enter first
606
+ // Claude CLI's Ink text input needs time to process the input
607
+ // before receiving Enter (tested: immediate Enter fails, delayed Enter works)
608
+ session.process.write(cleanCode);
609
+ logger.info('Auth code written, waiting before sending Enter...', { sessionId });
610
+
611
+ // Wait 1 second for CLI to process the typed input
612
+ await new Promise(resolve => setTimeout(resolve, 1000));
613
+
614
+ // Now send Enter to submit
615
+ session.process.write('\r');
616
+ logger.info('Enter key sent', { sessionId });
617
+
618
+ // Start polling for credentials after code submission
619
+ // The CLI should write credentials shortly after receiving the code
620
+ const config = CLI_AUTH_CONFIG[session.provider];
621
+ if (config) {
622
+ pollForCredentials(session, config);
623
+ }
624
+
625
+ return { success: true };
626
+ } catch (err) {
627
+ logger.error('Failed to submit auth code', { sessionId, error: String(err) });
628
+ return {
629
+ success: false,
630
+ error: 'Failed to write to CLI process. The process may have exited. Please try again.',
631
+ needsRestart: true,
632
+ };
633
+ }
634
+ }
635
+
636
+ /**
637
+ * Poll for credentials file after auth code submission
638
+ * Some CLIs don't output success patterns, so we check the file directly
639
+ */
640
+ async function pollForCredentials(session: AuthSession, config: CLIAuthConfig): Promise<void> {
641
+ const maxAttempts = 10;
642
+ const pollInterval = 1000; // 1 second
643
+
644
+ for (let i = 0; i < maxAttempts; i++) {
645
+ await new Promise(resolve => setTimeout(resolve, pollInterval));
646
+
647
+ // Skip if session already has credentials or errored
648
+ if (session.token || session.status === 'error') {
649
+ return;
650
+ }
651
+
652
+ try {
653
+ const creds = await extractCredentials(session.provider, config, session.userId);
654
+ if (creds) {
655
+ // Double-check we're not in error state (race condition protection)
656
+ // Use type assertion because TypeScript narrowing doesn't account for async race conditions
657
+ if ((session.status as AuthSession['status']) === 'error') {
658
+ logger.info('Credentials found but session is in error state, not overriding', {
659
+ provider: session.provider,
660
+ });
661
+ return;
662
+ }
663
+ session.token = creds.token;
664
+ session.refreshToken = creds.refreshToken;
665
+ session.tokenExpiresAt = creds.expiresAt;
666
+ session.status = 'success';
667
+ logger.info('Credentials found via polling', {
668
+ provider: session.provider,
669
+ attempt: i + 1,
670
+ hasRefreshToken: !!creds.refreshToken,
671
+ });
672
+ return;
673
+ }
674
+ } catch {
675
+ // File doesn't exist yet, continue polling
676
+ }
677
+ }
678
+
679
+ logger.warn('Credential polling completed without finding credentials', {
680
+ provider: session.provider,
681
+ sessionId: session.id,
682
+ });
683
+ }
684
+
685
+ /**
686
+ * Complete auth session by polling for credentials
687
+ * Called when user indicates they've completed auth in browser
688
+ */
689
+ export async function completeAuthSession(sessionId: string): Promise<{
690
+ success: boolean;
691
+ error?: string;
692
+ token?: string;
693
+ }> {
694
+ const session = sessions.get(sessionId);
695
+ if (!session) {
696
+ return { success: false, error: 'Session not found or expired' };
697
+ }
698
+
699
+ // Already have credentials
700
+ if (session.token) {
701
+ return { success: true, token: session.token };
702
+ }
703
+
704
+ const config = CLI_AUTH_CONFIG[session.provider];
705
+ if (!config) {
706
+ return { success: false, error: 'Unknown provider' };
707
+ }
708
+
709
+ // Poll for credentials (user just completed auth in browser)
710
+ const maxAttempts = 15;
711
+ const pollInterval = 1000;
712
+
713
+ for (let i = 0; i < maxAttempts; i++) {
714
+ // Check if session went into error state
715
+ if (session.status === 'error') {
716
+ return { success: false, error: session.error || 'Authentication failed' };
717
+ }
718
+ try {
719
+ const creds = await extractCredentials(session.provider, config, session.userId);
720
+ if (creds) {
721
+ // Double-check we're not in error state (race condition protection)
722
+ // Use type assertion because TypeScript narrowing doesn't account for async race conditions
723
+ if ((session.status as AuthSession['status']) === 'error') {
724
+ return { success: false, error: session.error || 'Authentication failed' };
725
+ }
726
+ session.token = creds.token;
727
+ session.refreshToken = creds.refreshToken;
728
+ session.tokenExpiresAt = creds.expiresAt;
729
+ session.status = 'success';
730
+ logger.info('Credentials found via complete polling', {
731
+ provider: session.provider,
732
+ attempt: i + 1,
733
+ });
734
+ return { success: true, token: creds.token };
735
+ }
736
+ } catch {
737
+ // File doesn't exist yet
738
+ }
739
+ await new Promise(resolve => setTimeout(resolve, pollInterval));
740
+ }
741
+
742
+ return {
743
+ success: false,
744
+ error: 'Credentials not found. Please ensure you completed authentication in the browser.',
745
+ };
746
+ }
747
+
748
+ /**
749
+ * Cancel auth session
750
+ */
751
+ export function cancelAuthSession(sessionId: string): boolean {
752
+ const session = sessions.get(sessionId);
753
+ if (!session) return false;
754
+
755
+ if (session.process) {
756
+ try {
757
+ session.process.kill();
758
+ } catch {
759
+ // Already dead
760
+ }
761
+ }
762
+
763
+ sessions.delete(sessionId);
764
+ return true;
765
+ }
766
+
767
+ interface ExtractedCredentials {
768
+ token: string;
769
+ refreshToken?: string;
770
+ expiresAt?: Date;
771
+ }
772
+
773
+ function resolveCredentialPath(
774
+ provider: string,
775
+ config: CLIAuthConfig,
776
+ userId?: string
777
+ ): string | null {
778
+ if (!config.credentialPath) return null;
779
+
780
+ if (!userId) {
781
+ return config.credentialPath.replace('~', os.homedir());
782
+ }
783
+
784
+ try {
785
+ const userDirService = getUserDirectoryService();
786
+ const userHome = userDirService.getUserHome(userId);
787
+ return config.credentialPath.replace('~', userHome);
788
+ } catch (err) {
789
+ logger.warn('Failed to resolve per-user credential path, using default', {
790
+ provider,
791
+ userId,
792
+ error: err instanceof Error ? err.message : String(err),
793
+ });
794
+ return config.credentialPath.replace('~', os.homedir());
795
+ }
796
+ }
797
+
798
+ /**
799
+ * Extract credentials from CLI credential file
800
+ */
801
+ async function extractCredentials(
802
+ provider: string,
803
+ config: CLIAuthConfig,
804
+ userId?: string
805
+ ): Promise<ExtractedCredentials | null> {
806
+ const credPath = resolveCredentialPath(provider, config, userId);
807
+ if (!credPath) return null;
808
+
809
+ try {
810
+ const content = await fs.readFile(credPath, 'utf8');
811
+ const creds = JSON.parse(content);
812
+
813
+ // Extract token based on provider
814
+ if (provider === 'anthropic') {
815
+ // Claude stores OAuth in: { claudeAiOauth: { accessToken: "...", refreshToken: "...", expiresAt: ... } }
816
+ if (creds.claudeAiOauth?.accessToken) {
817
+ return {
818
+ token: creds.claudeAiOauth.accessToken,
819
+ refreshToken: creds.claudeAiOauth.refreshToken,
820
+ expiresAt: creds.claudeAiOauth.expiresAt ? new Date(creds.claudeAiOauth.expiresAt) : undefined,
821
+ };
822
+ }
823
+ // Fallback to legacy formats
824
+ const token = creds.oauth_token || creds.access_token || creds.api_key;
825
+ return token ? { token } : null;
826
+ } else if (provider === 'openai') {
827
+ // Codex stores OAuth in: { tokens: { access_token: "...", refresh_token: "...", ... } }
828
+ if (creds.tokens?.access_token) {
829
+ return {
830
+ token: creds.tokens.access_token,
831
+ refreshToken: creds.tokens.refresh_token,
832
+ };
833
+ }
834
+ // Fallback: API key or legacy formats
835
+ const token = creds.OPENAI_API_KEY || creds.token || creds.access_token || creds.api_key;
836
+ return token ? { token } : null;
837
+ } else if (provider === 'opencode') {
838
+ // OpenCode stores multiple providers: { opencode: {...}, anthropic: {...}, openai: {...}, google: {...} }
839
+ // Check for any valid credential - prefer OpenCode Zen, then Anthropic
840
+ if (creds.opencode?.key) {
841
+ return { token: creds.opencode.key };
842
+ }
843
+ if (creds.anthropic?.access) {
844
+ return {
845
+ token: creds.anthropic.access,
846
+ refreshToken: creds.anthropic.refresh,
847
+ expiresAt: creds.anthropic.expires ? new Date(creds.anthropic.expires) : undefined,
848
+ };
849
+ }
850
+ if (creds.openai?.access) {
851
+ return {
852
+ token: creds.openai.access,
853
+ refreshToken: creds.openai.refresh,
854
+ expiresAt: creds.openai.expires ? new Date(creds.openai.expires) : undefined,
855
+ };
856
+ }
857
+ if (creds.google?.key) {
858
+ return { token: creds.google.key };
859
+ }
860
+ return null;
861
+ } else if (provider === 'cursor') {
862
+ // Cursor stores credentials in various formats - try common patterns
863
+ // { accessToken: "...", refreshToken: "..." } or { token: "..." } or nested
864
+ if (creds.accessToken) {
865
+ return {
866
+ token: creds.accessToken,
867
+ refreshToken: creds.refreshToken,
868
+ expiresAt: creds.expiresAt ? new Date(creds.expiresAt) : undefined,
869
+ };
870
+ }
871
+ if (creds.auth?.accessToken) {
872
+ return {
873
+ token: creds.auth.accessToken,
874
+ refreshToken: creds.auth.refreshToken,
875
+ expiresAt: creds.auth.expiresAt ? new Date(creds.auth.expiresAt) : undefined,
876
+ };
877
+ }
878
+ // Fallback to generic token fields
879
+ const token = creds.token || creds.access_token || creds.api_key;
880
+ return token ? { token } : null;
881
+ }
882
+
883
+ const token = creds.token || creds.access_token || creds.api_key;
884
+ return token ? { token } : null;
885
+ } catch {
886
+ return null;
887
+ }
888
+ }
889
+
890
+ /**
891
+ * Check if a provider is authenticated (credentials exist)
892
+ * Used by the auth check endpoint for SSH tunnel flow
893
+ */
894
+ export async function checkProviderAuth(provider: string, userId?: string): Promise<boolean> {
895
+ const config = CLI_AUTH_CONFIG[provider];
896
+ if (!config) {
897
+ return false;
898
+ }
899
+
900
+ try {
901
+ const creds = await extractCredentials(provider, config, userId);
902
+ return !!creds?.token;
903
+ } catch {
904
+ return false;
905
+ }
906
+ }