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
@@ -1,1366 +0,0 @@
1
- #!/usr/bin/env npx tsx
2
- /**
3
- * Integration Stress Test for Orchestrator
4
- *
5
- * Tests the REAL Orchestrator class and its critical paths:
6
- * - Daemon lifecycle (start/stop)
7
- * - Agent health monitoring
8
- * - HTTP/WebSocket API under load
9
- * - Relay-ledger concurrent operations
10
- *
11
- * Usage:
12
- * npx tsx scripts/stress-test-orchestrator-integration.mts
13
- * npx tsx scripts/stress-test-orchestrator-integration.mts --json
14
- */
15
-
16
- import { performance } from 'perf_hooks';
17
- import * as http from 'http';
18
- import * as fs from 'fs';
19
- import * as path from 'path';
20
- import * as os from 'os';
21
- import * as net from 'net';
22
- import { createRequire } from 'module';
23
- import { Worker } from 'worker_threads';
24
- import { spawn } from 'child_process';
25
-
26
- const require = createRequire(import.meta.url);
27
- const { WebSocket } = require('ws');
28
-
29
- // Suppress console output from Orchestrator loggers when running in JSON mode
30
- // This must happen BEFORE importing the Orchestrator module
31
- const JSON_OUTPUT_EARLY = process.argv.includes('--json');
32
- if (JSON_OUTPUT_EARLY) {
33
- // Suppress utils logger (daemon, router, etc.) - must be set before module imports
34
- process.env.AGENT_RELAY_LOG_LEVEL = 'ERROR';
35
-
36
- // Configure the resiliency logger to not output to console
37
- // IMPORTANT: Import directly from logger.js to avoid loading other modules that create loggers
38
- const { configure } = await import('../packages/resiliency/dist/logger.js');
39
- configure({ console: false, level: 'fatal' });
40
- }
41
-
42
- // ============================================================================
43
- // Configuration
44
- // ============================================================================
45
-
46
- const JSON_OUTPUT = process.argv.includes('--json');
47
- const VERBOSE = process.argv.includes('--verbose');
48
-
49
- // Get output file from --output=<file> argument
50
- function getOutputFile(): string | null {
51
- const arg = process.argv.find((a) => a.startsWith('--output='));
52
- return arg ? arg.split('=')[1] : null;
53
- }
54
- const OUTPUT_FILE = getOutputFile();
55
-
56
- const CONFIG = {
57
- // API stress
58
- httpRequestCount: 100,
59
- concurrentHttpClients: 10,
60
-
61
- // WebSocket stress
62
- wsClientCount: 10,
63
- wsMessagesPerClient: 20,
64
-
65
- // Workspace stress
66
- workspaceCycles: 5,
67
-
68
- // Ledger stress
69
- ledgerFileCount: 50,
70
- ledgerConcurrentOps: 10,
71
-
72
- // Health monitoring
73
- healthCheckIterations: 100,
74
-
75
- // Timeouts
76
- testTimeout: 60000,
77
- httpTimeout: 5000,
78
- };
79
-
80
- // ============================================================================
81
- // Utilities
82
- // ============================================================================
83
-
84
- function log(msg: string) {
85
- if (!JSON_OUTPUT) {
86
- console.error(msg);
87
- }
88
- }
89
-
90
- function verbose(msg: string) {
91
- if (VERBOSE && !JSON_OUTPUT) {
92
- console.error(` [verbose] ${msg}`);
93
- }
94
- }
95
-
96
- async function sleep(ms: number): Promise<void> {
97
- return new Promise((resolve) => setTimeout(resolve, ms));
98
- }
99
-
100
- async function findAvailablePort(): Promise<number> {
101
- return new Promise((resolve, reject) => {
102
- const server = net.createServer();
103
- server.listen(0, () => {
104
- const addr = server.address();
105
- const port = typeof addr === 'object' && addr ? addr.port : 0;
106
- server.close(() => resolve(port));
107
- });
108
- server.on('error', reject);
109
- });
110
- }
111
-
112
- function createTempDir(prefix: string): string {
113
- return fs.mkdtempSync(path.join(os.tmpdir(), prefix));
114
- }
115
-
116
- // ============================================================================
117
- // Test Results
118
- // ============================================================================
119
-
120
- interface TestResult {
121
- passed: boolean;
122
- elapsed_ms: number;
123
- details: Record<string, unknown>;
124
- error?: string;
125
- }
126
-
127
- interface AllResults {
128
- passed: boolean;
129
- failures: number;
130
- tests: Record<string, TestResult>;
131
- summary: {
132
- total_tests: number;
133
- passed_tests: number;
134
- failed_tests: number;
135
- total_time_ms: number;
136
- };
137
- }
138
-
139
- // ============================================================================
140
- // HTTP Client
141
- // ============================================================================
142
-
143
- async function httpRequest(
144
- method: string,
145
- url: string,
146
- body?: unknown,
147
- timeout = CONFIG.httpTimeout
148
- ): Promise<{ status: number; body: unknown }> {
149
- return new Promise((resolve, reject) => {
150
- const urlObj = new URL(url);
151
-
152
- const options: http.RequestOptions = {
153
- hostname: urlObj.hostname,
154
- port: urlObj.port,
155
- path: urlObj.pathname + urlObj.search,
156
- method,
157
- headers: {
158
- 'Content-Type': 'application/json',
159
- },
160
- timeout,
161
- };
162
-
163
- const req = http.request(options, (res) => {
164
- let data = '';
165
- res.on('data', (chunk) => (data += chunk));
166
- res.on('end', () => {
167
- try {
168
- const parsed = data ? JSON.parse(data) : null;
169
- resolve({ status: res.statusCode || 0, body: parsed });
170
- } catch {
171
- resolve({ status: res.statusCode || 0, body: data });
172
- }
173
- });
174
- });
175
-
176
- req.on('error', reject);
177
- req.on('timeout', () => {
178
- req.destroy();
179
- reject(new Error('Request timeout'));
180
- });
181
-
182
- if (body) {
183
- req.write(JSON.stringify(body));
184
- }
185
- req.end();
186
- });
187
- }
188
-
189
- // ============================================================================
190
- // Test Runner
191
- // ============================================================================
192
-
193
- class IntegrationStressTest {
194
- private port: number = 0;
195
- private baseUrl: string = '';
196
- private wsUrl: string = '';
197
- private tempDirs: string[] = [];
198
- private results: Record<string, TestResult> = {};
199
- private failures = 0;
200
- private orchestrator: any = null;
201
-
202
- async setup(): Promise<void> {
203
- log('=== Setting up Integration Stress Test ===\n');
204
-
205
- // Find available port
206
- this.port = await findAvailablePort();
207
- this.baseUrl = `http://localhost:${this.port}`;
208
- this.wsUrl = `ws://localhost:${this.port}`;
209
-
210
- log(`Using port ${this.port}`);
211
-
212
- // Create temp data directory
213
- const dataDir = createTempDir('orchestrator-stress-');
214
- this.tempDirs.push(dataDir);
215
-
216
- log(`Data directory: ${dataDir}`);
217
-
218
- // Import and start orchestrator
219
- try {
220
- const { Orchestrator } = await import('../packages/daemon/dist/orchestrator.js');
221
-
222
- this.orchestrator = new Orchestrator({
223
- port: this.port,
224
- host: 'localhost',
225
- dataDir,
226
- autoStartDaemons: false, // Manual control for testing
227
- });
228
-
229
- await this.orchestrator.start();
230
- log(`Orchestrator started on port ${this.port}\n`);
231
-
232
- // Wait for server to be ready
233
- await sleep(500);
234
- } catch (err: any) {
235
- throw new Error(`Failed to start orchestrator: ${err.message}`);
236
- }
237
- }
238
-
239
- async teardown(): Promise<void> {
240
- log('\n=== Tearing down ===');
241
-
242
- if (this.orchestrator) {
243
- try {
244
- await this.orchestrator.stop();
245
- log('Orchestrator stopped');
246
- } catch (err: any) {
247
- log(`Warning: Failed to stop orchestrator: ${err.message}`);
248
- }
249
- }
250
-
251
- // Clean up temp directories
252
- for (const dir of this.tempDirs) {
253
- try {
254
- fs.rmSync(dir, { recursive: true, force: true });
255
- verbose(`Removed temp dir: ${dir}`);
256
- } catch {
257
- // Ignore cleanup errors
258
- }
259
- }
260
- }
261
-
262
- async runAll(): Promise<AllResults> {
263
- const startTime = performance.now();
264
-
265
- await this.testHttpApiHealth();
266
- await this.testHttpApiWorkspaces();
267
- await this.testHttpApiConcurrent();
268
- await this.testWebSocketConnections();
269
- await this.testWebSocketMessageFlood();
270
- await this.testWorkspaceLifecycle();
271
- await this.testHealthMonitoringApi();
272
- await this.testRelayLedger();
273
- await this.testLedgerConcurrentClaims();
274
- await this.testLedgerCrashRecovery();
275
- await this.testAgentHealthCrashDetection();
276
-
277
- const totalTime = performance.now() - startTime;
278
-
279
- const passedTests = Object.values(this.results).filter((r) => r.passed).length;
280
-
281
- return {
282
- passed: this.failures === 0,
283
- failures: this.failures,
284
- tests: this.results,
285
- summary: {
286
- total_tests: Object.keys(this.results).length,
287
- passed_tests: passedTests,
288
- failed_tests: this.failures,
289
- total_time_ms: Math.round(totalTime),
290
- },
291
- };
292
- }
293
-
294
- // ==========================================================================
295
- // Test: HTTP API Health (uses / root endpoint)
296
- // ==========================================================================
297
-
298
- async testHttpApiHealth(): Promise<void> {
299
- log('=== Test: HTTP API Health ===');
300
- const start = performance.now();
301
-
302
- let passed = false;
303
- let successCount = 0;
304
- let errorCount = 0;
305
-
306
- try {
307
- // Hit root endpoint multiple times (orchestrator uses / for status)
308
- for (let i = 0; i < 20; i++) {
309
- try {
310
- const resp = await httpRequest('GET', `${this.baseUrl}/`);
311
- if (resp.status === 200) {
312
- const body = resp.body as any;
313
- // Verify response has expected structure
314
- if (body?.status === 'ok' || body?.workspaces !== undefined) {
315
- successCount++;
316
- } else {
317
- errorCount++;
318
- }
319
- } else {
320
- errorCount++;
321
- }
322
- } catch {
323
- errorCount++;
324
- }
325
- }
326
-
327
- passed = successCount >= 18; // 90% success rate
328
- } catch (err: any) {
329
- this.results.httpApiHealth = {
330
- passed: false,
331
- elapsed_ms: Math.round(performance.now() - start),
332
- details: {},
333
- error: err.message,
334
- };
335
- this.failures++;
336
- log(` FAILED: ${err.message}\n`);
337
- return;
338
- }
339
-
340
- this.results.httpApiHealth = {
341
- passed,
342
- elapsed_ms: Math.round(performance.now() - start),
343
- details: {
344
- success_count: successCount,
345
- error_count: errorCount,
346
- success_rate: successCount / 20,
347
- },
348
- };
349
-
350
- if (!passed) this.failures++;
351
- log(` Success: ${successCount}/20, PASSED: ${passed}\n`);
352
- }
353
-
354
- // ==========================================================================
355
- // Test: HTTP API Workspaces CRUD
356
- // ==========================================================================
357
-
358
- async testHttpApiWorkspaces(): Promise<void> {
359
- log('=== Test: HTTP API Workspaces CRUD ===');
360
- const start = performance.now();
361
-
362
- let passed = false;
363
- const operations = { add: 0, list: 0, remove: 0, errors: 0 };
364
-
365
- try {
366
- // Create temp workspace directories
367
- const workspacePaths: string[] = [];
368
- for (let i = 0; i < 5; i++) {
369
- const wsDir = createTempDir('test-workspace-');
370
- this.tempDirs.push(wsDir);
371
- workspacePaths.push(wsDir);
372
- }
373
-
374
- // Add workspaces
375
- const addedIds: string[] = [];
376
- for (const wsPath of workspacePaths) {
377
- try {
378
- const resp = await httpRequest('POST', `${this.baseUrl}/workspaces`, {
379
- path: wsPath,
380
- name: `Test-${path.basename(wsPath)}`,
381
- });
382
- if (resp.status === 200 || resp.status === 201) {
383
- operations.add++;
384
- const body = resp.body as any;
385
- if (body?.id) addedIds.push(body.id);
386
- } else {
387
- operations.errors++;
388
- }
389
- } catch {
390
- operations.errors++;
391
- }
392
- }
393
-
394
- // List workspaces
395
- for (let i = 0; i < 10; i++) {
396
- try {
397
- const resp = await httpRequest('GET', `${this.baseUrl}/workspaces`);
398
- if (resp.status === 200) {
399
- operations.list++;
400
- } else {
401
- operations.errors++;
402
- }
403
- } catch {
404
- operations.errors++;
405
- }
406
- }
407
-
408
- // Remove workspaces
409
- for (const id of addedIds) {
410
- try {
411
- const resp = await httpRequest('DELETE', `${this.baseUrl}/workspaces/${id}`);
412
- if (resp.status === 200 || resp.status === 204) {
413
- operations.remove++;
414
- } else {
415
- operations.errors++;
416
- }
417
- } catch {
418
- operations.errors++;
419
- }
420
- }
421
-
422
- passed =
423
- operations.add >= 4 &&
424
- operations.list >= 8 &&
425
- operations.remove >= 4 &&
426
- operations.errors <= 3;
427
- } catch (err: any) {
428
- this.results.httpApiWorkspaces = {
429
- passed: false,
430
- elapsed_ms: Math.round(performance.now() - start),
431
- details: operations,
432
- error: err.message,
433
- };
434
- this.failures++;
435
- log(` FAILED: ${err.message}\n`);
436
- return;
437
- }
438
-
439
- this.results.httpApiWorkspaces = {
440
- passed,
441
- elapsed_ms: Math.round(performance.now() - start),
442
- details: operations,
443
- };
444
-
445
- if (!passed) this.failures++;
446
- log(` Add: ${operations.add}, List: ${operations.list}, Remove: ${operations.remove}, Errors: ${operations.errors}`);
447
- log(` PASSED: ${passed}\n`);
448
- }
449
-
450
- // ==========================================================================
451
- // Test: HTTP API Concurrent Requests
452
- // ==========================================================================
453
-
454
- async testHttpApiConcurrent(): Promise<void> {
455
- log('=== Test: HTTP API Concurrent Requests ===');
456
- const start = performance.now();
457
-
458
- let passed = false;
459
- let successCount = 0;
460
- let errorCount = 0;
461
-
462
- try {
463
- const requestCount = CONFIG.httpRequestCount;
464
- const batchSize = CONFIG.concurrentHttpClients;
465
-
466
- // Fire requests in batches
467
- for (let batch = 0; batch < requestCount / batchSize; batch++) {
468
- const promises: Promise<void>[] = [];
469
-
470
- for (let i = 0; i < batchSize; i++) {
471
- promises.push(
472
- httpRequest('GET', `${this.baseUrl}/workspaces`)
473
- .then((resp) => {
474
- if (resp.status === 200) successCount++;
475
- else errorCount++;
476
- })
477
- .catch(() => {
478
- errorCount++;
479
- })
480
- );
481
- }
482
-
483
- await Promise.all(promises);
484
- }
485
-
486
- const successRate = successCount / requestCount;
487
- passed = successRate >= 0.9; // 90% success rate
488
- } catch (err: any) {
489
- this.results.httpApiConcurrent = {
490
- passed: false,
491
- elapsed_ms: Math.round(performance.now() - start),
492
- details: {},
493
- error: err.message,
494
- };
495
- this.failures++;
496
- log(` FAILED: ${err.message}\n`);
497
- return;
498
- }
499
-
500
- const elapsed = performance.now() - start;
501
- this.results.httpApiConcurrent = {
502
- passed,
503
- elapsed_ms: Math.round(elapsed),
504
- details: {
505
- total_requests: CONFIG.httpRequestCount,
506
- success_count: successCount,
507
- error_count: errorCount,
508
- success_rate: successCount / CONFIG.httpRequestCount,
509
- requests_per_second: Math.round(CONFIG.httpRequestCount / (elapsed / 1000)),
510
- },
511
- };
512
-
513
- if (!passed) this.failures++;
514
- log(` Success: ${successCount}/${CONFIG.httpRequestCount} (${Math.round((successCount / CONFIG.httpRequestCount) * 100)}%)`);
515
- log(` Rate: ${Math.round(CONFIG.httpRequestCount / (elapsed / 1000))} req/sec`);
516
- log(` PASSED: ${passed}\n`);
517
- }
518
-
519
- // ==========================================================================
520
- // Test: WebSocket Connections
521
- // ==========================================================================
522
-
523
- async testWebSocketConnections(): Promise<void> {
524
- log('=== Test: WebSocket Connections ===');
525
- const start = performance.now();
526
-
527
- let passed = false;
528
- let connected = 0;
529
- let errors = 0;
530
- const clients: any[] = [];
531
-
532
- try {
533
- // Create multiple WebSocket connections
534
- const connectionPromises: Promise<void>[] = [];
535
-
536
- for (let i = 0; i < CONFIG.wsClientCount; i++) {
537
- connectionPromises.push(
538
- new Promise<void>((resolve) => {
539
- try {
540
- const ws = new WebSocket(this.wsUrl);
541
- const timeout = setTimeout(() => {
542
- ws.terminate();
543
- errors++;
544
- resolve();
545
- }, 3000);
546
-
547
- ws.on('open', () => {
548
- clearTimeout(timeout);
549
- connected++;
550
- clients.push(ws);
551
- resolve();
552
- });
553
-
554
- ws.on('error', () => {
555
- clearTimeout(timeout);
556
- errors++;
557
- resolve();
558
- });
559
- } catch {
560
- errors++;
561
- resolve();
562
- }
563
- })
564
- );
565
- }
566
-
567
- await Promise.all(connectionPromises);
568
-
569
- // Hold connections briefly
570
- await sleep(500);
571
-
572
- // Close all connections
573
- for (const ws of clients) {
574
- try {
575
- ws.close();
576
- } catch {
577
- // Ignore
578
- }
579
- }
580
-
581
- passed = connected >= CONFIG.wsClientCount * 0.9; // 90% connected
582
- } catch (err: any) {
583
- this.results.webSocketConnections = {
584
- passed: false,
585
- elapsed_ms: Math.round(performance.now() - start),
586
- details: {},
587
- error: err.message,
588
- };
589
- this.failures++;
590
- log(` FAILED: ${err.message}\n`);
591
- return;
592
- }
593
-
594
- this.results.webSocketConnections = {
595
- passed,
596
- elapsed_ms: Math.round(performance.now() - start),
597
- details: {
598
- target_clients: CONFIG.wsClientCount,
599
- connected: connected,
600
- errors: errors,
601
- connection_rate: connected / CONFIG.wsClientCount,
602
- },
603
- };
604
-
605
- if (!passed) this.failures++;
606
- log(` Connected: ${connected}/${CONFIG.wsClientCount}, Errors: ${errors}`);
607
- log(` PASSED: ${passed}\n`);
608
- }
609
-
610
- // ==========================================================================
611
- // Test: WebSocket Message Flood
612
- // ==========================================================================
613
-
614
- async testWebSocketMessageFlood(): Promise<void> {
615
- log('=== Test: WebSocket Message Flood ===');
616
- const start = performance.now();
617
-
618
- let passed = false;
619
- let totalSent = 0;
620
- let totalReceived = 0;
621
-
622
- try {
623
- const clients: any[] = [];
624
- const messagePromises: Promise<{ sent: number; received: number }>[] = [];
625
-
626
- // Create clients
627
- for (let i = 0; i < CONFIG.wsClientCount; i++) {
628
- const ws = await new Promise<any>((resolve, reject) => {
629
- const client = new WebSocket(this.wsUrl);
630
- const timeout = setTimeout(() => {
631
- client.terminate();
632
- reject(new Error('Connection timeout'));
633
- }, 3000);
634
-
635
- client.on('open', () => {
636
- clearTimeout(timeout);
637
- resolve(client);
638
- });
639
-
640
- client.on('error', (err: Error) => {
641
- clearTimeout(timeout);
642
- reject(err);
643
- });
644
- }).catch(() => null);
645
-
646
- if (ws) clients.push(ws);
647
- }
648
-
649
- if (clients.length === 0) {
650
- throw new Error('No WebSocket clients connected');
651
- }
652
-
653
- // Send messages from each client
654
- for (const ws of clients) {
655
- messagePromises.push(
656
- new Promise((resolve) => {
657
- let sent = 0;
658
- let received = 0;
659
-
660
- const messageHandler = () => {
661
- received++;
662
- };
663
-
664
- ws.on('message', messageHandler);
665
-
666
- // Send messages
667
- for (let i = 0; i < CONFIG.wsMessagesPerClient; i++) {
668
- if (ws.readyState === WebSocket.OPEN) {
669
- ws.send(JSON.stringify({ type: 'ping', seq: i, timestamp: Date.now() }));
670
- sent++;
671
- }
672
- }
673
-
674
- // Wait for responses
675
- setTimeout(() => {
676
- ws.removeListener('message', messageHandler);
677
- resolve({ sent, received });
678
- }, 2000);
679
- })
680
- );
681
- }
682
-
683
- const results = await Promise.all(messagePromises);
684
-
685
- for (const r of results) {
686
- totalSent += r.sent;
687
- totalReceived += r.received;
688
- }
689
-
690
- // Close clients
691
- for (const ws of clients) {
692
- try {
693
- ws.close();
694
- } catch {
695
- // Ignore
696
- }
697
- }
698
-
699
- // Success if we sent most messages (receiving depends on server echo behavior)
700
- passed = totalSent >= CONFIG.wsClientCount * CONFIG.wsMessagesPerClient * 0.9;
701
- } catch (err: any) {
702
- this.results.webSocketMessageFlood = {
703
- passed: false,
704
- elapsed_ms: Math.round(performance.now() - start),
705
- details: {},
706
- error: err.message,
707
- };
708
- this.failures++;
709
- log(` FAILED: ${err.message}\n`);
710
- return;
711
- }
712
-
713
- this.results.webSocketMessageFlood = {
714
- passed,
715
- elapsed_ms: Math.round(performance.now() - start),
716
- details: {
717
- clients: CONFIG.wsClientCount,
718
- messages_per_client: CONFIG.wsMessagesPerClient,
719
- total_sent: totalSent,
720
- total_received: totalReceived,
721
- },
722
- };
723
-
724
- if (!passed) this.failures++;
725
- log(` Sent: ${totalSent}, Received: ${totalReceived}`);
726
- log(` PASSED: ${passed}\n`);
727
- }
728
-
729
- // ==========================================================================
730
- // Test: Workspace Lifecycle
731
- // ==========================================================================
732
-
733
- async testWorkspaceLifecycle(): Promise<void> {
734
- log('=== Test: Workspace Lifecycle ===');
735
- const start = performance.now();
736
-
737
- let passed = false;
738
- const cycles = { successful: 0, failed: 0 };
739
-
740
- try {
741
- for (let i = 0; i < CONFIG.workspaceCycles; i++) {
742
- const wsDir = createTempDir('lifecycle-ws-');
743
- this.tempDirs.push(wsDir);
744
-
745
- try {
746
- // Add workspace
747
- const addResp = await httpRequest('POST', `${this.baseUrl}/workspaces`, {
748
- path: wsDir,
749
- name: `Lifecycle-${i}`,
750
- });
751
-
752
- if (addResp.status !== 200 && addResp.status !== 201) {
753
- cycles.failed++;
754
- continue;
755
- }
756
-
757
- const workspaceId = (addResp.body as any)?.id;
758
- if (!workspaceId) {
759
- cycles.failed++;
760
- continue;
761
- }
762
-
763
- // Get workspace
764
- const getResp = await httpRequest('GET', `${this.baseUrl}/workspaces/${workspaceId}`);
765
- if (getResp.status !== 200) {
766
- cycles.failed++;
767
- continue;
768
- }
769
-
770
- // Switch to workspace (activates daemon)
771
- await httpRequest('POST', `${this.baseUrl}/workspaces/${workspaceId}/switch`);
772
-
773
- // Wait for daemon to start
774
- await sleep(200);
775
-
776
- // Get active workspace
777
- await httpRequest('GET', `${this.baseUrl}/workspaces/active`);
778
-
779
- // Remove workspace (stops daemon)
780
- const removeResp = await httpRequest('DELETE', `${this.baseUrl}/workspaces/${workspaceId}`);
781
- if (removeResp.status !== 200 && removeResp.status !== 204) {
782
- cycles.failed++;
783
- continue;
784
- }
785
-
786
- cycles.successful++;
787
- } catch {
788
- cycles.failed++;
789
- }
790
- }
791
-
792
- passed = cycles.successful >= CONFIG.workspaceCycles * 0.8;
793
- } catch (err: any) {
794
- this.results.workspaceLifecycle = {
795
- passed: false,
796
- elapsed_ms: Math.round(performance.now() - start),
797
- details: cycles,
798
- error: err.message,
799
- };
800
- this.failures++;
801
- log(` FAILED: ${err.message}\n`);
802
- return;
803
- }
804
-
805
- this.results.workspaceLifecycle = {
806
- passed,
807
- elapsed_ms: Math.round(performance.now() - start),
808
- details: {
809
- total_cycles: CONFIG.workspaceCycles,
810
- successful: cycles.successful,
811
- failed: cycles.failed,
812
- success_rate: cycles.successful / CONFIG.workspaceCycles,
813
- },
814
- };
815
-
816
- if (!passed) this.failures++;
817
- log(` Successful: ${cycles.successful}/${CONFIG.workspaceCycles}`);
818
- log(` PASSED: ${passed}\n`);
819
- }
820
-
821
- // ==========================================================================
822
- // Test: Health Monitoring API
823
- // ==========================================================================
824
-
825
- async testHealthMonitoringApi(): Promise<void> {
826
- log('=== Test: Health Monitoring API ===');
827
- const start = performance.now();
828
-
829
- let passed = false;
830
- let successCount = 0;
831
- let errorCount = 0;
832
-
833
- try {
834
- // Rapid root status endpoint hits (returns JSON with status)
835
- for (let i = 0; i < CONFIG.healthCheckIterations; i++) {
836
- try {
837
- const resp = await httpRequest('GET', `${this.baseUrl}/`);
838
- if (resp.status === 200) {
839
- const body = resp.body as any;
840
- // Verify status response structure
841
- if (body?.status === 'ok' || typeof body?.workspaces !== 'undefined') {
842
- successCount++;
843
- } else {
844
- errorCount++;
845
- }
846
- } else {
847
- errorCount++;
848
- }
849
- } catch {
850
- errorCount++;
851
- }
852
- }
853
-
854
- passed = successCount >= CONFIG.healthCheckIterations * 0.95;
855
- } catch (err: any) {
856
- this.results.healthMonitoringApi = {
857
- passed: false,
858
- elapsed_ms: Math.round(performance.now() - start),
859
- details: {},
860
- error: err.message,
861
- };
862
- this.failures++;
863
- log(` FAILED: ${err.message}\n`);
864
- return;
865
- }
866
-
867
- const elapsed = performance.now() - start;
868
- this.results.healthMonitoringApi = {
869
- passed,
870
- elapsed_ms: Math.round(elapsed),
871
- details: {
872
- total_checks: CONFIG.healthCheckIterations,
873
- success_count: successCount,
874
- error_count: errorCount,
875
- checks_per_second: Math.round(CONFIG.healthCheckIterations / (elapsed / 1000)),
876
- },
877
- };
878
-
879
- if (!passed) this.failures++;
880
- log(` Success: ${successCount}/${CONFIG.healthCheckIterations}`);
881
- log(` Rate: ${Math.round(CONFIG.healthCheckIterations / (elapsed / 1000))} checks/sec`);
882
- log(` PASSED: ${passed}\n`);
883
- }
884
-
885
- // ==========================================================================
886
- // Test: Relay Ledger Stress
887
- // ==========================================================================
888
-
889
- async testRelayLedger(): Promise<void> {
890
- log('=== Test: Relay Ledger Stress ===');
891
- const start = performance.now();
892
-
893
- let passed = false;
894
- const operations = { register: 0, claim: 0, complete: 0, errors: 0 };
895
-
896
- try {
897
- // Import relay ledger
898
- const { RelayLedger } = await import('../packages/daemon/dist/relay-ledger.js');
899
-
900
- // Create test ledger
901
- const ledgerDir = createTempDir('ledger-stress-');
902
- this.tempDirs.push(ledgerDir);
903
-
904
- const dbPath = path.join(ledgerDir, 'test-ledger.sqlite');
905
- const ledger = new RelayLedger({ dbPath });
906
-
907
- const fileIds: string[] = [];
908
-
909
- // Register files (registerFile returns fileId string)
910
- for (let i = 0; i < CONFIG.ledgerFileCount; i++) {
911
- const filePath = path.join(ledgerDir, `test-file-${i}.txt`);
912
- const content = `Test content ${i}`;
913
- fs.writeFileSync(filePath, content);
914
-
915
- try {
916
- // registerFile returns the fileId string directly
917
- const fileId = ledger.registerFile(
918
- filePath,
919
- `agent-${i % 5}`,
920
- 'message',
921
- content.length
922
- );
923
- if (fileId) {
924
- fileIds.push(fileId);
925
- operations.register++;
926
- }
927
- } catch {
928
- operations.errors++;
929
- }
930
- }
931
-
932
- // Claim files (must be done after registration)
933
- for (const fileId of fileIds) {
934
- try {
935
- const result = ledger.claimFile(fileId);
936
- if (result.success) {
937
- operations.claim++;
938
- }
939
- } catch {
940
- operations.errors++;
941
- }
942
- }
943
-
944
- // Mark delivered (must be done after claiming)
945
- for (const fileId of fileIds) {
946
- try {
947
- ledger.markDelivered(fileId);
948
- operations.complete++;
949
- } catch {
950
- operations.errors++;
951
- }
952
- }
953
-
954
-
955
- // Cleanup
956
- ledger.close();
957
-
958
- passed =
959
- operations.register >= CONFIG.ledgerFileCount * 0.9 &&
960
- operations.claim >= CONFIG.ledgerFileCount * 0.9 &&
961
- operations.complete >= CONFIG.ledgerFileCount * 0.9;
962
- } catch (err: any) {
963
- this.results.relayLedger = {
964
- passed: false,
965
- elapsed_ms: Math.round(performance.now() - start),
966
- details: operations,
967
- error: err.message,
968
- };
969
- this.failures++;
970
- log(` FAILED: ${err.message}\n`);
971
- return;
972
- }
973
-
974
- this.results.relayLedger = {
975
- passed,
976
- elapsed_ms: Math.round(performance.now() - start),
977
- details: {
978
- file_count: CONFIG.ledgerFileCount,
979
- ...operations,
980
- },
981
- };
982
-
983
- if (!passed) this.failures++;
984
- log(` Register: ${operations.register}, Claim: ${operations.claim}, Complete: ${operations.complete}`);
985
- log(` Errors: ${operations.errors}`);
986
- log(` PASSED: ${passed}\n`);
987
- }
988
-
989
- // ==========================================================================
990
- // Test: Ledger Concurrent Claims (race-proofing)
991
- // ==========================================================================
992
-
993
- async testLedgerConcurrentClaims(): Promise<void> {
994
- log('=== Test: Ledger Concurrent Claims ===');
995
- const start = performance.now();
996
-
997
- let passed = false;
998
- const operations = {
999
- files: 0,
1000
- workers: 0,
1001
- claimed: 0,
1002
- duplicates: 0,
1003
- missed: 0,
1004
- errors: 0,
1005
- };
1006
-
1007
- try {
1008
- const { RelayLedger } = await import('../packages/daemon/dist/relay-ledger.js');
1009
- const ledgerDir = createTempDir('ledger-race-');
1010
- this.tempDirs.push(ledgerDir);
1011
-
1012
- const dbPath = path.join(ledgerDir, 'ledger-race.sqlite');
1013
- const fileCount = Math.min(CONFIG.ledgerFileCount, 30);
1014
- const workerCount = Math.min(CONFIG.ledgerConcurrentOps, 8);
1015
- operations.files = fileCount;
1016
- operations.workers = workerCount;
1017
-
1018
- // Register files with a single coordinator ledger
1019
- const coordinator = new RelayLedger({ dbPath });
1020
- const fileIds: string[] = [];
1021
-
1022
- for (let i = 0; i < fileCount; i++) {
1023
- const filePath = path.join(ledgerDir, `race-file-${i}.txt`);
1024
- const content = `Race content ${i}`;
1025
- fs.writeFileSync(filePath, content);
1026
- const stats = fs.statSync(filePath);
1027
- const fileId = coordinator.registerFile(
1028
- fs.realpathSync(filePath),
1029
- `agent-${i % 3}`,
1030
- 'message',
1031
- stats.size,
1032
- null,
1033
- stats.mtimeMs * 1e6,
1034
- (stats as any).ino
1035
- );
1036
- fileIds.push(fileId);
1037
- }
1038
- coordinator.close();
1039
-
1040
- // Use file:// URL for dynamic import in worker
1041
- const ledgerPath = 'file://' + path.resolve(process.cwd(), 'packages/daemon/dist/relay-ledger.js');
1042
- // Worker code uses dynamic import() since relay-ledger.js is an ES module
1043
- const workerCode = `
1044
- const { parentPort, workerData } = require('worker_threads');
1045
-
1046
- (async () => {
1047
- const { RelayLedger } = await import(workerData.ledgerPath);
1048
-
1049
- const ledger = new RelayLedger({ dbPath: workerData.dbPath });
1050
- const claimed = [];
1051
-
1052
- for (const id of workerData.fileIds) {
1053
- // small jitter to increase contention
1054
- Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, Math.floor(Math.random() * 5));
1055
- const res = ledger.claimFile(id);
1056
- if (res.success) {
1057
- claimed.push(res.record.fileId);
1058
- }
1059
- }
1060
-
1061
- ledger.close();
1062
- parentPort.postMessage({ claimed });
1063
- })().catch(err => {
1064
- parentPort.postMessage({ claimed: [], error: err.message });
1065
- });
1066
- `;
1067
-
1068
- const workerPromises: Array<Promise<{ claimed: string[] }>> = [];
1069
- for (let i = 0; i < workerCount; i++) {
1070
- workerPromises.push(
1071
- new Promise((resolve, reject) => {
1072
- const worker = new Worker(workerCode, {
1073
- eval: true,
1074
- workerData: { ledgerPath, dbPath, fileIds },
1075
- });
1076
-
1077
- worker.on('message', (msg) => resolve(msg));
1078
- worker.on('error', (err) => reject(err));
1079
- worker.on('exit', (code) => {
1080
- if (code !== 0) {
1081
- reject(new Error(`Worker exited with code ${code}`));
1082
- }
1083
- });
1084
- })
1085
- );
1086
- }
1087
-
1088
- const workerResults = await Promise.all(workerPromises);
1089
-
1090
- // Check for worker errors
1091
- for (const result of workerResults) {
1092
- if ((result as any).error) {
1093
- throw new Error(`Worker error: ${(result as any).error}`);
1094
- }
1095
- }
1096
-
1097
- const allClaims = workerResults.flatMap((r) => r.claimed);
1098
- const uniqueClaims = new Set(allClaims);
1099
- operations.claimed = uniqueClaims.size;
1100
- operations.duplicates = allClaims.length - uniqueClaims.size;
1101
- operations.missed = fileIds.length - uniqueClaims.size;
1102
-
1103
- passed =
1104
- operations.duplicates === 0 &&
1105
- operations.missed === 0 &&
1106
- operations.claimed === fileIds.length;
1107
- } catch (err: any) {
1108
- this.results.ledgerConcurrentClaims = {
1109
- passed: false,
1110
- elapsed_ms: Math.round(performance.now() - start),
1111
- details: operations,
1112
- error: err.message,
1113
- };
1114
- this.failures++;
1115
- log(` FAILED: ${err.message}\n`);
1116
- return;
1117
- }
1118
-
1119
- this.results.ledgerConcurrentClaims = {
1120
- passed,
1121
- elapsed_ms: Math.round(performance.now() - start),
1122
- details: operations,
1123
- };
1124
-
1125
- if (!passed) this.failures++;
1126
- log(` Workers: ${operations.workers}, Files: ${operations.files}, Claimed: ${operations.claimed}`);
1127
- log(` Duplicates: ${operations.duplicates}, Missed: ${operations.missed}`);
1128
- log(` PASSED: ${passed}\n`);
1129
- }
1130
-
1131
- // ==========================================================================
1132
- // Test: Ledger Crash Recovery
1133
- // ==========================================================================
1134
-
1135
- async testLedgerCrashRecovery(): Promise<void> {
1136
- log('=== Test: Ledger Crash Recovery ===');
1137
- const start = performance.now();
1138
-
1139
- let passed = false;
1140
- const details: Record<string, unknown> = {};
1141
-
1142
- try {
1143
- const { RelayLedger } = await import('../packages/daemon/dist/relay-ledger.js');
1144
- const ledgerDir = createTempDir('ledger-crash-');
1145
- this.tempDirs.push(ledgerDir);
1146
-
1147
- const dbPath = path.join(ledgerDir, 'ledger-crash.sqlite');
1148
-
1149
- // Seed a file and move it to processing to mimic an in-flight crash
1150
- const seedLedger = new RelayLedger({ dbPath });
1151
- const filePath = path.join(ledgerDir, 'processing-file.txt');
1152
- fs.writeFileSync(filePath, 'processing content');
1153
- const stats = fs.statSync(filePath);
1154
- const fileId = seedLedger.registerFile(
1155
- fs.realpathSync(filePath),
1156
- 'crash-agent',
1157
- 'message',
1158
- stats.size,
1159
- null,
1160
- stats.mtimeMs * 1e6,
1161
- (stats as any).ino
1162
- );
1163
- const claimResult = seedLedger.claimFile(fileId);
1164
- details.seedClaimed = claimResult.success;
1165
- seedLedger.close();
1166
-
1167
- // New ledger instance simulating restart
1168
- const recoveryLedger = new RelayLedger({ dbPath });
1169
- const resetCount = recoveryLedger.resetProcessingFiles();
1170
- const recordAfterReset = recoveryLedger.getById(fileId);
1171
-
1172
- details.resetCount = resetCount;
1173
- details.statusAfterReset = recordAfterReset?.status;
1174
-
1175
- const claimAfterReset = recoveryLedger.claimFile(fileId);
1176
- details.claimAfterReset = claimAfterReset.success;
1177
- recoveryLedger.close();
1178
-
1179
- passed =
1180
- resetCount === 1 &&
1181
- recordAfterReset?.status === 'pending' &&
1182
- claimAfterReset.success;
1183
- } catch (err: any) {
1184
- this.results.ledgerCrashRecovery = {
1185
- passed: false,
1186
- elapsed_ms: Math.round(performance.now() - start),
1187
- details,
1188
- error: err.message,
1189
- };
1190
- this.failures++;
1191
- log(` FAILED: ${err.message}\n`);
1192
- return;
1193
- }
1194
-
1195
- this.results.ledgerCrashRecovery = {
1196
- passed,
1197
- elapsed_ms: Math.round(performance.now() - start),
1198
- details,
1199
- };
1200
-
1201
- if (!passed) this.failures++;
1202
- log(` Reset count: ${details.resetCount}, Status after reset: ${details.statusAfterReset}`);
1203
- log(` Claim after reset success: ${details.claimAfterReset}`);
1204
- log(` PASSED: ${passed}\n`);
1205
- }
1206
-
1207
- // ==========================================================================
1208
- // Test: Agent Health Crash Detection
1209
- // ==========================================================================
1210
-
1211
- async testAgentHealthCrashDetection(): Promise<void> {
1212
- log('=== Test: Agent Health Crash Detection ===');
1213
- const start = performance.now();
1214
-
1215
- let passed = false;
1216
- const details: Record<string, unknown> = {};
1217
-
1218
- if (!this.orchestrator) {
1219
- this.results.agentHealthCrashDetection = {
1220
- passed: false,
1221
- elapsed_ms: Math.round(performance.now() - start),
1222
- details,
1223
- error: 'Orchestrator not initialized',
1224
- };
1225
- this.failures++;
1226
- log(' FAILED: orchestrator not initialized\n');
1227
- return;
1228
- }
1229
-
1230
- try {
1231
- const orch: any = this.orchestrator;
1232
- const agentName = `crash-agent-${Date.now()}`;
1233
- const workspaceId = 'stress-health-ws';
1234
-
1235
- // Capture broadcasted events to confirm crash notification
1236
- const broadcasted: any[] = [];
1237
- const originalBroadcast = orch.broadcastEvent?.bind(orch);
1238
- orch.broadcastEvent = (evt: any) => {
1239
- broadcasted.push(evt);
1240
- if (originalBroadcast) return originalBroadcast(evt);
1241
- };
1242
-
1243
- // Spawn a short-lived process and register for health monitoring
1244
- const child = spawn(process.execPath, ['-e', 'setTimeout(()=>{}, 5000);'], {
1245
- stdio: 'ignore',
1246
- });
1247
- details.childPid = child.pid;
1248
-
1249
- if (orch.registerAgentHealth) {
1250
- orch.registerAgentHealth(workspaceId, agentName, child.pid);
1251
- } else {
1252
- throw new Error('registerAgentHealth not available');
1253
- }
1254
-
1255
- // Kill the process to simulate crash
1256
- child.kill('SIGKILL');
1257
- await sleep(300);
1258
-
1259
- if (orch.checkAgentHeartbeats) {
1260
- orch.checkAgentHeartbeats();
1261
- } else {
1262
- throw new Error('checkAgentHeartbeats not available');
1263
- }
1264
-
1265
- // Allow async handlers to run
1266
- await sleep(300);
1267
-
1268
- passed = broadcasted.some(
1269
- (evt) => evt?.type === 'agent:crashed' && evt?.data?.name === agentName
1270
- );
1271
- details.broadcastCount = broadcasted.length;
1272
- details.crashEventDetected = passed;
1273
- } catch (err: any) {
1274
- this.results.agentHealthCrashDetection = {
1275
- passed: false,
1276
- elapsed_ms: Math.round(performance.now() - start),
1277
- details,
1278
- error: err.message,
1279
- };
1280
- this.failures++;
1281
- log(` FAILED: ${err.message}\n`);
1282
- return;
1283
- }
1284
-
1285
- this.results.agentHealthCrashDetection = {
1286
- passed,
1287
- elapsed_ms: Math.round(performance.now() - start),
1288
- details,
1289
- };
1290
-
1291
- if (!passed) this.failures++;
1292
- log(` Crash event detected: ${passed}, Broadcasts: ${details.broadcastCount}`);
1293
- log(` PASSED: ${passed}\n`);
1294
- }
1295
- }
1296
-
1297
- // ============================================================================
1298
- // Main
1299
- // ============================================================================
1300
-
1301
- async function main(): Promise<void> {
1302
- const test = new IntegrationStressTest();
1303
-
1304
- let results: AllResults;
1305
-
1306
- try {
1307
- await test.setup();
1308
- results = await test.runAll();
1309
- } catch (err: any) {
1310
- log(`\nFATAL ERROR: ${err.message}`);
1311
- results = {
1312
- passed: false,
1313
- failures: 1,
1314
- tests: {},
1315
- summary: {
1316
- total_tests: 0,
1317
- passed_tests: 0,
1318
- failed_tests: 1,
1319
- total_time_ms: 0,
1320
- },
1321
- };
1322
- } finally {
1323
- await test.teardown();
1324
- }
1325
-
1326
- // Output results
1327
- const jsonOutput = JSON.stringify(results, null, 2);
1328
-
1329
- if (OUTPUT_FILE) {
1330
- // Write directly to file to avoid stdout pollution from Orchestrator logs
1331
- fs.writeFileSync(OUTPUT_FILE, jsonOutput);
1332
- log(`\nResults written to ${OUTPUT_FILE}`);
1333
- } else if (JSON_OUTPUT) {
1334
- console.log(jsonOutput);
1335
- } else {
1336
- log('\n=== Summary ===');
1337
- log(`Overall: ${results.passed ? 'PASSED' : 'FAILED'}`);
1338
- log(`Tests: ${results.summary.passed_tests}/${results.summary.total_tests} passed`);
1339
- log(`Time: ${results.summary.total_time_ms}ms`);
1340
- log('\nDetailed Results:');
1341
- console.log(jsonOutput);
1342
- }
1343
-
1344
- process.exit(results.passed ? 0 : 1);
1345
- }
1346
-
1347
- main().catch((err) => {
1348
- console.error('Fatal error:', err);
1349
- // Ensure we write a valid JSON error result to the output file
1350
- if (OUTPUT_FILE) {
1351
- const errorResult = {
1352
- passed: false,
1353
- failures: 1,
1354
- tests: {},
1355
- summary: {
1356
- total_tests: 0,
1357
- passed_tests: 0,
1358
- failed_tests: 1,
1359
- total_time_ms: 0,
1360
- },
1361
- error: err?.message || String(err),
1362
- };
1363
- fs.writeFileSync(OUTPUT_FILE, JSON.stringify(errorResult, null, 2));
1364
- }
1365
- process.exit(1);
1366
- });