@askexenow/exe-os 0.9.362 → 0.9.365

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 (450) hide show
  1. package/deploy/compose/.env.customer.example +46 -2
  2. package/deploy/compose/.env.example +49 -2
  3. package/deploy/compose/cloudflared/config.yml.example +15 -8
  4. package/deploy/compose/docker-compose.yml +240 -34
  5. package/deploy/compose/generate-env.ts +88 -2
  6. package/deploy/compose/status.sh +30 -0
  7. package/deploy/compose/uptime-check.sh +39 -2
  8. package/deploy/compose/wiki-schema-guard.sh +302 -0
  9. package/deploy/stack-manifests/v0.9.json +232 -2
  10. package/dist/.dist-verified.json +3 -3
  11. package/dist/{active-agent-BPNEBKHI.js → active-agent-C6DPH43L.js} +10 -5
  12. package/dist/{active-agent-3FV5V7SS.js → active-agent-MGF7J3HB.js} +10 -5
  13. package/dist/agent-defs-generator-X7TVMPVB.js +240 -0
  14. package/dist/{agentic-ontology-RCVCJ6WB.js → agentic-ontology-CARDCG37.js} +1 -1
  15. package/dist/artifact-backup-767STHSW.js +209 -0
  16. package/dist/artifact-provenance-C7HQ267L.js +13 -0
  17. package/dist/{backfill-gate-LRX77SUD.js → backfill-gate-VX2RZTQV.js} +2 -2
  18. package/dist/{backfill-metadata-Y3DGVCK5.js → backfill-metadata-ANCJA6LA.js} +7 -7
  19. package/dist/{background-jobs-Z6KHCWES.js → background-jobs-LTPWCMA3.js} +2 -2
  20. package/dist/{backup-verify-TZPPUCLU.js → backup-verify-F7BHVEF7.js} +27 -14
  21. package/dist/{behavior-injection-JMGGWCWG.js → behavior-injection-XQ4B7DCF.js} +13 -12
  22. package/dist/{behaviors-TT6CMEKC.js → behaviors-R2IE3PEN.js} +12 -11
  23. package/dist/bin/age-ontology-load.js +2 -2
  24. package/dist/bin/agentic-ontology-backfill.js +9 -9
  25. package/dist/bin/agentic-reflection-backfill.js +10 -10
  26. package/dist/bin/agentic-semantic-label.js +9 -9
  27. package/dist/bin/backfill-conversations.js +10 -9
  28. package/dist/bin/backfill-responses.js +10 -9
  29. package/dist/bin/backfill-vectors.js +14 -13
  30. package/dist/bin/bulk-sync-postgres.js +23 -19
  31. package/dist/bin/cc-doctor.js +11 -8
  32. package/dist/bin/cleanup-stale-review-tasks.js +26 -24
  33. package/dist/bin/cli.js +29 -102
  34. package/dist/bin/customer-readiness.js +3 -1
  35. package/dist/bin/deferred-daemon-restart.js +115 -103
  36. package/dist/bin/exe-agent-config.js +5 -5
  37. package/dist/bin/exe-agent.js +14 -14
  38. package/dist/bin/exe-assign.js +12 -11
  39. package/dist/bin/exe-boot.js +60 -51
  40. package/dist/bin/exe-call.js +7 -7
  41. package/dist/bin/exe-cloud.js +26 -22
  42. package/dist/bin/exe-config-dump.js +5 -5
  43. package/dist/bin/exe-dispatch.js +30 -24
  44. package/dist/bin/exe-doctor.js +10 -9
  45. package/dist/bin/exe-export-behaviors.js +14 -13
  46. package/dist/bin/exe-forget.js +9 -9
  47. package/dist/bin/exe-gateway.js +9 -9
  48. package/dist/bin/exe-grant.js +5 -5
  49. package/dist/bin/exe-healthcheck.js +13 -8
  50. package/dist/bin/exe-heartbeat.js +36 -29
  51. package/dist/bin/exe-kill.js +30 -28
  52. package/dist/bin/exe-launch-agent.js +41 -37
  53. package/dist/bin/exe-mcp.js +5 -5
  54. package/dist/bin/exe-memory-reads.js +7 -7
  55. package/dist/bin/exe-new-employee.js +12 -11
  56. package/dist/bin/exe-os-mcp-proxy.js +5 -5
  57. package/dist/bin/exe-pending-messages.js +27 -25
  58. package/dist/bin/exe-pending-notifications.js +26 -24
  59. package/dist/bin/exe-pending-reviews.js +27 -25
  60. package/dist/bin/exe-rename.js +7 -7
  61. package/dist/bin/exe-review.js +29 -27
  62. package/dist/bin/exe-search.js +8 -8
  63. package/dist/bin/exe-session-cleanup.js +31 -29
  64. package/dist/bin/exe-settings.js +24 -20
  65. package/dist/bin/exe-start-codex.js +36 -21
  66. package/dist/bin/exe-start-opencode.js +15 -14
  67. package/dist/bin/exe-status.js +28 -25
  68. package/dist/bin/exe-support.js +5 -4
  69. package/dist/bin/exe-team.js +12 -6
  70. package/dist/bin/exe-verify-running-images.js +145 -0
  71. package/dist/bin/exe-watchdog.js +16 -6
  72. package/dist/bin/git-sweep.js +27 -25
  73. package/dist/bin/graph-backfill.js +10 -9
  74. package/dist/bin/graph-export.js +8 -8
  75. package/dist/bin/import-history.js +13 -11
  76. package/dist/bin/install.js +119 -107
  77. package/dist/bin/intercom-check.js +5 -5
  78. package/dist/bin/mcp-sessions.js +2 -2
  79. package/dist/bin/orchestration-metrics.js +6 -6
  80. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  81. package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
  82. package/dist/bin/pre-publish.js +1 -1
  83. package/dist/bin/reconcile-backlog.js +2 -2
  84. package/dist/bin/registry-proxy.js +1 -1
  85. package/dist/bin/scan-tasks.js +26 -24
  86. package/dist/bin/setup.js +4 -3
  87. package/dist/bin/shard-migrate.js +8 -8
  88. package/dist/bin/stack-update.js +87 -38
  89. package/dist/bin/vps-health-gate.js +1 -1
  90. package/dist/{boot-generation-XABYKF5P.js → boot-generation-X45BSVZY.js} +5 -5
  91. package/dist/{boot-review-sections-2X5TFIGU.js → boot-review-sections-OBVRXXSF.js} +25 -23
  92. package/dist/{branch-hygiene-Z4IBWAOX.js → branch-hygiene-HFJ3HA62.js} +17 -10
  93. package/dist/{branding-7MZDHTKN.js → branding-GH43W3PU.js} +2 -2
  94. package/dist/build-manifest.json +1189 -1049
  95. package/dist/{capability-cards-O5UXDOOA.js → capability-cards-57FURUMR.js} +4 -4
  96. package/dist/{capacity-monitor-IPXM726A.js → capacity-monitor-QEL62JDO.js} +27 -25
  97. package/dist/{catchup-brief-EBIGDXOK.js → catchup-brief-PMXTCASA.js} +30 -28
  98. package/dist/{chunk-UO5QJ2RX.js → chunk-22YQBVMO.js} +4 -4
  99. package/dist/chunk-2ADYTOHQ.js +189 -0
  100. package/dist/{chunk-NO5KHKKB.js → chunk-2CWS374F.js} +1 -1
  101. package/dist/{chunk-NAHCSQWT.js → chunk-2ESB5SDP.js} +19 -7
  102. package/dist/{chunk-CY5NVDTH.js → chunk-2FYIMTQE.js} +9 -5
  103. package/dist/{chunk-SC6WDF3Q.js → chunk-2RQT7TED.js} +2 -2
  104. package/dist/{chunk-UWEFIIEG.js → chunk-3CIMDFXG.js} +1 -1
  105. package/dist/{chunk-E7PL3T2U.js → chunk-3JNVB5LG.js} +1 -1
  106. package/dist/{chunk-7SY2NOMQ.js → chunk-3THNS2T7.js} +1 -1
  107. package/dist/{chunk-XJIRUTGJ.js → chunk-45EQTS7B.js} +1 -1
  108. package/dist/{chunk-YZUHSV24.js → chunk-4LWBC7CM.js} +1 -1
  109. package/dist/{chunk-DKRDU2AX.js → chunk-4QKKLK3C.js} +14 -14
  110. package/dist/{chunk-WP2TGH5R.js → chunk-52TIQJEQ.js} +2 -2
  111. package/dist/{chunk-LG37UBBE.js → chunk-5CBGH6RA.js} +5 -5
  112. package/dist/{chunk-W3LKIQJ2.js → chunk-6GQYPJPG.js} +22 -16
  113. package/dist/{chunk-I3SF6QGV.js → chunk-6Q263OZE.js} +1 -1
  114. package/dist/{chunk-XSYQ5EPE.js → chunk-7C4FUNVO.js} +11 -11
  115. package/dist/{chunk-P7CV4SHQ.js → chunk-7Y6AQWVT.js} +21 -10
  116. package/dist/{chunk-NGDXBN3M.js → chunk-A6PDF4BO.js} +2 -2
  117. package/dist/chunk-A7XLR3K7.js +45 -0
  118. package/dist/{chunk-7H3AZNQ7.js → chunk-AGQAGOQN.js} +9 -9
  119. package/dist/{chunk-VDMFVUSY.js → chunk-ANPE3TT3.js} +3 -3
  120. package/dist/{chunk-NE4QI2GX.js → chunk-BATQKSLI.js} +2 -2
  121. package/dist/{chunk-AOMFYUPT.js → chunk-BEHLIRRJ.js} +2 -2
  122. package/dist/{chunk-6EM6USV7.js → chunk-BNHAZ65R.js} +42 -50
  123. package/dist/{chunk-HLU52KTO.js → chunk-BRLS5OLZ.js} +257 -36
  124. package/dist/{chunk-QCJT265O.js → chunk-BY7WWPRM.js} +1 -1
  125. package/dist/{chunk-Z67DIJKT.js → chunk-C3UAQ3JG.js} +1 -1
  126. package/dist/{chunk-MZYNW5OY.js → chunk-CDUB5Q6J.js} +1 -1
  127. package/dist/{chunk-5H3RHWRE.js → chunk-CKG6CVKI.js} +1 -1
  128. package/dist/{chunk-WH2VVEGD.js → chunk-CMBF5WCL.js} +56 -2
  129. package/dist/{chunk-JYKZVAS6.js → chunk-CPILYY2K.js} +1 -1
  130. package/dist/{chunk-XTGR3LMF.js → chunk-CW2UCKHS.js} +2 -2
  131. package/dist/{chunk-32FEF5BW.js → chunk-CWBFOAGM.js} +2 -2
  132. package/dist/{chunk-V5I5N7NC.js → chunk-DEFSN2FQ.js} +3 -3
  133. package/dist/{chunk-HAXCUCJC.js → chunk-DJK45U7B.js} +1 -1
  134. package/dist/{chunk-MZZN5GFC.js → chunk-DQ5KHWFD.js} +1 -1
  135. package/dist/{chunk-SLBOKYYQ.js → chunk-DWAQOEXL.js} +2 -2
  136. package/dist/{chunk-T2RZU7JA.js → chunk-DYWGIPVP.js} +7 -7
  137. package/dist/{chunk-6DTALXOA.js → chunk-E5HAY3DQ.js} +1 -1
  138. package/dist/{chunk-D5CY4E7I.js → chunk-EHHMNKOA.js} +1 -1
  139. package/dist/{chunk-54USDN5Q.js → chunk-EJ4522YM.js} +1 -1
  140. package/dist/{chunk-URNVIZXU.js → chunk-EKVTRI3N.js} +52 -6
  141. package/dist/{chunk-KID6T2A4.js → chunk-EMZHB767.js} +44 -35
  142. package/dist/{chunk-KBI4FVBZ.js → chunk-EPDNWY5P.js} +111 -22
  143. package/dist/{chunk-AQO3BT3I.js → chunk-EPNWEOOE.js} +13 -13
  144. package/dist/{chunk-5C6ZIJ7J.js → chunk-ESTR7QUP.js} +1 -1
  145. package/dist/{chunk-Q2VQNAPU.js → chunk-EVPBYX2Z.js} +2 -2
  146. package/dist/{chunk-CVYDJ2TW.js → chunk-EWCEUO65.js} +1 -1
  147. package/dist/{chunk-RNSAVQEU.js → chunk-EWZYFG5Q.js} +8 -3
  148. package/dist/{chunk-R7F6HKTH.js → chunk-EXDW3E2R.js} +3 -1
  149. package/dist/{chunk-TY4JLBFO.js → chunk-F2S3M5MB.js} +3 -3
  150. package/dist/{chunk-BT2PUK3S.js → chunk-FXPAUDCZ.js} +1 -1
  151. package/dist/{chunk-3C7NE4JE.js → chunk-G2EAYH4U.js} +1 -1
  152. package/dist/{chunk-WDA2KAV7.js → chunk-GSJLB6JI.js} +1 -1
  153. package/dist/{chunk-M67ARGXY.js → chunk-H37FSTF2.js} +1 -1
  154. package/dist/{chunk-ZR4CQBAP.js → chunk-H74466TM.js} +1 -1
  155. package/dist/{chunk-3BAGFZFN.js → chunk-HHGOCBVQ.js} +9 -9
  156. package/dist/{working-memory-BACVOAIV.js → chunk-HSFBNCNC.js} +3 -3
  157. package/dist/{chunk-PF7EQSE5.js → chunk-IIZITKBV.js} +6 -6
  158. package/dist/{chunk-2FA4PYYX.js → chunk-IM2I7OOS.js} +1 -1
  159. package/dist/{chunk-DSKEYEL2.js → chunk-IXEFO6HD.js} +3 -3
  160. package/dist/{chunk-TN2E6ZCM.js → chunk-J4U5Z7VX.js} +214 -58
  161. package/dist/{chunk-PU7UYQRC.js → chunk-J5EYOBFF.js} +1 -1
  162. package/dist/{chunk-RWKX2TK5.js → chunk-J6I7X272.js} +1 -1
  163. package/dist/{chunk-BDLRTLXY.js → chunk-JITNFE4W.js} +6 -2
  164. package/dist/{chunk-PUMH7JSB.js → chunk-JNVQGLPX.js} +3 -3
  165. package/dist/{chunk-VAOUB2TK.js → chunk-JTB5V6BV.js} +1 -1
  166. package/dist/{chunk-QYRI25IP.js → chunk-JUOZLXLH.js} +2 -2
  167. package/dist/{chunk-RYRNY6IF.js → chunk-JYFYIGYK.js} +2 -2
  168. package/dist/{chunk-2PRAXZWM.js → chunk-KOYGRP2L.js} +10 -5
  169. package/dist/{chunk-4AFD4R35.js → chunk-KRUYQFSH.js} +5 -5
  170. package/dist/chunk-L25OAFOU.js +93 -0
  171. package/dist/{chunk-FUQ2OSDV.js → chunk-L2VZBPJJ.js} +25 -8
  172. package/dist/{chunk-LCDW2HUL.js → chunk-LHOKWZKL.js} +1 -1
  173. package/dist/{chunk-BN26LSME.js → chunk-LKYGSJ2E.js} +13 -2
  174. package/dist/chunk-LNOS24GV.js +214 -0
  175. package/dist/{chunk-O32HTNRX.js → chunk-LZKYVMBY.js} +13 -4
  176. package/dist/{chunk-35FD67ZB.js → chunk-M7EES2KM.js} +3 -3
  177. package/dist/chunk-MBBFL2SP.js +45 -0
  178. package/dist/{chunk-4R2WD6T3.js → chunk-MPQXQ5IE.js} +2 -2
  179. package/dist/{chunk-QQMYD4M7.js → chunk-MXEIZUXG.js} +1 -1
  180. package/dist/{chunk-6QJXFLNN.js → chunk-MZJBUAC3.js} +5 -5
  181. package/dist/chunk-NEHOQ3P2.js +19 -0
  182. package/dist/{chunk-BRZR76TS.js → chunk-NJFJWQNN.js} +49 -14
  183. package/dist/{chunk-Q7J2SQJ6.js → chunk-NO3M2AFM.js} +100 -32
  184. package/dist/{gotrue-session-2IT7MDGW.js → chunk-NUTZJZKW.js} +7 -8
  185. package/dist/{chunk-6UZDGEGQ.js → chunk-NV6A5HDN.js} +71 -1
  186. package/dist/{chunk-ZI3HA3XW.js → chunk-O2MEBF23.js} +3 -3
  187. package/dist/{chunk-V6YLIDLK.js → chunk-ODBRU6BF.js} +577 -230
  188. package/dist/{chunk-6N3HUOV3.js → chunk-OFGFRT5J.js} +2 -2
  189. package/dist/{chunk-HKQ7UTSE.js → chunk-OPNROU5B.js} +1 -1
  190. package/dist/{chunk-SQM4ZTL2.js → chunk-ORNCMRIX.js} +60 -33
  191. package/dist/{chunk-RUUX2ZST.js → chunk-P47MPWNU.js} +1 -1
  192. package/dist/{org-key-admin-4W6LZ5KZ.js → chunk-P5XTVIEC.js} +62 -17
  193. package/dist/{chunk-OZNCAMS3.js → chunk-POPRJKAY.js} +122 -20
  194. package/dist/{chunk-SRFRUN66.js → chunk-PPGPCWRC.js} +5 -5
  195. package/dist/{chunk-B6PFGUYJ.js → chunk-PVEM537A.js} +46 -5
  196. package/dist/{chunk-QJBX3MBV.js → chunk-Q7BU5Q6I.js} +3 -3
  197. package/dist/{chunk-SXKIGBNF.js → chunk-QFIVK3G5.js} +1 -1
  198. package/dist/{chunk-BRIZ6OZ3.js → chunk-QMSEL5YS.js} +81 -23
  199. package/dist/{chunk-BJEQBKGH.js → chunk-QYJANQWC.js} +8 -8
  200. package/dist/{chunk-4U56FZ7B.js → chunk-R7RM766N.js} +3 -3
  201. package/dist/{chunk-QI25QRUP.js → chunk-RD4E5G3B.js} +2 -2
  202. package/dist/{chunk-QP53XLC5.js → chunk-RHX6MNWY.js} +1 -1
  203. package/dist/chunk-RIECV7SR.js +234 -0
  204. package/dist/{chunk-3YBJ36UX.js → chunk-RLDMUSRM.js} +2 -2
  205. package/dist/{chunk-CXQ724WH.js → chunk-RVWALVDT.js} +2 -2
  206. package/dist/{chunk-VWTUKKUF.js → chunk-RZIKSE6N.js} +10 -4
  207. package/dist/chunk-SBAU735L.js +328 -0
  208. package/dist/{chunk-XRCX6R5S.js → chunk-SBJV2PCU.js} +1 -1
  209. package/dist/chunk-SO7KTH3Q.js +27 -0
  210. package/dist/{chunk-327Q53AS.js → chunk-SP37DONS.js} +17 -6
  211. package/dist/{chunk-KA4WVDLX.js → chunk-T6S45OLV.js} +4 -4
  212. package/dist/chunk-TCTED52S.js +120 -0
  213. package/dist/{chunk-HLQ4MS42.js → chunk-TO6TB75E.js} +4 -4
  214. package/dist/{chunk-465RCKVI.js → chunk-U373MEF5.js} +6 -6
  215. package/dist/{chunk-AL4HXKDJ.js → chunk-VGE6IHZB.js} +10 -10
  216. package/dist/{chunk-WBG7XYVR.js → chunk-VHJVD3MZ.js} +8 -0
  217. package/dist/{chunk-ZZEKOI2M.js → chunk-VMJ2UH4S.js} +1 -1
  218. package/dist/{chunk-3ICF4IAZ.js → chunk-VS4LPG66.js} +1 -1
  219. package/dist/{chunk-E3YI6FVJ.js → chunk-VV5EZZNT.js} +1 -1
  220. package/dist/{chunk-OPU3NYOO.js → chunk-W2IRQJ6R.js} +12 -0
  221. package/dist/{chunk-PV5BIXT6.js → chunk-WR75WUEP.js} +1 -1
  222. package/dist/{chunk-XUB4GFPN.js → chunk-WYLFDSIE.js} +144 -99
  223. package/dist/{chunk-4L33OFU4.js → chunk-X2P43TB2.js} +6 -3
  224. package/dist/chunk-X2X3IGZU.js +215 -0
  225. package/dist/{chunk-KIKB6FY3.js → chunk-X6A2VWVJ.js} +2 -2
  226. package/dist/chunk-XMVSLLED.js +38 -0
  227. package/dist/{chunk-KDMVVHZH.js → chunk-XTWHNLGD.js} +95 -23
  228. package/dist/{chunk-QY3TM2T3.js → chunk-YMJOLEPE.js} +4 -4
  229. package/dist/{chunk-RFKRCVGW.js → chunk-YYA5LXCT.js} +1 -1
  230. package/dist/{chunk-HSKABJE6.js → chunk-ZDUO6QBH.js} +5 -10
  231. package/dist/{chunk-PDJWHL63.js → chunk-ZEKCHV43.js} +4 -4
  232. package/dist/{chunk-23KWUA7Z.js → chunk-ZNEBZCZR.js} +53 -2
  233. package/dist/chunk-ZNUJFX7L.js +135 -0
  234. package/dist/{chunk-TP7RXGMP.js → chunk-ZRKEUCUZ.js} +315 -67
  235. package/dist/{chunk-6Y3KUO7Q.js → chunk-ZSZPMUNX.js} +244 -21
  236. package/dist/{chunk-4P2BFNSB.js → chunk-ZVTKWWLV.js} +2 -2
  237. package/dist/{chunk-RCOIKTHM.js → chunk-ZZXMB5F2.js} +1 -1
  238. package/dist/{cleanup-graph-garbage-6F22Y5SD.js → cleanup-graph-garbage-CAA625RJ.js} +10 -9
  239. package/dist/cloud-sync-command-DBB7WRHL.js +96 -0
  240. package/dist/cloud-sync-db-init-V7IB23W5.js +46 -0
  241. package/dist/{cloud-sync-shutdown-FWERMZB5.js → cloud-sync-shutdown-2D3B73CJ.js} +10 -4
  242. package/dist/{cloud-sync-state-DJRZORFI.js → cloud-sync-state-5DFKLWNB.js} +1 -1
  243. package/dist/{co-activation-UEEDCM5U.js → co-activation-JVN7EBS6.js} +4 -4
  244. package/dist/{co-occurrence-W6OPFRSY.js → co-occurrence-526PTFGT.js} +8 -7
  245. package/dist/{code-context-index-DWR6HS35.js → code-context-index-XOP6TLPZ.js} +5 -4
  246. package/dist/{conversation-entity-extractor-LWUIH3UB.js → conversation-entity-extractor-JO56DB2E.js} +9 -4
  247. package/dist/{conversation-wiki-populator-5EGRW2UZ.js → conversation-wiki-populator-EBUZXYEU.js} +1 -1
  248. package/dist/{crdt-sync-NHJX3ZJD.js → crdt-sync-LIJLZKFE.js} +2 -2
  249. package/dist/{crm-webhook-OY467ATC.js → crm-webhook-55F7Y6D2.js} +2 -2
  250. package/dist/{cto-delegation-gate-XH4YSQVC.js → cto-delegation-gate-QIYV4KFO.js} +41 -24
  251. package/dist/daemon-auth-SSPY5ODS.js +46 -0
  252. package/dist/{daemon-orchestration-7425ZVNH.js → daemon-orchestration-Q3GJA2JJ.js} +46 -30
  253. package/dist/{daemon-ready-VGPSRI3Z.js → daemon-ready-MKBH4QWD.js} +1 -1
  254. package/dist/{daemon-restart-report-HZU5LWXN.js → daemon-restart-report-EIVD6WDJ.js} +1 -1
  255. package/dist/db-integrity-events-5DTASXJF.js +22 -0
  256. package/dist/{db-restore-events-TFCZ4CPM.js → db-restore-events-2FI4ZMKA.js} +1 -1
  257. package/dist/{doc-graph-extractor-RR2VSO4W.js → doc-graph-extractor-P46R4QME.js} +13 -8
  258. package/dist/{documents-TRZ4R2ZW.js → documents-7KFEREWO.js} +12 -11
  259. package/dist/{dreaming-MAMZAPYW.js → dreaming-JMUXBAPU.js} +29 -27
  260. package/dist/employee-boot-brief-HN63D2BY.js +71 -0
  261. package/dist/{exe-drift-VBWB5E6S.js → exe-drift-7J7GX7DP.js} +5 -5
  262. package/dist/{exe-export-XJJTVVT7.js → exe-export-KJ7B2OBU.js} +14 -13
  263. package/dist/{exe-import-G6O7JFNZ.js → exe-import-HPZDWKGE.js} +14 -13
  264. package/dist/{exe-key-A2WJLLTM.js → exe-key-2PREP464.js} +117 -105
  265. package/dist/{exe-org-HXF4XBB3.js → exe-org-VEIISATF.js} +88 -26
  266. package/dist/{exe-snapshot-TL3TLKLR.js → exe-snapshot-JXQFLUKA.js} +33 -40
  267. package/dist/{fast-db-init-SO2XUQ7T.js → fast-db-init-SCXJXOYX.js} +1 -1
  268. package/dist/{founder-context-IOCADC66.js → founder-context-U2SZPLYV.js} +4 -3
  269. package/dist/{founder-monitor-envelope-SMILO4BT.js → founder-monitor-envelope-5KTKNL5G.js} +4 -4
  270. package/dist/fts-integrity-LKAZEZJE.js +96 -0
  271. package/dist/gateway/index.js +19 -19
  272. package/dist/{git-staleness-I6WT7EXV.js → git-staleness-S4NDR7NX.js} +4 -4
  273. package/dist/{global-procedures-3RMO6C3C.js → global-procedures-ZOFTOXIR.js} +6 -6
  274. package/dist/gotrue-session-ODZ2ERJX.js +25 -0
  275. package/dist/{graph-auto-extract-NKTYPD2I.js → graph-auto-extract-CLVTSUSB.js} +8 -7
  276. package/dist/{graph-rag-EOGPZOYI.js → graph-rag-LSJLWGXV.js} +4 -3
  277. package/dist/{hook-integrity-RTBF2BL2.js → hook-integrity-SGTKBL6W.js} +1 -1
  278. package/dist/{hook-prefetch-V5KCGW2N.js → hook-prefetch-BDSLB6F4.js} +26 -24
  279. package/dist/hooks/bug-report-worker.js +30 -28
  280. package/dist/hooks/codex-stop-task-finalizer.js +32 -30
  281. package/dist/hooks/commit-complete.js +29 -27
  282. package/dist/hooks/error-recall.js +11 -10
  283. package/dist/hooks/exe-heartbeat-hook.js +7 -6
  284. package/dist/hooks/ingest-worker.js +10 -9
  285. package/dist/hooks/ingest.js +18 -16
  286. package/dist/hooks/instructions-loaded.js +12 -8
  287. package/dist/hooks/manifest.json +20 -20
  288. package/dist/hooks/notification.js +8 -7
  289. package/dist/hooks/post-compact.js +7 -6
  290. package/dist/hooks/post-tool-combined.js +33 -14
  291. package/dist/hooks/pre-compact.js +31 -28
  292. package/dist/hooks/pre-tool-use.js +61 -34
  293. package/dist/hooks/prompt-submit.js +45 -42
  294. package/dist/hooks/session-end.js +40 -35
  295. package/dist/hooks/session-start.js +29 -71
  296. package/dist/hooks/stop.js +42 -36
  297. package/dist/hooks/subagent-stop.js +49 -33
  298. package/dist/hooks/summary-worker.js +35 -33
  299. package/dist/index.js +40 -38
  300. package/dist/{installer-G67M3DME.js → installer-EA7T3PBD.js} +7 -7
  301. package/dist/{installer-L3ZKMOPU.js → installer-KCEM4RCG.js} +7 -7
  302. package/dist/{installer-QBWZSYDG.js → installer-RC2JCKSE.js} +9 -7
  303. package/dist/{intercom-queue-R5LSXD3V.js → intercom-queue-6DZPHHQ2.js} +25 -23
  304. package/dist/{key-backup-status-3RC6XTUX.js → key-backup-status-6L2ARCXW.js} +1 -1
  305. package/dist/lib/agent-config.js +2 -2
  306. package/dist/lib/cloud-sync.js +25 -19
  307. package/dist/lib/config.js +1 -1
  308. package/dist/lib/consolidation.js +9 -9
  309. package/dist/lib/crypto.js +3 -1
  310. package/dist/lib/database.js +18 -4
  311. package/dist/lib/db-backup.js +4 -2
  312. package/dist/lib/db-daemon-client.js +5 -4
  313. package/dist/lib/db-write-worker.js +3 -3
  314. package/dist/lib/db.js +18 -4
  315. package/dist/lib/device-registry.js +2 -2
  316. package/dist/lib/embed-worker.js +1 -1
  317. package/dist/lib/embedder.js +5 -4
  318. package/dist/lib/employee-templates.js +7 -7
  319. package/dist/lib/employees.js +4 -4
  320. package/dist/lib/exe-daemon-client.js +4 -3
  321. package/dist/lib/exe-daemon.js +473 -206
  322. package/dist/lib/hybrid-search.js +8 -8
  323. package/dist/lib/identity-templates.js +1 -1
  324. package/dist/lib/identity.js +4 -4
  325. package/dist/lib/license.js +6 -4
  326. package/dist/lib/messaging.js +26 -24
  327. package/dist/lib/post-tool-memory.js +2 -2
  328. package/dist/lib/registry-proxy.js +3 -1
  329. package/dist/lib/reminders.js +5 -5
  330. package/dist/lib/schedules.js +8 -8
  331. package/dist/lib/session-registry.js +6 -6
  332. package/dist/lib/skill-learning.js +14 -12
  333. package/dist/lib/stack-invariants.js +21 -0
  334. package/dist/lib/status-brief.js +3 -3
  335. package/dist/lib/store.js +7 -7
  336. package/dist/lib/task-router.js +5 -5
  337. package/dist/lib/tasks.js +27 -25
  338. package/dist/lib/tmux-routing.js +25 -23
  339. package/dist/lib/token-spend.js +5 -5
  340. package/dist/{license-gate-6R3F3NQR.js → license-gate-HMSMUIAU.js} +5 -4
  341. package/dist/{license-sync-VBJCXBAP.js → license-sync-FBCMPC4J.js} +4 -3
  342. package/dist/{mailbox-inbox-CP2VRBXZ.js → mailbox-inbox-4MEUOL3J.js} +2 -2
  343. package/dist/{mailbox-outbox-HXI7DYNC.js → mailbox-outbox-J6WIF3UY.js} +1 -1
  344. package/dist/mcp/register-tools.js +114 -102
  345. package/dist/mcp/server.js +120 -108
  346. package/dist/mcp/tools/complete-reminder.js +6 -6
  347. package/dist/mcp/tools/create-reminder.js +6 -6
  348. package/dist/mcp/tools/create-task.js +30 -27
  349. package/dist/mcp/tools/deactivate-behavior.js +15 -13
  350. package/dist/mcp/tools/list-reminders.js +6 -6
  351. package/dist/mcp/tools/list-tasks.js +30 -27
  352. package/dist/mcp/tools/send-message.js +29 -26
  353. package/dist/mcp/tools/update-task.js +28 -26
  354. package/dist/{mcp-http-config-BWX7AMAZ.js → mcp-http-config-YKJN52HG.js} +5 -5
  355. package/dist/{mcp-session-identity-GOBGICLI.js → mcp-session-identity-QLUVYWPR.js} +25 -23
  356. package/dist/{memory-cards-4EXX3BQS.js → memory-cards-K2OSX4AW.js} +7 -7
  357. package/dist/{memory-graph-extractor-OYVZIJ3R.js → memory-graph-extractor-YLTSKLSY.js} +9 -8
  358. package/dist/{memory-poisoning-defense-AHOD2EBX.js → memory-poisoning-defense-IPO4ADRL.js} +4 -4
  359. package/dist/{memory-pressure-watchdog-COJC3OYS.js → memory-pressure-watchdog-ZI3TH2OF.js} +26 -24
  360. package/dist/{memory-queue-4VN3DTOE.js → memory-queue-QJNWKWKG.js} +2 -2
  361. package/dist/{memory-queue-client-OI4LDT4W.js → memory-queue-client-HIHCA3W4.js} +6 -5
  362. package/dist/{memory-reflection-V2SNAUIB.js → memory-reflection-ZKVRU3NT.js} +4 -4
  363. package/dist/{monitor-grants-W3ISOLMC.js → monitor-grants-BW2WL4IU.js} +3 -3
  364. package/dist/{notification-ledger-J6Q2GAYU.js → notification-ledger-4REL6M3T.js} +27 -25
  365. package/dist/{notifications-56TP36IK.js → notifications-UXJUAP3C.js} +25 -23
  366. package/dist/{orchestration-events-CKQ756NA.js → orchestration-events-GMRGGBMN.js} +5 -5
  367. package/dist/{orchestration-phase-ZJ4XVNFO.js → orchestration-phase-UDS24CVQ.js} +2 -2
  368. package/dist/{orchestrator-ERSQ3KNT.js → orchestrator-5TV75HDJ.js} +27 -25
  369. package/dist/{org-brief-session-FSZ3QJDN.js → org-brief-session-7AZZEO3F.js} +13 -13
  370. package/dist/{org-consent-policy-BN7MKCZ2.js → org-consent-policy-XT6UZENB.js} +2 -2
  371. package/dist/{org-join-HTQ57JYH.js → org-join-BMBQDMVF.js} +10 -7
  372. package/dist/org-key-admin-SCCVVE2H.js +38 -0
  373. package/dist/{org-key-pin-OTOKAELD.js → org-key-pin-5WUSPGVN.js} +3 -3
  374. package/dist/{org-membership-SML6GCHP.js → org-membership-ESALTLLN.js} +4 -4
  375. package/dist/{org-partner-config-XQGOB7EJ.js → org-partner-config-YKHPDPZR.js} +6 -6
  376. package/dist/{org-partner-runtime-RNNUL5IN.js → org-partner-runtime-WLZAZJIY.js} +14 -14
  377. package/dist/{org-row-visibility-JZFJ3YRJ.js → org-row-visibility-A5XM4MVO.js} +1 -1
  378. package/dist/{pipeline-router-IUENNTAY.js → pipeline-router-UEVXDUHR.js} +5 -5
  379. package/dist/{plan-limits-ZUII366B.js → plan-limits-QEP32X4W.js} +8 -7
  380. package/dist/{platform-procedures-2VQGBJU7.js → platform-procedures-44NDFTB6.js} +1 -1
  381. package/dist/{postinstall-failure-A7WTAXD6.js → postinstall-failure-B2JHNFPM.js} +2 -2
  382. package/dist/{project-boot-3DFY5F35.js → project-boot-LEZSK3W7.js} +9 -1
  383. package/dist/project-name-ILJTETUE.js +14 -0
  384. package/dist/{projection-worker-MBWUPB5O.js → projection-worker-GMRC6SBH.js} +4 -4
  385. package/dist/{prospective-memory-GHE5ORN4.js → prospective-memory-QLHSAPSG.js} +4 -4
  386. package/dist/{push-notifications-PTQ5DHCD.js → push-notifications-GKRPXOGI.js} +26 -24
  387. package/dist/reproject-worktree-memories-IXYGHTGA.js +224 -0
  388. package/dist/{reranker-NUIGAPA3.js → reranker-GB4VEMUV.js} +2 -2
  389. package/dist/{retrieval-health-XHCERQPG.js → retrieval-health-QIBPBGN6.js} +5 -1
  390. package/dist/{review-polling-CYBCBHZA.js → review-polling-MU47NQ2N.js} +26 -24
  391. package/dist/runtime/index.js +37 -35
  392. package/dist/seat-benefit-VDQJYJOB.js +17 -0
  393. package/dist/{session-events-X33W4JNA.js → session-events-YMQ3VGBJ.js} +26 -24
  394. package/dist/{session-kill-telemetry-I2F5PUIW.js → session-kill-telemetry-VGPKE57M.js} +26 -24
  395. package/dist/{session-mcp-config-YKNXG5DW.js → session-mcp-config-F7KATWOF.js} +10 -1
  396. package/dist/{session-scope-WXP4F7OF.js → session-scope-P46KAHXQ.js} +26 -24
  397. package/dist/{setup-wizard-2CTVITIX.js → setup-wizard-BRNHSJ4U.js} +4 -3
  398. package/dist/{shard-manager-YEOHEOHL.js → shard-manager-UROHZE46.js} +2 -2
  399. package/dist/{skill-refinement-VDR5OT4V.js → skill-refinement-NLYDSFEH.js} +5 -5
  400. package/dist/{stack-promote-XVC7FRJW.js → stack-promote-NHFTNIM2.js} +7 -5
  401. package/dist/{stack-release-6PWAACRM.js → stack-release-AQVKZUS7.js} +7 -5
  402. package/dist/{stack-update-24VRBQ3U.js → stack-update-LLX5KT7G.js} +38 -6
  403. package/dist/{steward-gate-2ZNYDVFO.js → steward-gate-JKHYFAHA.js} +5 -5
  404. package/dist/subagent-brief-injection-VDVOHDOU.js +97 -0
  405. package/dist/subagent-spawn-ledger-USYZXU3M.js +22 -0
  406. package/dist/{support-inbox-ZHKLDETT.js → support-inbox-S6YO5YZU.js} +5 -4
  407. package/dist/{support-outbox-DSWU3IXH.js → support-outbox-HFJWG52M.js} +1 -1
  408. package/dist/{task-enforcement-GQDUTIFY.js → task-enforcement-LXW45H5Z.js} +26 -24
  409. package/dist/{task-request-inbox-BFXNUU44.js → task-request-inbox-UCSKDC3R.js} +2 -2
  410. package/dist/{task-scope-ERHPHLUM.js → task-scope-GDLFE26E.js} +25 -23
  411. package/dist/{tasks-crud-NVNF3NRA.js → tasks-crud-W7VGWRUV.js} +25 -23
  412. package/dist/{tasks-notify-DXLU5VCT.js → tasks-notify-CT7NWCS4.js} +26 -24
  413. package/dist/{tasks-review-BST6N34P.js → tasks-review-WCSKOUFW.js} +25 -23
  414. package/dist/{telemetry-upload-NY3EKOGY.js → telemetry-upload-FK5WKXVB.js} +10 -9
  415. package/dist/{token-budget-CLB3GUIX.js → token-budget-GBNGSIU3.js} +5 -5
  416. package/dist/{tool-capability-index-WZWVBI2R.js → tool-capability-index-BT2GGLLI.js} +1 -1
  417. package/dist/{tool-telemetry-PALAZUXT.js → tool-telemetry-VKMRS6MP.js} +1 -1
  418. package/dist/tui/App.js +39 -37
  419. package/dist/{tui-data-CNFSRZP7.js → tui-data-FTPV2XBQ.js} +25 -23
  420. package/dist/{update-support-ZVB3CNGY.js → update-support-J6UWPUOC.js} +18 -15
  421. package/dist/{work-state-heartbeat-O7UMB6SE.js → work-state-heartbeat-4LDF6DSM.js} +1 -1
  422. package/dist/{worker-gate-6DQQWDNB.js → worker-gate-35VZINZG.js} +2 -2
  423. package/dist/{workflow-engine-5ZULFH7O.js → workflow-engine-4DA6RSHI.js} +2 -2
  424. package/dist/working-memory-DPFRSKH3.js +18 -0
  425. package/dist/{worktree-ZWA35PKW.js → worktree-H3YFJ3NU.js} +6 -6
  426. package/dist/{worktree-sweep-5LCVT46V.js → worktree-sweep-4EDLLQ2E.js} +9 -7
  427. package/package.json +11 -5
  428. package/release-notes.json +86 -34
  429. package/src/commands/exe/call.md +6 -4
  430. package/src/commands/exe-reference.md +11 -7
  431. package/src/commands/exe.md +16 -20
  432. package/dist/chunk-HISFWAAK.js +0 -90
  433. package/dist/daemon-auth-OCHW2U6B.js +0 -20
  434. package/dist/project-name-EWG5KAZP.js +0 -10
  435. package/dist/session-summary-5EYI4XW4.js +0 -128
  436. /package/dist/{chunk-YAZ5ECEG.js → chunk-3NBWARKC.js} +0 -0
  437. /package/dist/{chunk-6C4UAKMS.js → chunk-6CAX7YH4.js} +0 -0
  438. /package/dist/{chunk-FIPUVCKC.js → chunk-7DMCAGSC.js} +0 -0
  439. /package/dist/{chunk-X7LY3IOB.js → chunk-JRPYLUXH.js} +0 -0
  440. /package/dist/{chunk-L4LPJMPV.js → chunk-QYECRPGD.js} +0 -0
  441. /package/dist/{chunk-UELGUVNL.js → chunk-UY6HRDB2.js} +0 -0
  442. /package/dist/{chunk-YWN3XMPU.js → chunk-YSDIJ3VI.js} +0 -0
  443. /package/dist/{core-memory-BZFPVS43.js → core-memory-CMPPHJN5.js} +0 -0
  444. /package/dist/{entity-boost-VXXED26D.js → entity-boost-CDFAXVYL.js} +0 -0
  445. /package/dist/{memory-isolation-3PIOWLYP.js → memory-isolation-ZB5S5HCO.js} +0 -0
  446. /package/dist/{message-queue-client-5XW7ZOK2.js → message-queue-client-PL2POQOV.js} +0 -0
  447. /package/dist/{oauth-server-KW5M437C.js → oauth-server-NP7KGF7N.js} +0 -0
  448. /package/dist/{webhook-pipe-QJRFZVKA.js → webhook-pipe-UQSEHFPO.js} +0 -0
  449. /package/dist/{wiki-acl-RXFV5OEU.js → wiki-acl-5DKOWOIH.js} +0 -0
  450. /package/dist/{wiki-client-57QWZIHQ.js → wiki-client-AXNM5FWY.js} +0 -0
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  isPaneBusy
3
- } from "./chunk-PDJWHL63.js";
3
+ } from "./chunk-ZEKCHV43.js";
4
4
  import {
5
5
  recordSessionKill
6
- } from "./chunk-VDMFVUSY.js";
6
+ } from "./chunk-ANPE3TT3.js";
7
7
  import {
8
8
  updateTask
9
- } from "./chunk-7H3AZNQ7.js";
9
+ } from "./chunk-AGQAGOQN.js";
10
10
  import {
11
11
  BUSY_PATTERN,
12
12
  countPendingReviews,
@@ -23,26 +23,26 @@ import {
23
23
  sessionScopeFilter,
24
24
  strictSessionScopeFilter,
25
25
  writeNotification
26
- } from "./chunk-SQM4ZTL2.js";
26
+ } from "./chunk-ORNCMRIX.js";
27
27
  import {
28
28
  LEASE_MINUTES,
29
29
  isLeaseExpired
30
30
  } from "./chunk-E23LNUWJ.js";
31
31
  import {
32
32
  listSessions
33
- } from "./chunk-D5CY4E7I.js";
34
- import {
35
- getTransport
36
- } from "./chunk-UXLO7VHX.js";
33
+ } from "./chunk-EHHMNKOA.js";
37
34
  import {
38
35
  capturePaneLinesAsync,
39
36
  listTmuxSessions,
40
37
  parseContextPercentage,
41
38
  parseContextPercentageAsync
42
39
  } from "./chunk-GBNB4EWD.js";
40
+ import {
41
+ getTransport
42
+ } from "./chunk-UXLO7VHX.js";
43
43
  import {
44
44
  recordOrchestrationEventBestEffort
45
- } from "./chunk-PV5BIXT6.js";
45
+ } from "./chunk-WR75WUEP.js";
46
46
  import {
47
47
  checkDispatchStatus,
48
48
  readTerminalLauncherFailure,
@@ -51,27 +51,32 @@ import {
51
51
  } from "./chunk-AJIXH5JF.js";
52
52
  import {
53
53
  getAgentRuntime
54
- } from "./chunk-KDMVVHZH.js";
54
+ } from "./chunk-XTWHNLGD.js";
55
+ import {
56
+ killIfSameProcess,
57
+ processStartedAt,
58
+ recordKillIntent
59
+ } from "./chunk-LNOS24GV.js";
55
60
  import {
56
61
  baseAgentName,
57
62
  getCoordinatorName,
58
63
  isCoordinatorName,
59
64
  shouldAutoInstance
60
- } from "./chunk-HLU52KTO.js";
65
+ } from "./chunk-BRLS5OLZ.js";
61
66
  import {
62
67
  eventLoopBlockedMarkerPath
63
68
  } from "./chunk-JY5GAZYC.js";
64
69
  import {
65
70
  loadConfigSync
66
- } from "./chunk-BRIZ6OZ3.js";
71
+ } from "./chunk-QMSEL5YS.js";
67
72
 
68
73
  // src/lib/daemon-orchestration.ts
69
74
  import { execFile, execFileSync, execSync } from "child_process";
70
75
  import { promisify } from "util";
71
76
  import { randomUUID } from "crypto";
72
- import { existsSync as existsSync2, readFileSync, writeFileSync, unlinkSync, statSync as statSync2 } from "fs";
77
+ import { existsSync as existsSync2, mkdirSync, readFileSync, writeFileSync, unlinkSync, statSync as statSync2 } from "fs";
73
78
  import { homedir, loadavg, freemem, cpus as osCpus, platform } from "os";
74
- import { join, basename } from "path";
79
+ import { join, basename, dirname } from "path";
75
80
 
76
81
  // src/lib/session-pane-snapshot.ts
77
82
  var CONTEXT_BAR = /[█░]+\s*(\d+)%/;
@@ -209,29 +214,41 @@ async function collectAgentSignals(client, agentId, sessionName, intercomAckWind
209
214
 
210
215
  // src/lib/daemon-orchestration.ts
211
216
  var cpuCount = () => osCpus().length;
212
- function getAvailableMemoryGB() {
213
- if (platform() === "darwin") {
217
+ function parseVmStatAvailableGB(vmStatOutput) {
218
+ const pageSizeMatch = vmStatOutput.match(/page size of (\d+)/);
219
+ const pageSize = pageSizeMatch ? parseInt(pageSizeMatch[1], 10) : 16384;
220
+ const parsePages = (label) => {
221
+ const re = new RegExp(`${label}:\\s+([\\d]+)\\.`);
222
+ const m = vmStatOutput.match(re);
223
+ return m ? parseInt(m[1], 10) : 0;
224
+ };
225
+ const freePages = parsePages("Pages free");
226
+ const inactivePages = parsePages("Pages inactive");
227
+ const purgeablePages = parsePages("Pages purgeable");
228
+ const availableBytes = (freePages + inactivePages + purgeablePages) * pageSize;
229
+ return availableBytes / 1024 ** 3;
230
+ }
231
+ var VM_STAT_TTL_MS = 1e4;
232
+ var _vmStatAvailableGB = null;
233
+ var _vmStatSampledAt = 0;
234
+ var _vmStatRefreshing = false;
235
+ function refreshVmStatAvailableGB() {
236
+ if (_vmStatRefreshing) return;
237
+ _vmStatRefreshing = true;
238
+ execFile("vm_stat", [], { encoding: "utf8", timeout: 3e3 }, (err, stdout) => {
239
+ _vmStatRefreshing = false;
240
+ if (err) return;
214
241
  try {
215
- const vmStatOutput = execFileSync("vm_stat", [], {
216
- encoding: "utf8",
217
- timeout: 3e3,
218
- stdio: ["pipe", "pipe", "pipe"]
219
- });
220
- const pageSizeMatch = vmStatOutput.match(/page size of (\d+)/);
221
- const pageSize = pageSizeMatch ? parseInt(pageSizeMatch[1], 10) : 16384;
222
- const parsePages = (label) => {
223
- const re = new RegExp(`${label}:\\s+([\\d]+)\\.`);
224
- const m = vmStatOutput.match(re);
225
- return m ? parseInt(m[1], 10) : 0;
226
- };
227
- const freePages = parsePages("Pages free");
228
- const inactivePages = parsePages("Pages inactive");
229
- const purgeablePages = parsePages("Pages purgeable");
230
- const availableBytes = (freePages + inactivePages + purgeablePages) * pageSize;
231
- return availableBytes / 1024 ** 3;
242
+ _vmStatAvailableGB = parseVmStatAvailableGB(String(stdout));
243
+ _vmStatSampledAt = Date.now();
232
244
  } catch {
233
- return freemem() / 1024 ** 3;
234
245
  }
246
+ });
247
+ }
248
+ function getAvailableMemoryGB() {
249
+ if (platform() === "darwin") {
250
+ if (Date.now() - _vmStatSampledAt > VM_STAT_TTL_MS) refreshVmStatAvailableGB();
251
+ return _vmStatAvailableGB ?? freemem() / 1024 ** 3;
235
252
  }
236
253
  return freemem() / 1024 ** 3;
237
254
  }
@@ -2670,16 +2687,49 @@ var HOOK_PROCESS_PATTERNS = [
2670
2687
  "exe-heartbeat-hook.js"
2671
2688
  ];
2672
2689
  var AGENT_CLI_EXECUTABLES = /* @__PURE__ */ new Set(["claude", "codex", "opencode"]);
2673
- function getProcessExecutable(args) {
2674
- const first = args.trim().split(/\s+/)[0] ?? "";
2675
- return first.split("/").pop() ?? first;
2676
- }
2677
- function getProcessCommandPrefix(args) {
2678
- return args.split(/\s+--system-prompt\b/)[0] ?? args;
2690
+ var RUNTIME_EXECUTABLES = /* @__PURE__ */ new Set([
2691
+ "node",
2692
+ "nodejs",
2693
+ "bun",
2694
+ "deno",
2695
+ "npx",
2696
+ "python",
2697
+ "python2",
2698
+ "python3",
2699
+ "sh",
2700
+ "bash",
2701
+ "zsh",
2702
+ "dash",
2703
+ "env"
2704
+ ]);
2705
+ function getProcessIdentityTokens(args) {
2706
+ const tokens = args.trim().split(/\s+/);
2707
+ const argv0 = tokens[0] ?? "";
2708
+ const identity = [argv0];
2709
+ if (!RUNTIME_EXECUTABLES.has(basenameOf(argv0))) return identity;
2710
+ for (let i = 1; i < tokens.length; i++) {
2711
+ const token = tokens[i];
2712
+ if (token.startsWith("-")) continue;
2713
+ identity.push(token);
2714
+ break;
2715
+ }
2716
+ return identity;
2717
+ }
2718
+ function basenameOf(token) {
2719
+ return token.split("/").pop() ?? token;
2720
+ }
2721
+ function identityMatchesPattern(identity, pattern) {
2722
+ return identity.some((token) => token === pattern || token.endsWith(`/${pattern}`));
2723
+ }
2724
+ function isAgentCliProcess(args) {
2725
+ return getProcessIdentityTokens(args).some(
2726
+ (token) => AGENT_CLI_EXECUTABLES.has(basenameOf(token).replace(/\.(?:js|mjs|cjs)$/, ""))
2727
+ );
2679
2728
  }
2680
2729
  var ZOMBIE_AGENT_MAX_AGE_SECS = 300;
2681
2730
  var REAPER_MAX_BUFFER_BYTES = 64 * 1024 * 1024;
2682
2731
  function reapZombieAgentProcesses(deps) {
2732
+ const readStartedAt = deps.getStartedAtMs ?? processStartedAt;
2683
2733
  let liveSessions;
2684
2734
  try {
2685
2735
  liveSessions = new Set(deps.listTmuxSessions());
@@ -2827,6 +2877,20 @@ function reapZombieAgentProcesses(deps) {
2827
2877
  const rssKb = deps.getRssKb ? deps.getRssKb(pid) : null;
2828
2878
  const rssMb = rssKb ? Math.round(rssKb / 1024) : "?";
2829
2879
  const desc = `PID ${pid} (age=${ageSecs}s, RSS=${rssMb}MB, ${info.args.slice(0, 80)})`;
2880
+ const startedAt = readStartedAt(pid);
2881
+ const wrapperStartedAt = wrapperPid > 1 ? readStartedAt(wrapperPid) : null;
2882
+ const guard = (reason) => ({
2883
+ sender: "zombie-reaper",
2884
+ reason,
2885
+ kill: (p, s) => deps.killProcess(p, s),
2886
+ startedAt: readStartedAt
2887
+ });
2888
+ recordKillIntent({
2889
+ targetPid: pid,
2890
+ signal: "SIGTERM",
2891
+ sender: "zombie-reaper",
2892
+ reason: `matched agent pattern, no live tmux session (age=${ageSecs}s) :: ${info.args.slice(0, 200)}`
2893
+ });
2830
2894
  try {
2831
2895
  deps.killProcess(pid, "SIGTERM");
2832
2896
  } catch {
@@ -2837,6 +2901,12 @@ function reapZombieAgentProcesses(deps) {
2837
2901
  `);
2838
2902
  if (wrapperPid > 1 && procMap.has(wrapperPid)) {
2839
2903
  try {
2904
+ recordKillIntent({
2905
+ targetPid: wrapperPid,
2906
+ signal: "SIGTERM",
2907
+ sender: "zombie-reaper",
2908
+ reason: `wrapper of zombie agent PID ${pid} :: ${procMap.get(wrapperPid)?.args.slice(0, 200) ?? ""}`
2909
+ });
2840
2910
  deps.killProcess(wrapperPid, "SIGTERM");
2841
2911
  process.stderr.write(`[zombie-agent-reaper] Killed wrapper PID ${wrapperPid}
2842
2912
  `);
@@ -2844,17 +2914,11 @@ function reapZombieAgentProcesses(deps) {
2844
2914
  }
2845
2915
  }
2846
2916
  deps.scheduleKill(pid, ORPHAN_SIGKILL_DELAY_MS, () => {
2847
- try {
2848
- deps.killProcess(pid, "SIGKILL");
2849
- } catch {
2850
- }
2917
+ killIfSameProcess(pid, startedAt, "SIGKILL", guard(`zombie agent survived SIGTERM :: ${info.args.slice(0, 200)}`));
2851
2918
  });
2852
2919
  if (wrapperPid > 1) {
2853
2920
  deps.scheduleKill(wrapperPid, ORPHAN_SIGKILL_DELAY_MS, () => {
2854
- try {
2855
- deps.killProcess(wrapperPid, "SIGKILL");
2856
- } catch {
2857
- }
2921
+ killIfSameProcess(wrapperPid, wrapperStartedAt, "SIGKILL", guard(`wrapper of zombie agent PID ${pid} survived SIGTERM`));
2858
2922
  });
2859
2923
  }
2860
2924
  }
@@ -2978,6 +3042,7 @@ function parseEtime(etime) {
2978
3042
  return 0;
2979
3043
  }
2980
3044
  function reapOrphanedMcpProcesses(deps) {
3045
+ const readStartedAt = deps.getStartedAtMs ?? processStartedAt;
2981
3046
  let lines;
2982
3047
  try {
2983
3048
  lines = deps.listProcesses();
@@ -2994,27 +3059,42 @@ function reapOrphanedMcpProcesses(deps) {
2994
3059
  const etime = match[3];
2995
3060
  const args = match[4];
2996
3061
  if (pid === deps.selfPid) continue;
2997
- if (AGENT_CLI_EXECUTABLES.has(getProcessExecutable(args))) continue;
2998
- const matchScope = getProcessCommandPrefix(args);
2999
- const isPpid1Orphan = ppid === 1 && ORPHAN_PATTERNS.some((pat) => matchScope.includes(pat));
3062
+ const identity = getProcessIdentityTokens(args);
3063
+ const isPpid1Orphan = ppid === 1 && ORPHAN_PATTERNS.some((pat) => identityMatchesPattern(identity, pat));
3000
3064
  const ageSecs = parseEtime(etime);
3001
- const isAgedHookOrphan = ageSecs > ORPHAN_MAX_AGE_SECS && HOOK_PROCESS_PATTERNS.some((pat) => matchScope.includes(pat));
3065
+ const isAgedHookOrphan = ageSecs > ORPHAN_MAX_AGE_SECS && HOOK_PROCESS_PATTERNS.some((pat) => identityMatchesPattern(identity, pat));
3002
3066
  if (!isPpid1Orphan && !isAgedHookOrphan) continue;
3067
+ if (isAgentCliProcess(args)) {
3068
+ process.stderr.write(
3069
+ `[orphan-reaper] Protected PID ${pid} \u2014 agent CLI (${identity.join(" ").slice(0, 100)})
3070
+ `
3071
+ );
3072
+ continue;
3073
+ }
3074
+ const reason = isPpid1Orphan ? "ppid=1" : `age=${ageSecs}s`;
3075
+ const startedAt = readStartedAt(pid);
3076
+ recordKillIntent({
3077
+ targetPid: pid,
3078
+ signal: "SIGTERM",
3079
+ sender: "orphan-reaper",
3080
+ reason: `matched ${isPpid1Orphan ? "ORPHAN_PATTERNS" : "HOOK_PROCESS_PATTERNS"} (${reason}) :: ${args.slice(0, 200)}`
3081
+ });
3003
3082
  try {
3004
3083
  deps.killProcess(pid, "SIGTERM");
3005
3084
  } catch {
3006
3085
  continue;
3007
3086
  }
3008
- const reason = isPpid1Orphan ? "ppid=1" : `age=${ageSecs}s`;
3009
3087
  const desc = `PID ${pid} (${reason}, ${args.slice(0, 100)})`;
3010
3088
  reaped.push(desc);
3011
3089
  process.stderr.write(`[orphan-reaper] Killed ${desc}
3012
3090
  `);
3013
3091
  deps.scheduleKill(pid, ORPHAN_SIGKILL_DELAY_MS, () => {
3014
- try {
3015
- deps.killProcess(pid, "SIGKILL");
3016
- } catch {
3017
- }
3092
+ killIfSameProcess(pid, startedAt, "SIGKILL", {
3093
+ sender: "orphan-reaper",
3094
+ reason: `orphan survived SIGTERM (${reason}) :: ${args.slice(0, 200)}`,
3095
+ kill: (p, s) => deps.killProcess(p, s),
3096
+ startedAt: readStartedAt
3097
+ });
3018
3098
  });
3019
3099
  }
3020
3100
  return reaped;
@@ -3070,8 +3150,77 @@ var WORKTREE_REAPER_INTERVAL_MS = 30 * 60 * 1e3;
3070
3150
  var WORKTREE_MIN_AGE_MS = 60 * 60 * 1e3;
3071
3151
  var WORKTREE_MAX_PRUNES_PER_TICK = 5;
3072
3152
  var WORKTREE_DIRTY_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1e3;
3153
+ var WORKTREE_ARCHIVE_FAILURE_MAX_ATTEMPTS = 3;
3154
+ var WORKTREE_ARCHIVE_FAILURE_STATE_PATH = join(homedir(), ".exe-os", "session-cache", "worktree-reaper-archive-failures.json");
3155
+ function worktreeArchiveFailureKey(repoRoot, wtPath, branch) {
3156
+ return JSON.stringify([repoRoot, wtPath, branch]);
3157
+ }
3158
+ function normalizeArchiveFailureState(raw) {
3159
+ const entries = {};
3160
+ if (!raw || typeof raw !== "object") return { entries };
3161
+ const src = raw.entries;
3162
+ if (!src || typeof src !== "object") return { entries };
3163
+ for (const [key, val] of Object.entries(src)) {
3164
+ if (!val || typeof val !== "object") continue;
3165
+ const e = val;
3166
+ if (typeof e.attempts !== "number" || !Number.isFinite(e.attempts) || e.attempts < 0 || typeof e.firstFailureAt !== "number" || !Number.isFinite(e.firstFailureAt) || typeof e.lastFailureAt !== "number" || !Number.isFinite(e.lastFailureAt) || typeof e.mtimeMs !== "number" || !Number.isFinite(e.mtimeMs)) continue;
3167
+ entries[key] = {
3168
+ attempts: Math.floor(e.attempts),
3169
+ firstFailureAt: e.firstFailureAt,
3170
+ lastFailureAt: e.lastFailureAt,
3171
+ mtimeMs: e.mtimeMs,
3172
+ ...typeof e.lastError === "string" ? { lastError: e.lastError.slice(0, 500) } : {}
3173
+ };
3174
+ }
3175
+ return { entries };
3176
+ }
3177
+ function loadWorktreeArchiveFailureState(statePath = WORKTREE_ARCHIVE_FAILURE_STATE_PATH) {
3178
+ try {
3179
+ if (!existsSync2(statePath)) return { entries: {} };
3180
+ return normalizeArchiveFailureState(JSON.parse(readFileSync(statePath, "utf8")));
3181
+ } catch {
3182
+ return { entries: {} };
3183
+ }
3184
+ }
3185
+ function saveWorktreeArchiveFailureState(state, statePath = WORKTREE_ARCHIVE_FAILURE_STATE_PATH) {
3186
+ mkdirSync(dirname(statePath), { recursive: true });
3187
+ writeFileSync(statePath, JSON.stringify({ entries: state.entries }, null, 2), "utf8");
3188
+ }
3189
+ function archiveFailureEntryFor(state, key, mtimeMs) {
3190
+ const entry = state.entries[key];
3191
+ if (!entry) return null;
3192
+ if (entry.mtimeMs !== mtimeMs) return null;
3193
+ return entry;
3194
+ }
3195
+ function shouldSkipWorktreeArchiveAfterFailures(state, key, mtimeMs, maxAttempts = WORKTREE_ARCHIVE_FAILURE_MAX_ATTEMPTS) {
3196
+ const entry = archiveFailureEntryFor(state, key, mtimeMs);
3197
+ if (!entry) return null;
3198
+ return entry.attempts >= maxAttempts ? entry : null;
3199
+ }
3200
+ function recordWorktreeArchiveFailure(state, key, mtimeMs, nowMs, err) {
3201
+ const prev = archiveFailureEntryFor(state, key, mtimeMs);
3202
+ const text = err instanceof Error ? err.message : String(err);
3203
+ const entry = {
3204
+ attempts: (prev?.attempts ?? 0) + 1,
3205
+ firstFailureAt: prev?.firstFailureAt ?? nowMs,
3206
+ lastFailureAt: nowMs,
3207
+ mtimeMs,
3208
+ lastError: text.slice(0, 500)
3209
+ };
3210
+ state.entries[key] = entry;
3211
+ return entry;
3212
+ }
3213
+ function clearWorktreeArchiveFailure(state, key) {
3214
+ if (!(key in state.entries)) return false;
3215
+ delete state.entries[key];
3216
+ return true;
3217
+ }
3073
3218
  async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
3074
3219
  const result = { pruned: [], skipped: [] };
3220
+ const archiveFailureState = deps.loadArchiveFailureState?.() ?? { entries: {} };
3221
+ const rawArchiveFailureMaxAttempts = deps.archiveFailureMaxAttempts ?? WORKTREE_ARCHIVE_FAILURE_MAX_ATTEMPTS;
3222
+ const archiveFailureMaxAttempts = Number.isFinite(rawArchiveFailureMaxAttempts) && rawArchiveFailureMaxAttempts > 0 ? Math.floor(rawArchiveFailureMaxAttempts) : WORKTREE_ARCHIVE_FAILURE_MAX_ATTEMPTS;
3223
+ let archiveFailureStateChanged = false;
3075
3224
  let sessions;
3076
3225
  try {
3077
3226
  sessions = deps.listTmuxSessions();
@@ -3129,7 +3278,39 @@ async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
3129
3278
  }
3130
3279
  if (await deps.isWorktreeDirty(wt.path)) {
3131
3280
  const ageH2 = Math.round(ageMs / 36e5);
3281
+ let archiveFailureReason = null;
3132
3282
  if (ageMs >= WORKTREE_DIRTY_MAX_AGE_MS && deps.archiveDirtyWorktree) {
3283
+ const archiveFailureKey = worktreeArchiveFailureKey(repoRoot, wt.path, wt.branch);
3284
+ const suppressed = shouldSkipWorktreeArchiveAfterFailures(
3285
+ archiveFailureState,
3286
+ archiveFailureKey,
3287
+ mtimeMs,
3288
+ archiveFailureMaxAttempts
3289
+ );
3290
+ if (suppressed) {
3291
+ process.stderr.write(
3292
+ `[worktree-reaper] Archive retry limit reached for ${wt.path} (${suppressed.attempts}/${archiveFailureMaxAttempts} failures; last=${suppressed.lastError ?? "unknown"}). Skipping future archive attempts until the worktree changes or ${WORKTREE_ARCHIVE_FAILURE_STATE_PATH} is cleared.
3293
+ `
3294
+ );
3295
+ result.skipped.push({
3296
+ path: wt.path,
3297
+ reason: `uncommitted changes (archive retry limit reached ${suppressed.attempts}/${archiveFailureMaxAttempts})`
3298
+ });
3299
+ recordOrchestrationEventBestEffort({
3300
+ eventType: "worktree.skipped",
3301
+ source: "daemon-orchestration.reapOrphanedWorktrees",
3302
+ severity: "warn",
3303
+ agentId: agentName,
3304
+ payload: {
3305
+ reason: "archive retry limit reached",
3306
+ branch: wt.branch,
3307
+ ageHours: ageH2,
3308
+ attempts: suppressed.attempts,
3309
+ maxAttempts: archiveFailureMaxAttempts
3310
+ }
3311
+ });
3312
+ continue;
3313
+ }
3133
3314
  process.stderr.write(
3134
3315
  `[worktree-reaper] Dirty orphan worktree aged out (${ageH2}h > ${WORKTREE_DIRTY_MAX_AGE_MS / 36e5}h), archiving: ${wt.path} (agent: ${agentName})
3135
3316
  `
@@ -3137,6 +3318,9 @@ async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
3137
3318
  try {
3138
3319
  const archived = await deps.archiveDirtyWorktree(repoRoot, wt.path, wt.branch, agentName);
3139
3320
  if (archived) {
3321
+ if (clearWorktreeArchiveFailure(archiveFailureState, archiveFailureKey)) {
3322
+ archiveFailureStateChanged = true;
3323
+ }
3140
3324
  const removed2 = await deps.removeWorktree(repoRoot, wt.path);
3141
3325
  if (removed2) {
3142
3326
  await deps.deleteBranch(repoRoot, wt.branch);
@@ -3154,25 +3338,64 @@ async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
3154
3338
  result.pruned.push(wt.path);
3155
3339
  continue;
3156
3340
  }
3341
+ archiveFailureReason = "git worktree remove failed after archive";
3342
+ } else {
3343
+ const failure = recordWorktreeArchiveFailure(
3344
+ archiveFailureState,
3345
+ archiveFailureKey,
3346
+ mtimeMs,
3347
+ nowMs,
3348
+ new Error("archive returned false")
3349
+ );
3350
+ archiveFailureStateChanged = true;
3351
+ archiveFailureReason = `uncommitted changes (archive failed ${failure.attempts}/${archiveFailureMaxAttempts}${failure.attempts >= archiveFailureMaxAttempts ? "; retry limit reached" : ""})`;
3352
+ if (failure.attempts >= archiveFailureMaxAttempts) {
3353
+ process.stderr.write(
3354
+ `[worktree-reaper] Archive retry limit reached for ${wt.path} (${failure.attempts}/${archiveFailureMaxAttempts} failures). Future ticks will skip git archive attempts until the worktree changes.
3355
+ `
3356
+ );
3357
+ }
3157
3358
  }
3158
3359
  } catch (err) {
3360
+ const failure = recordWorktreeArchiveFailure(
3361
+ archiveFailureState,
3362
+ archiveFailureKey,
3363
+ mtimeMs,
3364
+ nowMs,
3365
+ err
3366
+ );
3367
+ archiveFailureStateChanged = true;
3368
+ archiveFailureReason = `uncommitted changes (archive failed ${failure.attempts}/${archiveFailureMaxAttempts}${failure.attempts >= archiveFailureMaxAttempts ? "; retry limit reached" : ""})`;
3159
3369
  process.stderr.write(
3160
3370
  `[worktree-reaper] Failed to archive dirty orphan ${wt.path}: ${err instanceof Error ? err.message : String(err)}
3161
3371
  `
3162
3372
  );
3373
+ if (failure.attempts >= archiveFailureMaxAttempts) {
3374
+ process.stderr.write(
3375
+ `[worktree-reaper] Archive retry limit reached for ${wt.path} (${failure.attempts}/${archiveFailureMaxAttempts} failures). Future ticks will skip git archive attempts until the worktree changes.
3376
+ `
3377
+ );
3378
+ }
3163
3379
  }
3164
3380
  }
3165
3381
  process.stderr.write(
3166
3382
  `[worktree-reaper] WARNING: Orphan worktree has uncommitted changes, skipping: ${wt.path} (agent: ${agentName}, age: ${ageH2}h)
3167
3383
  `
3168
3384
  );
3169
- result.skipped.push({ path: wt.path, reason: ageMs >= WORKTREE_DIRTY_MAX_AGE_MS ? "uncommitted changes (archive failed)" : "uncommitted changes" });
3385
+ result.skipped.push({
3386
+ path: wt.path,
3387
+ reason: archiveFailureReason ?? (ageMs >= WORKTREE_DIRTY_MAX_AGE_MS ? "uncommitted changes (archive failed)" : "uncommitted changes")
3388
+ });
3170
3389
  recordOrchestrationEventBestEffort({
3171
3390
  eventType: "worktree.skipped",
3172
3391
  source: "daemon-orchestration.reapOrphanedWorktrees",
3173
3392
  severity: "warn",
3174
3393
  agentId: agentName,
3175
- payload: { reason: "uncommitted changes", ageHours: ageH2, agedOut: ageMs >= WORKTREE_DIRTY_MAX_AGE_MS }
3394
+ payload: {
3395
+ reason: archiveFailureReason ?? "uncommitted changes",
3396
+ ageHours: ageH2,
3397
+ agedOut: ageMs >= WORKTREE_DIRTY_MAX_AGE_MS
3398
+ }
3176
3399
  });
3177
3400
  continue;
3178
3401
  }
@@ -3224,11 +3447,17 @@ async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
3224
3447
  }
3225
3448
  }
3226
3449
  }
3450
+ if (archiveFailureStateChanged) {
3451
+ try {
3452
+ deps.saveArchiveFailureState?.(archiveFailureState);
3453
+ } catch {
3454
+ }
3455
+ }
3227
3456
  return result;
3228
3457
  }
3229
3458
  async function createWorktreeReaperRealDeps() {
3230
3459
  const { getPaneCwdAsync } = await import("./lib/tmux-status.js");
3231
- const { getGitRootAsync, isWorktreeDirtyAsync } = await import("./worktree-ZWA35PKW.js");
3460
+ const { getGitRootAsync, isWorktreeDirtyAsync } = await import("./worktree-H3YFJ3NU.js");
3232
3461
  const { statSync: statSync3 } = await import("fs");
3233
3462
  const { basename: basename2 } = await import("path");
3234
3463
  const { promisify: promisify2 } = await import("util");
@@ -3243,28 +3472,39 @@ async function createWorktreeReaperRealDeps() {
3243
3472
  sessions = String(stdout ?? "").split("\n").map((s) => s.trim()).filter(Boolean);
3244
3473
  } catch {
3245
3474
  }
3475
+ const REAPER_FANOUT = 4;
3476
+ const runPooled = async (items, fn) => {
3477
+ let next = 0;
3478
+ const worker = async () => {
3479
+ for (; ; ) {
3480
+ const i = next++;
3481
+ if (i >= items.length) return;
3482
+ await fn(items[i]);
3483
+ }
3484
+ };
3485
+ const lanes = Math.max(1, Math.min(REAPER_FANOUT, items.length));
3486
+ await Promise.all(Array.from({ length: lanes }, () => worker()));
3487
+ };
3246
3488
  const cwdMap = /* @__PURE__ */ new Map();
3247
- const cwdPromises = sessions.map(async (s) => {
3489
+ await runPooled(sessions, async (s) => {
3248
3490
  try {
3249
3491
  const cwd = await getPaneCwdAsync(s);
3250
3492
  if (cwd) cwdMap.set(s, cwd);
3251
3493
  } catch {
3252
3494
  }
3253
3495
  });
3254
- await Promise.all(cwdPromises);
3255
3496
  const gitRootCache = /* @__PURE__ */ new Map();
3256
- const rootPromises = [...cwdMap.values()].map(async (cwd) => {
3497
+ await runPooled([...new Set(cwdMap.values())], async (cwd) => {
3257
3498
  if (gitRootCache.has(cwd)) return;
3258
3499
  const root = await getGitRootAsync(cwd);
3259
3500
  gitRootCache.set(cwd, root);
3260
3501
  });
3261
- await Promise.all(rootPromises);
3262
3502
  const repoRoots = /* @__PURE__ */ new Set();
3263
3503
  for (const root of gitRootCache.values()) {
3264
3504
  if (root) repoRoots.add(root);
3265
3505
  }
3266
3506
  const worktreeCache = /* @__PURE__ */ new Map();
3267
- const wtPromises = [...repoRoots].map(async (repoRoot) => {
3507
+ await runPooled([...repoRoots], async (repoRoot) => {
3268
3508
  try {
3269
3509
  const { stdout } = await execFileAsync2("git", ["worktree", "list", "--porcelain"], {
3270
3510
  cwd: repoRoot,
@@ -3285,7 +3525,6 @@ async function createWorktreeReaperRealDeps() {
3285
3525
  } catch {
3286
3526
  }
3287
3527
  });
3288
- await Promise.all(wtPromises);
3289
3528
  return {
3290
3529
  listTmuxSessions: () => sessions,
3291
3530
  getPaneCwd: (s) => cwdMap.get(s),
@@ -3371,6 +3610,8 @@ async function createWorktreeReaperRealDeps() {
3371
3610
  // Pure cache lookup — the async prefetch above populated gitRootCache for
3372
3611
  // every live session cwd, so the reaper never shells out on the event loop.
3373
3612
  getGitRoot: (dir) => gitRootCache.get(dir) ?? null,
3613
+ loadArchiveFailureState: () => loadWorktreeArchiveFailureState(),
3614
+ saveArchiveFailureState: (state) => saveWorktreeArchiveFailureState(state),
3374
3615
  archiveDirtyWorktree: async (_repoRoot, wtPath, _branch, agentName) => {
3375
3616
  const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").slice(0, 19);
3376
3617
  const quarantineBranch = `quarantine/${agentName}-${timestamp}`;
@@ -3459,7 +3700,7 @@ async function gcStaleCheckpoints() {
3459
3700
  }
3460
3701
  async function pollTaskGroupBarriers() {
3461
3702
  try {
3462
- const { checkAndFireBarriers } = await import("./tasks-crud-NVNF3NRA.js");
3703
+ const { checkAndFireBarriers } = await import("./tasks-crud-W7VGWRUV.js");
3463
3704
  const firedGroupIds = await checkAndFireBarriers();
3464
3705
  if (firedGroupIds.length === 0) return 0;
3465
3706
  const { getClient } = await import("./lib/database.js");
@@ -3600,6 +3841,13 @@ export {
3600
3841
  createOrphanReaperRealDeps,
3601
3842
  createOrphanReaperRealDepsAsync,
3602
3843
  WORKTREE_REAPER_INTERVAL_MS,
3844
+ WORKTREE_ARCHIVE_FAILURE_MAX_ATTEMPTS,
3845
+ worktreeArchiveFailureKey,
3846
+ loadWorktreeArchiveFailureState,
3847
+ saveWorktreeArchiveFailureState,
3848
+ shouldSkipWorktreeArchiveAfterFailures,
3849
+ recordWorktreeArchiveFailure,
3850
+ clearWorktreeArchiveFailure,
3603
3851
  reapOrphanedWorktrees,
3604
3852
  createWorktreeReaperRealDeps,
3605
3853
  gcStaleCheckpoints,