agent-relay 2.0.29 → 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 +10 -2
  151. package/packages/bridge/dist/spawner.js.map +1 -0
  152. package/packages/bridge/dist/types.d.ts.map +1 -0
  153. package/packages/bridge/dist/types.js.map +1 -0
  154. package/packages/bridge/dist/utils.d.ts.map +1 -0
  155. package/packages/bridge/dist/utils.js.map +1 -0
  156. package/packages/bridge/package.json +8 -8
  157. package/packages/bridge/src/index.ts +25 -0
  158. package/packages/bridge/src/multi-project-client.test.ts +340 -0
  159. package/packages/bridge/src/multi-project-client.ts +469 -0
  160. package/packages/bridge/src/shadow-cli.ts +95 -0
  161. package/packages/bridge/src/spawner-mcp.test.ts +505 -0
  162. package/packages/bridge/src/spawner.ts +1724 -0
  163. package/packages/bridge/src/types.ts +145 -0
  164. package/packages/bridge/src/utils.test.ts +98 -0
  165. package/packages/bridge/src/utils.ts +67 -0
  166. package/packages/bridge/tsconfig.json +29 -0
  167. package/packages/bridge/vitest.config.ts +9 -0
  168. package/packages/cli-tester/dist/index.d.ts.map +1 -0
  169. package/packages/cli-tester/dist/index.js.map +1 -0
  170. package/packages/cli-tester/dist/utils/credential-check.d.ts.map +1 -0
  171. package/packages/cli-tester/dist/utils/credential-check.js.map +1 -0
  172. package/packages/cli-tester/dist/utils/socket-client.d.ts.map +1 -0
  173. package/packages/cli-tester/dist/utils/socket-client.js.map +1 -0
  174. package/packages/cli-tester/docker/Dockerfile +61 -0
  175. package/packages/cli-tester/docker/docker-compose.yml +71 -0
  176. package/packages/cli-tester/package.json +1 -1
  177. package/packages/cli-tester/src/index.ts +40 -0
  178. package/packages/cli-tester/src/utils/credential-check.ts +284 -0
  179. package/packages/cli-tester/src/utils/socket-client.ts +211 -0
  180. package/packages/cli-tester/tests/credential-check.test.ts +56 -0
  181. package/packages/cli-tester/tsconfig.json +11 -0
  182. package/packages/config/dist/agent-config.d.ts.map +1 -0
  183. package/packages/config/dist/agent-config.js.map +1 -0
  184. package/packages/config/dist/bridge-config.d.ts.map +1 -0
  185. package/packages/config/dist/bridge-config.js.map +1 -0
  186. package/packages/config/dist/bridge-utils.d.ts.map +1 -0
  187. package/packages/config/dist/bridge-utils.js.map +1 -0
  188. package/packages/config/dist/cli-auth-config.d.ts.map +1 -0
  189. package/packages/config/dist/cli-auth-config.js.map +1 -0
  190. package/packages/config/dist/cloud-config.d.ts.map +1 -0
  191. package/packages/config/dist/cloud-config.js.map +1 -0
  192. package/packages/config/dist/index.d.ts.map +1 -0
  193. package/packages/config/dist/index.js.map +1 -0
  194. package/packages/config/dist/project-namespace.d.ts.map +1 -0
  195. package/packages/config/dist/project-namespace.js.map +1 -0
  196. package/packages/config/dist/relay-config.d.ts.map +1 -0
  197. package/packages/config/dist/relay-config.js.map +1 -0
  198. package/packages/config/dist/relay-file-writer.d.ts.map +1 -0
  199. package/packages/config/dist/relay-file-writer.js.map +1 -0
  200. package/packages/config/dist/schemas.d.ts.map +1 -0
  201. package/packages/config/dist/schemas.js.map +1 -0
  202. package/packages/config/dist/shadow-config.d.ts.map +1 -0
  203. package/packages/config/dist/shadow-config.js.map +1 -0
  204. package/packages/config/dist/teams-config.d.ts.map +1 -0
  205. package/packages/config/dist/teams-config.js.map +1 -0
  206. package/packages/config/dist/trajectory-config.d.ts.map +1 -0
  207. package/packages/config/dist/trajectory-config.js.map +1 -0
  208. package/packages/config/package.json +2 -2
  209. package/packages/config/src/agent-config.test.ts +245 -0
  210. package/packages/config/src/agent-config.ts +160 -0
  211. package/packages/config/src/bridge-config.test.ts +132 -0
  212. package/packages/config/src/bridge-config.ts +189 -0
  213. package/packages/config/src/bridge-utils.ts +59 -0
  214. package/packages/config/src/cli-auth-config.ts +548 -0
  215. package/packages/config/src/cloud-config.ts +208 -0
  216. package/packages/config/src/index.ts +12 -0
  217. package/packages/config/src/project-namespace.ts +344 -0
  218. package/packages/config/src/relay-config.test.ts +51 -0
  219. package/packages/config/src/relay-config.ts +36 -0
  220. package/packages/config/src/relay-file-writer.test.ts +351 -0
  221. package/packages/config/src/relay-file-writer.ts +508 -0
  222. package/packages/config/src/schemas.test.ts +59 -0
  223. package/packages/config/src/schemas.ts +201 -0
  224. package/packages/config/src/shadow-config.ts +205 -0
  225. package/packages/config/src/teams-config.ts +135 -0
  226. package/packages/config/src/trajectory-config.ts +222 -0
  227. package/packages/config/tsconfig.json +21 -0
  228. package/packages/config/vitest.config.ts +9 -0
  229. package/packages/continuity/dist/formatter.d.ts.map +1 -0
  230. package/packages/continuity/dist/formatter.js.map +1 -0
  231. package/packages/continuity/dist/handoff-store.d.ts.map +1 -0
  232. package/packages/continuity/dist/handoff-store.js.map +1 -0
  233. package/packages/continuity/dist/index.d.ts.map +1 -0
  234. package/packages/continuity/dist/index.js.map +1 -0
  235. package/packages/continuity/dist/ledger-store.d.ts.map +1 -0
  236. package/packages/continuity/dist/ledger-store.js.map +1 -0
  237. package/packages/continuity/dist/manager.d.ts.map +1 -0
  238. package/packages/continuity/dist/manager.js.map +1 -0
  239. package/packages/continuity/dist/parser.d.ts.map +1 -0
  240. package/packages/continuity/dist/parser.js.map +1 -0
  241. package/packages/continuity/dist/types.d.ts.map +1 -0
  242. package/packages/continuity/dist/types.js.map +1 -0
  243. package/packages/continuity/package.json +1 -1
  244. package/packages/continuity/src/formatter.ts +371 -0
  245. package/packages/continuity/src/handoff-store.ts +523 -0
  246. package/packages/continuity/src/index.ts +9 -0
  247. package/packages/continuity/src/ledger-store.ts +594 -0
  248. package/packages/continuity/src/manager.test.ts +291 -0
  249. package/packages/continuity/src/manager.ts +774 -0
  250. package/packages/continuity/src/parser.test.ts +292 -0
  251. package/packages/continuity/src/parser.ts +680 -0
  252. package/packages/continuity/src/types.ts +211 -0
  253. package/packages/continuity/tsconfig.json +21 -0
  254. package/packages/continuity/vitest.config.ts +9 -0
  255. package/packages/daemon/dist/agent-manager.d.ts.map +1 -0
  256. package/packages/daemon/dist/agent-manager.js.map +1 -0
  257. package/packages/daemon/dist/agent-registry.d.ts.map +1 -0
  258. package/packages/daemon/dist/agent-registry.js.map +1 -0
  259. package/packages/daemon/dist/agent-signing.d.ts.map +1 -0
  260. package/packages/daemon/dist/agent-signing.js.map +1 -0
  261. package/packages/daemon/dist/api.d.ts.map +1 -0
  262. package/packages/daemon/dist/api.js.map +1 -0
  263. package/packages/daemon/dist/auth.d.ts.map +1 -0
  264. package/packages/daemon/dist/auth.js.map +1 -0
  265. package/packages/daemon/dist/channel-membership-store.d.ts.map +1 -0
  266. package/packages/daemon/dist/channel-membership-store.js.map +1 -0
  267. package/packages/daemon/dist/cli-auth.d.ts.map +1 -0
  268. package/packages/daemon/dist/cli-auth.js.map +1 -0
  269. package/packages/daemon/dist/cloud-sync.d.ts.map +1 -0
  270. package/packages/daemon/dist/cloud-sync.js.map +1 -0
  271. package/packages/daemon/dist/connection.d.ts.map +1 -0
  272. package/packages/daemon/dist/connection.js.map +1 -0
  273. package/packages/daemon/dist/consensus-integration.d.ts.map +1 -0
  274. package/packages/daemon/dist/consensus-integration.js.map +1 -0
  275. package/packages/daemon/dist/consensus.d.ts.map +1 -0
  276. package/packages/daemon/dist/consensus.js.map +1 -0
  277. package/packages/daemon/dist/delivery-tracker.d.ts.map +1 -0
  278. package/packages/daemon/dist/delivery-tracker.js.map +1 -0
  279. package/packages/daemon/dist/enhanced-features.d.ts.map +1 -0
  280. package/packages/daemon/dist/enhanced-features.js.map +1 -0
  281. package/packages/daemon/dist/index.d.ts.map +1 -0
  282. package/packages/daemon/dist/index.js.map +1 -0
  283. package/packages/daemon/dist/migrations/index.d.ts.map +1 -0
  284. package/packages/daemon/dist/migrations/index.js.map +1 -0
  285. package/packages/daemon/dist/orchestrator.d.ts.map +1 -0
  286. package/packages/daemon/dist/orchestrator.js.map +1 -0
  287. package/packages/daemon/dist/rate-limiter.d.ts.map +1 -0
  288. package/packages/daemon/dist/rate-limiter.js.map +1 -0
  289. package/packages/daemon/dist/registry.d.ts.map +1 -0
  290. package/packages/daemon/dist/registry.js.map +1 -0
  291. package/packages/daemon/dist/relay-ledger.d.ts.map +1 -0
  292. package/packages/daemon/dist/relay-ledger.js.map +1 -0
  293. package/packages/daemon/dist/relay-watchdog.d.ts.map +1 -0
  294. package/packages/daemon/dist/relay-watchdog.js.map +1 -0
  295. package/packages/daemon/dist/repo-manager.d.ts.map +1 -0
  296. package/packages/daemon/dist/repo-manager.js.map +1 -0
  297. package/packages/daemon/dist/router.d.ts.map +1 -0
  298. package/packages/daemon/dist/router.js.map +1 -0
  299. package/packages/daemon/dist/server.d.ts +1 -0
  300. package/packages/daemon/dist/server.d.ts.map +1 -0
  301. package/packages/daemon/dist/server.js +46 -16
  302. package/packages/daemon/dist/server.js.map +1 -0
  303. package/packages/daemon/dist/spawn-manager.d.ts.map +1 -0
  304. package/packages/daemon/dist/spawn-manager.js.map +1 -0
  305. package/packages/daemon/dist/sync-queue.d.ts.map +1 -0
  306. package/packages/daemon/dist/sync-queue.js.map +1 -0
  307. package/packages/daemon/dist/types.d.ts.map +1 -0
  308. package/packages/daemon/dist/types.js.map +1 -0
  309. package/packages/daemon/dist/workspace-manager.d.ts.map +1 -0
  310. package/packages/daemon/dist/workspace-manager.js.map +1 -0
  311. package/packages/daemon/package.json +12 -12
  312. package/packages/daemon/src/agent-manager.ts +679 -0
  313. package/packages/daemon/src/agent-registry.ts +284 -0
  314. package/packages/daemon/src/agent-signing.ts +707 -0
  315. package/packages/daemon/src/api.ts +1012 -0
  316. package/packages/daemon/src/auth.ts +276 -0
  317. package/packages/daemon/src/channel-membership-store.ts +217 -0
  318. package/packages/daemon/src/cli-auth.ts +906 -0
  319. package/packages/daemon/src/cloud-sync.ts +902 -0
  320. package/packages/daemon/src/connection.ts +534 -0
  321. package/packages/daemon/src/consensus-integration.ts +510 -0
  322. package/packages/daemon/src/consensus.ts +848 -0
  323. package/packages/daemon/src/delivery-tracker.ts +145 -0
  324. package/packages/daemon/src/enhanced-features.ts +390 -0
  325. package/packages/daemon/src/index.ts +52 -0
  326. package/packages/daemon/src/migrations/0001_initial.sql +72 -0
  327. package/packages/daemon/src/migrations/index.test.ts +195 -0
  328. package/packages/daemon/src/migrations/index.ts +286 -0
  329. package/packages/daemon/src/orchestrator.test.ts +231 -0
  330. package/packages/daemon/src/orchestrator.ts +1376 -0
  331. package/packages/daemon/src/rate-limiter.ts +172 -0
  332. package/packages/daemon/src/registry.ts +8 -0
  333. package/packages/daemon/src/relay-ledger.test.ts +358 -0
  334. package/packages/daemon/src/relay-ledger.ts +713 -0
  335. package/packages/daemon/src/relay-watchdog.test.ts +881 -0
  336. package/packages/daemon/src/relay-watchdog.ts +785 -0
  337. package/packages/daemon/src/repo-manager.ts +468 -0
  338. package/packages/daemon/src/router.test.ts +149 -0
  339. package/packages/daemon/src/router.ts +1885 -0
  340. package/packages/daemon/src/server.ts +1871 -0
  341. package/packages/daemon/src/spawn-manager.ts +275 -0
  342. package/packages/daemon/src/sync-queue.ts +477 -0
  343. package/packages/daemon/src/types.ts +158 -0
  344. package/packages/daemon/src/workspace-manager.ts +371 -0
  345. package/packages/daemon/tsconfig.json +21 -0
  346. package/packages/hooks/dist/browser.d.ts.map +1 -0
  347. package/packages/hooks/dist/browser.js.map +1 -0
  348. package/packages/hooks/dist/emitter.d.ts.map +1 -0
  349. package/packages/hooks/dist/emitter.js.map +1 -0
  350. package/packages/hooks/dist/inbox-check/hook.d.ts.map +1 -0
  351. package/packages/hooks/dist/inbox-check/hook.js.map +1 -0
  352. package/packages/hooks/dist/inbox-check/index.d.ts.map +1 -0
  353. package/packages/hooks/dist/inbox-check/index.js.map +1 -0
  354. package/packages/hooks/dist/inbox-check/types.d.ts.map +1 -0
  355. package/packages/hooks/dist/inbox-check/types.js.map +1 -0
  356. package/packages/hooks/dist/inbox-check/utils.d.ts.map +1 -0
  357. package/packages/hooks/dist/inbox-check/utils.js.map +1 -0
  358. package/packages/hooks/dist/index.d.ts.map +1 -0
  359. package/packages/hooks/dist/index.js.map +1 -0
  360. package/packages/hooks/dist/registry.d.ts.map +1 -0
  361. package/packages/hooks/dist/registry.js.map +1 -0
  362. package/packages/hooks/dist/trajectory-hooks.d.ts.map +1 -0
  363. package/packages/hooks/dist/trajectory-hooks.js.map +1 -0
  364. package/packages/hooks/dist/types.d.ts.map +1 -0
  365. package/packages/hooks/dist/types.js.map +1 -0
  366. package/packages/hooks/package.json +4 -4
  367. package/packages/hooks/src/browser.ts +2 -0
  368. package/packages/hooks/src/emitter.ts +84 -0
  369. package/packages/hooks/src/inbox-check/hook.ts +114 -0
  370. package/packages/hooks/src/inbox-check/index.ts +8 -0
  371. package/packages/hooks/src/inbox-check/types.ts +39 -0
  372. package/packages/hooks/src/inbox-check/utils.test.ts +287 -0
  373. package/packages/hooks/src/inbox-check/utils.ts +125 -0
  374. package/packages/hooks/src/index.ts +11 -0
  375. package/packages/hooks/src/registry.ts +614 -0
  376. package/packages/hooks/src/shims.d.ts +3 -0
  377. package/packages/hooks/src/trajectory-hooks.ts +251 -0
  378. package/packages/hooks/src/types.ts +342 -0
  379. package/packages/hooks/tsconfig.json +21 -0
  380. package/packages/hooks/vitest.config.ts +9 -0
  381. package/packages/mcp/dist/bin.d.ts.map +1 -0
  382. package/packages/mcp/dist/bin.js.map +1 -0
  383. package/packages/mcp/dist/client.d.ts +9 -15
  384. package/packages/mcp/dist/client.d.ts.map +1 -0
  385. package/packages/mcp/dist/client.js +42 -74
  386. package/packages/mcp/dist/client.js.map +1 -0
  387. package/packages/mcp/dist/cloud.d.ts.map +1 -0
  388. package/packages/mcp/dist/cloud.js.map +1 -0
  389. package/packages/mcp/dist/errors.d.ts.map +1 -0
  390. package/packages/mcp/dist/errors.js.map +1 -0
  391. package/packages/mcp/dist/file-transport.d.ts.map +1 -0
  392. package/packages/mcp/dist/file-transport.js.map +1 -0
  393. package/packages/mcp/dist/hybrid-client.d.ts.map +1 -0
  394. package/packages/mcp/dist/hybrid-client.js.map +1 -0
  395. package/packages/mcp/dist/index.d.ts.map +1 -0
  396. package/packages/mcp/dist/index.js.map +1 -0
  397. package/packages/mcp/dist/install-cli.d.ts.map +1 -0
  398. package/packages/mcp/dist/install-cli.js.map +1 -0
  399. package/packages/mcp/dist/install.d.ts.map +1 -0
  400. package/packages/mcp/dist/install.js.map +1 -0
  401. package/packages/mcp/dist/prompts/index.d.ts.map +1 -0
  402. package/packages/mcp/dist/prompts/index.js.map +1 -0
  403. package/packages/mcp/dist/prompts/protocol.d.ts.map +1 -0
  404. package/packages/mcp/dist/prompts/protocol.js.map +1 -0
  405. package/packages/mcp/dist/resources/agents.d.ts.map +1 -0
  406. package/packages/mcp/dist/resources/agents.js.map +1 -0
  407. package/packages/mcp/dist/resources/inbox.d.ts.map +1 -0
  408. package/packages/mcp/dist/resources/inbox.js.map +1 -0
  409. package/packages/mcp/dist/resources/index.d.ts.map +1 -0
  410. package/packages/mcp/dist/resources/index.js.map +1 -0
  411. package/packages/mcp/dist/resources/project.d.ts.map +1 -0
  412. package/packages/mcp/dist/resources/project.js.map +1 -0
  413. package/packages/mcp/dist/server.d.ts.map +1 -0
  414. package/packages/mcp/dist/server.js.map +1 -0
  415. package/packages/mcp/dist/simple.d.ts +2 -5
  416. package/packages/mcp/dist/simple.d.ts.map +1 -0
  417. package/packages/mcp/dist/simple.js.map +1 -0
  418. package/packages/mcp/dist/tools/index.d.ts.map +1 -0
  419. package/packages/mcp/dist/tools/index.js.map +1 -0
  420. package/packages/mcp/dist/tools/relay-broadcast.d.ts.map +1 -0
  421. package/packages/mcp/dist/tools/relay-broadcast.js.map +1 -0
  422. package/packages/mcp/dist/tools/relay-channel.d.ts.map +1 -0
  423. package/packages/mcp/dist/tools/relay-channel.js.map +1 -0
  424. package/packages/mcp/dist/tools/relay-connected.d.ts.map +1 -0
  425. package/packages/mcp/dist/tools/relay-connected.js.map +1 -0
  426. package/packages/mcp/dist/tools/relay-consensus.d.ts.map +1 -0
  427. package/packages/mcp/dist/tools/relay-consensus.js.map +1 -0
  428. package/packages/mcp/dist/tools/relay-continuity.d.ts.map +1 -0
  429. package/packages/mcp/dist/tools/relay-continuity.js.map +1 -0
  430. package/packages/mcp/dist/tools/relay-health.d.ts.map +1 -0
  431. package/packages/mcp/dist/tools/relay-health.js.map +1 -0
  432. package/packages/mcp/dist/tools/relay-inbox.d.ts.map +1 -0
  433. package/packages/mcp/dist/tools/relay-inbox.js.map +1 -0
  434. package/packages/mcp/dist/tools/relay-logs.d.ts.map +1 -0
  435. package/packages/mcp/dist/tools/relay-logs.js.map +1 -0
  436. package/packages/mcp/dist/tools/relay-metrics.d.ts.map +1 -0
  437. package/packages/mcp/dist/tools/relay-metrics.js.map +1 -0
  438. package/packages/mcp/dist/tools/relay-release.d.ts.map +1 -0
  439. package/packages/mcp/dist/tools/relay-release.js.map +1 -0
  440. package/packages/mcp/dist/tools/relay-remove-agent.d.ts.map +1 -0
  441. package/packages/mcp/dist/tools/relay-remove-agent.js.map +1 -0
  442. package/packages/mcp/dist/tools/relay-send.d.ts.map +1 -0
  443. package/packages/mcp/dist/tools/relay-send.js +4 -2
  444. package/packages/mcp/dist/tools/relay-send.js.map +1 -0
  445. package/packages/mcp/dist/tools/relay-shadow.d.ts.map +1 -0
  446. package/packages/mcp/dist/tools/relay-shadow.js.map +1 -0
  447. package/packages/mcp/dist/tools/relay-spawn.d.ts.map +1 -0
  448. package/packages/mcp/dist/tools/relay-spawn.js.map +1 -0
  449. package/packages/mcp/dist/tools/relay-status.d.ts.map +1 -0
  450. package/packages/mcp/dist/tools/relay-status.js.map +1 -0
  451. package/packages/mcp/dist/tools/relay-subscribe.d.ts.map +1 -0
  452. package/packages/mcp/dist/tools/relay-subscribe.js.map +1 -0
  453. package/packages/mcp/dist/tools/relay-who.d.ts.map +1 -0
  454. package/packages/mcp/dist/tools/relay-who.js.map +1 -0
  455. package/packages/mcp/package.json +3 -3
  456. package/packages/mcp/src/bin.ts +149 -0
  457. package/packages/mcp/src/client.ts +400 -0
  458. package/packages/mcp/src/cloud.ts +523 -0
  459. package/packages/mcp/src/errors.ts +54 -0
  460. package/packages/mcp/src/file-transport.ts +268 -0
  461. package/packages/mcp/src/hybrid-client.ts +209 -0
  462. package/packages/mcp/src/index.ts +122 -0
  463. package/packages/mcp/src/install-cli.ts +210 -0
  464. package/packages/mcp/src/install.ts +745 -0
  465. package/packages/mcp/src/prompts/index.ts +1 -0
  466. package/packages/mcp/src/prompts/protocol.ts +164 -0
  467. package/packages/mcp/src/resources/agents.ts +21 -0
  468. package/packages/mcp/src/resources/inbox.ts +21 -0
  469. package/packages/mcp/src/resources/index.ts +3 -0
  470. package/packages/mcp/src/resources/project.ts +29 -0
  471. package/packages/mcp/src/server.ts +431 -0
  472. package/packages/mcp/src/simple.ts +214 -0
  473. package/packages/mcp/src/tools/index.ts +133 -0
  474. package/packages/mcp/src/tools/relay-broadcast.ts +32 -0
  475. package/packages/mcp/src/tools/relay-channel.ts +93 -0
  476. package/packages/mcp/src/tools/relay-connected.ts +52 -0
  477. package/packages/mcp/src/tools/relay-consensus.ts +92 -0
  478. package/packages/mcp/src/tools/relay-continuity.ts +127 -0
  479. package/packages/mcp/src/tools/relay-health.ts +148 -0
  480. package/packages/mcp/src/tools/relay-inbox.ts +70 -0
  481. package/packages/mcp/src/tools/relay-logs.ts +106 -0
  482. package/packages/mcp/src/tools/relay-metrics.ts +140 -0
  483. package/packages/mcp/src/tools/relay-release.ts +54 -0
  484. package/packages/mcp/src/tools/relay-remove-agent.ts +58 -0
  485. package/packages/mcp/src/tools/relay-send.ts +84 -0
  486. package/packages/mcp/src/tools/relay-shadow.ts +67 -0
  487. package/packages/mcp/src/tools/relay-spawn.ts +87 -0
  488. package/packages/mcp/src/tools/relay-status.ts +57 -0
  489. package/packages/mcp/src/tools/relay-subscribe.ts +61 -0
  490. package/packages/mcp/src/tools/relay-who.ts +59 -0
  491. package/packages/mcp/tests/client.test.ts +476 -0
  492. package/packages/mcp/tests/discover.test.ts +195 -0
  493. package/packages/mcp/tests/install.test.ts +123 -0
  494. package/packages/mcp/tests/prompts.test.ts +12 -0
  495. package/packages/mcp/tests/resources.test.ts +53 -0
  496. package/packages/mcp/tests/tools.test.ts +1242 -0
  497. package/packages/mcp/tsconfig.json +22 -0
  498. package/packages/mcp/vitest.config.ts +9 -0
  499. package/packages/memory/dist/adapters/index.d.ts.map +1 -0
  500. package/packages/memory/dist/adapters/index.js.map +1 -0
  501. package/packages/memory/dist/adapters/inmemory.d.ts.map +1 -0
  502. package/packages/memory/dist/adapters/inmemory.js.map +1 -0
  503. package/packages/memory/dist/adapters/supermemory.d.ts.map +1 -0
  504. package/packages/memory/dist/adapters/supermemory.js.map +1 -0
  505. package/packages/memory/dist/context-compaction.d.ts.map +1 -0
  506. package/packages/memory/dist/context-compaction.js.map +1 -0
  507. package/packages/memory/dist/factory.d.ts.map +1 -0
  508. package/packages/memory/dist/factory.js.map +1 -0
  509. package/packages/memory/dist/index.d.ts.map +1 -0
  510. package/packages/memory/dist/index.js.map +1 -0
  511. package/packages/memory/dist/memory-hooks.d.ts.map +1 -0
  512. package/packages/memory/dist/memory-hooks.js.map +1 -0
  513. package/packages/memory/dist/service.d.ts.map +1 -0
  514. package/packages/memory/dist/service.js.map +1 -0
  515. package/packages/memory/dist/types.d.ts.map +1 -0
  516. package/packages/memory/dist/types.js.map +1 -0
  517. package/packages/memory/package.json +2 -2
  518. package/packages/memory/src/adapters/index.ts +8 -0
  519. package/packages/memory/src/adapters/inmemory.ts +265 -0
  520. package/packages/memory/src/adapters/supermemory.ts +449 -0
  521. package/packages/memory/src/context-compaction.test.ts +660 -0
  522. package/packages/memory/src/context-compaction.ts +612 -0
  523. package/packages/memory/src/factory.ts +170 -0
  524. package/packages/memory/src/index.ts +33 -0
  525. package/packages/memory/src/memory-hooks.ts +410 -0
  526. package/packages/memory/src/service.ts +194 -0
  527. package/packages/memory/src/types.ts +211 -0
  528. package/packages/memory/tsconfig.json +21 -0
  529. package/packages/memory/vitest.config.ts +9 -0
  530. package/packages/policy/dist/agent-policy.d.ts.map +1 -0
  531. package/packages/policy/dist/agent-policy.js.map +1 -0
  532. package/packages/policy/dist/cloud-policy-fetcher.d.ts.map +1 -0
  533. package/packages/policy/dist/cloud-policy-fetcher.js.map +1 -0
  534. package/packages/policy/dist/index.d.ts.map +1 -0
  535. package/packages/policy/dist/index.js.map +1 -0
  536. package/packages/policy/package.json +2 -2
  537. package/packages/policy/src/agent-policy.ts +866 -0
  538. package/packages/policy/src/cloud-policy-fetcher.ts +78 -0
  539. package/packages/policy/src/index.ts +21 -0
  540. package/packages/policy/tsconfig.json +21 -0
  541. package/packages/policy/vitest.config.ts +9 -0
  542. package/packages/protocol/dist/channels.d.ts.map +1 -0
  543. package/packages/protocol/dist/channels.js.map +1 -0
  544. package/packages/protocol/dist/framing.d.ts.map +1 -0
  545. package/packages/protocol/dist/framing.js.map +1 -0
  546. package/packages/protocol/dist/id-generator.d.ts.map +1 -0
  547. package/packages/protocol/dist/id-generator.js.map +1 -0
  548. package/packages/protocol/dist/index.d.ts.map +1 -0
  549. package/packages/protocol/dist/index.js.map +1 -0
  550. package/packages/protocol/dist/relay-pty-schemas.d.ts +70 -2
  551. package/packages/protocol/dist/relay-pty-schemas.d.ts.map +1 -0
  552. package/packages/protocol/dist/relay-pty-schemas.js.map +1 -0
  553. package/packages/protocol/dist/types.d.ts +8 -0
  554. package/packages/protocol/dist/types.d.ts.map +1 -0
  555. package/packages/protocol/dist/types.js.map +1 -0
  556. package/packages/protocol/package.json +1 -1
  557. package/packages/protocol/src/channels.test.ts +330 -0
  558. package/packages/protocol/src/channels.ts +270 -0
  559. package/packages/protocol/src/framing.test.ts +164 -0
  560. package/packages/protocol/src/framing.ts +242 -0
  561. package/packages/protocol/src/id-generator.ts +69 -0
  562. package/packages/protocol/src/index.ts +4 -0
  563. package/packages/protocol/src/relay-pty-schemas.ts +400 -0
  564. package/packages/protocol/src/types.test.ts +271 -0
  565. package/packages/protocol/src/types.ts +846 -0
  566. package/packages/protocol/tsconfig.json +21 -0
  567. package/packages/protocol/vitest.config.ts +9 -0
  568. package/packages/resiliency/dist/cgroup-manager.d.ts.map +1 -0
  569. package/packages/resiliency/dist/cgroup-manager.js.map +1 -0
  570. package/packages/resiliency/dist/context-persistence.d.ts.map +1 -0
  571. package/packages/resiliency/dist/context-persistence.js.map +1 -0
  572. package/packages/resiliency/dist/crash-insights.d.ts.map +1 -0
  573. package/packages/resiliency/dist/crash-insights.js.map +1 -0
  574. package/packages/resiliency/dist/gossip-health.d.ts.map +1 -0
  575. package/packages/resiliency/dist/gossip-health.js.map +1 -0
  576. package/packages/resiliency/dist/health-monitor.d.ts.map +1 -0
  577. package/packages/resiliency/dist/health-monitor.js.map +1 -0
  578. package/packages/resiliency/dist/index.d.ts.map +1 -0
  579. package/packages/resiliency/dist/index.js.map +1 -0
  580. package/packages/resiliency/dist/leader-watchdog.d.ts.map +1 -0
  581. package/packages/resiliency/dist/leader-watchdog.js.map +1 -0
  582. package/packages/resiliency/dist/logger.d.ts.map +1 -0
  583. package/packages/resiliency/dist/logger.js.map +1 -0
  584. package/packages/resiliency/dist/memory-monitor.d.ts.map +1 -0
  585. package/packages/resiliency/dist/memory-monitor.js.map +1 -0
  586. package/packages/resiliency/dist/metrics.d.ts.map +1 -0
  587. package/packages/resiliency/dist/metrics.js.map +1 -0
  588. package/packages/resiliency/dist/provider-context.d.ts.map +1 -0
  589. package/packages/resiliency/dist/provider-context.js.map +1 -0
  590. package/packages/resiliency/dist/stateless-lead.d.ts.map +1 -0
  591. package/packages/resiliency/dist/stateless-lead.js.map +1 -0
  592. package/packages/resiliency/dist/supervisor.d.ts.map +1 -0
  593. package/packages/resiliency/dist/supervisor.js.map +1 -0
  594. package/packages/resiliency/package.json +1 -1
  595. package/packages/resiliency/src/cgroup-manager.ts +468 -0
  596. package/packages/resiliency/src/context-persistence.ts +538 -0
  597. package/packages/resiliency/src/crash-insights.test.ts +620 -0
  598. package/packages/resiliency/src/crash-insights.ts +660 -0
  599. package/packages/resiliency/src/gossip-health.ts +333 -0
  600. package/packages/resiliency/src/health-monitor.ts +371 -0
  601. package/packages/resiliency/src/index.ts +157 -0
  602. package/packages/resiliency/src/leader-watchdog.ts +260 -0
  603. package/packages/resiliency/src/logger.ts +320 -0
  604. package/packages/resiliency/src/memory-monitor.test.ts +637 -0
  605. package/packages/resiliency/src/memory-monitor.ts +740 -0
  606. package/packages/resiliency/src/metrics.ts +311 -0
  607. package/packages/resiliency/src/provider-context.ts +452 -0
  608. package/packages/resiliency/src/stateless-lead.ts +408 -0
  609. package/packages/resiliency/src/supervisor.ts +578 -0
  610. package/packages/resiliency/tsconfig.json +21 -0
  611. package/packages/resiliency/vitest.config.ts +9 -0
  612. package/packages/sdk/dist/client.d.ts.map +1 -0
  613. package/packages/sdk/dist/client.js.map +1 -0
  614. package/packages/sdk/dist/index.d.ts.map +1 -0
  615. package/packages/sdk/dist/index.js.map +1 -0
  616. package/packages/sdk/dist/logs.d.ts.map +1 -0
  617. package/packages/sdk/dist/logs.js.map +1 -0
  618. package/packages/sdk/dist/protocol/index.d.ts.map +1 -0
  619. package/packages/sdk/dist/protocol/index.js.map +1 -0
  620. package/packages/sdk/dist/standalone.d.ts.map +1 -0
  621. package/packages/sdk/dist/standalone.js.map +1 -0
  622. package/packages/sdk/examples/SWARM_CAPABILITIES.md +498 -0
  623. package/packages/sdk/examples/SWARM_PATTERNS.md +541 -0
  624. package/packages/sdk/package.json +2 -2
  625. package/packages/sdk/src/client.test.ts +568 -0
  626. package/packages/sdk/src/client.ts +1418 -0
  627. package/packages/sdk/src/index.ts +103 -0
  628. package/packages/sdk/src/logs.test.ts +98 -0
  629. package/packages/sdk/src/logs.ts +126 -0
  630. package/packages/sdk/src/protocol/framing.test.ts +164 -0
  631. package/packages/sdk/src/protocol/index.ts +8 -0
  632. package/packages/sdk/src/standalone.ts +176 -0
  633. package/packages/sdk/tsconfig.json +22 -0
  634. package/packages/sdk/vitest.config.ts +9 -0
  635. package/packages/spawner/.trajectories/index.json +5 -0
  636. package/packages/spawner/dist/index.d.ts.map +1 -0
  637. package/packages/spawner/dist/index.js.map +1 -0
  638. package/packages/spawner/dist/types.d.ts.map +1 -0
  639. package/packages/spawner/dist/types.js.map +1 -0
  640. package/packages/spawner/package.json +1 -1
  641. package/packages/spawner/src/index.ts +8 -0
  642. package/packages/spawner/src/types.test.ts +385 -0
  643. package/packages/spawner/src/types.ts +228 -0
  644. package/packages/spawner/tsconfig.json +19 -0
  645. package/packages/spawner/vitest.config.ts +9 -0
  646. package/packages/state/dist/agent-state.d.ts.map +1 -0
  647. package/packages/state/dist/agent-state.js.map +1 -0
  648. package/packages/state/dist/index.d.ts.map +1 -0
  649. package/packages/state/dist/index.js.map +1 -0
  650. package/packages/state/package.json +1 -1
  651. package/packages/state/src/agent-state.test.ts +335 -0
  652. package/packages/state/src/agent-state.ts +153 -0
  653. package/packages/state/src/index.ts +12 -0
  654. package/packages/state/tsconfig.json +21 -0
  655. package/packages/state/vitest.config.ts +9 -0
  656. package/packages/storage/dist/adapter.d.ts +28 -1
  657. package/packages/storage/dist/adapter.d.ts.map +1 -0
  658. package/packages/storage/dist/adapter.js +104 -10
  659. package/packages/storage/dist/adapter.js.map +1 -0
  660. package/packages/storage/dist/batched-sqlite-adapter.d.ts.map +1 -0
  661. package/packages/storage/dist/batched-sqlite-adapter.js.map +1 -0
  662. package/packages/storage/dist/dead-letter-queue.d.ts.map +1 -0
  663. package/packages/storage/dist/dead-letter-queue.js.map +1 -0
  664. package/packages/storage/dist/dlq-adapter.d.ts.map +1 -0
  665. package/packages/storage/dist/dlq-adapter.js.map +1 -0
  666. package/packages/storage/dist/index.d.ts +1 -0
  667. package/packages/storage/dist/index.d.ts.map +1 -0
  668. package/packages/storage/dist/index.js +1 -0
  669. package/packages/storage/dist/index.js.map +1 -0
  670. package/packages/storage/dist/jsonl-adapter.d.ts +77 -0
  671. package/packages/storage/dist/jsonl-adapter.d.ts.map +1 -0
  672. package/packages/storage/dist/jsonl-adapter.js +505 -0
  673. package/packages/storage/dist/jsonl-adapter.js.map +1 -0
  674. package/packages/storage/dist/sqlite-adapter.d.ts +6 -1
  675. package/packages/storage/dist/sqlite-adapter.d.ts.map +1 -0
  676. package/packages/storage/dist/sqlite-adapter.js +47 -0
  677. package/packages/storage/dist/sqlite-adapter.js.map +1 -0
  678. package/packages/storage/package.json +2 -2
  679. package/packages/storage/src/adapter.ts +438 -0
  680. package/packages/storage/src/batched-sqlite-adapter.test.ts +240 -0
  681. package/packages/storage/src/batched-sqlite-adapter.ts +239 -0
  682. package/packages/storage/src/dead-letter-queue.ts +643 -0
  683. package/packages/storage/src/dlq-adapter.test.ts +492 -0
  684. package/packages/storage/src/dlq-adapter.ts +954 -0
  685. package/packages/storage/src/index.ts +6 -0
  686. package/packages/storage/src/jsonl-adapter.test.ts +200 -0
  687. package/packages/storage/src/jsonl-adapter.ts +618 -0
  688. package/packages/storage/src/memory-adapter.test.ts +36 -0
  689. package/packages/storage/src/sqlite-adapter.test.ts +562 -0
  690. package/packages/storage/src/sqlite-adapter.ts +1058 -0
  691. package/packages/storage/tsconfig.json +21 -0
  692. package/packages/storage/vitest.config.ts +9 -0
  693. package/packages/telemetry/dist/client.d.ts.map +1 -0
  694. package/packages/telemetry/dist/client.js.map +1 -0
  695. package/packages/telemetry/dist/config.d.ts.map +1 -0
  696. package/packages/telemetry/dist/config.js.map +1 -0
  697. package/packages/telemetry/dist/events.d.ts.map +1 -0
  698. package/packages/telemetry/dist/events.js.map +1 -0
  699. package/packages/telemetry/dist/index.d.ts.map +1 -0
  700. package/packages/telemetry/dist/index.js.map +1 -0
  701. package/packages/telemetry/dist/machine-id.d.ts.map +1 -0
  702. package/packages/telemetry/dist/machine-id.js.map +1 -0
  703. package/packages/telemetry/dist/posthog-config.d.ts.map +1 -0
  704. package/packages/telemetry/dist/posthog-config.js.map +1 -0
  705. package/packages/telemetry/package.json +1 -1
  706. package/packages/telemetry/src/client.ts +158 -0
  707. package/packages/telemetry/src/config.ts +110 -0
  708. package/packages/telemetry/src/events.ts +137 -0
  709. package/packages/telemetry/src/index.ts +46 -0
  710. package/packages/telemetry/src/machine-id.ts +63 -0
  711. package/packages/telemetry/src/posthog-config.ts +39 -0
  712. package/packages/telemetry/tsconfig.json +21 -0
  713. package/packages/trajectory/dist/index.d.ts.map +1 -0
  714. package/packages/trajectory/dist/index.js.map +1 -0
  715. package/packages/trajectory/dist/integration.d.ts.map +1 -0
  716. package/packages/trajectory/dist/integration.js.map +1 -0
  717. package/packages/trajectory/package.json +2 -2
  718. package/packages/trajectory/src/index.ts +1 -0
  719. package/packages/trajectory/src/integration.ts +1268 -0
  720. package/packages/trajectory/tsconfig.json +21 -0
  721. package/packages/trajectory/vitest.config.ts +9 -0
  722. package/packages/user-directory/dist/index.d.ts.map +1 -0
  723. package/packages/user-directory/dist/index.js.map +1 -0
  724. package/packages/user-directory/dist/user-directory.d.ts.map +1 -0
  725. package/packages/user-directory/dist/user-directory.js.map +1 -0
  726. package/packages/user-directory/package.json +2 -2
  727. package/packages/user-directory/src/index.ts +12 -0
  728. package/packages/user-directory/src/user-directory.ts +393 -0
  729. package/packages/user-directory/tsconfig.json +21 -0
  730. package/packages/user-directory/vitest.config.ts +9 -0
  731. package/packages/utils/dist/cjs/client-helpers.js +127 -0
  732. package/packages/utils/dist/cjs/command-resolver.js +89 -0
  733. package/packages/utils/dist/cjs/error-tracking.js +106 -0
  734. package/packages/utils/dist/cjs/git-remote.js +120 -0
  735. package/packages/utils/dist/cjs/index.js +40 -0
  736. package/packages/utils/dist/cjs/logger.js +105 -0
  737. package/packages/utils/dist/cjs/model-mapping.js +54 -0
  738. package/packages/utils/dist/cjs/name-generator.js +179 -0
  739. package/packages/utils/dist/cjs/package.json +3 -0
  740. package/packages/utils/dist/cjs/precompiled-patterns.js +271 -0
  741. package/packages/utils/dist/cjs/relay-pty-path.js +143 -0
  742. package/packages/utils/dist/cjs/update-checker.js +185 -0
  743. package/packages/utils/dist/client-helpers.d.ts +73 -0
  744. package/packages/utils/dist/client-helpers.d.ts.map +1 -0
  745. package/packages/utils/dist/client-helpers.js +130 -0
  746. package/packages/utils/dist/client-helpers.js.map +1 -0
  747. package/packages/utils/dist/command-resolver.d.ts.map +1 -0
  748. package/packages/utils/dist/command-resolver.js.map +1 -0
  749. package/packages/utils/dist/error-tracking.d.ts.map +1 -0
  750. package/packages/utils/dist/error-tracking.js.map +1 -0
  751. package/packages/utils/dist/git-remote.d.ts.map +1 -0
  752. package/packages/utils/dist/git-remote.js.map +1 -0
  753. package/packages/utils/dist/index.d.ts +1 -0
  754. package/packages/utils/dist/index.d.ts.map +1 -0
  755. package/packages/utils/dist/index.js +1 -0
  756. package/packages/utils/dist/index.js.map +1 -0
  757. package/packages/utils/dist/logger.d.ts.map +1 -0
  758. package/packages/utils/dist/logger.js.map +1 -0
  759. package/packages/utils/dist/model-mapping.d.ts.map +1 -0
  760. package/packages/utils/dist/model-mapping.js.map +1 -0
  761. package/packages/utils/dist/name-generator.d.ts.map +1 -0
  762. package/packages/utils/dist/name-generator.js.map +1 -0
  763. package/packages/utils/dist/precompiled-patterns.d.ts.map +1 -0
  764. package/packages/utils/dist/precompiled-patterns.js.map +1 -0
  765. package/packages/utils/dist/relay-pty-path.d.ts +11 -5
  766. package/packages/utils/dist/relay-pty-path.d.ts.map +1 -0
  767. package/packages/utils/dist/relay-pty-path.js +60 -5
  768. package/packages/utils/dist/relay-pty-path.js.map +1 -0
  769. package/packages/utils/dist/update-checker.d.ts.map +1 -0
  770. package/packages/utils/dist/update-checker.js.map +1 -0
  771. package/packages/utils/package.json +37 -14
  772. package/packages/utils/scripts/build-cjs.mjs +24 -0
  773. package/packages/utils/src/client-helpers.ts +221 -0
  774. package/packages/utils/src/command-resolver.ts +82 -0
  775. package/packages/utils/src/error-tracking.ts +189 -0
  776. package/packages/utils/src/git-remote.ts +143 -0
  777. package/packages/utils/src/index.ts +10 -0
  778. package/packages/utils/src/logger.ts +107 -0
  779. package/packages/utils/src/model-mapping.test.ts +122 -0
  780. package/packages/utils/src/model-mapping.ts +58 -0
  781. package/packages/utils/src/name-generator.test.ts +259 -0
  782. package/packages/utils/src/name-generator.ts +56 -0
  783. package/packages/utils/src/precompiled-patterns.test.ts +452 -0
  784. package/packages/utils/src/precompiled-patterns.ts +395 -0
  785. package/packages/utils/src/relay-pty-path.ts +196 -0
  786. package/packages/utils/src/update-checker.test.ts +260 -0
  787. package/packages/utils/src/update-checker.ts +211 -0
  788. package/packages/utils/tsconfig.json +21 -0
  789. package/packages/utils/vitest.config.ts +9 -0
  790. package/packages/wrapper/dist/__fixtures__/claude-outputs.d.ts.map +1 -0
  791. package/packages/wrapper/dist/__fixtures__/claude-outputs.js.map +1 -0
  792. package/packages/wrapper/dist/__fixtures__/codex-outputs.d.ts.map +1 -0
  793. package/packages/wrapper/dist/__fixtures__/codex-outputs.js.map +1 -0
  794. package/packages/wrapper/dist/__fixtures__/gemini-outputs.d.ts.map +1 -0
  795. package/packages/wrapper/dist/__fixtures__/gemini-outputs.js.map +1 -0
  796. package/packages/wrapper/dist/__fixtures__/index.d.ts.map +1 -0
  797. package/packages/wrapper/dist/__fixtures__/index.js.map +1 -0
  798. package/packages/wrapper/dist/auth-detection.d.ts.map +1 -0
  799. package/packages/wrapper/dist/auth-detection.js.map +1 -0
  800. package/packages/wrapper/dist/base-wrapper.d.ts.map +1 -0
  801. package/packages/wrapper/dist/base-wrapper.js.map +1 -0
  802. package/packages/wrapper/dist/client.d.ts.map +1 -0
  803. package/packages/wrapper/dist/client.js.map +1 -0
  804. package/packages/wrapper/dist/id-generator.d.ts.map +1 -0
  805. package/packages/wrapper/dist/id-generator.js.map +1 -0
  806. package/packages/wrapper/dist/idle-detector.d.ts.map +1 -0
  807. package/packages/wrapper/dist/idle-detector.js.map +1 -0
  808. package/packages/wrapper/dist/inbox.d.ts.map +1 -0
  809. package/packages/wrapper/dist/inbox.js.map +1 -0
  810. package/packages/wrapper/dist/index.d.ts.map +1 -0
  811. package/packages/wrapper/dist/index.js.map +1 -0
  812. package/packages/wrapper/dist/parser.d.ts.map +1 -0
  813. package/packages/wrapper/dist/parser.js.map +1 -0
  814. package/packages/wrapper/dist/prompt-composer.d.ts.map +1 -0
  815. package/packages/wrapper/dist/prompt-composer.js.map +1 -0
  816. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +10 -0
  817. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts.map +1 -0
  818. package/packages/wrapper/dist/relay-pty-orchestrator.js +69 -0
  819. package/packages/wrapper/dist/relay-pty-orchestrator.js.map +1 -0
  820. package/packages/wrapper/dist/shared.d.ts.map +1 -0
  821. package/packages/wrapper/dist/shared.js.map +1 -0
  822. package/packages/wrapper/dist/stuck-detector.d.ts.map +1 -0
  823. package/packages/wrapper/dist/stuck-detector.js.map +1 -0
  824. package/packages/wrapper/dist/tmux-resolver.d.ts.map +1 -0
  825. package/packages/wrapper/dist/tmux-resolver.js.map +1 -0
  826. package/packages/wrapper/dist/tmux-wrapper.d.ts.map +1 -0
  827. package/packages/wrapper/dist/tmux-wrapper.js.map +1 -0
  828. package/packages/wrapper/dist/trajectory-integration.d.ts.map +1 -0
  829. package/packages/wrapper/dist/trajectory-integration.js.map +1 -0
  830. package/packages/wrapper/dist/wrapper-types.d.ts.map +1 -0
  831. package/packages/wrapper/dist/wrapper-types.js.map +1 -0
  832. package/packages/wrapper/package.json +6 -9
  833. package/packages/wrapper/src/__fixtures__/claude-outputs.ts +471 -0
  834. package/packages/wrapper/src/__fixtures__/codex-outputs.ts +99 -0
  835. package/packages/wrapper/src/__fixtures__/gemini-outputs.ts +151 -0
  836. package/packages/wrapper/src/__fixtures__/index.ts +47 -0
  837. package/packages/wrapper/src/auth-detection.ts +244 -0
  838. package/packages/wrapper/src/base-wrapper.test.ts +589 -0
  839. package/packages/wrapper/src/base-wrapper.ts +810 -0
  840. package/packages/wrapper/src/client.test.ts +262 -0
  841. package/packages/wrapper/src/client.ts +984 -0
  842. package/packages/wrapper/src/id-generator.test.ts +71 -0
  843. package/packages/wrapper/src/id-generator.ts +69 -0
  844. package/packages/wrapper/src/idle-detector.test.ts +418 -0
  845. package/packages/wrapper/src/idle-detector.ts +384 -0
  846. package/packages/wrapper/src/inbox.test.ts +233 -0
  847. package/packages/wrapper/src/inbox.ts +89 -0
  848. package/packages/wrapper/src/index.ts +170 -0
  849. package/packages/wrapper/src/parser.regression.test.ts +251 -0
  850. package/packages/wrapper/src/parser.test.ts +1359 -0
  851. package/packages/wrapper/src/parser.ts +1477 -0
  852. package/packages/wrapper/src/prompt-composer.test.ts +219 -0
  853. package/packages/wrapper/src/prompt-composer.ts +231 -0
  854. package/packages/wrapper/src/relay-pty-orchestrator.test.ts +1204 -0
  855. package/packages/wrapper/src/relay-pty-orchestrator.ts +2626 -0
  856. package/packages/wrapper/src/shared.test.ts +322 -0
  857. package/packages/wrapper/src/shared.ts +495 -0
  858. package/packages/wrapper/src/stuck-detector.test.ts +303 -0
  859. package/packages/wrapper/src/stuck-detector.ts +511 -0
  860. package/packages/wrapper/src/tmux-resolver.test.ts +104 -0
  861. package/packages/wrapper/src/tmux-resolver.ts +207 -0
  862. package/packages/wrapper/src/tmux-wrapper.test.ts +316 -0
  863. package/packages/wrapper/src/tmux-wrapper.ts +2095 -0
  864. package/packages/wrapper/src/trajectory-detection.test.ts +151 -0
  865. package/packages/wrapper/src/trajectory-integration.ts +1261 -0
  866. package/packages/wrapper/src/wrapper-types.ts +45 -0
  867. package/packages/wrapper/tsconfig.json +19 -0
  868. package/packages/wrapper/vitest.config.ts +9 -0
  869. package/scripts/build-cjs.mjs +23 -0
  870. package/scripts/postinstall.js +132 -0
  871. package/.cursor/mcp.json +0 -11
  872. package/.gitattributes +0 -3
  873. package/.gitleaks.toml +0 -26
  874. package/.mcp.json +0 -11
  875. package/.nvmrc +0 -1
  876. package/ARCHITECTURE.md +0 -1245
  877. package/CHANGELOG.md +0 -231
  878. package/TESTING.md +0 -278
  879. package/TRAIL_GIT_AUTH_FIX.md +0 -113
  880. package/scripts/demos/README.md +0 -79
  881. package/scripts/demos/server-capacity.sh +0 -69
  882. package/scripts/demos/sprint-planning.sh +0 -73
  883. package/scripts/hooks/install.sh +0 -16
  884. package/scripts/hooks/pre-commit +0 -60
  885. package/scripts/post-publish-verify/README.md +0 -80
  886. package/scripts/post-publish-verify/run-verify.sh +0 -127
  887. package/scripts/post-publish-verify/verify-install.sh +0 -249
  888. package/scripts/stress-test-orchestrator-integration.mts +0 -1366
  889. package/scripts/stress-test-orchestrator.mjs +0 -584
  890. package/scripts/stress-test-relay-pty.sh +0 -452
  891. package/scripts/test-interactive-terminal.sh +0 -248
  892. package/specs/PRIMITIVES_ROADMAP.md +0 -2154
  893. package/tests/benchmarks/protocol.bench.ts +0 -310
  894. package/turbo.json +0 -37
@@ -0,0 +1,954 @@
1
+ /**
2
+ * Dead Letter Queue Storage Adapter
3
+ *
4
+ * Abstract interface for DLQ storage with implementations for:
5
+ * - SQLite (local daemon)
6
+ * - PostgreSQL (cloud deployment)
7
+ * - In-memory (testing)
8
+ *
9
+ * Follows the adapter pattern used by the main storage layer.
10
+ */
11
+
12
+ // =============================================================================
13
+ // Types
14
+ // =============================================================================
15
+
16
+ export type DLQFailureReason =
17
+ | 'max_retries_exceeded'
18
+ | 'ttl_expired'
19
+ | 'connection_lost'
20
+ | 'target_not_found'
21
+ | 'signature_invalid'
22
+ | 'payload_too_large'
23
+ | 'rate_limited'
24
+ | 'unknown';
25
+
26
+ export interface DeadLetter {
27
+ id: string;
28
+ messageId: string;
29
+ from: string;
30
+ to: string;
31
+ topic?: string;
32
+ kind: string;
33
+ body: string;
34
+ data?: Record<string, unknown>;
35
+ thread?: string;
36
+ originalTs: number;
37
+ dlqTs: number;
38
+ reason: DLQFailureReason;
39
+ errorMessage?: string;
40
+ attemptCount: number;
41
+ lastAttemptTs?: number;
42
+ dlqRetryCount: number;
43
+ acknowledged: boolean;
44
+ acknowledgedTs?: number;
45
+ acknowledgedBy?: string;
46
+ }
47
+
48
+ export interface DLQQuery {
49
+ to?: string;
50
+ from?: string;
51
+ reason?: DLQFailureReason;
52
+ acknowledged?: boolean;
53
+ afterTs?: number;
54
+ beforeTs?: number;
55
+ limit?: number;
56
+ offset?: number;
57
+ orderBy?: 'dlqTs' | 'originalTs' | 'attemptCount';
58
+ orderDir?: 'ASC' | 'DESC';
59
+ }
60
+
61
+ export interface DLQStats {
62
+ totalEntries: number;
63
+ unacknowledged: number;
64
+ byReason: Record<DLQFailureReason, number>;
65
+ byTarget: Record<string, number>;
66
+ oldestEntryTs: number | null;
67
+ newestEntryTs: number | null;
68
+ avgRetryCount: number;
69
+ }
70
+
71
+ export interface DLQConfig {
72
+ enabled: boolean;
73
+ retentionHours: number;
74
+ maxEntries: number;
75
+ autoCleanup: boolean;
76
+ cleanupIntervalMinutes: number;
77
+ alertThreshold: number;
78
+ }
79
+
80
+ export interface MessageEnvelope {
81
+ from: string;
82
+ to: string;
83
+ topic?: string;
84
+ kind: string;
85
+ body: string;
86
+ data?: Record<string, unknown>;
87
+ thread?: string;
88
+ ts: number;
89
+ }
90
+
91
+ // =============================================================================
92
+ // Adapter Interface
93
+ // =============================================================================
94
+
95
+ /**
96
+ * Abstract interface for DLQ storage backends.
97
+ */
98
+ export interface DLQStorageAdapter {
99
+ /**
100
+ * Initialize the adapter (create tables, etc.)
101
+ */
102
+ init(): Promise<void>;
103
+
104
+ /**
105
+ * Add a dead letter to the queue.
106
+ */
107
+ add(
108
+ messageId: string,
109
+ envelope: MessageEnvelope,
110
+ reason: DLQFailureReason,
111
+ attemptCount: number,
112
+ errorMessage?: string
113
+ ): Promise<DeadLetter>;
114
+
115
+ /**
116
+ * Get a dead letter by ID.
117
+ */
118
+ get(id: string): Promise<DeadLetter | null>;
119
+
120
+ /**
121
+ * Query dead letters with filters.
122
+ */
123
+ query(query?: DLQQuery): Promise<DeadLetter[]>;
124
+
125
+ /**
126
+ * Acknowledge a dead letter.
127
+ */
128
+ acknowledge(id: string, acknowledgedBy?: string): Promise<boolean>;
129
+
130
+ /**
131
+ * Acknowledge multiple dead letters.
132
+ */
133
+ acknowledgeMany(ids: string[], acknowledgedBy?: string): Promise<number>;
134
+
135
+ /**
136
+ * Increment retry count for a dead letter.
137
+ */
138
+ incrementRetry(id: string): Promise<boolean>;
139
+
140
+ /**
141
+ * Remove a dead letter.
142
+ */
143
+ remove(id: string): Promise<boolean>;
144
+
145
+ /**
146
+ * Get DLQ statistics.
147
+ */
148
+ getStats(): Promise<DLQStats>;
149
+
150
+ /**
151
+ * Cleanup old entries.
152
+ */
153
+ cleanup(retentionHours: number, maxEntries: number): Promise<{ removed: number }>;
154
+
155
+ /**
156
+ * Get messages ready for retry.
157
+ */
158
+ getRetryable(maxRetries?: number, limit?: number): Promise<DeadLetter[]>;
159
+
160
+ /**
161
+ * Close the adapter (cleanup resources).
162
+ */
163
+ close(): Promise<void>;
164
+ }
165
+
166
+ // =============================================================================
167
+ // Default Configuration
168
+ // =============================================================================
169
+
170
+ export const DEFAULT_DLQ_CONFIG: DLQConfig = {
171
+ enabled: true,
172
+ retentionHours: 168, // 7 days
173
+ maxEntries: 10000,
174
+ autoCleanup: true,
175
+ cleanupIntervalMinutes: 60,
176
+ alertThreshold: 1000,
177
+ };
178
+
179
+ // =============================================================================
180
+ // SQLite Adapter
181
+ // =============================================================================
182
+
183
+ import type { Database as BetterSqlite3Database } from 'better-sqlite3';
184
+
185
+ const DLQ_SQLITE_SCHEMA = `
186
+ CREATE TABLE IF NOT EXISTS dead_letters (
187
+ id TEXT PRIMARY KEY,
188
+ message_id TEXT NOT NULL,
189
+ from_agent TEXT NOT NULL,
190
+ to_agent TEXT NOT NULL,
191
+ topic TEXT,
192
+ kind TEXT NOT NULL,
193
+ body TEXT NOT NULL,
194
+ data TEXT,
195
+ thread TEXT,
196
+ original_ts INTEGER NOT NULL,
197
+ dlq_ts INTEGER NOT NULL,
198
+ reason TEXT NOT NULL,
199
+ error_message TEXT,
200
+ attempt_count INTEGER NOT NULL DEFAULT 0,
201
+ last_attempt_ts INTEGER,
202
+ dlq_retry_count INTEGER NOT NULL DEFAULT 0,
203
+ acknowledged INTEGER NOT NULL DEFAULT 0,
204
+ acknowledged_ts INTEGER,
205
+ acknowledged_by TEXT
206
+ );
207
+
208
+ CREATE INDEX IF NOT EXISTS idx_dlq_to ON dead_letters(to_agent);
209
+ CREATE INDEX IF NOT EXISTS idx_dlq_from ON dead_letters(from_agent);
210
+ CREATE INDEX IF NOT EXISTS idx_dlq_reason ON dead_letters(reason);
211
+ CREATE INDEX IF NOT EXISTS idx_dlq_ts ON dead_letters(dlq_ts);
212
+ CREATE INDEX IF NOT EXISTS idx_dlq_acknowledged ON dead_letters(acknowledged);
213
+ `;
214
+
215
+ export class SQLiteDLQAdapter implements DLQStorageAdapter {
216
+ private db: BetterSqlite3Database;
217
+
218
+ constructor(db: BetterSqlite3Database) {
219
+ this.db = db;
220
+ }
221
+
222
+ async init(): Promise<void> {
223
+ this.db.exec(DLQ_SQLITE_SCHEMA);
224
+ }
225
+
226
+ async add(
227
+ messageId: string,
228
+ envelope: MessageEnvelope,
229
+ reason: DLQFailureReason,
230
+ attemptCount: number,
231
+ errorMessage?: string
232
+ ): Promise<DeadLetter> {
233
+ const id = `dlq_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
234
+ const now = Date.now();
235
+
236
+ const deadLetter: DeadLetter = {
237
+ id,
238
+ messageId,
239
+ from: envelope.from,
240
+ to: envelope.to,
241
+ topic: envelope.topic,
242
+ kind: envelope.kind,
243
+ body: envelope.body,
244
+ data: envelope.data,
245
+ thread: envelope.thread,
246
+ originalTs: envelope.ts,
247
+ dlqTs: now,
248
+ reason,
249
+ errorMessage,
250
+ attemptCount,
251
+ lastAttemptTs: now,
252
+ dlqRetryCount: 0,
253
+ acknowledged: false,
254
+ };
255
+
256
+ const stmt = this.db.prepare(`
257
+ INSERT INTO dead_letters (
258
+ id, message_id, from_agent, to_agent, topic, kind, body, data, thread,
259
+ original_ts, dlq_ts, reason, error_message, attempt_count, last_attempt_ts,
260
+ dlq_retry_count, acknowledged
261
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
262
+ `);
263
+
264
+ stmt.run(
265
+ deadLetter.id,
266
+ deadLetter.messageId,
267
+ deadLetter.from,
268
+ deadLetter.to,
269
+ deadLetter.topic ?? null,
270
+ deadLetter.kind,
271
+ deadLetter.body,
272
+ deadLetter.data ? JSON.stringify(deadLetter.data) : null,
273
+ deadLetter.thread ?? null,
274
+ deadLetter.originalTs,
275
+ deadLetter.dlqTs,
276
+ deadLetter.reason,
277
+ deadLetter.errorMessage ?? null,
278
+ deadLetter.attemptCount,
279
+ deadLetter.lastAttemptTs ?? null,
280
+ deadLetter.dlqRetryCount,
281
+ deadLetter.acknowledged ? 1 : 0
282
+ );
283
+
284
+ return deadLetter;
285
+ }
286
+
287
+ async get(id: string): Promise<DeadLetter | null> {
288
+ const stmt = this.db.prepare('SELECT * FROM dead_letters WHERE id = ?');
289
+ const row = stmt.get(id) as Record<string, unknown> | undefined;
290
+ return row ? this.rowToDeadLetter(row) : null;
291
+ }
292
+
293
+ async query(query: DLQQuery = {}): Promise<DeadLetter[]> {
294
+ const conditions: string[] = [];
295
+ const params: unknown[] = [];
296
+
297
+ if (query.to) {
298
+ conditions.push('to_agent = ?');
299
+ params.push(query.to);
300
+ }
301
+ if (query.from) {
302
+ conditions.push('from_agent = ?');
303
+ params.push(query.from);
304
+ }
305
+ if (query.reason) {
306
+ conditions.push('reason = ?');
307
+ params.push(query.reason);
308
+ }
309
+ if (query.acknowledged !== undefined) {
310
+ conditions.push('acknowledged = ?');
311
+ params.push(query.acknowledged ? 1 : 0);
312
+ }
313
+ if (query.afterTs) {
314
+ conditions.push('dlq_ts > ?');
315
+ params.push(query.afterTs);
316
+ }
317
+ if (query.beforeTs) {
318
+ conditions.push('dlq_ts < ?');
319
+ params.push(query.beforeTs);
320
+ }
321
+
322
+ const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
323
+ const orderColumn = query.orderBy === 'originalTs' ? 'original_ts' :
324
+ query.orderBy === 'attemptCount' ? 'attempt_count' : 'dlq_ts';
325
+ const orderDir = query.orderDir ?? 'DESC';
326
+ const limit = query.limit ?? 100;
327
+ const offset = query.offset ?? 0;
328
+
329
+ const sql = `
330
+ SELECT * FROM dead_letters ${whereClause}
331
+ ORDER BY ${orderColumn} ${orderDir}
332
+ LIMIT ? OFFSET ?
333
+ `;
334
+ params.push(limit, offset);
335
+
336
+ const stmt = this.db.prepare(sql);
337
+ const rows = stmt.all(...params) as Record<string, unknown>[];
338
+ return rows.map(row => this.rowToDeadLetter(row));
339
+ }
340
+
341
+ async acknowledge(id: string, acknowledgedBy: string = 'system'): Promise<boolean> {
342
+ const stmt = this.db.prepare(`
343
+ UPDATE dead_letters SET acknowledged = 1, acknowledged_ts = ?, acknowledged_by = ?
344
+ WHERE id = ? AND acknowledged = 0
345
+ `);
346
+ const result = stmt.run(Date.now(), acknowledgedBy, id);
347
+ return result.changes > 0;
348
+ }
349
+
350
+ async acknowledgeMany(ids: string[], acknowledgedBy: string = 'system'): Promise<number> {
351
+ const placeholders = ids.map(() => '?').join(',');
352
+ const stmt = this.db.prepare(`
353
+ UPDATE dead_letters SET acknowledged = 1, acknowledged_ts = ?, acknowledged_by = ?
354
+ WHERE id IN (${placeholders}) AND acknowledged = 0
355
+ `);
356
+ const result = stmt.run(Date.now(), acknowledgedBy, ...ids);
357
+ return result.changes;
358
+ }
359
+
360
+ async incrementRetry(id: string): Promise<boolean> {
361
+ const stmt = this.db.prepare(`
362
+ UPDATE dead_letters SET dlq_retry_count = dlq_retry_count + 1, last_attempt_ts = ?
363
+ WHERE id = ?
364
+ `);
365
+ const result = stmt.run(Date.now(), id);
366
+ return result.changes > 0;
367
+ }
368
+
369
+ async remove(id: string): Promise<boolean> {
370
+ const stmt = this.db.prepare('DELETE FROM dead_letters WHERE id = ?');
371
+ const result = stmt.run(id);
372
+ return result.changes > 0;
373
+ }
374
+
375
+ async getStats(): Promise<DLQStats> {
376
+ const totalRow = this.db.prepare('SELECT COUNT(*) as count FROM dead_letters').get() as { count: number };
377
+ const unackRow = this.db.prepare('SELECT COUNT(*) as count FROM dead_letters WHERE acknowledged = 0').get() as { count: number };
378
+
379
+ const reasonRows = this.db.prepare('SELECT reason, COUNT(*) as count FROM dead_letters GROUP BY reason').all() as Array<{ reason: string; count: number }>;
380
+ const byReason: Record<DLQFailureReason, number> = {
381
+ max_retries_exceeded: 0, ttl_expired: 0, connection_lost: 0, target_not_found: 0,
382
+ signature_invalid: 0, payload_too_large: 0, rate_limited: 0, unknown: 0,
383
+ };
384
+ for (const row of reasonRows) {
385
+ byReason[row.reason as DLQFailureReason] = row.count;
386
+ }
387
+
388
+ const targetRows = this.db.prepare('SELECT to_agent, COUNT(*) as count FROM dead_letters GROUP BY to_agent ORDER BY count DESC LIMIT 10').all() as Array<{ to_agent: string; count: number }>;
389
+ const byTarget: Record<string, number> = {};
390
+ for (const row of targetRows) {
391
+ byTarget[row.to_agent] = row.count;
392
+ }
393
+
394
+ const oldestRow = this.db.prepare('SELECT MIN(dlq_ts) as ts FROM dead_letters WHERE acknowledged = 0').get() as { ts: number | null };
395
+ const newestRow = this.db.prepare('SELECT MAX(dlq_ts) as ts FROM dead_letters WHERE acknowledged = 0').get() as { ts: number | null };
396
+ const avgRow = this.db.prepare('SELECT AVG(dlq_retry_count) as avg FROM dead_letters').get() as { avg: number | null };
397
+
398
+ return {
399
+ totalEntries: totalRow.count,
400
+ unacknowledged: unackRow.count,
401
+ byReason,
402
+ byTarget,
403
+ oldestEntryTs: oldestRow.ts,
404
+ newestEntryTs: newestRow.ts,
405
+ avgRetryCount: avgRow.avg ?? 0,
406
+ };
407
+ }
408
+
409
+ async cleanup(retentionHours: number, maxEntries: number): Promise<{ removed: number }> {
410
+ const cutoffTs = Date.now() - retentionHours * 3600 * 1000;
411
+
412
+ const retentionResult = this.db.prepare('DELETE FROM dead_letters WHERE dlq_ts < ?').run(cutoffTs);
413
+
414
+ const countRow = this.db.prepare('SELECT COUNT(*) as count FROM dead_letters').get() as { count: number };
415
+ let maxEntriesRemoved = 0;
416
+ if (countRow.count > maxEntries) {
417
+ const excess = countRow.count - maxEntries;
418
+ const trimResult = this.db.prepare(`
419
+ DELETE FROM dead_letters WHERE id IN (
420
+ SELECT id FROM dead_letters WHERE acknowledged = 1 ORDER BY dlq_ts ASC LIMIT ?
421
+ )
422
+ `).run(excess);
423
+ maxEntriesRemoved = trimResult.changes;
424
+ }
425
+
426
+ return { removed: retentionResult.changes + maxEntriesRemoved };
427
+ }
428
+
429
+ async getRetryable(maxRetries: number = 3, limit: number = 10): Promise<DeadLetter[]> {
430
+ const stmt = this.db.prepare(`
431
+ SELECT * FROM dead_letters
432
+ WHERE acknowledged = 0 AND dlq_retry_count < ?
433
+ ORDER BY dlq_ts ASC LIMIT ?
434
+ `);
435
+ const rows = stmt.all(maxRetries, limit) as Record<string, unknown>[];
436
+ return rows.map(row => this.rowToDeadLetter(row));
437
+ }
438
+
439
+ async close(): Promise<void> {
440
+ // SQLite connection managed externally
441
+ }
442
+
443
+ private rowToDeadLetter(row: Record<string, unknown>): DeadLetter {
444
+ let data: Record<string, unknown> | undefined;
445
+ if (row.data) {
446
+ try {
447
+ data = JSON.parse(row.data as string);
448
+ } catch {
449
+ // Invalid JSON data, leave as undefined
450
+ console.warn(`[dlq] Failed to parse data for dead letter ${row.id}`);
451
+ }
452
+ }
453
+
454
+ return {
455
+ id: row.id as string,
456
+ messageId: row.message_id as string,
457
+ from: row.from_agent as string,
458
+ to: row.to_agent as string,
459
+ topic: row.topic as string | undefined,
460
+ kind: row.kind as string,
461
+ body: row.body as string,
462
+ data,
463
+ thread: row.thread as string | undefined,
464
+ originalTs: row.original_ts as number,
465
+ dlqTs: row.dlq_ts as number,
466
+ reason: row.reason as DLQFailureReason,
467
+ errorMessage: row.error_message as string | undefined,
468
+ attemptCount: row.attempt_count as number,
469
+ lastAttemptTs: row.last_attempt_ts as number | undefined,
470
+ dlqRetryCount: row.dlq_retry_count as number,
471
+ acknowledged: (row.acknowledged as number) === 1,
472
+ acknowledgedTs: row.acknowledged_ts as number | undefined,
473
+ acknowledgedBy: row.acknowledged_by as string | undefined,
474
+ };
475
+ }
476
+ }
477
+
478
+ // =============================================================================
479
+ // PostgreSQL Adapter
480
+ // =============================================================================
481
+
482
+ import type { Pool as PgPool } from 'pg';
483
+
484
+ const DLQ_POSTGRES_SCHEMA = `
485
+ CREATE TABLE IF NOT EXISTS dead_letters (
486
+ id TEXT PRIMARY KEY,
487
+ message_id TEXT NOT NULL,
488
+ from_agent TEXT NOT NULL,
489
+ to_agent TEXT NOT NULL,
490
+ topic TEXT,
491
+ kind TEXT NOT NULL,
492
+ body TEXT NOT NULL,
493
+ data JSONB,
494
+ thread TEXT,
495
+ original_ts BIGINT NOT NULL,
496
+ dlq_ts BIGINT NOT NULL,
497
+ reason TEXT NOT NULL,
498
+ error_message TEXT,
499
+ attempt_count INTEGER NOT NULL DEFAULT 0,
500
+ last_attempt_ts BIGINT,
501
+ dlq_retry_count INTEGER NOT NULL DEFAULT 0,
502
+ acknowledged BOOLEAN NOT NULL DEFAULT FALSE,
503
+ acknowledged_ts BIGINT,
504
+ acknowledged_by TEXT
505
+ );
506
+
507
+ CREATE INDEX IF NOT EXISTS idx_dlq_to ON dead_letters(to_agent);
508
+ CREATE INDEX IF NOT EXISTS idx_dlq_from ON dead_letters(from_agent);
509
+ CREATE INDEX IF NOT EXISTS idx_dlq_reason ON dead_letters(reason);
510
+ CREATE INDEX IF NOT EXISTS idx_dlq_ts ON dead_letters(dlq_ts);
511
+ CREATE INDEX IF NOT EXISTS idx_dlq_acknowledged ON dead_letters(acknowledged);
512
+ `;
513
+
514
+ export class PostgresDLQAdapter implements DLQStorageAdapter {
515
+ private pool: PgPool;
516
+
517
+ constructor(pool: PgPool) {
518
+ this.pool = pool;
519
+ }
520
+
521
+ async init(): Promise<void> {
522
+ const client = await this.pool.connect();
523
+ try {
524
+ await client.query(DLQ_POSTGRES_SCHEMA);
525
+ } finally {
526
+ client.release();
527
+ }
528
+ }
529
+
530
+ async add(
531
+ messageId: string,
532
+ envelope: MessageEnvelope,
533
+ reason: DLQFailureReason,
534
+ attemptCount: number,
535
+ errorMessage?: string
536
+ ): Promise<DeadLetter> {
537
+ const id = `dlq_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
538
+ const now = Date.now();
539
+
540
+ const deadLetter: DeadLetter = {
541
+ id,
542
+ messageId,
543
+ from: envelope.from,
544
+ to: envelope.to,
545
+ topic: envelope.topic,
546
+ kind: envelope.kind,
547
+ body: envelope.body,
548
+ data: envelope.data,
549
+ thread: envelope.thread,
550
+ originalTs: envelope.ts,
551
+ dlqTs: now,
552
+ reason,
553
+ errorMessage,
554
+ attemptCount,
555
+ lastAttemptTs: now,
556
+ dlqRetryCount: 0,
557
+ acknowledged: false,
558
+ };
559
+
560
+ await this.pool.query(`
561
+ INSERT INTO dead_letters (
562
+ id, message_id, from_agent, to_agent, topic, kind, body, data, thread,
563
+ original_ts, dlq_ts, reason, error_message, attempt_count, last_attempt_ts,
564
+ dlq_retry_count, acknowledged
565
+ ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17)
566
+ `, [
567
+ deadLetter.id, deadLetter.messageId, deadLetter.from, deadLetter.to,
568
+ deadLetter.topic ?? null, deadLetter.kind, deadLetter.body,
569
+ deadLetter.data ? JSON.stringify(deadLetter.data) : null,
570
+ deadLetter.thread ?? null, deadLetter.originalTs, deadLetter.dlqTs,
571
+ deadLetter.reason, deadLetter.errorMessage ?? null, deadLetter.attemptCount,
572
+ deadLetter.lastAttemptTs ?? null, deadLetter.dlqRetryCount, deadLetter.acknowledged
573
+ ]);
574
+
575
+ return deadLetter;
576
+ }
577
+
578
+ async get(id: string): Promise<DeadLetter | null> {
579
+ const result = await this.pool.query('SELECT * FROM dead_letters WHERE id = $1', [id]);
580
+ return result.rows[0] ? this.rowToDeadLetter(result.rows[0]) : null;
581
+ }
582
+
583
+ async query(query: DLQQuery = {}): Promise<DeadLetter[]> {
584
+ const conditions: string[] = [];
585
+ const params: unknown[] = [];
586
+ let paramIndex = 1;
587
+
588
+ if (query.to) {
589
+ conditions.push(`to_agent = $${paramIndex++}`);
590
+ params.push(query.to);
591
+ }
592
+ if (query.from) {
593
+ conditions.push(`from_agent = $${paramIndex++}`);
594
+ params.push(query.from);
595
+ }
596
+ if (query.reason) {
597
+ conditions.push(`reason = $${paramIndex++}`);
598
+ params.push(query.reason);
599
+ }
600
+ if (query.acknowledged !== undefined) {
601
+ conditions.push(`acknowledged = $${paramIndex++}`);
602
+ params.push(query.acknowledged);
603
+ }
604
+ if (query.afterTs) {
605
+ conditions.push(`dlq_ts > $${paramIndex++}`);
606
+ params.push(query.afterTs);
607
+ }
608
+ if (query.beforeTs) {
609
+ conditions.push(`dlq_ts < $${paramIndex++}`);
610
+ params.push(query.beforeTs);
611
+ }
612
+
613
+ const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
614
+ const orderColumn = query.orderBy === 'originalTs' ? 'original_ts' :
615
+ query.orderBy === 'attemptCount' ? 'attempt_count' : 'dlq_ts';
616
+ const orderDir = query.orderDir ?? 'DESC';
617
+ const limit = query.limit ?? 100;
618
+ const offset = query.offset ?? 0;
619
+
620
+ params.push(limit, offset);
621
+
622
+ const sql = `
623
+ SELECT * FROM dead_letters ${whereClause}
624
+ ORDER BY ${orderColumn} ${orderDir}
625
+ LIMIT $${paramIndex++} OFFSET $${paramIndex++}
626
+ `;
627
+
628
+ const result = await this.pool.query(sql, params);
629
+ return result.rows.map(row => this.rowToDeadLetter(row));
630
+ }
631
+
632
+ async acknowledge(id: string, acknowledgedBy: string = 'system'): Promise<boolean> {
633
+ const result = await this.pool.query(`
634
+ UPDATE dead_letters SET acknowledged = TRUE, acknowledged_ts = $1, acknowledged_by = $2
635
+ WHERE id = $3 AND acknowledged = FALSE
636
+ `, [Date.now(), acknowledgedBy, id]);
637
+ return (result.rowCount ?? 0) > 0;
638
+ }
639
+
640
+ async acknowledgeMany(ids: string[], acknowledgedBy: string = 'system'): Promise<number> {
641
+ const result = await this.pool.query(`
642
+ UPDATE dead_letters SET acknowledged = TRUE, acknowledged_ts = $1, acknowledged_by = $2
643
+ WHERE id = ANY($3) AND acknowledged = FALSE
644
+ `, [Date.now(), acknowledgedBy, ids]);
645
+ return result.rowCount ?? 0;
646
+ }
647
+
648
+ async incrementRetry(id: string): Promise<boolean> {
649
+ const result = await this.pool.query(`
650
+ UPDATE dead_letters SET dlq_retry_count = dlq_retry_count + 1, last_attempt_ts = $1
651
+ WHERE id = $2
652
+ `, [Date.now(), id]);
653
+ return (result.rowCount ?? 0) > 0;
654
+ }
655
+
656
+ async remove(id: string): Promise<boolean> {
657
+ const result = await this.pool.query('DELETE FROM dead_letters WHERE id = $1', [id]);
658
+ return (result.rowCount ?? 0) > 0;
659
+ }
660
+
661
+ async getStats(): Promise<DLQStats> {
662
+ const [totalResult, unackResult, reasonResult, targetResult, oldestResult, newestResult, avgResult] = await Promise.all([
663
+ this.pool.query('SELECT COUNT(*) as count FROM dead_letters'),
664
+ this.pool.query('SELECT COUNT(*) as count FROM dead_letters WHERE acknowledged = FALSE'),
665
+ this.pool.query('SELECT reason, COUNT(*) as count FROM dead_letters GROUP BY reason'),
666
+ this.pool.query('SELECT to_agent, COUNT(*) as count FROM dead_letters GROUP BY to_agent ORDER BY count DESC LIMIT 10'),
667
+ this.pool.query('SELECT MIN(dlq_ts) as ts FROM dead_letters WHERE acknowledged = FALSE'),
668
+ this.pool.query('SELECT MAX(dlq_ts) as ts FROM dead_letters WHERE acknowledged = FALSE'),
669
+ this.pool.query('SELECT AVG(dlq_retry_count) as avg FROM dead_letters'),
670
+ ]);
671
+
672
+ const byReason: Record<DLQFailureReason, number> = {
673
+ max_retries_exceeded: 0, ttl_expired: 0, connection_lost: 0, target_not_found: 0,
674
+ signature_invalid: 0, payload_too_large: 0, rate_limited: 0, unknown: 0,
675
+ };
676
+ for (const row of reasonResult.rows) {
677
+ byReason[row.reason as DLQFailureReason] = parseInt(row.count, 10);
678
+ }
679
+
680
+ const byTarget: Record<string, number> = {};
681
+ for (const row of targetResult.rows) {
682
+ byTarget[row.to_agent] = parseInt(row.count, 10);
683
+ }
684
+
685
+ return {
686
+ totalEntries: parseInt(totalResult.rows[0]?.count ?? '0', 10),
687
+ unacknowledged: parseInt(unackResult.rows[0]?.count ?? '0', 10),
688
+ byReason,
689
+ byTarget,
690
+ oldestEntryTs: oldestResult.rows[0]?.ts ? parseInt(oldestResult.rows[0].ts, 10) : null,
691
+ newestEntryTs: newestResult.rows[0]?.ts ? parseInt(newestResult.rows[0].ts, 10) : null,
692
+ avgRetryCount: parseFloat(avgResult.rows[0]?.avg ?? '0'),
693
+ };
694
+ }
695
+
696
+ async cleanup(retentionHours: number, maxEntries: number): Promise<{ removed: number }> {
697
+ const cutoffTs = Date.now() - retentionHours * 3600 * 1000;
698
+ const retentionResult = await this.pool.query('DELETE FROM dead_letters WHERE dlq_ts < $1', [cutoffTs]);
699
+
700
+ const countResult = await this.pool.query('SELECT COUNT(*) as count FROM dead_letters');
701
+ const count = parseInt(countResult.rows[0]?.count ?? '0', 10);
702
+ let maxEntriesRemoved = 0;
703
+
704
+ if (count > maxEntries) {
705
+ const excess = count - maxEntries;
706
+ const trimResult = await this.pool.query(`
707
+ DELETE FROM dead_letters WHERE id IN (
708
+ SELECT id FROM dead_letters WHERE acknowledged = TRUE ORDER BY dlq_ts ASC LIMIT $1
709
+ )
710
+ `, [excess]);
711
+ maxEntriesRemoved = trimResult.rowCount ?? 0;
712
+ }
713
+
714
+ return { removed: (retentionResult.rowCount ?? 0) + maxEntriesRemoved };
715
+ }
716
+
717
+ async getRetryable(maxRetries: number = 3, limit: number = 10): Promise<DeadLetter[]> {
718
+ const result = await this.pool.query(`
719
+ SELECT * FROM dead_letters
720
+ WHERE acknowledged = FALSE AND dlq_retry_count < $1
721
+ ORDER BY dlq_ts ASC LIMIT $2
722
+ `, [maxRetries, limit]);
723
+ return result.rows.map(row => this.rowToDeadLetter(row));
724
+ }
725
+
726
+ async close(): Promise<void> {
727
+ // Pool managed externally
728
+ }
729
+
730
+ private rowToDeadLetter(row: Record<string, unknown>): DeadLetter {
731
+ return {
732
+ id: row.id as string,
733
+ messageId: row.message_id as string,
734
+ from: row.from_agent as string,
735
+ to: row.to_agent as string,
736
+ topic: row.topic as string | undefined,
737
+ kind: row.kind as string,
738
+ body: row.body as string,
739
+ data: row.data as Record<string, unknown> | undefined,
740
+ thread: row.thread as string | undefined,
741
+ originalTs: parseInt(row.original_ts as string, 10),
742
+ dlqTs: parseInt(row.dlq_ts as string, 10),
743
+ reason: row.reason as DLQFailureReason,
744
+ errorMessage: row.error_message as string | undefined,
745
+ attemptCount: row.attempt_count as number,
746
+ lastAttemptTs: row.last_attempt_ts ? parseInt(row.last_attempt_ts as string, 10) : undefined,
747
+ dlqRetryCount: row.dlq_retry_count as number,
748
+ acknowledged: row.acknowledged as boolean,
749
+ acknowledgedTs: row.acknowledged_ts ? parseInt(row.acknowledged_ts as string, 10) : undefined,
750
+ acknowledgedBy: row.acknowledged_by as string | undefined,
751
+ };
752
+ }
753
+ }
754
+
755
+ // =============================================================================
756
+ // In-Memory Adapter (for testing)
757
+ // =============================================================================
758
+
759
+ export class InMemoryDLQAdapter implements DLQStorageAdapter {
760
+ private letters: Map<string, DeadLetter> = new Map();
761
+
762
+ async init(): Promise<void> {
763
+ // No-op
764
+ }
765
+
766
+ async add(
767
+ messageId: string,
768
+ envelope: MessageEnvelope,
769
+ reason: DLQFailureReason,
770
+ attemptCount: number,
771
+ errorMessage?: string
772
+ ): Promise<DeadLetter> {
773
+ const id = `dlq_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
774
+ const now = Date.now();
775
+
776
+ const deadLetter: DeadLetter = {
777
+ id,
778
+ messageId,
779
+ from: envelope.from,
780
+ to: envelope.to,
781
+ topic: envelope.topic,
782
+ kind: envelope.kind,
783
+ body: envelope.body,
784
+ data: envelope.data,
785
+ thread: envelope.thread,
786
+ originalTs: envelope.ts,
787
+ dlqTs: now,
788
+ reason,
789
+ errorMessage,
790
+ attemptCount,
791
+ lastAttemptTs: now,
792
+ dlqRetryCount: 0,
793
+ acknowledged: false,
794
+ };
795
+
796
+ this.letters.set(id, deadLetter);
797
+ return deadLetter;
798
+ }
799
+
800
+ async get(id: string): Promise<DeadLetter | null> {
801
+ return this.letters.get(id) ?? null;
802
+ }
803
+
804
+ async query(query: DLQQuery = {}): Promise<DeadLetter[]> {
805
+ let results = Array.from(this.letters.values());
806
+
807
+ if (query.to) results = results.filter(l => l.to === query.to);
808
+ if (query.from) results = results.filter(l => l.from === query.from);
809
+ if (query.reason) results = results.filter(l => l.reason === query.reason);
810
+ if (query.acknowledged !== undefined) results = results.filter(l => l.acknowledged === query.acknowledged);
811
+ if (query.afterTs) results = results.filter(l => l.dlqTs > query.afterTs!);
812
+ if (query.beforeTs) results = results.filter(l => l.dlqTs < query.beforeTs!);
813
+
814
+ const orderDir = query.orderDir ?? 'DESC';
815
+ const orderBy = query.orderBy ?? 'dlqTs';
816
+ results.sort((a, b) => {
817
+ const aVal = orderBy === 'originalTs' ? a.originalTs : orderBy === 'attemptCount' ? a.attemptCount : a.dlqTs;
818
+ const bVal = orderBy === 'originalTs' ? b.originalTs : orderBy === 'attemptCount' ? b.attemptCount : b.dlqTs;
819
+ return orderDir === 'ASC' ? aVal - bVal : bVal - aVal;
820
+ });
821
+
822
+ const offset = query.offset ?? 0;
823
+ const limit = query.limit ?? 100;
824
+ return results.slice(offset, offset + limit);
825
+ }
826
+
827
+ async acknowledge(id: string, acknowledgedBy: string = 'system'): Promise<boolean> {
828
+ const letter = this.letters.get(id);
829
+ if (!letter || letter.acknowledged) return false;
830
+ letter.acknowledged = true;
831
+ letter.acknowledgedTs = Date.now();
832
+ letter.acknowledgedBy = acknowledgedBy;
833
+ return true;
834
+ }
835
+
836
+ async acknowledgeMany(ids: string[], acknowledgedBy: string = 'system'): Promise<number> {
837
+ let count = 0;
838
+ for (const id of ids) {
839
+ if (await this.acknowledge(id, acknowledgedBy)) count++;
840
+ }
841
+ return count;
842
+ }
843
+
844
+ async incrementRetry(id: string): Promise<boolean> {
845
+ const letter = this.letters.get(id);
846
+ if (!letter) return false;
847
+ letter.dlqRetryCount++;
848
+ letter.lastAttemptTs = Date.now();
849
+ return true;
850
+ }
851
+
852
+ async remove(id: string): Promise<boolean> {
853
+ return this.letters.delete(id);
854
+ }
855
+
856
+ async getStats(): Promise<DLQStats> {
857
+ const letters = Array.from(this.letters.values());
858
+ const byReason: Record<DLQFailureReason, number> = {
859
+ max_retries_exceeded: 0, ttl_expired: 0, connection_lost: 0, target_not_found: 0,
860
+ signature_invalid: 0, payload_too_large: 0, rate_limited: 0, unknown: 0,
861
+ };
862
+ const byTarget: Record<string, number> = {};
863
+ let unacknowledged = 0;
864
+ let totalRetry = 0;
865
+
866
+ for (const l of letters) {
867
+ byReason[l.reason]++;
868
+ byTarget[l.to] = (byTarget[l.to] ?? 0) + 1;
869
+ if (!l.acknowledged) unacknowledged++;
870
+ totalRetry += l.dlqRetryCount;
871
+ }
872
+
873
+ const unackLetters = letters.filter(l => !l.acknowledged);
874
+ const timestamps = unackLetters.map(l => l.dlqTs);
875
+
876
+ return {
877
+ totalEntries: letters.length,
878
+ unacknowledged,
879
+ byReason,
880
+ byTarget,
881
+ oldestEntryTs: timestamps.length > 0 ? Math.min(...timestamps) : null,
882
+ newestEntryTs: timestamps.length > 0 ? Math.max(...timestamps) : null,
883
+ avgRetryCount: letters.length > 0 ? totalRetry / letters.length : 0,
884
+ };
885
+ }
886
+
887
+ async cleanup(retentionHours: number, maxEntries: number): Promise<{ removed: number }> {
888
+ const cutoffTs = Date.now() - retentionHours * 3600 * 1000;
889
+ let removed = 0;
890
+
891
+ for (const [id, letter] of this.letters) {
892
+ if (letter.dlqTs < cutoffTs) {
893
+ this.letters.delete(id);
894
+ removed++;
895
+ }
896
+ }
897
+
898
+ // Enforce max entries
899
+ if (this.letters.size > maxEntries) {
900
+ const sorted = Array.from(this.letters.entries())
901
+ .filter(([, l]) => l.acknowledged)
902
+ .sort((a, b) => a[1].dlqTs - b[1].dlqTs);
903
+
904
+ const excess = this.letters.size - maxEntries;
905
+ for (let i = 0; i < excess && i < sorted.length; i++) {
906
+ this.letters.delete(sorted[i][0]);
907
+ removed++;
908
+ }
909
+ }
910
+
911
+ return { removed };
912
+ }
913
+
914
+ async getRetryable(maxRetries: number = 3, limit: number = 10): Promise<DeadLetter[]> {
915
+ return Array.from(this.letters.values())
916
+ .filter(l => !l.acknowledged && l.dlqRetryCount < maxRetries)
917
+ .sort((a, b) => a.dlqTs - b.dlqTs)
918
+ .slice(0, limit);
919
+ }
920
+
921
+ async close(): Promise<void> {
922
+ this.letters.clear();
923
+ }
924
+ }
925
+
926
+ // =============================================================================
927
+ // Factory Function
928
+ // =============================================================================
929
+
930
+ export type DLQAdapterType = 'sqlite' | 'postgres' | 'memory';
931
+
932
+ export interface DLQAdapterOptions {
933
+ type: DLQAdapterType;
934
+ sqlite?: BetterSqlite3Database;
935
+ postgres?: PgPool;
936
+ }
937
+
938
+ /**
939
+ * Create a DLQ adapter based on configuration.
940
+ */
941
+ export function createDLQAdapter(options: DLQAdapterOptions): DLQStorageAdapter {
942
+ switch (options.type) {
943
+ case 'sqlite':
944
+ if (!options.sqlite) throw new Error('SQLite database required');
945
+ return new SQLiteDLQAdapter(options.sqlite);
946
+ case 'postgres':
947
+ if (!options.postgres) throw new Error('PostgreSQL pool required');
948
+ return new PostgresDLQAdapter(options.postgres);
949
+ case 'memory':
950
+ return new InMemoryDLQAdapter();
951
+ default:
952
+ throw new Error(`Unknown DLQ adapter type: ${options.type}`);
953
+ }
954
+ }