@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
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  writeMemoryViaDaemon
3
- } from "./chunk-2233TQCA.js";
3
+ } from "./chunk-JLZ4RYSD.js";
4
4
 
5
5
  // src/lib/auto-checkpoint.ts
6
6
  var FILE_RE = /(?:^|\s)([\w./-]+\.(?:ts|tsx|js|jsx|json|md|yml|yaml|sql|go|py|css|scss|html|sh))(?:\b|$)/g;
@@ -1,12 +1,32 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-HEPR6QTL.js";
3
+ } from "./chunk-AOHXREB7.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-7Y5UDEVM.js";
6
+ } from "./chunk-WZHZCDDO.js";
7
7
 
8
8
  // src/lib/reminders.ts
9
9
  import crypto from "crypto";
10
+ function parseDailyPushHours(dailyPush) {
11
+ if (!dailyPush || dailyPush.trim().length === 0) return [];
12
+ try {
13
+ const parsed = JSON.parse(dailyPush);
14
+ if (!Array.isArray(parsed.hours)) return [];
15
+ const hours = parsed.hours.filter((h) => typeof h === "number" && Number.isInteger(h) && h >= 0 && h <= 23);
16
+ return [...new Set(hours)].sort((a, b) => a - b);
17
+ } catch {
18
+ return [];
19
+ }
20
+ }
21
+ function normalizeDailyPush(dailyPush) {
22
+ if (dailyPush === void 0 || dailyPush === null) return null;
23
+ if (dailyPush.trim().length === 0) return null;
24
+ const hours = parseDailyPushHours(dailyPush);
25
+ if (hours.length === 0) {
26
+ throw new Error(`Invalid daily_push: expected JSON like {"hours":[9,18]} with integer hours 0\u201323`);
27
+ }
28
+ return JSON.stringify({ hours });
29
+ }
10
30
  async function getCloudConfig() {
11
31
  try {
12
32
  const config = await loadConfig();
@@ -62,6 +82,9 @@ async function cloudFetchReminders(cloud) {
62
82
  createdAt: r.created_at,
63
83
  dueDate: r.due_date,
64
84
  completedAt: r.completed_at,
85
+ dailyPush: null,
86
+ // cloud KV does not carry the local push schedule
87
+ lastPushedAt: null,
65
88
  source: "cloud"
66
89
  }));
67
90
  } catch (err) {
@@ -103,31 +126,42 @@ function dedup(local, cloud) {
103
126
  }
104
127
  return merged;
105
128
  }
106
- async function createReminder(text, dueDate) {
129
+ async function createReminder(text, dueDate, dailyPush) {
107
130
  const client = getClient();
108
131
  const id = crypto.randomUUID();
109
132
  const now = (/* @__PURE__ */ new Date()).toISOString();
133
+ const normalizedPush = normalizeDailyPush(dailyPush);
110
134
  await client.execute({
111
- sql: `INSERT INTO reminders (id, text, created_at, due_date) VALUES (?, ?, ?, ?)`,
112
- args: [id, text, now, dueDate ?? null]
135
+ sql: `INSERT INTO reminders (id, text, created_at, due_date, daily_push) VALUES (?, ?, ?, ?, ?)`,
136
+ args: [id, text, now, dueDate ?? null, normalizedPush]
113
137
  });
114
138
  const cloud = await getCloudConfig();
115
139
  if (cloud) {
116
140
  cloudPushReminder(cloud, text, dueDate ?? null).catch(() => {
117
141
  });
118
142
  }
119
- return { id, text, createdAt: now, dueDate: dueDate ?? null, completedAt: null };
143
+ return {
144
+ id,
145
+ text,
146
+ createdAt: now,
147
+ dueDate: dueDate ?? null,
148
+ completedAt: null,
149
+ dailyPush: normalizedPush,
150
+ lastPushedAt: null
151
+ };
120
152
  }
121
153
  async function listReminders(includeCompleted = false) {
122
154
  const client = getClient();
123
- const sql = includeCompleted ? `SELECT id, text, created_at, due_date, completed_at FROM reminders ORDER BY due_date ASC NULLS LAST LIMIT 500` : `SELECT id, text, created_at, due_date, completed_at FROM reminders WHERE completed_at IS NULL ORDER BY due_date ASC NULLS LAST LIMIT 500`;
155
+ const sql = includeCompleted ? `SELECT id, text, created_at, due_date, completed_at, daily_push, last_pushed_at FROM reminders ORDER BY due_date ASC NULLS LAST LIMIT 500` : `SELECT id, text, created_at, due_date, completed_at, daily_push, last_pushed_at FROM reminders WHERE completed_at IS NULL ORDER BY due_date ASC NULLS LAST LIMIT 500`;
124
156
  const result = await client.execute(sql);
125
157
  const local = result.rows.map((row) => ({
126
158
  id: String(row.id),
127
159
  text: String(row.text),
128
160
  createdAt: String(row.created_at),
129
161
  dueDate: row.due_date ? String(row.due_date) : null,
130
- completedAt: row.completed_at ? String(row.completed_at) : null
162
+ completedAt: row.completed_at ? String(row.completed_at) : null,
163
+ dailyPush: row.daily_push ? String(row.daily_push) : null,
164
+ lastPushedAt: row.last_pushed_at ? String(row.last_pushed_at) : null
131
165
  }));
132
166
  const cloud = await getCloudConfig();
133
167
  if (cloud) {
@@ -171,11 +205,57 @@ async function completeReminder(idOrText) {
171
205
  }).catch(() => {
172
206
  });
173
207
  }
174
- return { id, text, createdAt: "", dueDate: null, completedAt: now };
208
+ return { id, text, createdAt: "", dueDate: null, completedAt: now, dailyPush: null };
209
+ }
210
+ function alreadyPushedThisHour(lastPushedAt, now) {
211
+ if (!lastPushedAt) return false;
212
+ const last = new Date(lastPushedAt);
213
+ if (Number.isNaN(last.getTime())) return false;
214
+ return last.getFullYear() === now.getFullYear() && last.getMonth() === now.getMonth() && last.getDate() === now.getDate() && last.getHours() === now.getHours();
215
+ }
216
+ async function getDuePushReminders(now = /* @__PURE__ */ new Date()) {
217
+ const client = getClient();
218
+ const result = await client.execute({
219
+ sql: `SELECT id, text, due_date, daily_push, last_pushed_at
220
+ FROM reminders
221
+ WHERE completed_at IS NULL AND daily_push IS NOT NULL
222
+ LIMIT 500`,
223
+ args: []
224
+ });
225
+ const hour = now.getHours();
226
+ const due = [];
227
+ for (const row of result.rows) {
228
+ const hours = parseDailyPushHours(row.daily_push ? String(row.daily_push) : null);
229
+ if (!hours.includes(hour)) continue;
230
+ if (alreadyPushedThisHour(row.last_pushed_at ? String(row.last_pushed_at) : null, now)) continue;
231
+ due.push({
232
+ id: String(row.id),
233
+ text: String(row.text),
234
+ hour,
235
+ dueDate: row.due_date ? String(row.due_date) : null
236
+ });
237
+ }
238
+ return due;
239
+ }
240
+ async function markReminderPushed(id, now = /* @__PURE__ */ new Date()) {
241
+ try {
242
+ const client = getClient();
243
+ await client.execute({
244
+ sql: `UPDATE reminders SET last_pushed_at = ? WHERE id = ?`,
245
+ args: [now.toISOString(), id]
246
+ });
247
+ } catch (err) {
248
+ process.stderr.write(`[reminders] markReminderPushed failed: ${err instanceof Error ? err.message : String(err)}
249
+ `);
250
+ }
175
251
  }
176
252
 
177
253
  export {
254
+ parseDailyPushHours,
255
+ normalizeDailyPush,
178
256
  createReminder,
179
257
  listReminders,
180
- completeReminder
258
+ completeReminder,
259
+ getDuePushReminders,
260
+ markReminderPushed
181
261
  };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getIdentity,
3
3
  loadEmployeesSync
4
- } from "./chunk-HEPR6QTL.js";
4
+ } from "./chunk-AOHXREB7.js";
5
5
 
6
6
  // src/lib/drift-probes.ts
7
7
  var DRIFT_THRESHOLD = 80;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-HEPR6QTL.js";
3
+ } from "./chunk-AOHXREB7.js";
4
4
 
5
5
  // src/lib/token-budget.ts
6
6
  var WARN_THRESHOLD = 0.8;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EXE_AI_DIR
3
- } from "./chunk-7Y5UDEVM.js";
3
+ } from "./chunk-WZHZCDDO.js";
4
4
 
5
5
  // src/lib/worker-gate.ts
6
6
  import { readdirSync, writeFileSync, unlinkSync, mkdirSync, existsSync, readFileSync } from "fs";
@@ -119,7 +119,7 @@ function releaseBackfillLock() {
119
119
  }
120
120
  async function getTaskAwareCapacity() {
121
121
  const { getClient } = await import("./lib/database.js");
122
- const { sessionScopeFilter } = await import("./task-scope-CQEG5SSJ.js");
122
+ const { sessionScopeFilter } = await import("./task-scope-FOIW25HR.js");
123
123
  const client = getClient();
124
124
  const scope = sessionScopeFilter();
125
125
  const result = await client.execute({
@@ -0,0 +1,265 @@
1
+ import {
2
+ redactSecrets
3
+ } from "./chunk-4QCFFW2H.js";
4
+ import {
5
+ EXE_AI_DIR
6
+ } from "./chunk-WZHZCDDO.js";
7
+
8
+ // src/lib/local-secret-inventory.ts
9
+ import {
10
+ chmodSync,
11
+ lstatSync,
12
+ mkdirSync,
13
+ readFileSync,
14
+ readdirSync,
15
+ realpathSync,
16
+ rmSync
17
+ } from "fs";
18
+ import path from "path";
19
+ var SQLITE_HEADER = "SQLite format 3\0";
20
+ var CRDT_STATE_ENC_MAGIC = "EXEO-CRDT-ENC1:";
21
+ function isEncryptedCrdtState(head) {
22
+ const magic = Buffer.from(CRDT_STATE_ENC_MAGIC, "utf8");
23
+ if (head.length < magic.length) return false;
24
+ return head.subarray(0, magic.length).equals(magic);
25
+ }
26
+ function safeStat(filePath) {
27
+ try {
28
+ return lstatSync(filePath);
29
+ } catch {
30
+ return null;
31
+ }
32
+ }
33
+ function addIfFile(residues, filePath, kind, detail, cleanup, deletable = true) {
34
+ const st = safeStat(filePath);
35
+ if (!st?.isFile()) return;
36
+ residues.push({ kind, path: filePath, sizeBytes: Number(st.size), detail, cleanup, deletable });
37
+ }
38
+ function firstBytes(filePath, n) {
39
+ try {
40
+ return readFileSync(filePath).subarray(0, n);
41
+ } catch {
42
+ return Buffer.alloc(0);
43
+ }
44
+ }
45
+ function isPlaintextSqliteFile(filePath) {
46
+ const st = safeStat(filePath);
47
+ if (!st?.isFile()) return false;
48
+ if (st.size === 0) return true;
49
+ return firstBytes(filePath, SQLITE_HEADER.length).toString("binary") === SQLITE_HEADER;
50
+ }
51
+ function walk(dir, maxDepth) {
52
+ if (maxDepth < 0) return [];
53
+ let entries;
54
+ try {
55
+ entries = readdirSync(dir);
56
+ } catch {
57
+ return [];
58
+ }
59
+ const out = [];
60
+ for (const entry of entries) {
61
+ const full = path.join(dir, entry);
62
+ const st = safeStat(full);
63
+ if (!st) continue;
64
+ if (st.isFile()) out.push(full);
65
+ else if (st.isDirectory()) out.push(...walk(full, maxDepth - 1));
66
+ }
67
+ return out;
68
+ }
69
+ function segmentIsEmergencyRecovery(segment) {
70
+ if (/emergency[-_]?recovery/i.test(segment)) return true;
71
+ if (/recovery[-_]?export/i.test(segment)) return true;
72
+ return false;
73
+ }
74
+ function isEmergencyRecoveryExport(filePath) {
75
+ const base = path.basename(filePath);
76
+ if (/^NEW_KEY_DO_NOT_SHARE\.base64$/i.test(base)) return true;
77
+ if (/^OLD_KEY_BACKUP_DELETE_AFTER_VERIFICATION\.base64$/i.test(base)) return true;
78
+ return segmentIsEmergencyRecovery(base);
79
+ }
80
+ function isUnderEmergencyRecoveryDir(dataDir, filePath) {
81
+ const rel = path.relative(dataDir, filePath);
82
+ if (rel.startsWith("..")) return false;
83
+ const segments = rel.split(path.sep);
84
+ return segments.slice(0, -1).some(segmentIsEmergencyRecovery);
85
+ }
86
+ function findEmergencyRecoveryDirs(dataDir, maxDepth) {
87
+ const out = [];
88
+ const recurse = (dir, depth) => {
89
+ if (depth < 0) return;
90
+ let entries;
91
+ try {
92
+ entries = readdirSync(dir);
93
+ } catch {
94
+ return;
95
+ }
96
+ for (const entry of entries) {
97
+ const full = path.join(dir, entry);
98
+ const st = safeStat(full);
99
+ if (!st?.isDirectory()) continue;
100
+ if (segmentIsEmergencyRecovery(entry)) out.push(full);
101
+ recurse(full, depth - 1);
102
+ }
103
+ };
104
+ recurse(dataDir, maxDepth);
105
+ return out;
106
+ }
107
+ function dirSize(dir) {
108
+ let total = 0;
109
+ for (const f of walk(dir, 8)) {
110
+ const st = safeStat(f);
111
+ if (st?.isFile()) total += Number(st.size);
112
+ }
113
+ return total;
114
+ }
115
+ function inventoryLocalSecretResidue(dataDir = EXE_AI_DIR) {
116
+ const residues = [];
117
+ addIfFile(
118
+ residues,
119
+ path.join(dataDir, "recovery-phrase.txt"),
120
+ "recovery-phrase",
121
+ "Headless setup recovery phrase is still on disk. Do not print it; move it to a password manager or offline vault, then delete the file.",
122
+ "Vault the phrase, then run: exe-os doctor --delete-local-secret-residue"
123
+ );
124
+ for (const filePath of walk(dataDir, 4)) {
125
+ if (isEmergencyRecoveryExport(filePath) || isUnderEmergencyRecoveryDir(dataDir, filePath)) {
126
+ addIfFile(
127
+ residues,
128
+ filePath,
129
+ "emergency-recovery-export",
130
+ "Plaintext key/recovery export residue from an emergency recovery or key rotation flow.",
131
+ "Confirm the key/phrase is vaulted or no longer needed, then run: exe-os doctor --delete-local-secret-residue"
132
+ );
133
+ }
134
+ }
135
+ for (const emDir of findEmergencyRecoveryDirs(dataDir, 4)) {
136
+ const st = safeStat(emDir);
137
+ if (!st?.isDirectory()) continue;
138
+ residues.push({
139
+ kind: "emergency-recovery-export",
140
+ path: emDir,
141
+ sizeBytes: dirSize(emDir),
142
+ detail: "Emergency recovery / key rotation export directory. May hold a multi-GB plaintext memories.jsonl and key material.",
143
+ cleanup: "Confirm the key/phrase is vaulted or no longer needed, then run: exe-os doctor --delete-local-secret-residue",
144
+ deletable: true
145
+ });
146
+ }
147
+ {
148
+ const crdtPath = path.join(dataDir, "crdt-state.bin");
149
+ const crdtStat = safeStat(crdtPath);
150
+ if (crdtStat?.isFile() && crdtStat.size > 0 && !isEncryptedCrdtState(firstBytes(crdtPath, CRDT_STATE_ENC_MAGIC.length))) {
151
+ residues.push({
152
+ kind: "crdt-plaintext-state",
153
+ path: crdtPath,
154
+ sizeBytes: Number(crdtStat.size),
155
+ detail: "Plaintext CRDT sync state \u2014 an unencrypted mirror of decrypted memory rows. Persists even after CRDT sync is disabled.",
156
+ cleanup: "Safe to delete (rebuilt from the encrypted DB on next sync). Run: exe-os doctor --delete-local-secret-residue",
157
+ deletable: true
158
+ });
159
+ }
160
+ }
161
+ const supportArtifactDirs = [
162
+ { dir: "bug-reports", kind: "unredacted-bug-report", label: "Bug-report" },
163
+ { dir: "feature-requests", kind: "unredacted-support-artifact", label: "Feature-request" },
164
+ { dir: "reviews", kind: "unredacted-support-artifact", label: "Review" }
165
+ ];
166
+ for (const { dir, kind, label } of supportArtifactDirs) {
167
+ const artifactDir = path.join(dataDir, dir);
168
+ if (!safeStat(artifactDir)?.isDirectory()) continue;
169
+ for (const filePath of walk(artifactDir, 4)) {
170
+ const st = safeStat(filePath);
171
+ if (!st?.isFile() || st.size === 0) continue;
172
+ if (st.size > 5 * 1024 * 1024) continue;
173
+ let content;
174
+ try {
175
+ content = readFileSync(filePath, "utf8");
176
+ } catch {
177
+ continue;
178
+ }
179
+ if (redactSecrets(content).redactedCount > 0) {
180
+ residues.push({
181
+ kind,
182
+ path: filePath,
183
+ sizeBytes: Number(st.size),
184
+ detail: `${label} file on disk contains secret-shaped content (e.g. an API key or private key) written before local redaction shipped. Rotate any exposed key.`,
185
+ cleanup: "Review the file, rotate any exposed secret, then delete it manually. Not auto-deleted (it is your own artifact).",
186
+ deletable: false
187
+ });
188
+ }
189
+ }
190
+ }
191
+ let rootEntries = [];
192
+ try {
193
+ rootEntries = readdirSync(dataDir);
194
+ } catch {
195
+ rootEntries = [];
196
+ }
197
+ for (const entry of rootEntries) {
198
+ if (!/\.(db|sqlite|sqlite3)$/i.test(entry)) continue;
199
+ const filePath = path.join(dataDir, entry);
200
+ if (!isPlaintextSqliteFile(filePath)) continue;
201
+ addIfFile(
202
+ residues,
203
+ filePath,
204
+ "legacy-plaintext-sqlite",
205
+ "Legacy plaintext SQLite database/stub detected in the exe-os data directory. SQLCipher databases should not expose a SQLite header.",
206
+ "Confirm this is not the active encrypted DB, back it up if needed, then run: exe-os doctor --delete-local-secret-residue"
207
+ );
208
+ }
209
+ residues.sort((a, b) => a.path.localeCompare(b.path));
210
+ return { dataDir, residues };
211
+ }
212
+ function isContainedWithin(target, dataDirReal) {
213
+ let targetReal;
214
+ try {
215
+ targetReal = realpathSync(target);
216
+ } catch {
217
+ return false;
218
+ }
219
+ if (targetReal === dataDirReal) return false;
220
+ const rel = path.relative(dataDirReal, targetReal);
221
+ return rel.length > 0 && !rel.startsWith("..") && !path.isAbsolute(rel);
222
+ }
223
+ function cleanupLocalSecretResidue(opts = {}) {
224
+ const inventory = inventoryLocalSecretResidue(opts.dataDir);
225
+ const deleted = [];
226
+ const skipped = [];
227
+ let dataDirReal;
228
+ try {
229
+ dataDirReal = realpathSync(inventory.dataDir);
230
+ } catch {
231
+ dataDirReal = path.resolve(inventory.dataDir);
232
+ }
233
+ for (const residue of inventory.residues) {
234
+ if (!residue.deletable) {
235
+ skipped.push(residue.path);
236
+ continue;
237
+ }
238
+ if (!isContainedWithin(residue.path, dataDirReal)) {
239
+ console.warn(`[local-secret-inventory] refusing to delete path outside data dir: ${residue.path}`);
240
+ skipped.push(residue.path);
241
+ continue;
242
+ }
243
+ if (opts.dryRun) {
244
+ deleted.push(residue.path);
245
+ continue;
246
+ }
247
+ try {
248
+ rmSync(residue.path, { force: true, recursive: true });
249
+ deleted.push(residue.path);
250
+ } catch {
251
+ skipped.push(residue.path);
252
+ }
253
+ }
254
+ try {
255
+ mkdirSync(inventory.dataDir, { recursive: true, mode: 448 });
256
+ chmodSync(inventory.dataDir, 448);
257
+ } catch {
258
+ }
259
+ return { deleted, skipped };
260
+ }
261
+
262
+ export {
263
+ inventoryLocalSecretResidue,
264
+ cleanupLocalSecretResidue
265
+ };
@@ -9,7 +9,7 @@ import {
9
9
  findScopedDuplicate,
10
10
  governMemoryRecord,
11
11
  schedulePostWriteMemoryHygiene
12
- } from "./chunk-HHIBOU3P.js";
12
+ } from "./chunk-6XWTQUO4.js";
13
13
  import {
14
14
  orgBus
15
15
  } from "./chunk-MP2AFCGL.js";
@@ -18,16 +18,16 @@ import {
18
18
  ensureSchema,
19
19
  getClient,
20
20
  initTurso
21
- } from "./chunk-HEPR6QTL.js";
21
+ } from "./chunk-AOHXREB7.js";
22
22
  import {
23
23
  EMBEDDING_DIM
24
24
  } from "./chunk-FXU7JOXK.js";
25
25
  import {
26
26
  getMasterKey
27
- } from "./chunk-Z42MXYWW.js";
27
+ } from "./chunk-QWVXN224.js";
28
28
  import {
29
29
  loadConfig
30
- } from "./chunk-7Y5UDEVM.js";
30
+ } from "./chunk-WZHZCDDO.js";
31
31
 
32
32
  // src/lib/store.ts
33
33
  var _debugStore = process.env.EXE_DEBUG === "1";
@@ -68,7 +68,7 @@ function recordShardFailure(project, error) {
68
68
  `[store] Shard circuit OPEN for "${project}" after ${state.failures} consecutive failures. Will retry in ${SHARD_CB_COOLDOWN_MS / 6e4}min. Last error: ${error}
69
69
  `
70
70
  );
71
- void import("./orchestration-events-5SIJOE4H.js").then(({ recordOrchestrationEventBestEffort }) => {
71
+ void import("./orchestration-events-WV4NWKZH.js").then(({ recordOrchestrationEventBestEffort }) => {
72
72
  recordOrchestrationEventBestEffort({
73
73
  eventType: "shard.circuit_open",
74
74
  source: "store.recordShardFailure",
@@ -152,7 +152,7 @@ async function initStore(options) {
152
152
  if (!options?.lightweight) {
153
153
  try {
154
154
  if (process.env.EXE_DISABLE_SHARDING !== "1") {
155
- const { initShardManager } = await import("./shard-manager-MBWQEYNG.js");
155
+ const { initShardManager } = await import("./shard-manager-35PWFR3B.js");
156
156
  initShardManager(hexKey);
157
157
  }
158
158
  } catch (e) {
@@ -165,7 +165,7 @@ async function initStore(options) {
165
165
  );
166
166
  _nextVersion = (Number(vResult.rows[0]?.max_v) || 0) + 1;
167
167
  try {
168
- const { loadGlobalProcedures } = await import("./global-procedures-R7KRREEK.js");
168
+ const { loadGlobalProcedures } = await import("./global-procedures-XQX3LUH6.js");
169
169
  await loadGlobalProcedures();
170
170
  } catch (e) {
171
171
  logStoreWarn("catch", e);
@@ -293,7 +293,7 @@ async function writeMemory(record) {
293
293
  founder_id: record.founder_id ?? null
294
294
  };
295
295
  try {
296
- const { checkMemoryPoisoning } = await import("./memory-poisoning-defense-T4ITBGSG.js");
296
+ const { checkMemoryPoisoning } = await import("./memory-poisoning-defense-HJTXYCWH.js");
297
297
  const poisonResult = await checkMemoryPoisoning({
298
298
  memoryId: dbRow.id,
299
299
  vector: Array.isArray(dbRow.vector) ? dbRow.vector : void 0,
@@ -486,19 +486,19 @@ async function flushBatch() {
486
486
  }
487
487
  _nextVersion = baseVersion;
488
488
  try {
489
- const { insertMemoryCardsForBatch } = await import("./memory-cards-TQRLZI4D.js");
489
+ const { insertMemoryCardsForBatch } = await import("./memory-cards-ZRDW7QBX.js");
490
490
  await insertMemoryCardsForBatch(batch);
491
491
  } catch (e) {
492
492
  logStoreWarn("catch", e);
493
493
  }
494
494
  try {
495
- const { insertOntologyForBatch } = await import("./agentic-ontology-RNSXGXW4.js");
495
+ const { insertOntologyForBatch } = await import("./agentic-ontology-3FXYMHKW.js");
496
496
  await insertOntologyForBatch(batch);
497
497
  } catch (e) {
498
498
  logStoreWarn("catch", e);
499
499
  }
500
500
  try {
501
- const { extractGraphForBatch } = await import("./memory-graph-extractor-IWGNVAFU.js");
501
+ const { extractGraphForBatch } = await import("./memory-graph-extractor-QLXDMHRS.js");
502
502
  await extractGraphForBatch(batch);
503
503
  } catch (e) {
504
504
  logStoreWarn("catch", e);
@@ -506,7 +506,7 @@ async function flushBatch() {
506
506
  schedulePostWriteMemoryHygiene(batch.map((row) => row.id));
507
507
  _pendingRecords.splice(0, batch.length);
508
508
  try {
509
- const { isShardingEnabled, getReadyShardClient } = await import("./shard-manager-MBWQEYNG.js");
509
+ const { isShardingEnabled, getReadyShardClient } = await import("./shard-manager-35PWFR3B.js");
510
510
  if (process.env.EXE_DISABLE_SHARDING !== "1" && isShardingEnabled()) {
511
511
  const byProject = /* @__PURE__ */ new Map();
512
512
  let skippedUnknown = 0;
@@ -590,7 +590,7 @@ async function searchMemories(queryVector, agentId, options) {
590
590
  let client;
591
591
  let isMainDb = true;
592
592
  try {
593
- const { isShardingEnabled, shardExists, getReadyShardClient } = await import("./shard-manager-MBWQEYNG.js");
593
+ const { isShardingEnabled, shardExists, getReadyShardClient } = await import("./shard-manager-35PWFR3B.js");
594
594
  if (isShardingEnabled() && options?.projectName && shardExists(options.projectName)) {
595
595
  client = await getReadyShardClient(options.projectName);
596
596
  isMainDb = false;
@@ -629,7 +629,7 @@ async function searchMemories(queryVector, agentId, options) {
629
629
  args.push(activeEmbeddingModel);
630
630
  }
631
631
  try {
632
- const { founderScopeFilter } = await import("./founder-context-PQR3BUS7.js");
632
+ const { founderScopeFilter } = await import("./founder-context-7L3CFPYN.js");
633
633
  const founderFilter = founderScopeFilter(options?.founderId);
634
634
  sql += founderFilter.sql;
635
635
  args.push(...founderFilter.args.filter((a) => a !== null));
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getBrandName
3
- } from "./chunk-TPHCZDE3.js";
3
+ } from "./chunk-O5V57XYE.js";
4
4
 
5
5
  // src/lib/status-brief.ts
6
6
  import pathMod from "path";
@@ -198,6 +198,8 @@ function buildReminders(data) {
198
198
  return lines;
199
199
  }
200
200
  function buildDegradedBanner(data) {
201
+ const breakerLines = buildBreakerBanner();
202
+ if (breakerLines.length > 0) return breakerLines;
201
203
  const dh = data.daemonHealth;
202
204
  if (!dh) return [];
203
205
  const lines = [];
@@ -230,6 +232,32 @@ function buildDegradedBanner(data) {
230
232
  }
231
233
  return [];
232
234
  }
235
+ function buildBreakerBanner() {
236
+ const alert = readBreakerAlertSync();
237
+ if (!alert) return [];
238
+ const lines = [];
239
+ lines.push("\u{1F6A8}\u{1F6A8}\u{1F6A8} DAEMON DEGRADED \u2014 RESTART BREAKER TRIPPED \u{1F6A8}\u{1F6A8}\u{1F6A8}");
240
+ lines.push("");
241
+ lines.push(` \u274C ${String(alert.reason ?? "crash-loop circuit breaker open")}`);
242
+ lines.push(` Crash restarts in window: ${String(alert.crashRestartsInWindow ?? "?")}`);
243
+ if (typeof alert.lastBootClassification === "string") lines.push(` Last boot: ${alert.lastBootClassification}`);
244
+ lines.push("");
245
+ lines.push(" \u{1F527} TO FIX:");
246
+ lines.push(" 1. Run: exe-os daemon status (see crash timestamps + last exit)");
247
+ lines.push(" 2. Run: exe-os daemon reset-breaker (clear the breaker)");
248
+ lines.push(" 3. Relaunch the daemon, then /mcp");
249
+ return lines;
250
+ }
251
+ function readBreakerAlertSync() {
252
+ try {
253
+ const home = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? pathMod.join(osMod.homedir(), ".exe-os");
254
+ const p = pathMod.join(home, "daemon-restart-breaker.ALERT.json");
255
+ if (!fsMod.existsSync(p)) return null;
256
+ return JSON.parse(fsMod.readFileSync(p, "utf8"));
257
+ } catch {
258
+ return null;
259
+ }
260
+ }
233
261
  function buildOrchestrationPhase(data, employees) {
234
262
  if (!data.orchestrationPhase) return [];
235
263
  const phase = data.orchestrationPhase;
@@ -332,9 +360,15 @@ function buildActionRequired(data) {
332
360
  );
333
361
  for (const b of ub.branches.slice(0, 5)) {
334
362
  const age = b.ageHours >= 24 ? `${(b.ageHours / 24).toFixed(1)}d` : `${b.ageHours.toFixed(0)}h`;
335
- lines.push(` \u2022 ${b.name} (+${b.ahead} commit${b.ahead === 1 ? "" : "s"}, ${b.filesChanged} file${b.filesChanged === 1 ? "" : "s"}, ${age})`);
363
+ lines.push(` \u2022 ${b.name} (+${b.ahead} commit${b.ahead === 1 ? "" : "s"}, ${age})`);
336
364
  }
337
- if (ub.total > 5) lines.push(` ... ${ub.total - 5} more \u2014 run: exe-os git-sweep --dry-run`);
365
+ if (ub.total > 5) lines.push(` ... ${ub.total - 5} more \u2014 list all: git branch -r --no-merged origin/main`);
366
+ }
367
+ if (data.localMainAhead && data.localMainAhead.ahead > 0) {
368
+ hasIssues = true;
369
+ const ahead = data.localMainAhead;
370
+ lines.push(` \u{1F534} Local ${ahead.branch} is ${ahead.ahead} commit${ahead.ahead === 1 ? "" : "s"} ahead of origin/${ahead.branch} \u2014 do NOT reset`);
371
+ for (const c of ahead.commits.slice(0, 5)) lines.push(` \u2022 ${c}`);
338
372
  }
339
373
  if (data.failedMessages && data.failedMessages.length > 0) {
340
374
  hasIssues = true;