agent-relay 1.1.0 → 1.2.3

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 (567) hide show
  1. package/.gitattributes +3 -0
  2. package/.nvmrc +1 -0
  3. package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.json +65 -0
  4. package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.md +37 -0
  5. package/.trajectories/completed/2026-01/traj_1k5if5snst2e.json +65 -0
  6. package/.trajectories/completed/2026-01/traj_1k5if5snst2e.md +37 -0
  7. package/.trajectories/completed/2026-01/traj_1rp3rges5811.json +49 -0
  8. package/.trajectories/completed/2026-01/traj_1rp3rges5811.md +31 -0
  9. package/.trajectories/completed/2026-01/traj_22bhyulruouw.json +113 -0
  10. package/.trajectories/completed/2026-01/traj_22bhyulruouw.md +57 -0
  11. package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.json +53 -0
  12. package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.md +32 -0
  13. package/.trajectories/completed/2026-01/traj_3t0440mjeunc.json +26 -0
  14. package/.trajectories/completed/2026-01/traj_3t0440mjeunc.md +6 -0
  15. package/.trajectories/completed/2026-01/traj_45x9494d9xnr.json +47 -0
  16. package/.trajectories/completed/2026-01/traj_45x9494d9xnr.md +32 -0
  17. package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.json +53 -0
  18. package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.md +32 -0
  19. package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.json +59 -0
  20. package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.md +33 -0
  21. package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.json +53 -0
  22. package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.md +32 -0
  23. package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.json +48 -0
  24. package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.md +24 -0
  25. package/.trajectories/completed/2026-01/traj_7ludwvz45veh.json +209 -0
  26. package/.trajectories/completed/2026-01/traj_7ludwvz45veh.md +97 -0
  27. package/.trajectories/completed/2026-01/traj_9921cuhel0pj.json +48 -0
  28. package/.trajectories/completed/2026-01/traj_9921cuhel0pj.md +24 -0
  29. package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.json +49 -0
  30. package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.md +23 -0
  31. package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.json +53 -0
  32. package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.md +32 -0
  33. package/.trajectories/completed/2026-01/traj_cxofprm2m2en.json +49 -0
  34. package/.trajectories/completed/2026-01/traj_cxofprm2m2en.md +31 -0
  35. package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.json +26 -0
  36. package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.md +6 -0
  37. package/.trajectories/completed/2026-01/traj_dfuvww9pege5.json +59 -0
  38. package/.trajectories/completed/2026-01/traj_dfuvww9pege5.md +37 -0
  39. package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.json +77 -0
  40. package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.md +42 -0
  41. package/.trajectories/completed/2026-01/traj_gjdre5voouod.json +53 -0
  42. package/.trajectories/completed/2026-01/traj_gjdre5voouod.md +32 -0
  43. package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.json +25 -0
  44. package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.md +15 -0
  45. package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.json +101 -0
  46. package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.md +44 -0
  47. package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.json +22 -0
  48. package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.md +5 -0
  49. package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.json +53 -0
  50. package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.md +32 -0
  51. package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.json +25 -0
  52. package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.md +15 -0
  53. package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.json +53 -0
  54. package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.md +32 -0
  55. package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.json +53 -0
  56. package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.md +32 -0
  57. package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.json +48 -0
  58. package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.md +24 -0
  59. package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.json +53 -0
  60. package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.md +32 -0
  61. package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.json +77 -0
  62. package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.md +42 -0
  63. package/.trajectories/completed/2026-01/traj_qft54mi7nfor.json +53 -0
  64. package/.trajectories/completed/2026-01/traj_qft54mi7nfor.md +32 -0
  65. package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.json +83 -0
  66. package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.md +47 -0
  67. package/.trajectories/completed/2026-01/traj_rd9toccj18a0.json +59 -0
  68. package/.trajectories/completed/2026-01/traj_rd9toccj18a0.md +37 -0
  69. package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.json +48 -0
  70. package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.md +16 -0
  71. package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.json +59 -0
  72. package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.md +37 -0
  73. package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.json +53 -0
  74. package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.md +32 -0
  75. package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.json +84 -0
  76. package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.md +109 -0
  77. package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.json +53 -0
  78. package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.md +32 -0
  79. package/.trajectories/completed/2026-01/traj_v87hypnongqx.json +71 -0
  80. package/.trajectories/completed/2026-01/traj_v87hypnongqx.md +42 -0
  81. package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.json +53 -0
  82. package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.md +32 -0
  83. package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.json +20 -0
  84. package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.md +6 -0
  85. package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.json +175 -0
  86. package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.md +82 -0
  87. package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.json +47 -0
  88. package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.md +32 -0
  89. package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.json +59 -0
  90. package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.md +37 -0
  91. package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.json +53 -0
  92. package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.md +32 -0
  93. package/.trajectories/index.json +314 -0
  94. package/ARCHITECTURE.md +1245 -0
  95. package/README.md +1 -1
  96. package/TESTING.md +278 -0
  97. package/deploy/init-db.sql +5 -0
  98. package/deploy/scripts/setup-fly-workspaces.sh +69 -0
  99. package/deploy/scripts/setup-railway.sh +75 -0
  100. package/deploy/workspace/entrypoint-browser.sh +118 -0
  101. package/deploy/workspace/entrypoint.sh +348 -0
  102. package/deploy/workspace/git-credential-relay +111 -0
  103. package/dist/bridge/spawner.d.ts +53 -0
  104. package/dist/bridge/spawner.js +203 -19
  105. package/dist/bridge/types.d.ts +12 -0
  106. package/dist/cli/index.js +618 -5
  107. package/dist/cloud/api/auth.d.ts +3 -2
  108. package/dist/cloud/api/auth.js +10 -98
  109. package/dist/cloud/api/billing.js +30 -9
  110. package/dist/cloud/api/cli-pty-runner.d.ts +54 -0
  111. package/dist/cloud/api/cli-pty-runner.js +119 -0
  112. package/dist/cloud/api/codex-auth-helper.d.ts +15 -0
  113. package/dist/cloud/api/codex-auth-helper.js +100 -0
  114. package/dist/cloud/api/generic-webhooks.d.ts +8 -0
  115. package/dist/cloud/api/generic-webhooks.js +129 -0
  116. package/dist/cloud/api/git.d.ts +8 -0
  117. package/dist/cloud/api/git.js +152 -0
  118. package/dist/cloud/api/github-app.d.ts +11 -0
  119. package/dist/cloud/api/github-app.js +189 -0
  120. package/dist/cloud/api/middleware/planLimits.d.ts +7 -0
  121. package/dist/cloud/api/middleware/planLimits.js +39 -1
  122. package/dist/cloud/api/monitoring.d.ts +11 -0
  123. package/dist/cloud/api/monitoring.js +578 -0
  124. package/dist/cloud/api/nango-auth.d.ts +9 -0
  125. package/dist/cloud/api/nango-auth.js +377 -0
  126. package/dist/cloud/api/onboarding.d.ts +8 -1
  127. package/dist/cloud/api/onboarding.js +313 -119
  128. package/dist/cloud/api/policy.d.ts +8 -0
  129. package/dist/cloud/api/policy.js +229 -0
  130. package/dist/cloud/api/providers.js +114 -42
  131. package/dist/cloud/api/repos.d.ts +1 -0
  132. package/dist/cloud/api/repos.js +186 -0
  133. package/dist/cloud/api/test-helpers.d.ts +10 -0
  134. package/dist/cloud/api/test-helpers.js +575 -0
  135. package/dist/cloud/api/webhooks.d.ts +8 -0
  136. package/dist/cloud/api/webhooks.js +645 -0
  137. package/dist/cloud/api/workspaces.js +320 -12
  138. package/dist/cloud/billing/plans.js +32 -19
  139. package/dist/cloud/billing/types.d.ts +9 -3
  140. package/dist/cloud/config.d.ts +9 -2
  141. package/dist/cloud/config.js +13 -4
  142. package/dist/cloud/db/drizzle.d.ts +84 -1
  143. package/dist/cloud/db/drizzle.js +470 -0
  144. package/dist/cloud/db/index.d.ts +9 -4
  145. package/dist/cloud/db/index.js +11 -3
  146. package/dist/cloud/db/schema.d.ts +3283 -556
  147. package/dist/cloud/db/schema.js +314 -1
  148. package/dist/cloud/index.d.ts +1 -0
  149. package/dist/cloud/index.js +2 -0
  150. package/dist/cloud/provisioner/index.d.ts +56 -0
  151. package/dist/cloud/provisioner/index.js +676 -34
  152. package/dist/cloud/server.d.ts +1 -0
  153. package/dist/cloud/server.js +362 -13
  154. package/dist/cloud/services/auto-scaler.d.ts +152 -0
  155. package/dist/cloud/services/auto-scaler.js +439 -0
  156. package/dist/cloud/services/capacity-manager.d.ts +148 -0
  157. package/dist/cloud/services/capacity-manager.js +449 -0
  158. package/dist/cloud/services/ci-agent-spawner.d.ts +49 -0
  159. package/dist/cloud/services/ci-agent-spawner.js +373 -0
  160. package/dist/cloud/services/index.d.ts +12 -0
  161. package/dist/cloud/services/index.js +15 -0
  162. package/dist/cloud/services/mention-handler.d.ts +65 -0
  163. package/dist/cloud/services/mention-handler.js +405 -0
  164. package/dist/cloud/services/nango.d.ts +186 -0
  165. package/dist/cloud/services/nango.js +344 -0
  166. package/dist/cloud/services/persistence.d.ts +131 -0
  167. package/dist/cloud/services/persistence.js +200 -0
  168. package/dist/cloud/services/planLimits.d.ts +37 -0
  169. package/dist/cloud/services/planLimits.js +86 -5
  170. package/dist/cloud/services/scaling-orchestrator.d.ts +159 -0
  171. package/dist/cloud/services/scaling-orchestrator.js +502 -0
  172. package/dist/cloud/services/scaling-policy.d.ts +121 -0
  173. package/dist/cloud/services/scaling-policy.js +415 -0
  174. package/dist/cloud/vault/index.js +1 -1
  175. package/dist/cloud/webhooks/index.d.ts +24 -0
  176. package/dist/cloud/webhooks/index.js +29 -0
  177. package/dist/cloud/webhooks/parsers/github.d.ts +8 -0
  178. package/dist/cloud/webhooks/parsers/github.js +234 -0
  179. package/dist/cloud/webhooks/parsers/index.d.ts +23 -0
  180. package/dist/cloud/webhooks/parsers/index.js +30 -0
  181. package/dist/cloud/webhooks/parsers/linear.d.ts +9 -0
  182. package/dist/cloud/webhooks/parsers/linear.js +258 -0
  183. package/dist/cloud/webhooks/parsers/slack.d.ts +9 -0
  184. package/dist/cloud/webhooks/parsers/slack.js +214 -0
  185. package/dist/cloud/webhooks/responders/github.d.ts +8 -0
  186. package/dist/cloud/webhooks/responders/github.js +73 -0
  187. package/dist/cloud/webhooks/responders/index.d.ts +23 -0
  188. package/dist/cloud/webhooks/responders/index.js +30 -0
  189. package/dist/cloud/webhooks/responders/linear.d.ts +9 -0
  190. package/dist/cloud/webhooks/responders/linear.js +149 -0
  191. package/dist/cloud/webhooks/responders/slack.d.ts +20 -0
  192. package/dist/cloud/webhooks/responders/slack.js +178 -0
  193. package/dist/cloud/webhooks/router.d.ts +25 -0
  194. package/dist/cloud/webhooks/router.js +504 -0
  195. package/dist/cloud/webhooks/rules-engine.d.ts +24 -0
  196. package/dist/cloud/webhooks/rules-engine.js +287 -0
  197. package/dist/cloud/webhooks/types.d.ts +186 -0
  198. package/dist/cloud/webhooks/types.js +8 -0
  199. package/dist/continuity/formatter.d.ts +51 -0
  200. package/dist/continuity/formatter.js +313 -0
  201. package/dist/continuity/handoff-store.d.ts +67 -0
  202. package/dist/continuity/handoff-store.js +472 -0
  203. package/dist/continuity/index.d.ts +45 -0
  204. package/dist/continuity/index.js +48 -0
  205. package/dist/continuity/ledger-store.d.ts +110 -0
  206. package/dist/continuity/ledger-store.js +500 -0
  207. package/dist/continuity/manager.d.ts +178 -0
  208. package/dist/continuity/manager.js +562 -0
  209. package/dist/continuity/parser.d.ts +76 -0
  210. package/dist/continuity/parser.js +579 -0
  211. package/dist/continuity/types.d.ts +180 -0
  212. package/dist/continuity/types.js +9 -0
  213. package/dist/daemon/agent-manager.d.ts +27 -0
  214. package/dist/daemon/agent-manager.js +107 -6
  215. package/dist/daemon/agent-registry.d.ts +32 -0
  216. package/dist/daemon/agent-registry.js +42 -2
  217. package/dist/daemon/api.d.ts +12 -0
  218. package/dist/daemon/api.js +131 -2
  219. package/dist/daemon/cli-auth.d.ts +67 -0
  220. package/dist/daemon/cli-auth.js +537 -0
  221. package/dist/daemon/cloud-sync.js +9 -7
  222. package/dist/daemon/orchestrator.js +30 -0
  223. package/dist/daemon/router.d.ts +5 -0
  224. package/dist/daemon/router.js +78 -26
  225. package/dist/daemon/server.d.ts +5 -0
  226. package/dist/daemon/server.js +9 -1
  227. package/dist/daemon/services/browser-testing.d.ts +88 -0
  228. package/dist/daemon/services/browser-testing.js +244 -0
  229. package/dist/daemon/services/container-spawner.d.ts +135 -0
  230. package/dist/daemon/services/container-spawner.js +313 -0
  231. package/dist/daemon/types.d.ts +5 -1
  232. package/dist/dashboard/out/404.html +1 -1
  233. package/dist/dashboard/out/_next/static/chunks/116-2502180def231162.js +1 -0
  234. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
  235. package/dist/dashboard/out/_next/static/chunks/699-3b1cd6618a45d259.js +1 -0
  236. package/dist/dashboard/out/_next/static/chunks/724-2dae7627550ab88f.js +9 -0
  237. package/dist/dashboard/out/_next/static/chunks/766-1f2dd8cb7f766b0b.js +1 -0
  238. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-3fdfa60e53f2810d.js +1 -0
  239. package/dist/dashboard/out/_next/static/chunks/app/app/page-e6381e5a6e1fbcfd.js +1 -0
  240. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-3538dfe0ffe984b8.js +1 -0
  241. package/dist/dashboard/out/_next/static/chunks/app/history/{page-b6edd4dde8d08194.js → page-abb9ab2d329f56e9.js} +1 -1
  242. package/dist/dashboard/out/_next/static/chunks/app/layout-c0d118c0f92d969c.js +1 -0
  243. package/dist/dashboard/out/_next/static/chunks/app/login/page-c22d080201cbd9fb.js +1 -0
  244. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-67a3e98d9a43a6ed.js +1 -0
  245. package/dist/dashboard/out/_next/static/chunks/app/page-77e9c65420a06cfb.js +1 -0
  246. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-b08ed1c34d14434a.js +1 -0
  247. package/dist/dashboard/out/_next/static/chunks/app/providers/page-e88bc117ef7671c3.js +1 -0
  248. package/dist/dashboard/out/_next/static/chunks/app/signup/page-68d34f50baa8ab6b.js +1 -0
  249. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
  250. package/dist/dashboard/out/_next/static/chunks/{main-app-5d692157a8eb1fd9.js → main-app-6e8e8d3ef4e0192a.js} +1 -1
  251. package/dist/dashboard/out/_next/static/chunks/{main-c2f423b9c9f4591b.js → main-ed4e1fb6f29c34cf.js} +1 -1
  252. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
  253. package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +1 -0
  254. package/dist/dashboard/out/_next/static/css/7c3ae9e8617d42a5.css +1 -0
  255. package/dist/dashboard/out/app/onboarding.html +1 -0
  256. package/dist/dashboard/out/app/onboarding.txt +7 -0
  257. package/dist/dashboard/out/app.html +1 -14
  258. package/dist/dashboard/out/app.txt +2 -2
  259. package/dist/dashboard/out/connect-repos.html +1 -0
  260. package/dist/dashboard/out/connect-repos.txt +7 -0
  261. package/dist/dashboard/out/history.html +1 -1
  262. package/dist/dashboard/out/history.txt +2 -2
  263. package/dist/dashboard/out/index.html +1 -1
  264. package/dist/dashboard/out/index.txt +2 -2
  265. package/dist/dashboard/out/login.html +6 -0
  266. package/dist/dashboard/out/login.txt +7 -0
  267. package/dist/dashboard/out/metrics.html +1 -1
  268. package/dist/dashboard/out/metrics.txt +2 -2
  269. package/dist/dashboard/out/pricing.html +3 -3
  270. package/dist/dashboard/out/pricing.txt +2 -2
  271. package/dist/dashboard/out/providers.html +1 -0
  272. package/dist/dashboard/out/providers.txt +7 -0
  273. package/dist/dashboard/out/signup.html +6 -0
  274. package/dist/dashboard/out/signup.txt +7 -0
  275. package/dist/dashboard-server/server.js +1308 -8
  276. package/dist/hooks/emitter.d.ts +40 -0
  277. package/dist/hooks/emitter.js +63 -0
  278. package/dist/hooks/index.d.ts +3 -0
  279. package/dist/hooks/index.js +3 -0
  280. package/dist/hooks/registry.d.ts +173 -0
  281. package/dist/hooks/registry.js +476 -0
  282. package/dist/hooks/trajectory-hooks.d.ts +52 -0
  283. package/dist/hooks/trajectory-hooks.js +183 -0
  284. package/dist/hooks/types.d.ts +141 -0
  285. package/dist/index.d.ts +2 -0
  286. package/dist/index.js +3 -0
  287. package/dist/memory/adapters/index.d.ts +8 -0
  288. package/dist/memory/adapters/index.js +8 -0
  289. package/dist/memory/adapters/inmemory.d.ts +59 -0
  290. package/dist/memory/adapters/inmemory.js +195 -0
  291. package/dist/memory/adapters/supermemory.d.ts +71 -0
  292. package/dist/memory/adapters/supermemory.js +338 -0
  293. package/dist/memory/factory.d.ts +48 -0
  294. package/dist/memory/factory.js +143 -0
  295. package/dist/memory/index.d.ts +32 -0
  296. package/dist/memory/index.js +32 -0
  297. package/dist/memory/memory-hooks.d.ts +60 -0
  298. package/dist/memory/memory-hooks.js +313 -0
  299. package/dist/memory/service.d.ts +49 -0
  300. package/dist/memory/service.js +146 -0
  301. package/dist/memory/types.d.ts +195 -0
  302. package/dist/memory/types.js +8 -0
  303. package/dist/policy/agent-policy.d.ts +225 -0
  304. package/dist/policy/agent-policy.js +665 -0
  305. package/dist/policy/cloud-policy-fetcher.d.ts +12 -0
  306. package/dist/policy/cloud-policy-fetcher.js +64 -0
  307. package/dist/resiliency/crash-insights.d.ts +156 -0
  308. package/dist/resiliency/crash-insights.js +492 -0
  309. package/dist/resiliency/gossip-health.d.ts +137 -0
  310. package/dist/resiliency/gossip-health.js +241 -0
  311. package/dist/resiliency/index.d.ts +5 -0
  312. package/dist/resiliency/index.js +5 -0
  313. package/dist/resiliency/leader-watchdog.d.ts +109 -0
  314. package/dist/resiliency/leader-watchdog.js +189 -0
  315. package/dist/resiliency/memory-monitor.d.ts +172 -0
  316. package/dist/resiliency/memory-monitor.js +593 -0
  317. package/dist/resiliency/stateless-lead.d.ts +149 -0
  318. package/dist/resiliency/stateless-lead.js +308 -0
  319. package/dist/resiliency/supervisor.d.ts +38 -0
  320. package/dist/resiliency/supervisor.js +122 -0
  321. package/dist/shared/cli-auth-config.d.ts +91 -0
  322. package/dist/shared/cli-auth-config.js +264 -0
  323. package/dist/storage/adapter.d.ts +1 -1
  324. package/dist/trajectory/config.d.ts +84 -0
  325. package/dist/trajectory/config.js +163 -0
  326. package/dist/trajectory/index.d.ts +8 -0
  327. package/dist/trajectory/index.js +8 -0
  328. package/dist/trajectory/integration.d.ts +292 -0
  329. package/dist/trajectory/integration.js +834 -0
  330. package/dist/utils/logger.js +1 -1
  331. package/dist/utils/project-namespace.d.ts +24 -0
  332. package/dist/utils/project-namespace.js +84 -0
  333. package/dist/wrapper/parser.d.ts +10 -0
  334. package/dist/wrapper/parser.js +100 -33
  335. package/dist/wrapper/pty-wrapper.d.ts +197 -16
  336. package/dist/wrapper/pty-wrapper.js +943 -106
  337. package/dist/wrapper/shared.d.ts +165 -0
  338. package/dist/wrapper/shared.js +270 -0
  339. package/dist/wrapper/tmux-wrapper.d.ts +73 -11
  340. package/dist/wrapper/tmux-wrapper.js +541 -120
  341. package/package.json +16 -16
  342. package/scripts/postinstall.js +60 -0
  343. package/test-push.txt +1 -0
  344. package/bin/tmux +0 -0
  345. package/dist/bridge/config.d.ts.map +0 -1
  346. package/dist/bridge/config.js.map +0 -1
  347. package/dist/bridge/index.d.ts.map +0 -1
  348. package/dist/bridge/index.js.map +0 -1
  349. package/dist/bridge/multi-project-client.d.ts.map +0 -1
  350. package/dist/bridge/multi-project-client.js.map +0 -1
  351. package/dist/bridge/shadow-cli.d.ts.map +0 -1
  352. package/dist/bridge/shadow-cli.js.map +0 -1
  353. package/dist/bridge/shadow-config.d.ts.map +0 -1
  354. package/dist/bridge/shadow-config.js.map +0 -1
  355. package/dist/bridge/spawner.d.ts.map +0 -1
  356. package/dist/bridge/spawner.js.map +0 -1
  357. package/dist/bridge/teams-config.d.ts.map +0 -1
  358. package/dist/bridge/teams-config.js.map +0 -1
  359. package/dist/bridge/types.d.ts.map +0 -1
  360. package/dist/bridge/types.js.map +0 -1
  361. package/dist/bridge/utils.d.ts.map +0 -1
  362. package/dist/bridge/utils.js.map +0 -1
  363. package/dist/cli/index.d.ts.map +0 -1
  364. package/dist/cli/index.js.map +0 -1
  365. package/dist/cloud/api/auth.d.ts.map +0 -1
  366. package/dist/cloud/api/auth.js.map +0 -1
  367. package/dist/cloud/api/billing.d.ts.map +0 -1
  368. package/dist/cloud/api/billing.js.map +0 -1
  369. package/dist/cloud/api/coordinators.d.ts.map +0 -1
  370. package/dist/cloud/api/coordinators.js.map +0 -1
  371. package/dist/cloud/api/daemons.d.ts.map +0 -1
  372. package/dist/cloud/api/daemons.js.map +0 -1
  373. package/dist/cloud/api/middleware/planLimits.d.ts.map +0 -1
  374. package/dist/cloud/api/middleware/planLimits.js.map +0 -1
  375. package/dist/cloud/api/onboarding.d.ts.map +0 -1
  376. package/dist/cloud/api/onboarding.js.map +0 -1
  377. package/dist/cloud/api/providers.d.ts.map +0 -1
  378. package/dist/cloud/api/providers.js.map +0 -1
  379. package/dist/cloud/api/repos.d.ts.map +0 -1
  380. package/dist/cloud/api/repos.js.map +0 -1
  381. package/dist/cloud/api/teams.d.ts.map +0 -1
  382. package/dist/cloud/api/teams.js.map +0 -1
  383. package/dist/cloud/api/usage.d.ts.map +0 -1
  384. package/dist/cloud/api/usage.js.map +0 -1
  385. package/dist/cloud/api/workspaces.d.ts.map +0 -1
  386. package/dist/cloud/api/workspaces.js.map +0 -1
  387. package/dist/cloud/billing/index.d.ts.map +0 -1
  388. package/dist/cloud/billing/index.js.map +0 -1
  389. package/dist/cloud/billing/plans.d.ts.map +0 -1
  390. package/dist/cloud/billing/plans.js.map +0 -1
  391. package/dist/cloud/billing/service.d.ts.map +0 -1
  392. package/dist/cloud/billing/service.js.map +0 -1
  393. package/dist/cloud/billing/types.d.ts.map +0 -1
  394. package/dist/cloud/billing/types.js.map +0 -1
  395. package/dist/cloud/config.d.ts.map +0 -1
  396. package/dist/cloud/config.js.map +0 -1
  397. package/dist/cloud/db/drizzle.d.ts.map +0 -1
  398. package/dist/cloud/db/drizzle.js.map +0 -1
  399. package/dist/cloud/db/index.d.ts.map +0 -1
  400. package/dist/cloud/db/index.js.map +0 -1
  401. package/dist/cloud/db/schema.d.ts.map +0 -1
  402. package/dist/cloud/db/schema.js.map +0 -1
  403. package/dist/cloud/index.d.ts.map +0 -1
  404. package/dist/cloud/index.js.map +0 -1
  405. package/dist/cloud/provisioner/index.d.ts.map +0 -1
  406. package/dist/cloud/provisioner/index.js.map +0 -1
  407. package/dist/cloud/server.d.ts.map +0 -1
  408. package/dist/cloud/server.js.map +0 -1
  409. package/dist/cloud/services/coordinator.d.ts.map +0 -1
  410. package/dist/cloud/services/coordinator.js.map +0 -1
  411. package/dist/cloud/services/planLimits.d.ts.map +0 -1
  412. package/dist/cloud/services/planLimits.js.map +0 -1
  413. package/dist/cloud/vault/index.d.ts.map +0 -1
  414. package/dist/cloud/vault/index.js.map +0 -1
  415. package/dist/daemon/agent-manager.d.ts.map +0 -1
  416. package/dist/daemon/agent-manager.js.map +0 -1
  417. package/dist/daemon/agent-registry.d.ts.map +0 -1
  418. package/dist/daemon/agent-registry.js.map +0 -1
  419. package/dist/daemon/api.d.ts.map +0 -1
  420. package/dist/daemon/api.js.map +0 -1
  421. package/dist/daemon/auth.d.ts.map +0 -1
  422. package/dist/daemon/auth.js.map +0 -1
  423. package/dist/daemon/cloud-sync.d.ts.map +0 -1
  424. package/dist/daemon/cloud-sync.js.map +0 -1
  425. package/dist/daemon/connection.d.ts.map +0 -1
  426. package/dist/daemon/connection.js.map +0 -1
  427. package/dist/daemon/index.d.ts.map +0 -1
  428. package/dist/daemon/index.js.map +0 -1
  429. package/dist/daemon/orchestrator.d.ts.map +0 -1
  430. package/dist/daemon/orchestrator.js.map +0 -1
  431. package/dist/daemon/registry.d.ts.map +0 -1
  432. package/dist/daemon/registry.js.map +0 -1
  433. package/dist/daemon/router.d.ts.map +0 -1
  434. package/dist/daemon/router.js.map +0 -1
  435. package/dist/daemon/server.d.ts.map +0 -1
  436. package/dist/daemon/server.js.map +0 -1
  437. package/dist/daemon/types.d.ts.map +0 -1
  438. package/dist/daemon/types.js.map +0 -1
  439. package/dist/daemon/workspace-manager.d.ts.map +0 -1
  440. package/dist/daemon/workspace-manager.js.map +0 -1
  441. package/dist/dashboard/out/_next/static/chunks/693-7b3301d8f6bc5014.js +0 -1
  442. package/dist/dashboard/out/_next/static/chunks/713-f78477eb185f1f4d.js +0 -1
  443. package/dist/dashboard/out/_next/static/chunks/766-e53e1cfe39b0b5b5.js +0 -1
  444. package/dist/dashboard/out/_next/static/chunks/900-037c64bfd797fb2a.js +0 -1
  445. package/dist/dashboard/out/_next/static/chunks/app/app/page-e3d9e1f4466b9bae.js +0 -1
  446. package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +0 -1
  447. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-e68825a81db67ba1.js +0 -1
  448. package/dist/dashboard/out/_next/static/chunks/app/page-cc108bf68c8a657f.js +0 -1
  449. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-d80e03a5297f95b6.js +0 -1
  450. package/dist/dashboard/out/_next/static/chunks/webpack-a5acc2831d094776.js +0 -1
  451. package/dist/dashboard/out/_next/static/css/79b80143647a07d7.css +0 -1
  452. package/dist/dashboard/out/_next/static/css/8cf277370ad48cfe.css +0 -1
  453. package/dist/dashboard-server/metrics.d.ts.map +0 -1
  454. package/dist/dashboard-server/metrics.js.map +0 -1
  455. package/dist/dashboard-server/needs-attention.d.ts.map +0 -1
  456. package/dist/dashboard-server/needs-attention.js.map +0 -1
  457. package/dist/dashboard-server/server.d.ts.map +0 -1
  458. package/dist/dashboard-server/server.js.map +0 -1
  459. package/dist/dashboard-server/start.d.ts.map +0 -1
  460. package/dist/dashboard-server/start.js.map +0 -1
  461. package/dist/hooks/inbox-check/hook.d.ts.map +0 -1
  462. package/dist/hooks/inbox-check/hook.js.map +0 -1
  463. package/dist/hooks/inbox-check/index.d.ts.map +0 -1
  464. package/dist/hooks/inbox-check/index.js.map +0 -1
  465. package/dist/hooks/inbox-check/types.d.ts.map +0 -1
  466. package/dist/hooks/inbox-check/types.js.map +0 -1
  467. package/dist/hooks/inbox-check/utils.d.ts.map +0 -1
  468. package/dist/hooks/inbox-check/utils.js.map +0 -1
  469. package/dist/hooks/index.d.ts.map +0 -1
  470. package/dist/hooks/index.js.map +0 -1
  471. package/dist/hooks/types.d.ts.map +0 -1
  472. package/dist/hooks/types.js.map +0 -1
  473. package/dist/index.d.ts.map +0 -1
  474. package/dist/index.js.map +0 -1
  475. package/dist/protocol/framing.d.ts.map +0 -1
  476. package/dist/protocol/framing.js.map +0 -1
  477. package/dist/protocol/index.d.ts.map +0 -1
  478. package/dist/protocol/index.js.map +0 -1
  479. package/dist/protocol/types.d.ts.map +0 -1
  480. package/dist/protocol/types.js.map +0 -1
  481. package/dist/resiliency/context-persistence.d.ts.map +0 -1
  482. package/dist/resiliency/context-persistence.js.map +0 -1
  483. package/dist/resiliency/health-monitor.d.ts.map +0 -1
  484. package/dist/resiliency/health-monitor.js.map +0 -1
  485. package/dist/resiliency/index.d.ts.map +0 -1
  486. package/dist/resiliency/index.js.map +0 -1
  487. package/dist/resiliency/logger.d.ts.map +0 -1
  488. package/dist/resiliency/logger.js.map +0 -1
  489. package/dist/resiliency/metrics.d.ts.map +0 -1
  490. package/dist/resiliency/metrics.js.map +0 -1
  491. package/dist/resiliency/provider-context.d.ts.map +0 -1
  492. package/dist/resiliency/provider-context.js.map +0 -1
  493. package/dist/resiliency/supervisor.d.ts.map +0 -1
  494. package/dist/resiliency/supervisor.js.map +0 -1
  495. package/dist/state/agent-state.d.ts.map +0 -1
  496. package/dist/state/agent-state.js.map +0 -1
  497. package/dist/storage/adapter.d.ts.map +0 -1
  498. package/dist/storage/adapter.js.map +0 -1
  499. package/dist/storage/sqlite-adapter.d.ts.map +0 -1
  500. package/dist/storage/sqlite-adapter.js.map +0 -1
  501. package/dist/utils/agent-config.d.ts.map +0 -1
  502. package/dist/utils/agent-config.js.map +0 -1
  503. package/dist/utils/command-resolver.d.ts.map +0 -1
  504. package/dist/utils/command-resolver.js.map +0 -1
  505. package/dist/utils/index.d.ts.map +0 -1
  506. package/dist/utils/index.js.map +0 -1
  507. package/dist/utils/logger.d.ts.map +0 -1
  508. package/dist/utils/logger.js.map +0 -1
  509. package/dist/utils/name-generator.d.ts.map +0 -1
  510. package/dist/utils/name-generator.js.map +0 -1
  511. package/dist/utils/project-namespace.d.ts.map +0 -1
  512. package/dist/utils/project-namespace.js.map +0 -1
  513. package/dist/utils/tmux-resolver.d.ts.map +0 -1
  514. package/dist/utils/tmux-resolver.js.map +0 -1
  515. package/dist/utils/update-checker.d.ts.map +0 -1
  516. package/dist/utils/update-checker.js.map +0 -1
  517. package/dist/wrapper/client.d.ts.map +0 -1
  518. package/dist/wrapper/client.js.map +0 -1
  519. package/dist/wrapper/inbox.d.ts.map +0 -1
  520. package/dist/wrapper/inbox.js.map +0 -1
  521. package/dist/wrapper/index.d.ts.map +0 -1
  522. package/dist/wrapper/index.js.map +0 -1
  523. package/dist/wrapper/parser.d.ts.map +0 -1
  524. package/dist/wrapper/parser.js.map +0 -1
  525. package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
  526. package/dist/wrapper/pty-wrapper.js.map +0 -1
  527. package/dist/wrapper/tmux-wrapper.d.ts.map +0 -1
  528. package/dist/wrapper/tmux-wrapper.js.map +0 -1
  529. package/docs/AGENTS.md +0 -513
  530. package/docs/ARCHITECTURE_DECISIONS.md +0 -175
  531. package/docs/CHANGELOG.md +0 -11
  532. package/docs/CLI-SIMPLIFICATION-COMPLETE.md +0 -48
  533. package/docs/CLOUD-ARCHITECTURE.md +0 -652
  534. package/docs/CLOUD-ONBOARDING-DESIGN.md +0 -1983
  535. package/docs/COMPETITIVE_ANALYSIS.md +0 -897
  536. package/docs/CONTRIBUTING.md +0 -151
  537. package/docs/DESIGN_BRIDGE_STAFFING.md +0 -878
  538. package/docs/DESIGN_V2.md +0 -1079
  539. package/docs/INTEGRATION-GUIDE.md +0 -926
  540. package/docs/MONETIZATION.md +0 -1679
  541. package/docs/PROPOSAL-trajectories.md +0 -1582
  542. package/docs/PROTOCOL.md +0 -325
  543. package/docs/SCALING_ANALYSIS.md +0 -280
  544. package/docs/TESTING_PRESENCE_FEATURES.md +0 -327
  545. package/docs/TMUX_IMPLEMENTATION_NOTES.md +0 -364
  546. package/docs/TMUX_IMPROVEMENTS.md +0 -968
  547. package/docs/agent-relay-snippet.md +0 -168
  548. package/docs/competitive-analysis-mcp-agent-mail.md +0 -389
  549. package/docs/dashboard-v2-plan.md +0 -179
  550. package/docs/guides/CLOUD.md +0 -236
  551. package/docs/guides/LOCAL.md +0 -535
  552. package/docs/guides/SELF-HOSTED.md +0 -494
  553. package/docs/proposals/shadow-as-subagent.md +0 -765
  554. package/docs/proposals/slack-bot-integration.md +0 -1457
  555. package/docs/removable-code-analysis.md +0 -24
  556. package/scripts/dev/PUBLIC_RELEASE_PLAN.md +0 -88
  557. package/scripts/dev/dev-team-setup.sh +0 -431
  558. package/scripts/e2e-test.sh +0 -119
  559. package/scripts/games/game-protocol.md +0 -79
  560. package/scripts/games/hearts-setup.sh +0 -264
  561. package/scripts/tictactoe-setup.sh +0 -181
  562. /package/dist/dashboard/out/_next/static/chunks/{117-b2cd8d6485aacf2b.js → 117-f7b8ab0809342e77.js} +0 -0
  563. /package/dist/dashboard/out/_next/static/chunks/{648-8f3f26864ce515e5.js → 648-5cc6e1921389a58a.js} +0 -0
  564. /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-0b990dbb71d72a98.js → page-53b8a69f76db17d0.js} +0 -0
  565. /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-bf46c09eb57e019c.js → fd9d1056-609918ca7b6280bb.js} +0 -0
  566. /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → wPgKJtcOmTFLpUncDg16A}/_buildManifest.js +0 -0
  567. /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → wPgKJtcOmTFLpUncDg16A}/_ssgManifest.js +0 -0
@@ -0,0 +1,579 @@
1
+ /**
2
+ * Continuity Command Parser
3
+ *
4
+ * Parses `->continuity:` patterns from agent output.
5
+ * Similar to how `->relay:` works for messaging.
6
+ *
7
+ * Supported patterns:
8
+ * ->continuity:save <<<...>>>
9
+ * ->continuity:load
10
+ * ->continuity:search "query"
11
+ * ->continuity:uncertain "item"
12
+ * ->continuity:handoff <<<...>>>
13
+ */
14
+ /**
15
+ * Regex patterns for continuity commands
16
+ */
17
+ const PATTERNS = {
18
+ // ->continuity:save <<<...>>> or ->continuity:save --handoff <<<...>>>
19
+ save: /->continuity:save(?:\s+(--handoff))?\s*<<<([\s\S]*?)>>>/,
20
+ // ->continuity:load
21
+ load: /->continuity:load\b/,
22
+ // ->continuity:search "query" or ->continuity:search <<<query>>>
23
+ search: /->continuity:search\s+(?:"([^"]+)"|<<<([\s\S]*?)>>>)/,
24
+ // ->continuity:uncertain "item"
25
+ uncertain: /->continuity:uncertain\s+"([^"]+)"/,
26
+ // ->continuity:handoff <<<...>>> (explicit handoff creation)
27
+ handoff: /->continuity:handoff\s*<<<([\s\S]*?)>>>/,
28
+ };
29
+ /**
30
+ * Known placeholder/template values that should be filtered out.
31
+ * These appear in documentation examples and startup messages.
32
+ */
33
+ const PLACEHOLDER_VALUES = new Set([
34
+ '...',
35
+ '....',
36
+ 'What you\'ve done',
37
+ 'What you\'re working on',
38
+ 'What you\'re working on now',
39
+ 'What\'s remaining',
40
+ 'task1',
41
+ 'task2',
42
+ 'task3',
43
+ 'Important context for session recovery',
44
+ 'src/file1.ts',
45
+ 'src/file2.ts',
46
+ 'item1',
47
+ 'item2',
48
+ ]);
49
+ /**
50
+ * Check if a value is a placeholder/template string that should be filtered out.
51
+ */
52
+ export function isPlaceholderValue(value) {
53
+ if (!value)
54
+ return true;
55
+ const trimmed = value.trim();
56
+ if (!trimmed)
57
+ return true;
58
+ // Exact match against known placeholders
59
+ if (PLACEHOLDER_VALUES.has(trimmed))
60
+ return true;
61
+ // Check for ellipsis-only values
62
+ if (/^\.{2,}$/.test(trimmed))
63
+ return true;
64
+ // Check for template-like patterns: [...]
65
+ if (/^\[\.{3}\]$/.test(trimmed))
66
+ return true;
67
+ // Check for placeholder array syntax: [...]
68
+ if (trimmed === '[...]')
69
+ return true;
70
+ return false;
71
+ }
72
+ /**
73
+ * Filter an array to remove placeholder values.
74
+ */
75
+ export function filterPlaceholders(items) {
76
+ return items.filter(item => !isPlaceholderValue(item));
77
+ }
78
+ /**
79
+ * Parse a continuity command from agent output
80
+ */
81
+ export function parseContinuityCommand(output) {
82
+ // Check for save command
83
+ const saveMatch = output.match(PATTERNS.save);
84
+ if (saveMatch) {
85
+ return {
86
+ type: 'save',
87
+ content: saveMatch[2].trim(),
88
+ createHandoff: saveMatch[1] === '--handoff',
89
+ };
90
+ }
91
+ // Check for load command
92
+ if (PATTERNS.load.test(output)) {
93
+ return {
94
+ type: 'load',
95
+ };
96
+ }
97
+ // Check for search command
98
+ const searchMatch = output.match(PATTERNS.search);
99
+ if (searchMatch) {
100
+ return {
101
+ type: 'search',
102
+ query: (searchMatch[1] || searchMatch[2]).trim(),
103
+ };
104
+ }
105
+ // Check for uncertain command
106
+ const uncertainMatch = output.match(PATTERNS.uncertain);
107
+ if (uncertainMatch) {
108
+ return {
109
+ type: 'uncertain',
110
+ item: uncertainMatch[1].trim(),
111
+ };
112
+ }
113
+ // Check for handoff command
114
+ const handoffMatch = output.match(PATTERNS.handoff);
115
+ if (handoffMatch) {
116
+ return {
117
+ type: 'handoff',
118
+ content: handoffMatch[1].trim(),
119
+ createHandoff: true,
120
+ };
121
+ }
122
+ return null;
123
+ }
124
+ /**
125
+ * Check if output contains any continuity command
126
+ */
127
+ export function hasContinuityCommand(output) {
128
+ return Object.values(PATTERNS).some((pattern) => pattern.test(output));
129
+ }
130
+ /**
131
+ * Map section headers to ledger field names
132
+ */
133
+ function mapSectionToField(section) {
134
+ const sectionMap = {
135
+ 'completed': 'completed',
136
+ 'previously completed': 'completed',
137
+ 'done': 'completed',
138
+ 'finished': 'completed',
139
+ 'in progress': 'inProgress',
140
+ 'working': 'inProgress',
141
+ 'ongoing': 'inProgress',
142
+ 'blocked': 'blocked',
143
+ 'blockers': 'blocked',
144
+ 'stuck': 'blocked',
145
+ 'key decisions': 'keyDecisions',
146
+ 'prior decisions': 'keyDecisions',
147
+ 'decisions': 'keyDecisions',
148
+ 'needs verification': 'uncertainItems',
149
+ 'uncertain': 'uncertainItems',
150
+ 'relevant files': 'fileContext',
151
+ 'key files': 'fileContext',
152
+ 'files': 'fileContext',
153
+ 'next steps': 'nextSteps',
154
+ 'todo': 'nextSteps',
155
+ 'next': 'nextSteps',
156
+ 'learnings': 'learnings',
157
+ };
158
+ return sectionMap[section] || null;
159
+ }
160
+ /**
161
+ * Add an item to the appropriate ledger section.
162
+ * Filters out placeholder/template values.
163
+ */
164
+ function addItemToSection(result, section, item) {
165
+ const field = mapSectionToField(section);
166
+ if (!field)
167
+ return;
168
+ // Filter out placeholder values
169
+ if (isPlaceholderValue(item))
170
+ return;
171
+ switch (field) {
172
+ case 'completed':
173
+ result.completed = [...(result.completed || []), item];
174
+ break;
175
+ case 'inProgress':
176
+ result.inProgress = [...(result.inProgress || []), item];
177
+ break;
178
+ case 'blocked':
179
+ result.blocked = [...(result.blocked || []), item];
180
+ break;
181
+ case 'keyDecisions':
182
+ result.keyDecisions = [
183
+ ...(result.keyDecisions || []),
184
+ { decision: item, timestamp: new Date() },
185
+ ];
186
+ break;
187
+ case 'uncertainItems':
188
+ result.uncertainItems = [...(result.uncertainItems || []), item];
189
+ break;
190
+ case 'fileContext':
191
+ result.fileContext = [...(result.fileContext || []), { path: item }];
192
+ break;
193
+ case 'nextSteps':
194
+ result.inProgress = [...(result.inProgress || []), item];
195
+ break;
196
+ }
197
+ }
198
+ /**
199
+ * Process a field-value pair from bold markdown or plain text.
200
+ * Filters out placeholder/template values.
201
+ */
202
+ function processFieldValue(result, field, value) {
203
+ switch (field) {
204
+ case 'current task':
205
+ case 'task':
206
+ case 'working on':
207
+ // Only set if not a placeholder
208
+ if (!isPlaceholderValue(value)) {
209
+ result.currentTask = value;
210
+ }
211
+ break;
212
+ case 'completed':
213
+ case 'done':
214
+ case 'finished':
215
+ result.completed = filterPlaceholders(parseListValue(value));
216
+ break;
217
+ case 'in progress':
218
+ case 'working':
219
+ case 'ongoing':
220
+ result.inProgress = filterPlaceholders(parseListValue(value));
221
+ break;
222
+ case 'blocked':
223
+ case 'blockers':
224
+ case 'stuck':
225
+ result.blocked = filterPlaceholders(parseListValue(value));
226
+ break;
227
+ case 'key decision':
228
+ case 'key decisions':
229
+ case 'decisions':
230
+ case 'decided':
231
+ result.keyDecisions = parseDecisions(value);
232
+ break;
233
+ case 'uncertain':
234
+ case 'unconfirmed':
235
+ case 'needs verification':
236
+ case 'to verify':
237
+ result.uncertainItems = filterPlaceholders(parseListValue(value));
238
+ break;
239
+ case 'files':
240
+ case 'file context':
241
+ case 'relevant files':
242
+ result.fileContext = parseFileRefs(value).filter(f => !isPlaceholderValue(f.path));
243
+ break;
244
+ case 'next':
245
+ case 'next steps':
246
+ case 'todo':
247
+ result.inProgress = [...(result.inProgress || []), ...filterPlaceholders(parseListValue(value))];
248
+ break;
249
+ case 'phase':
250
+ case 'last phase':
251
+ result.pderoPhase = value.toLowerCase();
252
+ break;
253
+ }
254
+ }
255
+ /**
256
+ * Parse the content of a save command into ledger fields
257
+ *
258
+ * Expected format:
259
+ * Current task: <task>
260
+ * Completed: <item>, <item>, ...
261
+ * In progress: <item>, ...
262
+ * Blocked: <item>, ...
263
+ * Key decisions: <decision>
264
+ * Uncertain: <item>, ...
265
+ * Files: <path>:<lines>, ...
266
+ *
267
+ * Also handles markdown-formatted content:
268
+ * **Current Task:** <task>
269
+ * ### Completed
270
+ * - ✓ <item>
271
+ */
272
+ export function parseSaveContent(content) {
273
+ const result = {
274
+ completed: [],
275
+ inProgress: [],
276
+ blocked: [],
277
+ keyDecisions: [],
278
+ uncertainItems: [],
279
+ fileContext: [],
280
+ };
281
+ const lines = content.split('\n');
282
+ let currentSection = null;
283
+ for (const line of lines) {
284
+ const trimmed = line.trim();
285
+ if (!trimmed)
286
+ continue;
287
+ // Check for markdown section headers (## or ###)
288
+ const sectionMatch = trimmed.match(/^#{2,3}\s+(.+)$/);
289
+ if (sectionMatch) {
290
+ currentSection = sectionMatch[1].toLowerCase().trim();
291
+ continue;
292
+ }
293
+ // Skip top-level markdown headers
294
+ if (trimmed.startsWith('#'))
295
+ continue;
296
+ // Handle markdown list items under a section
297
+ if (trimmed.startsWith('-') && currentSection) {
298
+ const itemContent = trimmed.slice(1).trim().replace(/^[✓⚠❓]\s*/, '');
299
+ if (itemContent) {
300
+ addItemToSection(result, currentSection, itemContent);
301
+ }
302
+ continue;
303
+ }
304
+ // Skip standalone list items without a section context
305
+ if (trimmed.startsWith('-') && !currentSection) {
306
+ continue;
307
+ }
308
+ // Match "**Field:** value" (markdown bold syntax - colon can be inside or outside asterisks)
309
+ // Format 1: **Field:** value (colon inside asterisks)
310
+ // Format 2: **Field**: value (colon outside asterisks)
311
+ const boldMatch = trimmed.match(/^\*\*([^*:]+):?\*\*:?\s*(.*)$/);
312
+ if (boldMatch) {
313
+ const field = boldMatch[1].toLowerCase().trim();
314
+ const value = boldMatch[2].trim();
315
+ processFieldValue(result, field, value);
316
+ // Reset section when we see a bold field
317
+ currentSection = null;
318
+ continue;
319
+ }
320
+ // Match "Field: value" or "Field:" followed by list items
321
+ const colonIndex = trimmed.indexOf(':');
322
+ if (colonIndex === -1)
323
+ continue;
324
+ // Skip if colon is too early (likely a file path like "src/file.ts:10")
325
+ // or if field contains special characters that suggest it's not a field
326
+ const potentialField = trimmed.slice(0, colonIndex);
327
+ if (colonIndex < 2 ||
328
+ potentialField.includes('/') ||
329
+ potentialField.includes('\\') ||
330
+ potentialField.includes('`')) {
331
+ continue;
332
+ }
333
+ const field = potentialField.toLowerCase().trim();
334
+ const value = trimmed.slice(colonIndex + 1).trim();
335
+ // Reset section when we see a new field
336
+ currentSection = null;
337
+ processFieldValue(result, field, value);
338
+ }
339
+ return result;
340
+ }
341
+ /**
342
+ * Parse a comma or newline separated list
343
+ */
344
+ function parseListValue(value) {
345
+ if (!value)
346
+ return [];
347
+ // Handle both comma-separated and newline-separated
348
+ return value
349
+ .split(/[,\n]/)
350
+ .map((item) => item.trim())
351
+ .filter((item) => item && !item.startsWith('-') && item !== '-')
352
+ .map((item) => item.replace(/^[-*]\s*/, '').trim())
353
+ .filter(Boolean);
354
+ }
355
+ /**
356
+ * Parse decisions from value
357
+ */
358
+ function parseDecisions(value) {
359
+ const items = parseListValue(value);
360
+ return items.map((item) => ({
361
+ decision: item,
362
+ timestamp: new Date(),
363
+ }));
364
+ }
365
+ /**
366
+ * Parse file references from value
367
+ * Format: path:startLine-endLine, path, path:line
368
+ */
369
+ function parseFileRefs(value) {
370
+ const items = parseListValue(value);
371
+ return items.map((item) => {
372
+ // Match path:startLine-endLine or path:line or just path
373
+ const match = item.match(/^([^:]+)(?::(\d+)(?:-(\d+))?)?$/);
374
+ if (!match) {
375
+ return { path: item.trim() };
376
+ }
377
+ const ref = { path: match[1].trim() };
378
+ if (match[2]) {
379
+ const startLine = parseInt(match[2]);
380
+ const endLine = match[3] ? parseInt(match[3]) : startLine;
381
+ ref.lines = [startLine, endLine];
382
+ }
383
+ return ref;
384
+ });
385
+ }
386
+ export function parseHandoffContent(content) {
387
+ const result = {
388
+ completedWork: [],
389
+ nextSteps: [],
390
+ decisions: [],
391
+ fileReferences: [],
392
+ learnings: [],
393
+ };
394
+ const lines = content.split('\n');
395
+ let currentSection = null;
396
+ for (const line of lines) {
397
+ const trimmed = line.trim();
398
+ if (!trimmed)
399
+ continue;
400
+ // Check for markdown section headers (## or ###)
401
+ const sectionMatch = trimmed.match(/^#{2,3}\s+(.+)$/);
402
+ if (sectionMatch) {
403
+ currentSection = sectionMatch[1].toLowerCase().trim();
404
+ continue;
405
+ }
406
+ // Skip top-level markdown headers
407
+ if (trimmed.startsWith('#'))
408
+ continue;
409
+ // Handle markdown list items under a section
410
+ if (trimmed.startsWith('-') && currentSection) {
411
+ const itemContent = trimmed.slice(1).trim().replace(/^[✓⚠❓]\s*/, '');
412
+ if (itemContent) {
413
+ addItemToHandoffSection(result, currentSection, itemContent);
414
+ }
415
+ continue;
416
+ }
417
+ // Skip standalone list items without a section context
418
+ if (trimmed.startsWith('-') && !currentSection) {
419
+ continue;
420
+ }
421
+ // Match "**Field:** value" (markdown bold syntax - colon can be inside or outside asterisks)
422
+ const boldMatch = trimmed.match(/^\*\*([^*:]+):?\*\*:?\s*(.*)$/);
423
+ if (boldMatch) {
424
+ const field = boldMatch[1].toLowerCase().trim();
425
+ const value = boldMatch[2].trim();
426
+ processHandoffFieldValue(result, field, value);
427
+ currentSection = null;
428
+ continue;
429
+ }
430
+ // Match "Field: value"
431
+ const colonIndex = trimmed.indexOf(':');
432
+ if (colonIndex === -1)
433
+ continue;
434
+ // Skip if colon is too early or field contains path-like characters
435
+ const potentialField = trimmed.slice(0, colonIndex);
436
+ if (colonIndex < 2 ||
437
+ potentialField.includes('/') ||
438
+ potentialField.includes('\\') ||
439
+ potentialField.includes('`')) {
440
+ continue;
441
+ }
442
+ const field = potentialField.toLowerCase().trim();
443
+ const value = trimmed.slice(colonIndex + 1).trim();
444
+ currentSection = null;
445
+ processHandoffFieldValue(result, field, value);
446
+ }
447
+ return result;
448
+ }
449
+ /**
450
+ * Add an item to the appropriate handoff section.
451
+ * Filters out placeholder/template values.
452
+ */
453
+ function addItemToHandoffSection(result, section, item) {
454
+ const sectionMap = {
455
+ 'summary': 'summary',
456
+ 'completed': 'completedWork',
457
+ 'previously completed': 'completedWork',
458
+ 'done': 'completedWork',
459
+ 'next steps': 'nextSteps',
460
+ 'next': 'nextSteps',
461
+ 'todo': 'nextSteps',
462
+ 'key decisions': 'decisions',
463
+ 'prior decisions': 'decisions',
464
+ 'decisions': 'decisions',
465
+ 'files': 'fileReferences',
466
+ 'key files': 'fileReferences',
467
+ 'learnings': 'learnings',
468
+ };
469
+ const field = sectionMap[section];
470
+ if (!field)
471
+ return;
472
+ // Filter out placeholder values
473
+ if (isPlaceholderValue(item))
474
+ return;
475
+ switch (field) {
476
+ case 'completedWork':
477
+ result.completedWork.push(item);
478
+ break;
479
+ case 'nextSteps':
480
+ result.nextSteps.push(item);
481
+ break;
482
+ case 'decisions':
483
+ result.decisions.push({ decision: item, timestamp: new Date() });
484
+ break;
485
+ case 'fileReferences':
486
+ result.fileReferences.push({ path: item });
487
+ break;
488
+ case 'learnings':
489
+ result.learnings.push(item);
490
+ break;
491
+ }
492
+ }
493
+ /**
494
+ * Process a field-value pair for handoff content.
495
+ * Filters out placeholder/template values.
496
+ */
497
+ function processHandoffFieldValue(result, field, value) {
498
+ switch (field) {
499
+ case 'summary':
500
+ if (!isPlaceholderValue(value)) {
501
+ result.summary = value;
502
+ }
503
+ break;
504
+ case 'task':
505
+ case 'task description':
506
+ if (!isPlaceholderValue(value)) {
507
+ result.taskDescription = value;
508
+ }
509
+ break;
510
+ case 'completed':
511
+ case 'done':
512
+ result.completedWork = filterPlaceholders(parseListValue(value));
513
+ break;
514
+ case 'next':
515
+ case 'next steps':
516
+ case 'todo':
517
+ result.nextSteps = filterPlaceholders(parseListValue(value));
518
+ break;
519
+ case 'decisions':
520
+ case 'key decisions':
521
+ result.decisions = parseDecisions(value).filter(d => !isPlaceholderValue(d.decision));
522
+ break;
523
+ case 'files':
524
+ result.fileReferences = parseFileRefs(value).filter(f => !isPlaceholderValue(f.path));
525
+ break;
526
+ case 'learnings':
527
+ case 'learned':
528
+ result.learnings = filterPlaceholders(parseListValue(value));
529
+ break;
530
+ }
531
+ }
532
+ /**
533
+ * Extract all continuity commands from a block of output
534
+ * (in case multiple commands are present)
535
+ */
536
+ export function extractAllCommands(output) {
537
+ const commands = [];
538
+ // Find all save commands
539
+ const saveRegex = new RegExp(PATTERNS.save.source, 'g');
540
+ let match;
541
+ while ((match = saveRegex.exec(output)) !== null) {
542
+ commands.push({
543
+ type: 'save',
544
+ content: match[2].trim(),
545
+ createHandoff: match[1] === '--handoff',
546
+ });
547
+ }
548
+ // Find load commands
549
+ if (PATTERNS.load.test(output)) {
550
+ commands.push({ type: 'load' });
551
+ }
552
+ // Find search commands
553
+ const searchRegex = new RegExp(PATTERNS.search.source, 'g');
554
+ while ((match = searchRegex.exec(output)) !== null) {
555
+ commands.push({
556
+ type: 'search',
557
+ query: (match[1] || match[2]).trim(),
558
+ });
559
+ }
560
+ // Find uncertain commands
561
+ const uncertainRegex = new RegExp(PATTERNS.uncertain.source, 'g');
562
+ while ((match = uncertainRegex.exec(output)) !== null) {
563
+ commands.push({
564
+ type: 'uncertain',
565
+ item: match[1].trim(),
566
+ });
567
+ }
568
+ // Find handoff commands
569
+ const handoffRegex = new RegExp(PATTERNS.handoff.source, 'g');
570
+ while ((match = handoffRegex.exec(output)) !== null) {
571
+ commands.push({
572
+ type: 'handoff',
573
+ content: match[1].trim(),
574
+ createHandoff: true,
575
+ });
576
+ }
577
+ return commands;
578
+ }
579
+ //# sourceMappingURL=parser.js.map