@askexenow/exe-os 0.9.341 → 0.9.342

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 (419) hide show
  1. package/README.md +159 -196
  2. package/deploy/compose/.env.customer.example +1 -0
  3. package/deploy/compose/.env.example +1 -0
  4. package/deploy/compose/docker-compose.yml +13 -4
  5. package/deploy/compose/generate-env.ts +4 -0
  6. package/dist/{active-agent-AIQP4DFL.js → active-agent-PVGE57FY.js} +5 -5
  7. package/dist/{active-agent-LW45DSJ4.js → active-agent-TNIO6IY3.js} +5 -5
  8. package/dist/{agentic-ontology-RVUNRCQY.js → agentic-ontology-3FXYMHKW.js} +1 -1
  9. package/dist/{backfill-gate-J7UXFNXU.js → backfill-gate-65LSYVE5.js} +3 -3
  10. package/dist/{backfill-metadata-ZSDJ4O2T.js → backfill-metadata-ZSMZC45J.js} +8 -8
  11. package/dist/{background-jobs-STURKDCS.js → background-jobs-EXR5RVGG.js} +3 -3
  12. package/dist/{backup-verify-ZAJLEL4X.js → backup-verify-3Y2FHGZU.js} +4 -4
  13. package/dist/{behaviors-EO7KCP3H.js → behaviors-KYRB3NGJ.js} +9 -9
  14. package/dist/bin/age-ontology-load.js +3 -3
  15. package/dist/bin/agentic-ontology-backfill.js +10 -10
  16. package/dist/bin/agentic-reflection-backfill.js +11 -11
  17. package/dist/bin/agentic-semantic-label.js +10 -10
  18. package/dist/bin/backfill-conversations.js +10 -10
  19. package/dist/bin/backfill-responses.js +10 -10
  20. package/dist/bin/backfill-vectors.js +14 -14
  21. package/dist/bin/bulk-sync-postgres.js +19 -19
  22. package/dist/bin/cc-doctor.js +10 -8
  23. package/dist/bin/cleanup-stale-review-tasks.js +25 -23
  24. package/dist/bin/cli.js +79 -25
  25. package/dist/bin/customer-readiness.js +1 -1
  26. package/dist/bin/deferred-daemon-restart.js +98 -92
  27. package/dist/bin/exe-agent-config.js +9 -8
  28. package/dist/bin/exe-agent.js +17 -17
  29. package/dist/bin/exe-assign.js +12 -12
  30. package/dist/bin/exe-boot.js +200 -67
  31. package/dist/bin/exe-call.js +7 -7
  32. package/dist/bin/exe-cloud.js +20 -20
  33. package/dist/bin/exe-config-dump.js +9 -8
  34. package/dist/bin/exe-dispatch.js +25 -23
  35. package/dist/bin/exe-doctor.js +10 -6
  36. package/dist/bin/exe-export-behaviors.js +11 -11
  37. package/dist/bin/exe-forget.js +12 -10
  38. package/dist/bin/exe-gateway.js +15 -10
  39. package/dist/bin/exe-grant.js +5 -5
  40. package/dist/bin/exe-healthcheck.js +14 -8
  41. package/dist/bin/exe-heartbeat.js +28 -27
  42. package/dist/bin/exe-kill.js +30 -28
  43. package/dist/bin/exe-launch-agent.js +128 -67
  44. package/dist/bin/exe-memory-reads.js +257 -0
  45. package/dist/bin/exe-new-employee.js +12 -11
  46. package/dist/bin/exe-pending-messages.js +26 -24
  47. package/dist/bin/exe-pending-notifications.js +25 -23
  48. package/dist/bin/exe-pending-reviews.js +25 -23
  49. package/dist/bin/exe-rename.js +7 -7
  50. package/dist/bin/exe-review.js +29 -27
  51. package/dist/bin/exe-search.js +11 -9
  52. package/dist/bin/exe-session-cleanup.js +115 -85
  53. package/dist/bin/exe-settings.js +24 -23
  54. package/dist/bin/exe-start-codex.js +163 -41
  55. package/dist/bin/exe-start-opencode.js +15 -15
  56. package/dist/bin/exe-status.js +26 -24
  57. package/dist/bin/exe-support.js +5 -5
  58. package/dist/bin/exe-team.js +5 -5
  59. package/dist/bin/exe-timers.js +32 -213
  60. package/dist/bin/exe-watchdog.js +6 -5
  61. package/dist/bin/git-sweep.js +26 -24
  62. package/dist/bin/graph-backfill.js +11 -11
  63. package/dist/bin/graph-export.js +9 -9
  64. package/dist/bin/import-history.js +13 -13
  65. package/dist/bin/install.js +103 -97
  66. package/dist/bin/intercom-check.js +4 -4
  67. package/dist/bin/mcp-sessions.js +2 -2
  68. package/dist/bin/orchestration-metrics.js +6 -6
  69. package/dist/bin/postgres-agentic-reflection-backfill.js +5 -5
  70. package/dist/bin/postgres-agentic-semantic-backfill.js +7 -7
  71. package/dist/bin/pre-publish.js +5 -3
  72. package/dist/bin/reconcile-backlog.js +2 -2
  73. package/dist/bin/registry-proxy.js +1 -1
  74. package/dist/bin/scan-tasks.js +25 -23
  75. package/dist/bin/setup.js +6 -5
  76. package/dist/bin/shard-migrate.js +9 -9
  77. package/dist/bin/stack-update.js +6 -6
  78. package/dist/bin/update.js +1 -1
  79. package/dist/bin/vps-health-gate.js +1 -1
  80. package/dist/{boot-generation-GSMPJOWM.js → boot-generation-BL2ISK4U.js} +5 -5
  81. package/dist/boot-review-sections-DBMQJT5N.js +107 -0
  82. package/dist/branch-hygiene-TZWK6QCF.js +224 -0
  83. package/dist/{branding-JTEOF4ZV.js → branding-DVXBGVDH.js} +3 -3
  84. package/dist/{browser-session-store-CXQMOSEC.js → browser-session-store-B2NR3LIX.js} +2 -1
  85. package/dist/{capability-cards-OBYQNAKZ.js → capability-cards-DN5UIKVN.js} +4 -4
  86. package/dist/{capacity-monitor-MG3FTUD5.js → capacity-monitor-ZG5GGFR2.js} +26 -24
  87. package/dist/{catchup-brief-BVJOF3GL.js → catchup-brief-D6HH6DWS.js} +31 -28
  88. package/dist/{chunk-Q5AIPSSC.js → chunk-25X4JD2V.js} +10 -6
  89. package/dist/{chunk-6MVI4QH2.js → chunk-2KZNGDSW.js} +1 -1
  90. package/dist/{chunk-WH7XN5ER.js → chunk-2WAVZ5UJ.js} +1 -1
  91. package/dist/{chunk-PTJBWC77.js → chunk-2ZYO73KO.js} +4 -3
  92. package/dist/{chunk-CLAYNAXC.js → chunk-3EUMUSLE.js} +1 -1
  93. package/dist/{chunk-BVV6NHKQ.js → chunk-3SW4OEHB.js} +5 -5
  94. package/dist/{task-enforcement-X5QVL6RE.js → chunk-4CMVFVFC.js} +173 -69
  95. package/dist/{chunk-2YCFNBC4.js → chunk-4J4PMPXZ.js} +3 -2
  96. package/dist/{chunk-EDOO23B2.js → chunk-4N2NRGCM.js} +2 -2
  97. package/dist/chunk-4QCFFW2H.js +378 -0
  98. package/dist/{chunk-6MVC43X7.js → chunk-4VSV5P4D.js} +2 -2
  99. package/dist/{chunk-HJX6NCJF.js → chunk-4ZCD2UWW.js} +39 -10
  100. package/dist/{chunk-C445WRUX.js → chunk-5ERDIOV3.js} +2 -2
  101. package/dist/chunk-5H47VHB7.js +30 -0
  102. package/dist/{chunk-BJ23BNED.js → chunk-5TY4FPH6.js} +1 -1
  103. package/dist/{chunk-WD55PEBM.js → chunk-6CH3TPHR.js} +3 -3
  104. package/dist/{chunk-TIXTHUVJ.js → chunk-6WQ3NNCE.js} +3 -3
  105. package/dist/{chunk-7LF5DS3A.js → chunk-6XWTQUO4.js} +1 -1
  106. package/dist/chunk-76CJBM36.js +88 -0
  107. package/dist/{chunk-NFBW7N4D.js → chunk-7CTRGNLW.js} +2 -2
  108. package/dist/{chunk-ITMEE7PQ.js → chunk-7V4JADD6.js} +3 -3
  109. package/dist/{chunk-RMOBQ6A5.js → chunk-AD2VCHSS.js} +1 -1
  110. package/dist/{chunk-DNVFWFYF.js → chunk-AJYCFKJR.js} +1 -1
  111. package/dist/chunk-AM7S2TY6.js +54 -0
  112. package/dist/{chunk-RWSLVYTE.js → chunk-AOHXREB7.js} +295 -67
  113. package/dist/{chunk-DGGDUKH6.js → chunk-ASAFVDVR.js} +1 -1
  114. package/dist/{chunk-NTI22F3R.js → chunk-BUCXNV32.js} +1 -1
  115. package/dist/{chunk-SHIICYJW.js → chunk-BYTDMAGB.js} +4 -2
  116. package/dist/{chunk-32SXNM3G.js → chunk-C5QAPURN.js} +1 -1
  117. package/dist/{chunk-BMHQPIJ2.js → chunk-CE7F6RHG.js} +585 -75
  118. package/dist/{chunk-YWQMWFYR.js → chunk-CNVBKDEY.js} +21 -15
  119. package/dist/{chunk-KPIN44GZ.js → chunk-CWXVH7WV.js} +1 -1
  120. package/dist/chunk-D74XYSA3.js +621 -0
  121. package/dist/{chunk-A47MXY2I.js → chunk-EQHQF5IM.js} +50 -32
  122. package/dist/{chunk-YHUNDGVV.js → chunk-EUS4QUKP.js} +1 -1
  123. package/dist/{chunk-6D2PI4QD.js → chunk-EV46QTD3.js} +1 -1
  124. package/dist/{chunk-N7A5D25S.js → chunk-F27XXN6C.js} +1 -1
  125. package/dist/{chunk-XQNNB5GY.js → chunk-F55P3H4S.js} +37 -2
  126. package/dist/{chunk-MWZFF3Q7.js → chunk-F5O7V7UK.js} +1 -1
  127. package/dist/{chunk-MC4ATFJV.js → chunk-FPFPLPUY.js} +6 -6
  128. package/dist/{chunk-UU4UINUX.js → chunk-G4RGKBCA.js} +2 -2
  129. package/dist/{chunk-HAZO7TRD.js → chunk-G5T6KDG4.js} +1 -1
  130. package/dist/{chunk-TWXZM34M.js → chunk-GBTTBXAF.js} +6 -6
  131. package/dist/{chunk-LA2Z6RMS.js → chunk-GDIJE6D7.js} +1 -1
  132. package/dist/{chunk-4QSJVMMT.js → chunk-GG5NDQNN.js} +2 -2
  133. package/dist/{chunk-6BQG7EKO.js → chunk-GJ26DULE.js} +2 -2
  134. package/dist/chunk-GL57PO3K.js +104 -0
  135. package/dist/chunk-GWDSB25T.js +6 -0
  136. package/dist/{chunk-HSYJ6DZ2.js → chunk-H6BV5TKD.js} +39 -24
  137. package/dist/{chunk-HCJCW7X4.js → chunk-H7I47RS5.js} +34 -1
  138. package/dist/{chunk-GFDGDFBF.js → chunk-HA5R6USD.js} +22 -5
  139. package/dist/{chunk-L2YGXJGF.js → chunk-HAF2DJYV.js} +3 -3
  140. package/dist/chunk-HJ447YER.js +224 -0
  141. package/dist/{chunk-6QW6JHRE.js → chunk-HV4KESRY.js} +59 -32
  142. package/dist/{chunk-BJOBR6P2.js → chunk-I26FWCSP.js} +216 -9
  143. package/dist/{chunk-X2FHTDIU.js → chunk-IBYL4DHM.js} +1 -1
  144. package/dist/{chunk-JCBKARSK.js → chunk-IOEUAQWP.js} +1 -1
  145. package/dist/{chunk-2UGGBIDL.js → chunk-JGIPOUIK.js} +3 -3
  146. package/dist/{chunk-LLU6WZLK.js → chunk-JLZ4RYSD.js} +2 -2
  147. package/dist/{chunk-WWNQFOSP.js → chunk-JMYHW3AL.js} +2 -2
  148. package/dist/{chunk-KP4PY2Z2.js → chunk-JPUZPAAF.js} +4 -4
  149. package/dist/{chunk-4LWV633D.js → chunk-JTBIS4R5.js} +1 -1
  150. package/dist/{chunk-PPZOWQHP.js → chunk-K7KFGDWF.js} +1 -1
  151. package/dist/{chunk-HNLXMD2V.js → chunk-KGWRTRKC.js} +2 -2
  152. package/dist/{chunk-IB336P52.js → chunk-KP3U5QGJ.js} +1 -1
  153. package/dist/{chunk-OUEFW4RK.js → chunk-KW2SD2FL.js} +2 -2
  154. package/dist/{chunk-2P4WJNN5.js → chunk-KWZMQACA.js} +11 -7
  155. package/dist/{chunk-ATKW3SYL.js → chunk-L2R3LN2P.js} +1 -1
  156. package/dist/{chunk-IELUDZAA.js → chunk-L4A5DL6Z.js} +3 -3
  157. package/dist/{chunk-2C455MU3.js → chunk-LU2FALL6.js} +3 -3
  158. package/dist/{chunk-LOBCQXV5.js → chunk-MKYFAKDW.js} +4 -4
  159. package/dist/{chunk-3BRVLPPA.js → chunk-MOPUCPXK.js} +4 -0
  160. package/dist/{chunk-BR4423AS.js → chunk-MR6LHP4F.js} +1 -1
  161. package/dist/chunk-MVYB76QG.js +341 -0
  162. package/dist/{chunk-ZNE6H2JO.js → chunk-MZM6EJCU.js} +4 -4
  163. package/dist/{chunk-FOV57K47.js → chunk-N7QJKQMX.js} +258 -14
  164. package/dist/{chunk-AYLNJGCS.js → chunk-NBZL5CGA.js} +93 -12
  165. package/dist/{chunk-YLQXP7T7.js → chunk-NN2B2QKU.js} +1 -1
  166. package/dist/chunk-NX5INHHG.js +40 -0
  167. package/dist/{chunk-B75BOKEI.js → chunk-NXUSDL37.js} +2 -2
  168. package/dist/{chunk-TPHCZDE3.js → chunk-O5V57XYE.js} +1 -1
  169. package/dist/chunk-O7LWR36Z.js +269 -0
  170. package/dist/{chunk-BV6GBSRP.js → chunk-OLMQ4UOF.js} +42 -10
  171. package/dist/{chunk-UIU2DGRV.js → chunk-OTF44GXL.js} +4 -4
  172. package/dist/{chunk-GOGSWXNZ.js → chunk-OZEBAGKR.js} +277 -137
  173. package/dist/{chunk-NDSNM5OH.js → chunk-P5HIWY2E.js} +1 -1
  174. package/dist/{chunk-MJB5ZFQM.js → chunk-PDWS3E22.js} +55 -4
  175. package/dist/{chunk-4FJZ6SO7.js → chunk-PPCDBE6Z.js} +1 -1
  176. package/dist/{chunk-7SEC2AG5.js → chunk-PQIDGXSG.js} +13 -4
  177. package/dist/chunk-PWUFMX75.js +186 -0
  178. package/dist/{chunk-GPW32HVB.js → chunk-QDGZJ653.js} +3 -3
  179. package/dist/{chunk-CYA5S5OD.js → chunk-QOO5RW3K.js} +6 -5
  180. package/dist/{chunk-IXBIVKWZ.js → chunk-QQ4E2RYW.js} +95 -18
  181. package/dist/{chunk-2WMTTIAZ.js → chunk-QRYVCDWS.js} +2 -2
  182. package/dist/{chunk-Z42MXYWW.js → chunk-QWVXN224.js} +110 -28
  183. package/dist/{chunk-XSMRR4IW.js → chunk-QYZJHTNE.js} +26 -27
  184. package/dist/{chunk-I7ECEP3W.js → chunk-R2NN3JKH.js} +43 -6
  185. package/dist/{chunk-B7CUBLF7.js → chunk-RACAOE2Z.js} +13 -13
  186. package/dist/{chunk-5RACW3LX.js → chunk-RAXVPNMR.js} +1 -1
  187. package/dist/{chunk-CMR64RYM.js → chunk-RHWZUUS4.js} +17 -17
  188. package/dist/{chunk-RNAYCUNM.js → chunk-S3THSOWV.js} +1 -1
  189. package/dist/{chunk-U2MREVXQ.js → chunk-S7QUM2UK.js} +2 -2
  190. package/dist/{chunk-SSTLTIF3.js → chunk-SKGMF2SO.js} +25 -2
  191. package/dist/{chunk-J6SEDDOR.js → chunk-SQKXKV2Y.js} +2 -2
  192. package/dist/{chunk-DPFQ2WQX.js → chunk-TLT7NZCW.js} +4 -4
  193. package/dist/chunk-TTCUG2CF.js +91 -0
  194. package/dist/{chunk-W6K4XB6G.js → chunk-UEA3LXOB.js} +1 -1
  195. package/dist/{chunk-WNKVKNOM.js → chunk-UNXQBELK.js} +1 -1
  196. package/dist/{chunk-KKOLHBNC.js → chunk-UP75Z5X7.js} +904 -167
  197. package/dist/{chunk-Y3S4H77G.js → chunk-USSB56WK.js} +1 -1
  198. package/dist/{chunk-PVIH3ZGV.js → chunk-UUEKJDK6.js} +90 -10
  199. package/dist/{chunk-T2PYVVZ5.js → chunk-UUQBZPJJ.js} +1 -1
  200. package/dist/{chunk-32YHCHWW.js → chunk-V3EEVY4L.js} +1 -1
  201. package/dist/{chunk-2IWBY7XK.js → chunk-VPZHJCKW.js} +2 -2
  202. package/dist/chunk-VRAQTFD6.js +265 -0
  203. package/dist/{chunk-EDH54E5A.js → chunk-VSRPS3J7.js} +14 -14
  204. package/dist/{chunk-5ZNY7IZI.js → chunk-WMESXBJM.js} +37 -3
  205. package/dist/{chunk-54QCG45Y.js → chunk-WOYADZF5.js} +56 -5
  206. package/dist/{chunk-7Y5UDEVM.js → chunk-WZHZCDDO.js} +6 -5
  207. package/dist/{chunk-3NGZ4PL7.js → chunk-X2Q5NLUL.js} +11 -2
  208. package/dist/{chunk-CCIEIRV2.js → chunk-X33NYQYJ.js} +2 -2
  209. package/dist/{chunk-K6KRBXQP.js → chunk-XHK3FS3W.js} +3 -2
  210. package/dist/{chunk-AP455LBW.js → chunk-XZXBB3TN.js} +2 -2
  211. package/dist/{chunk-JSKBHUR7.js → chunk-YCANDMI2.js} +2 -2
  212. package/dist/{chunk-YIIME2OW.js → chunk-YLXTKI6M.js} +1 -1
  213. package/dist/{chunk-LEJ25726.js → chunk-YTCFACP4.js} +650 -434
  214. package/dist/{chunk-HUSVERE6.js → chunk-Z6RSN7KS.js} +7 -6
  215. package/dist/{cleanup-graph-garbage-MXQ4Q2MA.js → cleanup-graph-garbage-XWUFAMFO.js} +8 -8
  216. package/dist/{co-activation-QI5BK4RT.js → co-activation-ZCHPLLP6.js} +4 -4
  217. package/dist/{co-occurrence-BYSQNZSV.js → co-occurrence-KG3LKALN.js} +6 -6
  218. package/dist/{code-context-index-BNBHDXHW.js → code-context-index-WSOJQ72R.js} +5 -5
  219. package/dist/{content-extractor-JRJDNIHP.js → content-extractor-NXYNEF5K.js} +2 -2
  220. package/dist/{conversation-entity-extractor-FPAMTL3C.js → conversation-entity-extractor-D3EFTLT4.js} +2 -2
  221. package/dist/{conversation-wiki-populator-WU4HEQ7C.js → conversation-wiki-populator-WQN3IUU6.js} +1 -1
  222. package/dist/{crdt-sync-ETPKNBCU.js → crdt-sync-4PFGPZXV.js} +8 -1
  223. package/dist/{crm-webhook-M566ZMZS.js → crm-webhook-II7Z45Q6.js} +2 -2
  224. package/dist/cto-delegation-gate-JWWOJPNC.js +669 -0
  225. package/dist/{daemon-auth-7IFSV5FG.js → daemon-auth-3FEAHFWC.js} +5 -3
  226. package/dist/{daemon-orchestration-XV5GN73R.js → daemon-orchestration-FX4XZDR5.js} +45 -26
  227. package/dist/{daemon-ready-RKKB4P6K.js → daemon-ready-4JTSFKAY.js} +1 -1
  228. package/dist/{daemon-ready-signal-WKEJQNRA.js → daemon-ready-signal-LPAZWQOV.js} +3 -1
  229. package/dist/daemon-restart-circuit-breaker-PEGEIP6H.js +35 -0
  230. package/dist/daemon-timer-report-NM44WQRH.js +25 -0
  231. package/dist/{db-backup-MX2G3CEK.js → db-backup-W2QFSYQC.js} +15 -5
  232. package/dist/{db-restore-events-JVEEP52Z.js → db-restore-events-MQ2DBGEQ.js} +2 -2
  233. package/dist/dispatch-ack-VYH3ONSS.js +27 -0
  234. package/dist/{doc-graph-extractor-LR5KMPH7.js → doc-graph-extractor-F6ODFIID.js} +6 -6
  235. package/dist/{documents-FA6N7QDA.js → documents-23WX2FPQ.js} +12 -12
  236. package/dist/dreaming-NWD22UQ5.js +46 -0
  237. package/dist/{exe-drift-TUKTCXZE.js → exe-drift-CW72FBGE.js} +5 -5
  238. package/dist/{exe-export-ZLHBXMZC.js → exe-export-AUJ7CV7G.js} +11 -11
  239. package/dist/{exe-import-VVKBZWSA.js → exe-import-JX4I52VE.js} +11 -11
  240. package/dist/{exe-key-QJXFBF6G.js → exe-key-2N6LY2BU.js} +242 -228
  241. package/dist/{exe-org-BGZNNE4H.js → exe-org-X4CSNCKS.js} +3 -3
  242. package/dist/{exe-snapshot-JRLUO645.js → exe-snapshot-XZ7FVCYZ.js} +30 -28
  243. package/dist/{fast-db-init-JKJEEHUI.js → fast-db-init-4CWHSOOR.js} +1 -1
  244. package/dist/{founder-context-HWPLMZVR.js → founder-context-7L3CFPYN.js} +4 -4
  245. package/dist/gateway/index.js +25 -25
  246. package/dist/{gateway-client-GRBOJQYC.js → gateway-client-7LMZKHTH.js} +1 -1
  247. package/dist/git-main-guard-UZP3KXYI.js +39 -0
  248. package/dist/{git-staleness-X5XZONX3.js → git-staleness-CI2R4QOJ.js} +4 -4
  249. package/dist/{global-procedures-VIIVWB6R.js → global-procedures-XQX3LUH6.js} +6 -6
  250. package/dist/{graph-auto-extract-HCQQF5AG.js → graph-auto-extract-OURWMGBS.js} +6 -6
  251. package/dist/{graph-rag-WAK2BRJH.js → graph-rag-JZZAB7PC.js} +2 -2
  252. package/dist/{hook-integrity-WURH6DS3.js → hook-integrity-XY47IM7G.js} +1 -1
  253. package/dist/hook-prefetch-PHRRKY4C.js +137 -0
  254. package/dist/hooks/bug-report-worker.js +31 -27
  255. package/dist/hooks/codex-stop-task-finalizer.js +31 -27
  256. package/dist/hooks/commit-complete.js +28 -26
  257. package/dist/hooks/error-recall.js +12 -11
  258. package/dist/hooks/exe-heartbeat-hook.js +6 -6
  259. package/dist/hooks/ingest-worker.js +11 -11
  260. package/dist/hooks/ingest.js +18 -18
  261. package/dist/hooks/instructions-loaded.js +7 -7
  262. package/dist/hooks/manifest.json +20 -20
  263. package/dist/hooks/notification.js +7 -7
  264. package/dist/hooks/post-compact.js +27 -25
  265. package/dist/hooks/post-tool-combined.js +12 -12
  266. package/dist/hooks/pre-compact.js +28 -26
  267. package/dist/hooks/pre-tool-use.js +179 -46
  268. package/dist/hooks/prompt-submit.js +323 -272
  269. package/dist/hooks/session-end.js +34 -32
  270. package/dist/hooks/session-start.js +28 -21
  271. package/dist/hooks/stop.js +34 -32
  272. package/dist/hooks/subagent-stop.js +27 -25
  273. package/dist/hooks/summary-worker.js +35 -33
  274. package/dist/index.js +40 -38
  275. package/dist/{installer-6IFVEQI4.js → installer-G3JAO3NT.js} +9 -9
  276. package/dist/{installer-NX2CLNV5.js → installer-JND3RJ6Q.js} +9 -9
  277. package/dist/{installer-T2LGHZKL.js → installer-L7EVH5U5.js} +9 -9
  278. package/dist/{intercom-queue-KYHXXZCQ.js → intercom-queue-ZFEQALR3.js} +24 -22
  279. package/dist/{key-backup-status-TNEHXA2X.js → key-backup-status-LOSMVATJ.js} +2 -2
  280. package/dist/lib/agent-config.js +4 -3
  281. package/dist/lib/cloud-sync.js +19 -19
  282. package/dist/lib/config.js +2 -2
  283. package/dist/lib/consolidation.js +11 -11
  284. package/dist/lib/crypto.js +3 -3
  285. package/dist/lib/database.js +6 -4
  286. package/dist/lib/db-daemon-client.js +5 -5
  287. package/dist/lib/db-read-worker-client.js +9 -3
  288. package/dist/lib/db.js +6 -4
  289. package/dist/lib/device-registry.js +3 -3
  290. package/dist/lib/embed-worker.js +2 -2
  291. package/dist/lib/embedder.js +5 -5
  292. package/dist/lib/employee-templates.js +7 -7
  293. package/dist/lib/employees.js +10 -4
  294. package/dist/lib/exe-daemon-client.js +4 -4
  295. package/dist/lib/exe-daemon.js +588 -164
  296. package/dist/lib/hybrid-search.js +11 -9
  297. package/dist/lib/identity.js +4 -4
  298. package/dist/lib/keychain.js +1 -1
  299. package/dist/lib/license.js +4 -4
  300. package/dist/lib/messaging.js +27 -23
  301. package/dist/lib/post-tool-memory.js +3 -3
  302. package/dist/lib/registry-proxy.js +1 -1
  303. package/dist/lib/reminders.js +15 -7
  304. package/dist/lib/schedules.js +9 -9
  305. package/dist/lib/session-registry.js +6 -6
  306. package/dist/lib/skill-learning.js +10 -10
  307. package/dist/lib/status-brief.js +4 -4
  308. package/dist/lib/store.js +8 -8
  309. package/dist/lib/task-router.js +5 -5
  310. package/dist/lib/tasks.js +28 -24
  311. package/dist/lib/tmux-routing.js +55 -24
  312. package/dist/lib/tmux-status.js +9 -3
  313. package/dist/lib/tmux-transport.js +1 -1
  314. package/dist/lib/token-spend.js +5 -5
  315. package/dist/lib/transport.js +2 -2
  316. package/dist/lib/ws-client.js +1 -1
  317. package/dist/{license-gate-MGDR4YNI.js → license-gate-QTRQHV4F.js} +5 -5
  318. package/dist/{license-sync-UWE6GEB4.js → license-sync-N3UJFWAW.js} +4 -4
  319. package/dist/mcp/register-tools.js +97 -91
  320. package/dist/mcp/server.js +99 -93
  321. package/dist/mcp/tools/complete-reminder.js +6 -6
  322. package/dist/mcp/tools/create-reminder.js +6 -6
  323. package/dist/mcp/tools/create-task.js +36 -27
  324. package/dist/mcp/tools/deactivate-behavior.js +11 -11
  325. package/dist/mcp/tools/list-reminders.js +6 -6
  326. package/dist/mcp/tools/list-tasks.js +34 -28
  327. package/dist/mcp/tools/send-message.js +27 -25
  328. package/dist/mcp/tools/update-task.js +33 -27
  329. package/dist/{mcp-http-config-RQLYEPTL.js → mcp-http-config-BDL36JZ3.js} +6 -6
  330. package/dist/{mcp-port-config-FFAMMLLE.js → mcp-port-config-6HYY6J7K.js} +2 -2
  331. package/dist/mcp-session-identity-T7H2EKFQ.js +177 -0
  332. package/dist/{memory-cards-VYQ5DPMR.js → memory-cards-ZRDW7QBX.js} +8 -8
  333. package/dist/{memory-graph-extractor-GX2HNYLU.js → memory-graph-extractor-QLXDMHRS.js} +7 -7
  334. package/dist/{memory-poisoning-defense-TX7627BD.js → memory-poisoning-defense-HJTXYCWH.js} +4 -4
  335. package/dist/{memory-pressure-watchdog-MLNNH26B.js → memory-pressure-watchdog-HN5X7AVN.js} +75 -36
  336. package/dist/{memory-queue-X2CSEAKE.js → memory-queue-2UOOF27L.js} +5 -3
  337. package/dist/{memory-queue-client-YRL6XTGU.js → memory-queue-client-O5U6F6XP.js} +6 -6
  338. package/dist/{memory-reflection-KIGEFSI4.js → memory-reflection-WVNFBJAA.js} +4 -4
  339. package/dist/{monitor-grants-RZOVSYVO.js → monitor-grants-E3ELDEWD.js} +5 -5
  340. package/dist/{monitor-identity-MOXISYNG.js → monitor-identity-GLFZSEAH.js} +2 -2
  341. package/dist/{notification-ledger-B6AVEGMV.js → notification-ledger-SZEPGJQ7.js} +25 -23
  342. package/dist/{notifications-DWXV7SVL.js → notifications-4UT53CDG.js} +24 -22
  343. package/dist/{orchestration-events-ZG7O4HRY.js → orchestration-events-WV4NWKZH.js} +5 -5
  344. package/dist/{orchestration-phase-CXRCBCK7.js → orchestration-phase-AWBXPO52.js} +3 -3
  345. package/dist/orchestrator-UAC3RW2T.js +47 -0
  346. package/dist/{pipeline-router-RTLAGZTA.js → pipeline-router-LM53NMWJ.js} +5 -5
  347. package/dist/{plan-limits-WLQZTCSF.js → plan-limits-2FEY2GOS.js} +7 -7
  348. package/dist/platform-procedures-X5DFJFV7.js +13 -0
  349. package/dist/{preferences-TYTGDXQZ.js → preferences-TWIXZBKS.js} +2 -2
  350. package/dist/{project-boot-6CGQ3EAH.js → project-boot-4NUH5FRU.js} +2 -2
  351. package/dist/{projection-worker-44SEKTZ5.js → projection-worker-FZ7YSN3G.js} +5 -5
  352. package/dist/{prospective-memory-UACFTYXK.js → prospective-memory-6D2ASWM3.js} +4 -4
  353. package/dist/{push-notifications-W5JRXLKJ.js → push-notifications-U6FIBQRW.js} +3 -3
  354. package/dist/{reranker-NL4YAV6R.js → reranker-GYYRPANK.js} +3 -3
  355. package/dist/{retrieval-health-4C2PO6HH.js → retrieval-health-4Z242P3B.js} +1 -1
  356. package/dist/{review-polling-W5AMHNLT.js → review-polling-HXAFJZDA.js} +25 -23
  357. package/dist/runtime/index.js +35 -33
  358. package/dist/{session-events-PGL5GJEB.js → session-events-O3BV56ZX.js} +25 -23
  359. package/dist/{session-kill-telemetry-6YDGEF27.js → session-kill-telemetry-AELE4JDK.js} +25 -23
  360. package/dist/session-mcp-config-YKNXG5DW.js +50 -0
  361. package/dist/{session-scope-3MEOO557.js → session-scope-5EAPUT45.js} +24 -22
  362. package/dist/setup-wizard-NB6R4QVS.js +14 -0
  363. package/dist/{shard-manager-MBWQEYNG.js → shard-manager-35PWFR3B.js} +3 -3
  364. package/dist/{skill-refinement-EOROTBPX.js → skill-refinement-DVSYXBBP.js} +5 -5
  365. package/dist/{stack-release-PR2XKJ4Q.js → stack-release-HGFFFCGC.js} +90 -15
  366. package/dist/{stack-update-LMDM27ZW.js → stack-update-ATCJFOEK.js} +5 -5
  367. package/dist/{steward-gate-4A2XHYFD.js → steward-gate-3GQ5XKMJ.js} +5 -5
  368. package/dist/{support-inbox-Z77ACQUY.js → support-inbox-4L62P4EP.js} +7 -6
  369. package/dist/{support-outbox-GB5SQFRJ.js → support-outbox-WHGPUYL2.js} +2 -2
  370. package/dist/task-enforcement-IPIZX2MM.js +90 -0
  371. package/dist/{task-scope-EKYDCVUF.js → task-scope-FOIW25HR.js} +26 -22
  372. package/dist/{tasks-crud-6LBNU43G.js → tasks-crud-HBDKE6C5.js} +34 -22
  373. package/dist/tasks-notify-G2U2U2YA.js +53 -0
  374. package/dist/{tasks-review-PBIUYXAL.js → tasks-review-27SFX5XN.js} +26 -22
  375. package/dist/{telemetry-upload-WQDFABTF.js → telemetry-upload-ZOXHRWR5.js} +9 -9
  376. package/dist/tmux-command-guard-KSJKIX3C.js +117 -0
  377. package/dist/{token-budget-KWGL5DY7.js → token-budget-5Y4YPDO3.js} +5 -5
  378. package/dist/{tool-capability-index-EH3HQVHU.js → tool-capability-index-VYF5GNJ2.js} +1 -1
  379. package/dist/{tool-telemetry-UC55LSIH.js → tool-telemetry-KBXSBDTK.js} +1 -1
  380. package/dist/tui/App.js +39 -37
  381. package/dist/{tui-data-M3RBSJL3.js → tui-data-NLFMBIQI.js} +24 -22
  382. package/dist/{update-check-HFO4VHO4.js → update-check-3FHAWIG2.js} +7 -3
  383. package/dist/{update-support-VPBD5SD2.js → update-support-UVUSZG7R.js} +93 -93
  384. package/dist/{whatsapp-accounts-BWRZUY23.js → whatsapp-accounts-BFIOXYW5.js} +1 -1
  385. package/dist/{whatsapp-config-GOSELKTE.js → whatsapp-config-FAX6EA5K.js} +20 -13
  386. package/dist/{worker-gate-4QLLMXZM.js → worker-gate-3KUBAU32.js} +3 -3
  387. package/dist/{workflow-engine-MMEHKUN4.js → workflow-engine-YITHXZR5.js} +2 -2
  388. package/dist/{working-memory-PY4AG577.js → working-memory-NUVB5SFV.js} +1 -1
  389. package/dist/worktree-LL62PLQB.js +47 -0
  390. package/dist/{worktree-sweep-5WKBU7E6.js → worktree-sweep-WTK3MTKH.js} +7 -7
  391. package/package.json +3 -2
  392. package/release-notes.json +75 -43
  393. package/dist/branch-hygiene-R5NVTRAY.js +0 -138
  394. package/dist/chunk-7YORGTXC.js +0 -138
  395. package/dist/chunk-CCPHEPLU.js +0 -30
  396. package/dist/chunk-HMP5VT6A.js +0 -118
  397. package/dist/chunk-PVYR4FCQ.js +0 -113
  398. package/dist/chunk-RP5GETX5.js +0 -140
  399. package/dist/chunk-YGAAZN3E.js +0 -47
  400. package/dist/cto-delegation-gate-S734XDXT.js +0 -290
  401. package/dist/dispatch-ack-4S44HBWB.js +0 -15
  402. package/dist/dreaming-UKGTQT6I.js +0 -44
  403. package/dist/orchestrator-PGHJDUUT.js +0 -45
  404. package/dist/setup-wizard-CJIYDSSP.js +0 -13
  405. package/dist/tasks-notify-TFJLSQ3B.js +0 -50
  406. package/dist/worktree-YXBDRYOC.js +0 -31
  407. package/dist/{chunk-7UMCQQWS.js → chunk-A4DVMPYB.js} +3 -3
  408. /package/dist/{chunk-2KLAYDFB.js → chunk-GIBYNT6W.js} +0 -0
  409. /package/dist/{chunk-MC6VPZKS.js → chunk-JRM4TAGS.js} +0 -0
  410. /package/dist/{chunk-3NCZKWPO.js → chunk-MGGOSFCR.js} +0 -0
  411. /package/dist/{chunk-C2SRRCRK.js → chunk-QIFYLIUF.js} +0 -0
  412. /package/dist/{chunk-OADURIIN.js → chunk-WTH4CSAP.js} +0 -0
  413. /package/dist/{core-memory-3IBWM4WR.js → core-memory-GAC6EWOQ.js} +0 -0
  414. /package/dist/{entity-boost-DWAWXFKN.js → entity-boost-NT6UO2Z3.js} +0 -0
  415. /package/dist/{message-queue-client-3PTHPG5Q.js → message-queue-client-4EOQRUXW.js} +0 -0
  416. /package/dist/{oauth-server-M5TGXT6D.js → oauth-server-67YBDP32.js} +0 -0
  417. /package/dist/{webhook-pipe-FZYLO6RR.js → webhook-pipe-LEXMUQ5B.js} +0 -0
  418. /package/dist/{wiki-acl-7CROE3MJ.js → wiki-acl-74BLWG6J.js} +0 -0
  419. /package/dist/{wiki-client-VNDOBK63.js → wiki-client-EAN7F5LV.js} +0 -0
@@ -0,0 +1,269 @@
1
+ // src/lib/dispatch-ack.ts
2
+ import {
3
+ existsSync,
4
+ mkdirSync,
5
+ readFileSync,
6
+ writeFileSync,
7
+ unlinkSync,
8
+ readdirSync,
9
+ rmSync
10
+ } from "fs";
11
+ import path from "path";
12
+ import os from "os";
13
+ function ackDir() {
14
+ return process.env.EXE_DISPATCH_ACK_DIR || path.join(os.homedir(), ".exe-os", "dispatch-acks");
15
+ }
16
+ var DISPATCH_DEDUP_WINDOW_MS = 90 * 1e3;
17
+ function ensureAckDir() {
18
+ const dir = ackDir();
19
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
20
+ }
21
+ function writeDispatchPending(taskId, assignedTo, sessionName) {
22
+ ensureAckDir();
23
+ const signal = {
24
+ taskId,
25
+ assignedTo,
26
+ dispatchedAt: (/* @__PURE__ */ new Date()).toISOString(),
27
+ sessionName
28
+ };
29
+ writeFileSync(path.join(ackDir(), `${taskId}.pending`), JSON.stringify(signal), "utf-8");
30
+ }
31
+ function spawnLockName(taskId, bucket) {
32
+ return `${taskId}.spawnlock.b${bucket}`;
33
+ }
34
+ function ownerPidAlive(dir) {
35
+ try {
36
+ const owner = JSON.parse(readFileSync(path.join(dir, "owner.json"), "utf-8"));
37
+ if (typeof owner.pid !== "number") return true;
38
+ try {
39
+ process.kill(owner.pid, 0);
40
+ return true;
41
+ } catch {
42
+ return false;
43
+ }
44
+ } catch {
45
+ return true;
46
+ }
47
+ }
48
+ function tryAcquireDispatchClaim(taskId, assignedTo, sessionName, windowMs = DISPATCH_DEDUP_WINDOW_MS) {
49
+ ensureAckDir();
50
+ const dir = ackDir();
51
+ const bucket = Math.floor(Date.now() / windowMs);
52
+ const curLock = path.join(dir, spawnLockName(taskId, bucket));
53
+ const prevLock = path.join(dir, spawnLockName(taskId, bucket - 1));
54
+ try {
55
+ if (existsSync(prevLock) && ownerPidAlive(prevLock)) return false;
56
+ } catch {
57
+ }
58
+ try {
59
+ mkdirSync(curLock);
60
+ } catch (err) {
61
+ if (err?.code === "EEXIST") return false;
62
+ return true;
63
+ }
64
+ try {
65
+ writeFileSync(
66
+ path.join(curLock, "owner.json"),
67
+ JSON.stringify({ pid: process.pid, assignedTo, sessionName, ts: (/* @__PURE__ */ new Date()).toISOString() }),
68
+ "utf-8"
69
+ );
70
+ } catch {
71
+ }
72
+ try {
73
+ writeDispatchPending(taskId, assignedTo, sessionName);
74
+ } catch {
75
+ }
76
+ return true;
77
+ }
78
+ function removeSpawnLockdirs(taskId) {
79
+ const dir = ackDir();
80
+ try {
81
+ const prefix = `${taskId}.spawnlock.b`;
82
+ for (const entry of readdirSync(dir)) {
83
+ if (entry.startsWith(prefix)) {
84
+ try {
85
+ rmSync(path.join(dir, entry), { recursive: true, force: true });
86
+ } catch {
87
+ }
88
+ }
89
+ }
90
+ } catch {
91
+ }
92
+ }
93
+ function releaseDispatchClaim(taskId, assignedTo, reason = "dispatch failed") {
94
+ ensureAckDir();
95
+ removeSpawnLockdirs(taskId);
96
+ try {
97
+ writeDispatchFailed(taskId, assignedTo, reason);
98
+ } catch {
99
+ }
100
+ }
101
+ function writeDispatchAck(taskId, agentId) {
102
+ ensureAckDir();
103
+ const pendingPath = path.join(ackDir(), `${taskId}.pending`);
104
+ const ackPath = path.join(ackDir(), `${taskId}.ack`);
105
+ let signal;
106
+ try {
107
+ signal = JSON.parse(readFileSync(pendingPath, "utf-8"));
108
+ } catch {
109
+ signal = { taskId, assignedTo: agentId, dispatchedAt: (/* @__PURE__ */ new Date()).toISOString() };
110
+ }
111
+ signal.ackedAt = (/* @__PURE__ */ new Date()).toISOString();
112
+ writeFileSync(ackPath, JSON.stringify(signal), "utf-8");
113
+ try {
114
+ unlinkSync(pendingPath);
115
+ } catch {
116
+ }
117
+ removeSpawnLockdirs(taskId);
118
+ }
119
+ function writeDispatchFailed(taskId, assignedTo, error, sessionName) {
120
+ ensureAckDir();
121
+ const pendingPath = path.join(ackDir(), `${taskId}.pending`);
122
+ let signal;
123
+ try {
124
+ signal = JSON.parse(readFileSync(pendingPath, "utf-8"));
125
+ } catch {
126
+ signal = { taskId, assignedTo, dispatchedAt: (/* @__PURE__ */ new Date()).toISOString() };
127
+ }
128
+ signal.failedAt = (/* @__PURE__ */ new Date()).toISOString();
129
+ signal.error = error;
130
+ if (sessionName) signal.sessionName = sessionName;
131
+ writeFileSync(path.join(ackDir(), `${taskId}.failed`), JSON.stringify(signal), "utf-8");
132
+ try {
133
+ unlinkSync(pendingPath);
134
+ } catch {
135
+ }
136
+ }
137
+ function checkDispatchStatus(taskId) {
138
+ ensureAckDir();
139
+ const ackPath = path.join(ackDir(), `${taskId}.ack`);
140
+ const failedPath = path.join(ackDir(), `${taskId}.failed`);
141
+ const pendingPath = path.join(ackDir(), `${taskId}.pending`);
142
+ if (existsSync(ackPath)) {
143
+ try {
144
+ const signal = JSON.parse(readFileSync(ackPath, "utf-8"));
145
+ return { status: "acked", signal };
146
+ } catch {
147
+ return { status: "acked" };
148
+ }
149
+ }
150
+ if (existsSync(failedPath)) {
151
+ try {
152
+ const signal = JSON.parse(readFileSync(failedPath, "utf-8"));
153
+ return { status: "failed", signal };
154
+ } catch {
155
+ return { status: "failed" };
156
+ }
157
+ }
158
+ if (existsSync(pendingPath)) {
159
+ try {
160
+ const signal = JSON.parse(readFileSync(pendingPath, "utf-8"));
161
+ return { status: "pending", signal };
162
+ } catch {
163
+ return { status: "pending" };
164
+ }
165
+ }
166
+ return { status: "unknown" };
167
+ }
168
+ var TERMINAL_FAILURE_DIR = path.join(os.homedir(), ".exe-os", "session-cache", "terminal-launcher-failure");
169
+ var TERMINAL_FAILURE_DEFAULT_TTL_MS = Number(process.env.EXE_TERMINAL_FAILURE_TTL_MS) || 6 * 60 * 60 * 1e3;
170
+ function terminalFailurePath(agentId, scope, baseDir) {
171
+ const safe = `${agentId}::${scope}`.replace(/[/\\]/g, "_");
172
+ return path.join(baseDir, `${safe}.json`);
173
+ }
174
+ function writeTerminalLauncherFailure(rec, baseDir = TERMINAL_FAILURE_DIR) {
175
+ try {
176
+ if (!existsSync(baseDir)) mkdirSync(baseDir, { recursive: true });
177
+ const payload = {
178
+ reason: rec.reason,
179
+ ...rec.detail ? { detail: rec.detail } : {},
180
+ runtime: rec.runtime,
181
+ ts: (/* @__PURE__ */ new Date()).toISOString()
182
+ };
183
+ writeFileSync(terminalFailurePath(rec.agentId, rec.scope, baseDir), JSON.stringify(payload), "utf-8");
184
+ } catch {
185
+ }
186
+ }
187
+ function readTerminalLauncherFailure(agentId, scope, opts) {
188
+ const baseDir = opts?.baseDir ?? TERMINAL_FAILURE_DIR;
189
+ const ttlMs = opts?.ttlMs ?? TERMINAL_FAILURE_DEFAULT_TTL_MS;
190
+ const now = opts?.now ?? Date.now();
191
+ try {
192
+ const p = terminalFailurePath(agentId, scope, baseDir);
193
+ if (!existsSync(p)) return null;
194
+ const rec = JSON.parse(readFileSync(p, "utf-8"));
195
+ if (!rec || typeof rec.reason !== "string" || rec.reason.trim().length === 0) return null;
196
+ if (typeof rec.ts !== "string") return null;
197
+ if (typeof rec.runtime !== "string") return null;
198
+ const age = now - new Date(rec.ts).getTime();
199
+ if (!Number.isFinite(age)) return null;
200
+ if (age < 0 || age > ttlMs) return null;
201
+ return rec;
202
+ } catch {
203
+ return null;
204
+ }
205
+ }
206
+ function clearTerminalLauncherFailure(agentId, scope, baseDir = TERMINAL_FAILURE_DIR) {
207
+ try {
208
+ unlinkSync(terminalFailurePath(agentId, scope, baseDir));
209
+ } catch {
210
+ }
211
+ }
212
+ function cleanStaleDispatchAcks(maxAgeMs = 60 * 60 * 1e3) {
213
+ ensureAckDir();
214
+ const now = Date.now();
215
+ let cleaned = 0;
216
+ try {
217
+ const dir = ackDir();
218
+ for (const file of readdirSync(dir)) {
219
+ const fullPath = path.join(dir, file);
220
+ if (file.includes(".spawnlock.b")) {
221
+ try {
222
+ const owner = JSON.parse(readFileSync(path.join(fullPath, "owner.json"), "utf-8"));
223
+ const ownerTs = owner.ts ? new Date(owner.ts).getTime() : NaN;
224
+ if (!Number.isFinite(ownerTs) || now - ownerTs > maxAgeMs) {
225
+ rmSync(fullPath, { recursive: true, force: true });
226
+ cleaned++;
227
+ }
228
+ } catch {
229
+ try {
230
+ rmSync(fullPath, { recursive: true, force: true });
231
+ cleaned++;
232
+ } catch {
233
+ }
234
+ }
235
+ continue;
236
+ }
237
+ try {
238
+ const signal = JSON.parse(readFileSync(fullPath, "utf-8"));
239
+ const ts = signal.ackedAt ?? signal.dispatchedAt;
240
+ if (now - new Date(ts).getTime() > maxAgeMs) {
241
+ unlinkSync(fullPath);
242
+ cleaned++;
243
+ }
244
+ } catch {
245
+ try {
246
+ unlinkSync(fullPath);
247
+ cleaned++;
248
+ } catch {
249
+ }
250
+ }
251
+ }
252
+ } catch {
253
+ }
254
+ return cleaned;
255
+ }
256
+
257
+ export {
258
+ DISPATCH_DEDUP_WINDOW_MS,
259
+ writeDispatchPending,
260
+ tryAcquireDispatchClaim,
261
+ releaseDispatchClaim,
262
+ writeDispatchAck,
263
+ writeDispatchFailed,
264
+ checkDispatchStatus,
265
+ writeTerminalLauncherFailure,
266
+ readTerminalLauncherFailure,
267
+ clearTerminalLauncherFailure,
268
+ cleanStaleDispatchAcks
269
+ };
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  EXE_AI_DIR
3
- } from "./chunk-7Y5UDEVM.js";
3
+ } from "./chunk-WZHZCDDO.js";
4
4
 
5
5
  // src/lib/db-backup.ts
6
- import { existsSync, readdirSync, unlinkSync, statSync, statfsSync } from "fs";
6
+ import { existsSync, readdirSync, unlinkSync, statSync, statfsSync, constants as fsConstants } from "fs";
7
7
  import { copyFile, mkdir, unlink, rename } from "fs/promises";
8
8
  import path from "path";
9
9
  var BACKUP_DIR = path.join(EXE_AI_DIR, "backups");
@@ -18,6 +18,9 @@ var REASON_COUNT_CAP = {
18
18
  "pre-consolidation": 5,
19
19
  "pre-fix": 5,
20
20
  "pre-restore": 5,
21
+ // Bug 98cf412f: guaranteed sub-daily snapshots bound the restore window.
22
+ // At the default 6h cadence, keep the last 24h of restore points.
23
+ "guaranteed": 4,
21
24
  // Bug 91b1b167: daily snapshots are full uncompressed SQLCipher copies
22
25
  // (~2-3GB apiece on large enterprise DBs). Time-based rotation alone left
23
26
  // 19GB accumulating when mtimes drifted / the disk guard tripped. A hard
@@ -102,7 +105,7 @@ async function createBackupAsync(reason = "manual", opts = {}) {
102
105
  await unlink(tmpBackupPath);
103
106
  } catch {
104
107
  }
105
- await copyFile(dbPath, tmpBackupPath);
108
+ await copyFile(dbPath, tmpBackupPath, fsConstants.COPYFILE_FICLONE);
106
109
  await rename(tmpBackupPath, backupPath);
107
110
  try {
108
111
  const { getClient } = await import("./lib/database.js");
@@ -139,7 +142,7 @@ async function createBackupAsync(reason = "manual", opts = {}) {
139
142
  }
140
143
  }
141
144
  try {
142
- const { manifestWriteEnabled, writeBackupManifest } = await import("./backup-verify-ZAJLEL4X.js");
145
+ const { manifestWriteEnabled, writeBackupManifest } = await import("./backup-verify-3Y2FHGZU.js");
143
146
  if (manifestWriteEnabled()) {
144
147
  await writeBackupManifest(backupPath, dbName);
145
148
  }
@@ -218,6 +221,15 @@ function hasEnoughDiskSpace(freeBytes, backupSizeBytes, minFreeBytes = MIN_FREE_
218
221
  const required = Math.max(minFreeBytes, backupSizeBytes * 2);
219
222
  return freeBytes >= required;
220
223
  }
224
+ function backupMinFreeRatio() {
225
+ const raw = Number(process.env.EXE_BACKUP_MIN_FREE_RATIO);
226
+ return Number.isFinite(raw) && raw > 0 ? raw : 2;
227
+ }
228
+ function shouldSkipBackupUnderMemoryPressure(freeBytes, dbBytes, ratio = backupMinFreeRatio()) {
229
+ if (!(dbBytes > 0)) return false;
230
+ if (!Number.isFinite(freeBytes)) return false;
231
+ return freeBytes < dbBytes * ratio;
232
+ }
221
233
  function getFreeBytes(dir) {
222
234
  try {
223
235
  const s = statfsSync(dir);
@@ -380,16 +392,28 @@ function hasBackupToday(reason) {
380
392
  const backups = listBackups();
381
393
  return backups.some((b) => b.name.includes(reason) && b.name.includes(today.replace(/-/g, "-")));
382
394
  }
383
- function hasRecentBackup(reason, withinMs) {
395
+ var DEFAULT_PRE_RESTART_DEDUP_MS = 30 * 60 * 1e3;
396
+ function preRestartDedupWindowMs() {
397
+ const raw = Number(process.env.EXE_PRE_RESTART_DEDUP_MS);
398
+ return Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : DEFAULT_PRE_RESTART_DEDUP_MS;
399
+ }
400
+ var REAL_RECENT_BACKUP_DEPS = {
401
+ backupDir: BACKUP_DIR,
402
+ existsSync,
403
+ readdirSync,
404
+ statMtimeMs: (p) => statSync(p).mtimeMs,
405
+ now: () => Date.now()
406
+ };
407
+ function hasRecentBackup(reason, withinMs, deps = REAL_RECENT_BACKUP_DEPS) {
384
408
  try {
385
- if (!existsSync(BACKUP_DIR)) return false;
386
- const now = Date.now();
387
- for (const file of readdirSync(BACKUP_DIR)) {
409
+ if (!deps.existsSync(deps.backupDir)) return false;
410
+ const now = deps.now();
411
+ for (const file of deps.readdirSync(deps.backupDir)) {
388
412
  if (file.endsWith(".tmp")) continue;
389
413
  if (!file.endsWith(".db")) continue;
390
- if (!file.includes(`-${reason}-`)) continue;
414
+ if (!matchesBackupReason(file, reason)) continue;
391
415
  try {
392
- if (now - statSync(path.join(BACKUP_DIR, file)).mtimeMs <= withinMs) return true;
416
+ if (now - deps.statMtimeMs(path.join(deps.backupDir, file)) <= withinMs) return true;
393
417
  } catch {
394
418
  }
395
419
  }
@@ -397,6 +421,9 @@ function hasRecentBackup(reason, withinMs) {
397
421
  }
398
422
  return false;
399
423
  }
424
+ function shouldMakePreRestartBackup(existingBackupMtimesMs, now, windowMs = preRestartDedupWindowMs()) {
425
+ return !existingBackupMtimesMs.some((mtime) => now - mtime <= windowMs);
426
+ }
400
427
  function getLatestBackup() {
401
428
  const backups = listBackups();
402
429
  return backups.length > 0 ? backups[0].path : null;
@@ -462,6 +489,8 @@ export {
462
489
  selectStaleTmpFiles,
463
490
  cleanupStaleTmp,
464
491
  hasEnoughDiskSpace,
492
+ backupMinFreeRatio,
493
+ shouldSkipBackupUnderMemoryPressure,
465
494
  rotateBackupsByReason,
466
495
  matchesBackupReason,
467
496
  reasonFromBackupName,
@@ -471,7 +500,10 @@ export {
471
500
  cleanupCrashDebris,
472
501
  listBackups,
473
502
  hasBackupToday,
503
+ DEFAULT_PRE_RESTART_DEDUP_MS,
504
+ preRestartDedupWindowMs,
474
505
  hasRecentBackup,
506
+ shouldMakePreRestartBackup,
475
507
  getLatestBackup,
476
508
  restoreBackup,
477
509
  getBackupDir
@@ -8,11 +8,11 @@ import {
8
8
  import {
9
9
  loadLicense,
10
10
  readCachedLicenseToken
11
- } from "./chunk-7SEC2AG5.js";
11
+ } from "./chunk-PQIDGXSG.js";
12
12
  import {
13
13
  EXE_AI_DIR,
14
14
  loadConfig
15
- } from "./chunk-7Y5UDEVM.js";
15
+ } from "./chunk-WZHZCDDO.js";
16
16
 
17
17
  // src/bin/exe-support.ts
18
18
  import { mkdirSync, readFileSync, unlinkSync, writeFileSync } from "fs";
@@ -275,7 +275,7 @@ function nextForPostFailure(status) {
275
275
  return "Run `exe-os support health`; if it passes, send this output to AskExe.";
276
276
  }
277
277
  async function runFlush(json) {
278
- const { flushSupportOutbox } = await import("./support-outbox-GB5SQFRJ.js");
278
+ const { flushSupportOutbox } = await import("./support-outbox-WHGPUYL2.js");
279
279
  const result = await flushSupportOutbox({ maxPerFlush: 10 });
280
280
  if (json) {
281
281
  console.log(JSON.stringify(result, null, 2));
@@ -298,7 +298,7 @@ async function runFlush(json) {
298
298
  console.log("");
299
299
  }
300
300
  async function runStatus(json) {
301
- const { getOutboxStatus } = await import("./support-outbox-GB5SQFRJ.js");
301
+ const { getOutboxStatus } = await import("./support-outbox-WHGPUYL2.js");
302
302
  const status = await getOutboxStatus();
303
303
  if (json) {
304
304
  console.log(JSON.stringify(status, null, 2));