@askexenow/exe-os 0.9.340 → 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 (417) 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-EC6M7KTX.js → active-agent-PVGE57FY.js} +5 -5
  7. package/dist/{active-agent-WHIUCHLA.js → active-agent-TNIO6IY3.js} +5 -5
  8. package/dist/{agentic-ontology-RNSXGXW4.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-MFY6BHKE.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-3Y2FHGZU.js +425 -0
  13. package/dist/{behaviors-HLZUJSMP.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 +26 -24
  24. package/dist/bin/cli.js +111 -25
  25. package/dist/bin/customer-readiness.js +1 -1
  26. package/dist/bin/deferred-daemon-restart.js +97 -90
  27. package/dist/bin/exe-agent-config.js +9 -8
  28. package/dist/bin/exe-agent.js +20 -20
  29. package/dist/bin/exe-assign.js +12 -12
  30. package/dist/bin/exe-boot.js +201 -68
  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 +26 -24
  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 +29 -28
  42. package/dist/bin/exe-kill.js +31 -29
  43. package/dist/bin/exe-launch-agent.js +129 -68
  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 +27 -25
  47. package/dist/bin/exe-pending-notifications.js +26 -24
  48. package/dist/bin/exe-pending-reviews.js +26 -24
  49. package/dist/bin/exe-rename.js +7 -7
  50. package/dist/bin/exe-review.js +30 -28
  51. package/dist/bin/exe-search.js +11 -9
  52. package/dist/bin/exe-session-cleanup.js +116 -86
  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 +27 -25
  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 +27 -25
  62. package/dist/bin/graph-backfill.js +9 -9
  63. package/dist/bin/graph-export.js +9 -9
  64. package/dist/bin/import-history.js +11 -11
  65. package/dist/bin/install.js +102 -95
  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 +484 -0
  73. package/dist/bin/registry-proxy.js +1 -1
  74. package/dist/bin/scan-tasks.js +26 -24
  75. package/dist/bin/setup.js +6 -5
  76. package/dist/bin/shard-migrate.js +9 -9
  77. package/dist/bin/stack-update.js +15 -9
  78. package/dist/bin/update.js +1 -1
  79. package/dist/bin/vps-health-gate.js +1 -1
  80. package/dist/boot-generation-BL2ISK4U.js +22 -0
  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-YOKVMMOL.js → capability-cards-DN5UIKVN.js} +4 -4
  86. package/dist/{capacity-monitor-S54IOWRL.js → capacity-monitor-ZG5GGFR2.js} +27 -25
  87. package/dist/{catchup-brief-DRRQCMKA.js → catchup-brief-D6HH6DWS.js} +32 -29
  88. package/dist/{support-outbox-MGUVVGHT.js → chunk-25X4JD2V.js} +28 -12
  89. package/dist/{chunk-IYB2NIW3.js → chunk-2KZNGDSW.js} +1 -1
  90. package/dist/{chunk-FUIIVSW6.js → chunk-2WAVZ5UJ.js} +1 -1
  91. package/dist/{chunk-K5WFKEXQ.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-VI7L43DC.js → chunk-4CMVFVFC.js} +173 -69
  95. package/dist/{chunk-BU2QQWBQ.js → chunk-4J4PMPXZ.js} +3 -2
  96. package/dist/{chunk-JD5S5AAV.js → chunk-4N2NRGCM.js} +2 -2
  97. package/dist/chunk-4QCFFW2H.js +378 -0
  98. package/dist/{chunk-7EA7LYW4.js → chunk-4VSV5P4D.js} +4 -4
  99. package/dist/{chunk-52KNOQMK.js → chunk-4ZCD2UWW.js} +39 -10
  100. package/dist/{chunk-DZ6OQM67.js → chunk-5ERDIOV3.js} +2 -2
  101. package/dist/chunk-5H47VHB7.js +30 -0
  102. package/dist/{chunk-UCQITDLM.js → chunk-5TY4FPH6.js} +1 -1
  103. package/dist/{chunk-R44Z32O2.js → chunk-6CH3TPHR.js} +2 -2
  104. package/dist/{chunk-WYLV4S6A.js → chunk-6WQ3NNCE.js} +3 -3
  105. package/dist/{chunk-HHIBOU3P.js → chunk-6XWTQUO4.js} +1 -1
  106. package/dist/chunk-76CJBM36.js +88 -0
  107. package/dist/{chunk-H2L4PHGH.js → chunk-7CTRGNLW.js} +2 -2
  108. package/dist/{chunk-XUKPALWT.js → chunk-7V4JADD6.js} +2 -2
  109. package/dist/{chunk-RMOBQ6A5.js → chunk-AD2VCHSS.js} +1 -1
  110. package/dist/{chunk-QXSBB26A.js → chunk-AJYCFKJR.js} +1 -1
  111. package/dist/chunk-AM7S2TY6.js +54 -0
  112. package/dist/{chunk-HEPR6QTL.js → chunk-AOHXREB7.js} +334 -66
  113. package/dist/{chunk-FNZR3B7U.js → chunk-ASAFVDVR.js} +1 -1
  114. package/dist/{chunk-TALWBVZE.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-XCTGRD4S.js → chunk-CE7F6RHG.js} +587 -77
  118. package/dist/{chunk-7WPOJDTA.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-AOO77BDE.js → chunk-EUS4QUKP.js} +1 -1
  123. package/dist/{chunk-RLRT2BVM.js → chunk-EV46QTD3.js} +1 -1
  124. package/dist/{chunk-PAEXYFMY.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-LMZISHSJ.js → chunk-FPFPLPUY.js} +6 -6
  128. package/dist/{chunk-7TS64TBG.js → chunk-G4RGKBCA.js} +8 -3
  129. package/dist/{chunk-4IYSBPX3.js → chunk-G5T6KDG4.js} +1 -1
  130. package/dist/{chunk-7WDXEKUL.js → chunk-GBTTBXAF.js} +4 -4
  131. package/dist/{chunk-6MRWJMI5.js → chunk-GDIJE6D7.js} +1 -1
  132. package/dist/{chunk-AVKXCSBI.js → chunk-GG5NDQNN.js} +2 -2
  133. package/dist/{chunk-I3XKO3KQ.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-F55JF43M.js → chunk-H6BV5TKD.js} +39 -24
  137. package/dist/{chunk-HCJCW7X4.js → chunk-H7I47RS5.js} +34 -1
  138. package/dist/{chunk-65SVQELL.js → chunk-HA5R6USD.js} +31 -5
  139. package/dist/{chunk-VJHUVFIW.js → chunk-HAF2DJYV.js} +3 -3
  140. package/dist/chunk-HJ447YER.js +224 -0
  141. package/dist/chunk-HV4KESRY.js +395 -0
  142. package/dist/{chunk-B76TSEP3.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-MW2GJJ53.js → chunk-JGIPOUIK.js} +3 -3
  146. package/dist/{chunk-2233TQCA.js → chunk-JLZ4RYSD.js} +2 -2
  147. package/dist/{chunk-Q7L6G6KV.js → chunk-JMYHW3AL.js} +2 -2
  148. package/dist/{chunk-OJTJYEMX.js → chunk-JPUZPAAF.js} +4 -4
  149. package/dist/{chunk-XWHE4LZK.js → chunk-JTBIS4R5.js} +21 -2
  150. package/dist/{chunk-5Z5NATNS.js → chunk-K7KFGDWF.js} +1 -1
  151. package/dist/{chunk-UIV2WPBT.js → chunk-KGWRTRKC.js} +2 -2
  152. package/dist/{chunk-KTPG4XKI.js → chunk-KP3U5QGJ.js} +1 -1
  153. package/dist/{chunk-TLYAEISW.js → chunk-KW2SD2FL.js} +2 -2
  154. package/dist/{chunk-X7H3HMFH.js → chunk-KWZMQACA.js} +11 -7
  155. package/dist/{chunk-OFX5B2S7.js → chunk-L2R3LN2P.js} +1 -1
  156. package/dist/{chunk-T4KZ2Z2N.js → chunk-L4A5DL6Z.js} +3 -3
  157. package/dist/{chunk-X425OEYF.js → chunk-LU2FALL6.js} +3 -3
  158. package/dist/{chunk-6M36JFFD.js → chunk-MKYFAKDW.js} +4 -4
  159. package/dist/{chunk-I5RLNOFK.js → chunk-MOPUCPXK.js} +12 -4
  160. package/dist/{chunk-ZIVEA3NB.js → chunk-MR6LHP4F.js} +1 -1
  161. package/dist/chunk-MVYB76QG.js +341 -0
  162. package/dist/{chunk-2SG2UGCH.js → chunk-MZM6EJCU.js} +4 -4
  163. package/dist/{chunk-ZREGOV2Q.js → chunk-N7QJKQMX.js} +258 -14
  164. package/dist/{chunk-QLFRCA6I.js → chunk-NBZL5CGA.js} +93 -12
  165. package/dist/{chunk-QFPTDSY2.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-ATOU6CYR.js → chunk-OLMQ4UOF.js} +57 -11
  171. package/dist/{chunk-6HBURYON.js → chunk-OTF44GXL.js} +4 -4
  172. package/dist/{chunk-DILD54TU.js → chunk-OZEBAGKR.js} +277 -137
  173. package/dist/{chunk-DADMPMYX.js → chunk-P5HIWY2E.js} +1 -1
  174. package/dist/{chunk-EIF2LQHZ.js → chunk-PDWS3E22.js} +55 -4
  175. package/dist/{chunk-KTY7I7UH.js → chunk-PPCDBE6Z.js} +1 -1
  176. package/dist/{chunk-XACL67CS.js → chunk-PQIDGXSG.js} +13 -4
  177. package/dist/chunk-PWUFMX75.js +186 -0
  178. package/dist/{chunk-UPWE5NOG.js → chunk-QDGZJ653.js} +3 -3
  179. package/dist/{chunk-MQRFKSLI.js → chunk-QOO5RW3K.js} +6 -5
  180. package/dist/{chunk-KCC5A7YL.js → chunk-QQ4E2RYW.js} +95 -18
  181. package/dist/{chunk-BPC5LZ6Y.js → chunk-QRYVCDWS.js} +2 -2
  182. package/dist/{chunk-Z42MXYWW.js → chunk-QWVXN224.js} +110 -28
  183. package/dist/{chunk-542EWGY3.js → chunk-QYZJHTNE.js} +26 -27
  184. package/dist/{chunk-I7Z6KTGF.js → chunk-R2NN3JKH.js} +43 -6
  185. package/dist/{chunk-3OBWSCJN.js → chunk-RACAOE2Z.js} +14 -14
  186. package/dist/{chunk-5RACW3LX.js → chunk-RAXVPNMR.js} +1 -1
  187. package/dist/{chunk-2HZY3ECT.js → chunk-RHWZUUS4.js} +6 -6
  188. package/dist/{chunk-RNAYCUNM.js → chunk-S3THSOWV.js} +1 -1
  189. package/dist/{chunk-W7DHFGCB.js → chunk-S7QUM2UK.js} +2 -2
  190. package/dist/{chunk-SSTLTIF3.js → chunk-SKGMF2SO.js} +25 -2
  191. package/dist/{chunk-GN45PBWI.js → chunk-SQKXKV2Y.js} +2 -2
  192. package/dist/{chunk-QZLIZAS7.js → chunk-TLT7NZCW.js} +4 -4
  193. package/dist/chunk-TTCUG2CF.js +91 -0
  194. package/dist/chunk-UEA3LXOB.js +40 -0
  195. package/dist/{chunk-DRCRZIIJ.js → chunk-UNXQBELK.js} +1 -1
  196. package/dist/{chunk-PLRIJALF.js → chunk-UP75Z5X7.js} +921 -176
  197. package/dist/{chunk-TNJRWUCE.js → chunk-USSB56WK.js} +1 -1
  198. package/dist/{chunk-KMBEL7VB.js → chunk-UUEKJDK6.js} +90 -10
  199. package/dist/{chunk-XJI7Z6LZ.js → chunk-UUQBZPJJ.js} +1 -1
  200. package/dist/{chunk-RRWDYOQS.js → chunk-V3EEVY4L.js} +1 -1
  201. package/dist/{chunk-N5I7RL3I.js → chunk-VPZHJCKW.js} +2 -2
  202. package/dist/chunk-VRAQTFD6.js +265 -0
  203. package/dist/{chunk-H37HHX3E.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-YE7NH53A.js → chunk-X33NYQYJ.js} +2 -2
  209. package/dist/{chunk-UXBD22CD.js → chunk-XHK3FS3W.js} +3 -2
  210. package/dist/{chunk-3QDSCJ3F.js → chunk-XZXBB3TN.js} +2 -2
  211. package/dist/{chunk-JSKBHUR7.js → chunk-YCANDMI2.js} +2 -2
  212. package/dist/{chunk-JBSCL2XT.js → chunk-YLXTKI6M.js} +1 -1
  213. package/dist/{chunk-G7WO77Z2.js → chunk-YTCFACP4.js} +812 -896
  214. package/dist/{chunk-LTVCRHHD.js → chunk-Z6RSN7KS.js} +7 -6
  215. package/dist/{cleanup-graph-garbage-KUABW6LS.js → cleanup-graph-garbage-XWUFAMFO.js} +6 -6
  216. package/dist/{co-activation-XMPHKGHR.js → co-activation-ZCHPLLP6.js} +4 -4
  217. package/dist/{co-occurrence-SHKSJ6CV.js → co-occurrence-KG3LKALN.js} +4 -4
  218. package/dist/{code-context-index-EXXDY3QZ.js → code-context-index-WSOJQ72R.js} +5 -5
  219. package/dist/{content-extractor-RHITF2KM.js → content-extractor-NXYNEF5K.js} +2 -2
  220. package/dist/{conversation-wiki-populator-WU4HEQ7C.js → conversation-wiki-populator-WQN3IUU6.js} +1 -1
  221. package/dist/{crdt-sync-UJELKSNX.js → crdt-sync-4PFGPZXV.js} +8 -1
  222. package/dist/{crm-webhook-HHNBS7LY.js → crm-webhook-II7Z45Q6.js} +2 -2
  223. package/dist/cto-delegation-gate-JWWOJPNC.js +669 -0
  224. package/dist/{daemon-auth-7IFSV5FG.js → daemon-auth-3FEAHFWC.js} +5 -3
  225. package/dist/{daemon-orchestration-7QB6QOXT.js → daemon-orchestration-FX4XZDR5.js} +46 -27
  226. package/dist/{daemon-ready-5XI5BIJD.js → daemon-ready-4JTSFKAY.js} +1 -1
  227. package/dist/{daemon-ready-signal-E7VMIQ6I.js → daemon-ready-signal-LPAZWQOV.js} +5 -1
  228. package/dist/daemon-restart-circuit-breaker-PEGEIP6H.js +35 -0
  229. package/dist/daemon-timer-report-NM44WQRH.js +25 -0
  230. package/dist/{db-backup-DLD4QZBO.js → db-backup-W2QFSYQC.js} +15 -5
  231. package/dist/{db-restore-events-JVEEP52Z.js → db-restore-events-MQ2DBGEQ.js} +2 -2
  232. package/dist/dispatch-ack-VYH3ONSS.js +27 -0
  233. package/dist/{doc-graph-extractor-3TRLGD7M.js → doc-graph-extractor-F6ODFIID.js} +4 -4
  234. package/dist/{documents-FHIBU7KJ.js → documents-23WX2FPQ.js} +12 -12
  235. package/dist/dreaming-NWD22UQ5.js +46 -0
  236. package/dist/{exe-drift-KY2KHZEL.js → exe-drift-CW72FBGE.js} +5 -5
  237. package/dist/{exe-export-SP6G3QF6.js → exe-export-AUJ7CV7G.js} +11 -11
  238. package/dist/{exe-import-KJU7FBVQ.js → exe-import-JX4I52VE.js} +11 -11
  239. package/dist/{exe-key-M6TYHNUW.js → exe-key-2N6LY2BU.js} +241 -226
  240. package/dist/{exe-org-BGZNNE4H.js → exe-org-X4CSNCKS.js} +3 -3
  241. package/dist/{exe-snapshot-ZNPGUKRZ.js → exe-snapshot-XZ7FVCYZ.js} +31 -29
  242. package/dist/{fast-db-init-QQB6IVWV.js → fast-db-init-4CWHSOOR.js} +1 -1
  243. package/dist/{founder-context-PQR3BUS7.js → founder-context-7L3CFPYN.js} +4 -4
  244. package/dist/gateway/index.js +14 -14
  245. package/dist/{gateway-client-GRBOJQYC.js → gateway-client-7LMZKHTH.js} +1 -1
  246. package/dist/git-main-guard-UZP3KXYI.js +39 -0
  247. package/dist/{git-staleness-UGB5J3K7.js → git-staleness-CI2R4QOJ.js} +4 -4
  248. package/dist/{global-procedures-R7KRREEK.js → global-procedures-XQX3LUH6.js} +6 -6
  249. package/dist/{graph-auto-extract-LKIQ57PL.js → graph-auto-extract-OURWMGBS.js} +4 -4
  250. package/dist/{hook-integrity-WURH6DS3.js → hook-integrity-XY47IM7G.js} +1 -1
  251. package/dist/hook-prefetch-PHRRKY4C.js +137 -0
  252. package/dist/hooks/bug-report-worker.js +32 -28
  253. package/dist/hooks/codex-stop-task-finalizer.js +32 -28
  254. package/dist/hooks/commit-complete.js +29 -27
  255. package/dist/hooks/error-recall.js +12 -11
  256. package/dist/hooks/exe-heartbeat-hook.js +6 -6
  257. package/dist/hooks/ingest-worker.js +11 -11
  258. package/dist/hooks/ingest.js +18 -18
  259. package/dist/hooks/instructions-loaded.js +7 -7
  260. package/dist/hooks/manifest.json +20 -20
  261. package/dist/hooks/notification.js +7 -7
  262. package/dist/hooks/post-compact.js +28 -26
  263. package/dist/hooks/post-tool-combined.js +12 -12
  264. package/dist/hooks/pre-compact.js +29 -27
  265. package/dist/hooks/pre-tool-use.js +180 -47
  266. package/dist/hooks/prompt-submit.js +324 -273
  267. package/dist/hooks/session-end.js +35 -33
  268. package/dist/hooks/session-start.js +28 -21
  269. package/dist/hooks/stop.js +35 -33
  270. package/dist/hooks/subagent-stop.js +28 -26
  271. package/dist/hooks/summary-worker.js +36 -34
  272. package/dist/index.js +39 -37
  273. package/dist/{installer-SB2N5NKH.js → installer-G3JAO3NT.js} +9 -9
  274. package/dist/{installer-MZWWBXM6.js → installer-JND3RJ6Q.js} +9 -9
  275. package/dist/{installer-MNPXDLGG.js → installer-L7EVH5U5.js} +9 -9
  276. package/dist/{intercom-queue-VU2G6F5R.js → intercom-queue-ZFEQALR3.js} +25 -23
  277. package/dist/{key-backup-status-TNEHXA2X.js → key-backup-status-LOSMVATJ.js} +2 -2
  278. package/dist/lib/agent-config.js +4 -3
  279. package/dist/lib/cloud-sync.js +19 -19
  280. package/dist/lib/config.js +2 -2
  281. package/dist/lib/consolidation.js +9 -9
  282. package/dist/lib/crypto.js +3 -3
  283. package/dist/lib/database.js +6 -4
  284. package/dist/lib/db-daemon-client.js +5 -5
  285. package/dist/lib/db-read-worker-client.js +9 -3
  286. package/dist/lib/db.js +6 -4
  287. package/dist/lib/device-registry.js +3 -3
  288. package/dist/lib/embed-worker.js +2 -2
  289. package/dist/lib/embedder.js +5 -5
  290. package/dist/lib/employee-templates.js +7 -7
  291. package/dist/lib/employees.js +10 -4
  292. package/dist/lib/exe-daemon-client.js +4 -4
  293. package/dist/lib/exe-daemon.js +651 -158
  294. package/dist/lib/hybrid-search.js +11 -9
  295. package/dist/lib/identity.js +4 -4
  296. package/dist/lib/keychain.js +1 -1
  297. package/dist/lib/license.js +4 -4
  298. package/dist/lib/messaging.js +28 -24
  299. package/dist/lib/post-tool-memory.js +3 -3
  300. package/dist/lib/registry-proxy.js +1 -1
  301. package/dist/lib/reminders.js +15 -7
  302. package/dist/lib/schedules.js +9 -9
  303. package/dist/lib/session-registry.js +6 -6
  304. package/dist/lib/skill-learning.js +10 -10
  305. package/dist/lib/status-brief.js +4 -4
  306. package/dist/lib/store.js +8 -8
  307. package/dist/lib/task-router.js +5 -5
  308. package/dist/lib/tasks.js +29 -25
  309. package/dist/lib/tmux-routing.js +56 -25
  310. package/dist/lib/tmux-status.js +9 -3
  311. package/dist/lib/tmux-transport.js +1 -1
  312. package/dist/lib/token-spend.js +5 -5
  313. package/dist/lib/transport.js +2 -2
  314. package/dist/lib/ws-client.js +1 -1
  315. package/dist/{license-gate-BYDMFMFT.js → license-gate-QTRQHV4F.js} +5 -5
  316. package/dist/{license-sync-N3RNYVP2.js → license-sync-N3UJFWAW.js} +4 -4
  317. package/dist/mcp/register-tools.js +96 -89
  318. package/dist/mcp/server.js +98 -91
  319. package/dist/mcp/tools/complete-reminder.js +6 -6
  320. package/dist/mcp/tools/create-reminder.js +6 -6
  321. package/dist/mcp/tools/create-task.js +37 -28
  322. package/dist/mcp/tools/deactivate-behavior.js +11 -11
  323. package/dist/mcp/tools/list-reminders.js +6 -6
  324. package/dist/mcp/tools/list-tasks.js +35 -29
  325. package/dist/mcp/tools/send-message.js +28 -26
  326. package/dist/mcp/tools/update-task.js +34 -28
  327. package/dist/{mcp-http-config-EMAVS2JI.js → mcp-http-config-BDL36JZ3.js} +6 -6
  328. package/dist/{mcp-port-config-FFAMMLLE.js → mcp-port-config-6HYY6J7K.js} +2 -2
  329. package/dist/mcp-session-identity-T7H2EKFQ.js +177 -0
  330. package/dist/{memory-cards-TQRLZI4D.js → memory-cards-ZRDW7QBX.js} +8 -8
  331. package/dist/{memory-graph-extractor-IWGNVAFU.js → memory-graph-extractor-QLXDMHRS.js} +5 -5
  332. package/dist/{memory-poisoning-defense-T4ITBGSG.js → memory-poisoning-defense-HJTXYCWH.js} +4 -4
  333. package/dist/{memory-pressure-watchdog-RRIAXPXQ.js → memory-pressure-watchdog-HN5X7AVN.js} +76 -37
  334. package/dist/{memory-queue-X2CSEAKE.js → memory-queue-2UOOF27L.js} +5 -3
  335. package/dist/{memory-queue-client-BKQHTYTH.js → memory-queue-client-O5U6F6XP.js} +6 -6
  336. package/dist/{memory-reflection-6N4J2FL7.js → memory-reflection-WVNFBJAA.js} +4 -4
  337. package/dist/{monitor-grants-RZOVSYVO.js → monitor-grants-E3ELDEWD.js} +5 -5
  338. package/dist/{monitor-identity-MOXISYNG.js → monitor-identity-GLFZSEAH.js} +2 -2
  339. package/dist/notification-ledger-SZEPGJQ7.js +409 -0
  340. package/dist/{notifications-KONB3C62.js → notifications-4UT53CDG.js} +25 -23
  341. package/dist/{orchestration-events-5SIJOE4H.js → orchestration-events-WV4NWKZH.js} +5 -5
  342. package/dist/{orchestration-phase-CXRCBCK7.js → orchestration-phase-AWBXPO52.js} +3 -3
  343. package/dist/orchestrator-UAC3RW2T.js +47 -0
  344. package/dist/{pipeline-router-O6HU7DKH.js → pipeline-router-LM53NMWJ.js} +5 -5
  345. package/dist/{plan-limits-GRNBOBB3.js → plan-limits-2FEY2GOS.js} +7 -7
  346. package/dist/platform-procedures-X5DFJFV7.js +13 -0
  347. package/dist/{preferences-TYTGDXQZ.js → preferences-TWIXZBKS.js} +2 -2
  348. package/dist/{project-boot-SD7GM24K.js → project-boot-4NUH5FRU.js} +2 -2
  349. package/dist/{projection-worker-ZVOFHTXT.js → projection-worker-FZ7YSN3G.js} +5 -5
  350. package/dist/{prospective-memory-W6S67LZZ.js → prospective-memory-6D2ASWM3.js} +4 -4
  351. package/dist/{push-notifications-W5JRXLKJ.js → push-notifications-U6FIBQRW.js} +3 -3
  352. package/dist/{reranker-QATGTAPC.js → reranker-GYYRPANK.js} +3 -3
  353. package/dist/{retrieval-health-TWHKYCRK.js → retrieval-health-4Z242P3B.js} +1 -1
  354. package/dist/{review-polling-PCMD5BFN.js → review-polling-HXAFJZDA.js} +26 -24
  355. package/dist/runtime/index.js +37 -35
  356. package/dist/{session-events-3LCVQEL7.js → session-events-O3BV56ZX.js} +26 -24
  357. package/dist/{session-kill-telemetry-CZSPN5V6.js → session-kill-telemetry-AELE4JDK.js} +26 -24
  358. package/dist/session-mcp-config-YKNXG5DW.js +50 -0
  359. package/dist/{session-scope-CFHVSVAQ.js → session-scope-5EAPUT45.js} +25 -23
  360. package/dist/setup-wizard-NB6R4QVS.js +14 -0
  361. package/dist/{shard-manager-MBWQEYNG.js → shard-manager-35PWFR3B.js} +3 -3
  362. package/dist/{skill-refinement-74T6VDFM.js → skill-refinement-DVSYXBBP.js} +5 -5
  363. package/dist/stack-promote-RSOWO6EY.js +130 -0
  364. package/dist/{stack-release-XXMV7SPX.js → stack-release-HGFFFCGC.js} +112 -22
  365. package/dist/{stack-update-E2TKHHSQ.js → stack-update-ATCJFOEK.js} +7 -5
  366. package/dist/{steward-gate-WT7WXQIE.js → steward-gate-3GQ5XKMJ.js} +5 -5
  367. package/dist/support-inbox-4L62P4EP.js +33 -0
  368. package/dist/support-outbox-WHGPUYL2.js +16 -0
  369. package/dist/task-enforcement-IPIZX2MM.js +90 -0
  370. package/dist/{task-scope-CQEG5SSJ.js → task-scope-FOIW25HR.js} +27 -23
  371. package/dist/{tasks-crud-UGK5A25L.js → tasks-crud-HBDKE6C5.js} +35 -23
  372. package/dist/tasks-notify-G2U2U2YA.js +53 -0
  373. package/dist/{tasks-review-JKBRACII.js → tasks-review-27SFX5XN.js} +27 -23
  374. package/dist/{telemetry-upload-7LBYGPCB.js → telemetry-upload-ZOXHRWR5.js} +9 -9
  375. package/dist/tmux-command-guard-KSJKIX3C.js +117 -0
  376. package/dist/{token-budget-QBRJR4M5.js → token-budget-5Y4YPDO3.js} +5 -5
  377. package/dist/{tool-capability-index-Q6YQDL7I.js → tool-capability-index-VYF5GNJ2.js} +1 -1
  378. package/dist/{tool-telemetry-ULIDUK3P.js → tool-telemetry-KBXSBDTK.js} +1 -1
  379. package/dist/tui/App.js +40 -38
  380. package/dist/{tui-data-NPTGKT37.js → tui-data-NLFMBIQI.js} +25 -23
  381. package/dist/{update-check-HFO4VHO4.js → update-check-3FHAWIG2.js} +7 -3
  382. package/dist/update-support-UVUSZG7R.js +355 -0
  383. package/dist/{whatsapp-accounts-BWRZUY23.js → whatsapp-accounts-BFIOXYW5.js} +1 -1
  384. package/dist/{whatsapp-config-GOSELKTE.js → whatsapp-config-FAX6EA5K.js} +20 -13
  385. package/dist/{worker-gate-MXUQUG4M.js → worker-gate-3KUBAU32.js} +3 -3
  386. package/dist/{workflow-engine-EWCOLD47.js → workflow-engine-YITHXZR5.js} +2 -2
  387. package/dist/{working-memory-PY4AG577.js → working-memory-NUVB5SFV.js} +1 -1
  388. package/dist/worktree-LL62PLQB.js +47 -0
  389. package/dist/{worktree-sweep-ZAG3V24E.js → worktree-sweep-WTK3MTKH.js} +7 -7
  390. package/package.json +3 -2
  391. package/release-notes.json +86 -76
  392. package/dist/branch-hygiene-R5NVTRAY.js +0 -138
  393. package/dist/chunk-6IRVGOUL.js +0 -30
  394. package/dist/chunk-HMP5VT6A.js +0 -118
  395. package/dist/chunk-PVYR4FCQ.js +0 -113
  396. package/dist/chunk-UFAXZ2PY.js +0 -138
  397. package/dist/chunk-Y25OJWOQ.js +0 -45
  398. package/dist/chunk-YGAAZN3E.js +0 -47
  399. package/dist/cto-delegation-gate-DXNF5HVW.js +0 -290
  400. package/dist/dispatch-ack-4S44HBWB.js +0 -15
  401. package/dist/dreaming-OMFUEUCQ.js +0 -44
  402. package/dist/orchestrator-DUUX7FQV.js +0 -45
  403. package/dist/setup-wizard-TOFEJPLF.js +0 -13
  404. package/dist/tasks-notify-SMLDFBWM.js +0 -50
  405. package/dist/worktree-GVF2I5FP.js +0 -31
  406. /package/dist/{chunk-FLNSJ2TC.js → chunk-GIBYNT6W.js} +0 -0
  407. /package/dist/{chunk-NQBRGXYR.js → chunk-JRM4TAGS.js} +0 -0
  408. /package/dist/{chunk-WHRTDN5J.js → chunk-MGGOSFCR.js} +0 -0
  409. /package/dist/{chunk-D3QASX2W.js → chunk-QIFYLIUF.js} +0 -0
  410. /package/dist/{chunk-OADURIIN.js → chunk-WTH4CSAP.js} +0 -0
  411. /package/dist/{core-memory-VO5ZIBKH.js → core-memory-GAC6EWOQ.js} +0 -0
  412. /package/dist/{entity-boost-DNI4A5I7.js → entity-boost-NT6UO2Z3.js} +0 -0
  413. /package/dist/{message-queue-client-Q5BW3O5W.js → message-queue-client-4EOQRUXW.js} +0 -0
  414. /package/dist/{oauth-server-ROQFOEMM.js → oauth-server-67YBDP32.js} +0 -0
  415. /package/dist/{webhook-pipe-FZYLO6RR.js → webhook-pipe-LEXMUQ5B.js} +0 -0
  416. /package/dist/{wiki-acl-JA5UCQZ4.js → wiki-acl-74BLWG6J.js} +0 -0
  417. /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");
@@ -138,6 +141,13 @@ async function createBackupAsync(reason = "manual", opts = {}) {
138
141
  } catch {
139
142
  }
140
143
  }
144
+ try {
145
+ const { manifestWriteEnabled, writeBackupManifest } = await import("./backup-verify-3Y2FHGZU.js");
146
+ if (manifestWriteEnabled()) {
147
+ await writeBackupManifest(backupPath, dbName);
148
+ }
149
+ } catch {
150
+ }
141
151
  try {
142
152
  enforceRetention(reason);
143
153
  } catch {
@@ -159,6 +169,13 @@ function rotateBackups(keepDays = DEFAULT_KEEP_DAYS) {
159
169
  if (stat.mtimeMs < cutoff) {
160
170
  unlinkSync(filePath);
161
171
  deleted++;
172
+ if (file.endsWith(".db")) {
173
+ try {
174
+ const mf = filePath + ".manifest.json";
175
+ if (existsSync(mf)) unlinkSync(mf);
176
+ } catch {
177
+ }
178
+ }
162
179
  }
163
180
  } catch {
164
181
  }
@@ -204,6 +221,15 @@ function hasEnoughDiskSpace(freeBytes, backupSizeBytes, minFreeBytes = MIN_FREE_
204
221
  const required = Math.max(minFreeBytes, backupSizeBytes * 2);
205
222
  return freeBytes >= required;
206
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
+ }
207
233
  function getFreeBytes(dir) {
208
234
  try {
209
235
  const s = statfsSync(dir);
@@ -249,7 +275,7 @@ function rotateBackupsByReason(reason, keep) {
249
275
  }
250
276
  }
251
277
  for (const target of selectBackupsToDelete(matches, keep)) {
252
- for (const p of [target, target + "-wal", target + "-shm"]) {
278
+ for (const p of [target, target + "-wal", target + "-shm", target + ".manifest.json"]) {
253
279
  try {
254
280
  if (existsSync(p)) {
255
281
  unlinkSync(p);
@@ -327,7 +353,7 @@ function pruneCorruptQuarantine(keep = QUARANTINE_KEEP) {
327
353
  }
328
354
  }
329
355
  for (const target of selectBackupsToDelete(matches, keep)) {
330
- for (const p of [target, target + "-wal", target + "-shm"]) {
356
+ for (const p of [target, target + "-wal", target + "-shm", target + ".manifest.json"]) {
331
357
  try {
332
358
  if (existsSync(p)) {
333
359
  unlinkSync(p);
@@ -366,16 +392,28 @@ function hasBackupToday(reason) {
366
392
  const backups = listBackups();
367
393
  return backups.some((b) => b.name.includes(reason) && b.name.includes(today.replace(/-/g, "-")));
368
394
  }
369
- 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) {
370
408
  try {
371
- if (!existsSync(BACKUP_DIR)) return false;
372
- const now = Date.now();
373
- 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)) {
374
412
  if (file.endsWith(".tmp")) continue;
375
413
  if (!file.endsWith(".db")) continue;
376
- if (!file.includes(`-${reason}-`)) continue;
414
+ if (!matchesBackupReason(file, reason)) continue;
377
415
  try {
378
- 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;
379
417
  } catch {
380
418
  }
381
419
  }
@@ -383,6 +421,9 @@ function hasRecentBackup(reason, withinMs) {
383
421
  }
384
422
  return false;
385
423
  }
424
+ function shouldMakePreRestartBackup(existingBackupMtimesMs, now, windowMs = preRestartDedupWindowMs()) {
425
+ return !existingBackupMtimesMs.some((mtime) => now - mtime <= windowMs);
426
+ }
386
427
  function getLatestBackup() {
387
428
  const backups = listBackups();
388
429
  return backups.length > 0 ? backups[0].path : null;
@@ -448,6 +489,8 @@ export {
448
489
  selectStaleTmpFiles,
449
490
  cleanupStaleTmp,
450
491
  hasEnoughDiskSpace,
492
+ backupMinFreeRatio,
493
+ shouldSkipBackupUnderMemoryPressure,
451
494
  rotateBackupsByReason,
452
495
  matchesBackupReason,
453
496
  reasonFromBackupName,
@@ -457,7 +500,10 @@ export {
457
500
  cleanupCrashDebris,
458
501
  listBackups,
459
502
  hasBackupToday,
503
+ DEFAULT_PRE_RESTART_DEDUP_MS,
504
+ preRestartDedupWindowMs,
460
505
  hasRecentBackup,
506
+ shouldMakePreRestartBackup,
461
507
  getLatestBackup,
462
508
  restoreBackup,
463
509
  getBackupDir
@@ -8,11 +8,11 @@ import {
8
8
  import {
9
9
  loadLicense,
10
10
  readCachedLicenseToken
11
- } from "./chunk-XACL67CS.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-MGUVVGHT.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-MGUVVGHT.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));