@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
@@ -2,7 +2,12 @@ import {
2
2
  SUPPORT_REPORT_SENT_MARKER,
3
3
  markSupportReportSentSync
4
4
  } from "./chunk-MMRUBN3I.js";
5
- import "./chunk-MLKGABMK.js";
5
+ import {
6
+ isTelemetryRedactionEnabled,
7
+ sanitizeSupportEndpointPath,
8
+ sanitizeUpstreamId,
9
+ sanitizeUpstreamPayload
10
+ } from "./chunk-4QCFFW2H.js";
6
11
 
7
12
  // src/lib/support-outbox.ts
8
13
  import { mkdirSync, readdirSync, readFileSync, writeFileSync, existsSync } from "fs";
@@ -72,7 +77,8 @@ function normalizeBaseEndpoint(value, fallback) {
72
77
  }
73
78
  return raw.replace(/\/+$/, "").replace(/\/(bug-reports|feature-requests)\/?$/, "");
74
79
  }
75
- function buildStatusUpdateEndpoint(endpointPath, adminToken) {
80
+ function buildStatusUpdateEndpoint(rawEndpointPath, adminToken) {
81
+ const endpointPath = sanitizeSupportEndpointPath(rawEndpointPath);
76
82
  const config = loadConfigFile();
77
83
  const support = config?.support;
78
84
  const routerUrl = process.env.API_ROUTER_URL?.replace(/\/+$/, "");
@@ -115,8 +121,9 @@ function findExistingUnsentStatusUpdate(kind, id) {
115
121
  return void 0;
116
122
  }
117
123
  function queueSupportStatusUpdateSync(input) {
118
- const id = input.id.trim();
124
+ const id = sanitizeUpstreamId(input.id.trim());
119
125
  if (!id) return void 0;
126
+ const endpointPath = sanitizeSupportEndpointPath(input.endpointPath);
120
127
  try {
121
128
  mkdirSync(STATUS_UPDATE_DIR, { recursive: true });
122
129
  const existingPath = findExistingUnsentStatusUpdate(input.kind, id);
@@ -134,7 +141,7 @@ function queueSupportStatusUpdateSync(input) {
134
141
  const record = {
135
142
  id,
136
143
  kind: input.kind,
137
- endpointPath: input.endpointPath,
144
+ endpointPath,
138
145
  method: input.method ?? "PATCH",
139
146
  payload: input.payload,
140
147
  created_at: existingPath ? JSON.parse(readFileSync(existingPath, "utf-8")).created_at : createdAt,
@@ -350,6 +357,13 @@ ${DUPLICATE_MARKER}: ${dedupeHash}
350
357
  skipped++;
351
358
  continue;
352
359
  }
360
+ let outboundBody;
361
+ if (isTelemetryRedactionEnabled()) {
362
+ outboundBody = JSON.stringify(sanitizeUpstreamPayload(payload).payload);
363
+ } else {
364
+ console.error("[support-outbox] WARNING: EXE_TELEMETRY_REDACT=off \u2014 sending UNREDACTED payload upstream");
365
+ outboundBody = JSON.stringify(payload);
366
+ }
353
367
  try {
354
368
  const resp = await fetch(endpoint, {
355
369
  method: "POST",
@@ -363,7 +377,7 @@ ${DUPLICATE_MARKER}: ${dedupeHash}
363
377
  ...!gotrueAuth && licenseToken ? { "x-exe-license-token": licenseToken } : {},
364
378
  ...adminToken ? { "x-askexe-admin-token": adminToken } : {}
365
379
  },
366
- body: JSON.stringify(payload),
380
+ body: outboundBody,
367
381
  signal: AbortSignal.timeout(5e3)
368
382
  });
369
383
  if (resp.ok || resp.status === 409) {
@@ -396,7 +410,9 @@ async function sendStatusUpdateRecord(record, filePath, licenseKey, licenseToken
396
410
  ...!adminToken && !gotrueAuth && licenseKey ? { "x-exe-license-key": licenseKey } : {},
397
411
  ...!adminToken && !gotrueAuth && licenseToken ? { "x-exe-license-token": licenseToken } : {}
398
412
  },
399
- body: JSON.stringify(record.payload),
413
+ // Egress redaction gate — queued status updates may contain free-text
414
+ // notes/comments; redact before the retry PATCH reaches the network.
415
+ body: isTelemetryRedactionEnabled() ? JSON.stringify(sanitizeUpstreamPayload(record.payload).payload) : JSON.stringify(record.payload),
400
416
  signal: AbortSignal.timeout(5e3)
401
417
  });
402
418
  if (resp.ok) {
@@ -502,7 +518,7 @@ async function reconcileUpstreamStatus() {
502
518
  for (const file of files) {
503
519
  const filePath = path.join(dir, file);
504
520
  const content = readFileSync(filePath, "utf-8");
505
- const idMatch = content.match(/^id:\s*([0-9a-f-]{36})\s*$/m);
521
+ const idMatch = content.match(/^id:\s*([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\s*$/mi);
506
522
  if (!idMatch) continue;
507
523
  const id = idMatch[1];
508
524
  const statusMatch = content.match(/^status:\s*(\S+)\s*$/m);
@@ -510,7 +526,7 @@ async function reconcileUpstreamStatus() {
510
526
  if (localStatus === "closed" || localStatus === "shipped") continue;
511
527
  try {
512
528
  const resp = await fetch(
513
- `https://api.askexe.com/admin/support/${kind}/${encodeURIComponent(id)}`,
529
+ `https://api.askexe.com/admin/support/${kind}/${encodeURIComponent(sanitizeUpstreamId(id))}`,
514
530
  {
515
531
  headers: { authorization: `Bearer ${adminToken}` },
516
532
  signal: AbortSignal.timeout(5e3)
@@ -590,10 +606,10 @@ function scanStatusDir(dir) {
590
606
  }
591
607
  return { total: files.length, unsent, oldest };
592
608
  }
609
+
593
610
  export {
594
- flushSupportOutbox as flushBugReportOutbox,
595
- flushSupportOutbox,
596
- getOutboxStatus,
597
611
  queueSupportStatusUpdateSync,
598
- reconcileUpstreamStatus
612
+ flushSupportOutbox,
613
+ reconcileUpstreamStatus,
614
+ getOutboxStatus
599
615
  };
@@ -89,7 +89,7 @@ async function getRetrievalHealth() {
89
89
  const coveragePct = totalMemories > 0 ? Math.round(memoriesWithVectors / totalMemories * 100) : null;
90
90
  let dbRestore = { hasEvents: false, count: 0, last: null, quarantineFiles: 0 };
91
91
  try {
92
- const { getDbRestoreHealth } = await import("./db-restore-events-JVEEP52Z.js");
92
+ const { getDbRestoreHealth } = await import("./db-restore-events-MQ2DBGEQ.js");
93
93
  dbRestore = getDbRestoreHealth();
94
94
  } catch {
95
95
  }
@@ -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/orchestration-events.ts
6
6
  import crypto from "crypto";
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  getGitRoot,
3
- isWorktreeDirty
4
- } from "./chunk-B76TSEP3.js";
3
+ isWorktreeDirty,
4
+ isWorktreeDirtyAsync
5
+ } from "./chunk-I26FWCSP.js";
5
6
 
6
7
  // src/lib/worktree-sweep.ts
7
8
  import { execFile } from "child_process";
@@ -403,7 +404,7 @@ async function cleanupAgentWorktree(repoRoot, agentName) {
403
404
  if (baseName !== agentBase) continue;
404
405
  const wtPath = path.join(worktreesDir, entry);
405
406
  const branch = await getWorktreeBranch(repoRoot, wtPath);
406
- if (isWorktreeDirty(wtPath)) {
407
+ if (await isWorktreeDirtyAsync(wtPath)) {
407
408
  notes.push(`Worktree .worktrees/${entry} has uncommitted changes \u2014 preserved`);
408
409
  continue;
409
410
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  atomicWriteJsonSync,
3
3
  ensurePrivateDirSync
4
- } from "./chunk-SHIICYJW.js";
4
+ } from "./chunk-BYTDMAGB.js";
5
5
 
6
6
  // src/lib/preferences.ts
7
7
  import { existsSync, readFileSync } from "fs";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  loadConfigSync
3
- } from "./chunk-7Y5UDEVM.js";
3
+ } from "./chunk-WZHZCDDO.js";
4
4
 
5
5
  // src/lib/push-notifications.ts
6
- import { execSync } from "child_process";
6
+ import { execSync, execFileSync } from "child_process";
7
7
  import nodemailer from "nodemailer";
8
8
  var TELEGRAM_TIMEOUT_MS = 1e4;
9
9
  var SMTP_TIMEOUT_MS = 15e3;
@@ -29,8 +29,8 @@ function _resetPushConfig() {
29
29
  }
30
30
  function sendDesktopNotification(title, body, sessionScope) {
31
31
  try {
32
- const safeTitle = title.replace(/["\\\n]/g, " ").slice(0, 100);
33
- const safeBody = body.replace(/["\\\n]/g, " ").slice(0, 200);
32
+ const safeTitle = title.replace(/["\\\n$`!]/g, " ").slice(0, 100);
33
+ const safeBody = body.replace(/["\\\n$`!]/g, " ").slice(0, 200);
34
34
  try {
35
35
  const osc9 = `\x1B]9;${safeTitle}: ${safeBody}\x07`;
36
36
  let coordinatorSession;
@@ -47,7 +47,7 @@ function sendDesktopNotification(title, body, sessionScope) {
47
47
  } catch {
48
48
  }
49
49
  if (process.platform === "linux") {
50
- execSync(`notify-send "${safeTitle}" "${safeBody}"`, {
50
+ execFileSync("notify-send", [safeTitle, safeBody], {
51
51
  timeout: DESKTOP_TIMEOUT_MS,
52
52
  stdio: "ignore"
53
53
  });
@@ -1,56 +1,128 @@
1
- import {
2
- isExploreMode
3
- } from "./chunk-PVYR4FCQ.js";
4
1
  import {
5
2
  sendIntercom,
6
3
  updateTaskStatus
7
- } from "./chunk-PLRIJALF.js";
8
- import "./chunk-OFX5B2S7.js";
9
- import "./chunk-B76TSEP3.js";
10
- import "./chunk-RLRT2BVM.js";
11
- import "./chunk-4JERP7NT.js";
12
- import "./chunk-EIKATSE4.js";
13
- import "./chunk-E23LNUWJ.js";
14
- import "./chunk-UIV2WPBT.js";
15
- import "./chunk-SSTLTIF3.js";
16
- import "./chunk-RMOBQ6A5.js";
17
- import "./chunk-54QCG45Y.js";
4
+ } from "./chunk-UP75Z5X7.js";
18
5
  import {
19
6
  recordOrchestrationEventBestEffort
20
- } from "./chunk-FUIIVSW6.js";
21
- import "./chunk-65SVQELL.js";
22
- import "./chunk-NGP6LSV2.js";
23
- import "./chunk-MW2GJJ53.js";
24
- import "./chunk-CVYC6DUW.js";
25
- import "./chunk-2233TQCA.js";
26
- import "./chunk-HCJCW7X4.js";
27
- import "./chunk-OPU3NYOO.js";
28
- import "./chunk-7TS64TBG.js";
29
- import "./chunk-AFNRE2RV.js";
30
- import "./chunk-3NGZ4PL7.js";
31
- import "./chunk-NLEW62VC.js";
32
- import "./chunk-HYZV25LY.js";
33
- import "./chunk-GJV3WDWM.js";
34
- import "./chunk-MP2AFCGL.js";
7
+ } from "./chunk-2WAVZ5UJ.js";
8
+ import {
9
+ BUSY_PATTERN
10
+ } from "./chunk-GWDSB25T.js";
35
11
  import {
12
+ baseAgentName,
36
13
  getCoordinatorName,
37
14
  isCoordinatorName
38
- } from "./chunk-HEPR6QTL.js";
39
- import "./chunk-2I23RPSI.js";
40
- import "./chunk-ATOU6CYR.js";
41
- import "./chunk-PNQDP3OA.js";
42
- import "./chunk-H73TUI4Y.js";
43
- import "./chunk-7HLWBYH7.js";
44
- import "./chunk-FXU7JOXK.js";
45
- import "./chunk-XACL67CS.js";
46
- import "./chunk-5Z5NATNS.js";
47
- import "./chunk-7Y5UDEVM.js";
48
- import "./chunk-SHIICYJW.js";
49
- import "./chunk-MLKGABMK.js";
15
+ } from "./chunk-AOHXREB7.js";
16
+
17
+ // src/lib/play-mode.ts
18
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
19
+ import { join, dirname } from "path";
20
+ import { homedir } from "os";
21
+ var PLAY_MODE_FILE = join(homedir(), ".exe-os", "play-modes.json");
22
+ function resolvePlayModeFile() {
23
+ return process.env.EXE_PLAY_MODE_FILE ?? PLAY_MODE_FILE;
24
+ }
25
+ var DEFAULT_EXPLORE_DURATION_MS = 60 * 60 * 1e3;
26
+ function playModeKey(agentId, sessionScope) {
27
+ return `${agentId}:${sessionScope}`;
28
+ }
29
+ function readStore() {
30
+ try {
31
+ const filePath = resolvePlayModeFile();
32
+ if (!existsSync(filePath)) return {};
33
+ const raw = readFileSync(filePath, "utf8");
34
+ return JSON.parse(raw);
35
+ } catch {
36
+ return {};
37
+ }
38
+ }
39
+ function writeStore(store) {
40
+ const filePath = resolvePlayModeFile();
41
+ const dir = dirname(filePath);
42
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
43
+ writeFileSync(filePath, JSON.stringify(store, null, 2), "utf8");
44
+ }
45
+ function setPlayMode(agentId, sessionScope, mode, options = {}) {
46
+ const key = playModeKey(agentId, sessionScope);
47
+ const store = readStore();
48
+ if (mode === "task") {
49
+ delete store[key];
50
+ writeStore(store);
51
+ return {
52
+ mode: "task",
53
+ agentId,
54
+ sessionScope,
55
+ startedAt: (/* @__PURE__ */ new Date()).toISOString(),
56
+ expiresAt: new Date(Date.now() + 1).toISOString()
57
+ // immediate
58
+ };
59
+ }
60
+ const durationMs = options.durationMs ?? DEFAULT_EXPLORE_DURATION_MS;
61
+ const now = /* @__PURE__ */ new Date();
62
+ const entry = {
63
+ mode: "explore",
64
+ agentId,
65
+ sessionScope,
66
+ startedAt: now.toISOString(),
67
+ expiresAt: new Date(now.getTime() + durationMs).toISOString(),
68
+ notes: options.notes
69
+ };
70
+ store[key] = entry;
71
+ writeStore(store);
72
+ return entry;
73
+ }
74
+ function getPlayMode(agentId, sessionScope) {
75
+ const key = playModeKey(agentId, sessionScope);
76
+ const store = readStore();
77
+ const entry = store[key];
78
+ if (!entry) return null;
79
+ if (new Date(entry.expiresAt).getTime() <= Date.now()) {
80
+ delete store[key];
81
+ try {
82
+ writeStore(store);
83
+ } catch {
84
+ }
85
+ return null;
86
+ }
87
+ return entry;
88
+ }
89
+ function isExploreMode(agentId, sessionScope) {
90
+ try {
91
+ const entry = getPlayMode(agentId, sessionScope);
92
+ return entry?.mode === "explore";
93
+ } catch {
94
+ return false;
95
+ }
96
+ }
97
+ function listExploreSessions() {
98
+ try {
99
+ const store = readStore();
100
+ const now = Date.now();
101
+ const active = [];
102
+ let pruned = false;
103
+ for (const [key, entry] of Object.entries(store)) {
104
+ if (new Date(entry.expiresAt).getTime() <= now) {
105
+ delete store[key];
106
+ pruned = true;
107
+ } else {
108
+ active.push(entry);
109
+ }
110
+ }
111
+ if (pruned) {
112
+ try {
113
+ writeStore(store);
114
+ } catch {
115
+ }
116
+ }
117
+ return active;
118
+ } catch {
119
+ return [];
120
+ }
121
+ }
50
122
 
51
123
  // src/lib/task-enforcement.ts
52
124
  import { appendFile, readdir, readFile, writeFile } from "fs/promises";
53
- import { existsSync } from "fs";
125
+ import { existsSync as existsSync2 } from "fs";
54
126
  import path from "path";
55
127
  import os from "os";
56
128
  var TASK_ENFORCEMENT_INTERVAL_MS = 6e4;
@@ -115,7 +187,7 @@ function decideWorkerAction(taskCount, isIdle, nudgeEcho) {
115
187
  function isIdlePane(paneText) {
116
188
  return IDLE_PATTERNS.some((p) => paneText.includes(p));
117
189
  }
118
- var WORKER_BUSY_PATTERN = /[✻✽✶✳·].*…|Running…|• Working|• Ran |• Explored|• Called|esc to interrupt/;
190
+ var WORKER_BUSY_PATTERN = BUSY_PATTERN;
119
191
  function isPaneBusy(paneText) {
120
192
  const tail = paneText.split("\n").map((line) => line.trim()).filter(Boolean).slice(-6).join("\n");
121
193
  return WORKER_BUSY_PATTERN.test(tail);
@@ -204,7 +276,7 @@ function scopeFromEmployeeSession(sessionName) {
204
276
  }
205
277
  async function surfaceStaleDispatchPendingSignals(scopeList, now, thresholdMs = STALE_DISPATCH_PENDING_THRESHOLD_MS) {
206
278
  const dir = dispatchAckDir();
207
- if (!existsSync(dir)) return 0;
279
+ if (!existsSync2(dir)) return 0;
208
280
  const allowedScopes = new Set(scopeList);
209
281
  let surfaced = 0;
210
282
  let files = [];
@@ -220,7 +292,7 @@ async function surfaceStaleDispatchPendingSignals(scopeList, now, thresholdMs =
220
292
  const staleMarkerPath = path.join(dir, `${taskId}.stale`);
221
293
  const ackPath = path.join(dir, `${taskId}.ack`);
222
294
  const failedPath = path.join(dir, `${taskId}.failed`);
223
- if (existsSync(staleMarkerPath) || existsSync(ackPath) || existsSync(failedPath)) continue;
295
+ if (existsSync2(staleMarkerPath) || existsSync2(ackPath) || existsSync2(failedPath)) continue;
224
296
  let signal;
225
297
  try {
226
298
  signal = JSON.parse(await readFile(pendingPath, "utf8"));
@@ -233,7 +305,7 @@ async function surfaceStaleDispatchPendingSignals(scopeList, now, thresholdMs =
233
305
  const sessionScope = signalScope ?? (scopeList.length === 1 ? scopeList[0] : null);
234
306
  if (allowedScopes.size > 0 && sessionScope && !allowedScopes.has(sessionScope)) continue;
235
307
  try {
236
- const { writeNotification } = await import("./notifications-KONB3C62.js");
308
+ const { writeNotification } = await import("./notifications-4UT53CDG.js");
237
309
  await writeNotification({
238
310
  agentId: getCoordinatorName(),
239
311
  agentRole: "COO",
@@ -296,12 +368,20 @@ async function transitionCompletedDelegatedParents(client, scopeList, now) {
296
368
  await updateTaskStatus({
297
369
  taskId: parentId,
298
370
  status: "needs_review",
299
- result: "All delegated child tasks are complete; parent rolled up for review by task enforcement."
371
+ // Blocker 4 (liveness-hardening): this is an AUTOMATED rollup. If the
372
+ // parent already carries a real deliverable in `result`, preserve it —
373
+ // the rollup string is only a fallback for an empty result. Atomic in SQL,
374
+ // so a concurrently-written deliverable is never clobbered.
375
+ result: "All delegated child tasks are complete; parent rolled up for review by task enforcement.",
376
+ preserveResultIfPresent: true
300
377
  });
301
378
  } catch {
302
379
  await client.execute({
303
- sql: `UPDATE tasks SET status = 'needs_review', updated_at = ? WHERE id = ? AND status IN ('open', 'in_progress')`,
304
- args: [nowIso, parentId]
380
+ sql: `UPDATE tasks SET status = 'needs_review',
381
+ result = CASE WHEN result IS NULL OR trim(result, char(32)||char(9)||char(10)||char(13)) = '' THEN ? ELSE result END,
382
+ updated_at = ?
383
+ WHERE id = ? AND status IN ('open', 'in_progress')`,
384
+ args: ["All delegated child tasks are complete; parent rolled up for review by task enforcement.", nowIso, parentId]
305
385
  });
306
386
  }
307
387
  transitioned++;
@@ -365,7 +445,8 @@ async function runTaskEnforcementTick(deps) {
365
445
  const allowedScope = hasScopeRestriction && deps.scopeFilter.args.length > 0 ? String(deps.scopeFilter.args[deps.scopeFilter.args.length - 1]) : null;
366
446
  for (const session of sessions) {
367
447
  if (!session.includes("-")) continue;
368
- const agentName = session.split("-")[0]?.replace(/\d+$/, "");
448
+ const rawAgent = session.split("-")[0];
449
+ const agentName = rawAgent ? baseAgentName(rawAgent, employees) : void 0;
369
450
  if (!agentName) continue;
370
451
  if (allowedScope) {
371
452
  const sessionSuffix = session.slice(session.indexOf("-") + 1);
@@ -581,7 +662,7 @@ async function runTaskEnforcementTick(deps) {
581
662
  );
582
663
  }
583
664
  }
584
- if (processedAnyEmployee && deps.reviewerSpawn) {
665
+ if (processedAnyEmployee && (deps.reviewerSpawn || deps.reviewerNudge)) {
585
666
  try {
586
667
  const scopeList = allowedScope ? [...processedScopes].filter((s) => s === allowedScope) : [...processedScopes];
587
668
  const reviewerRows = scopeList.length === 0 ? { rows: [] } : await client.execute({
@@ -597,15 +678,33 @@ async function runTaskEnforcementTick(deps) {
597
678
  const reviewerName = String(row.reviewer ?? "");
598
679
  const sessionScope = row.session_scope ? String(row.session_scope) : null;
599
680
  if (!reviewerName || !sessionScope) continue;
600
- if (isCoordinatorName(reviewerName, employees)) {
681
+ const isCoord = isCoordinatorName(reviewerName, employees);
682
+ const reviewerSession = isCoord ? sessionScope : `${reviewerName}-${sessionScope}`;
683
+ if (liveSessionSet.has(reviewerSession)) {
684
+ if (deps.reviewerNudge) {
685
+ try {
686
+ deps.reviewerNudge(reviewerSession, sessionScope);
687
+ process.stderr.write(
688
+ `[exed] Reviewer wake: nudged live ${reviewerSession} (has needs_review tasks)
689
+ `
690
+ );
691
+ } catch (nudgeErr) {
692
+ process.stderr.write(
693
+ `[exed] Reviewer wake error for ${reviewerSession}: ${nudgeErr instanceof Error ? nudgeErr.message : String(nudgeErr)}
694
+ `
695
+ );
696
+ }
697
+ }
698
+ continue;
699
+ }
700
+ if (isCoord) {
601
701
  process.stderr.write(
602
- `[exed] Reviewer auto-spawn: skipping ${reviewerName} (coordinator, not dispatchable)
702
+ `[exed] Reviewer auto-spawn: skipping ${reviewerName} (coordinator, no live session to nudge)
603
703
  `
604
704
  );
605
705
  continue;
606
706
  }
607
- const reviewerSession = `${reviewerName}-${sessionScope}`;
608
- if (liveSessionSet.has(reviewerSession)) continue;
707
+ if (!deps.reviewerSpawn) continue;
609
708
  try {
610
709
  const result = deps.reviewerSpawn(reviewerName, sessionScope);
611
710
  if (!result) continue;
@@ -677,28 +776,33 @@ async function runTaskEnforcementTick(deps) {
677
776
  payload: { sessionCount: sessions.length, processedSessions, nudgesSent }
678
777
  });
679
778
  }
779
+
680
780
  export {
681
- IDLE_PATTERNS,
781
+ DEFAULT_EXPLORE_DURATION_MS,
782
+ setPlayMode,
783
+ getPlayMode,
784
+ listExploreSessions,
785
+ TASK_ENFORCEMENT_INTERVAL_MS,
786
+ TASK_ENFORCEMENT_DEBOUNCE_MS,
682
787
  MANAGER_GRACE_PERIOD_MS,
683
- MANAGER_ROLES,
684
- MCP_ZOMBIE_PATTERNS,
685
- NUDGE_ECHO_PATTERNS,
686
- STALE_DISPATCH_PENDING_THRESHOLD_MS,
687
788
  STUCK_TASK_THRESHOLD_MS,
688
- TASK_ENFORCEMENT_DEBOUNCE_MS,
689
- TASK_ENFORCEMENT_INTERVAL_MS,
690
- _resetNudgeState,
789
+ IDLE_PATTERNS,
790
+ NUDGE_ECHO_PATTERNS,
791
+ MCP_ZOMBIE_PATTERNS,
792
+ MANAGER_ROLES,
691
793
  decideManagerAction,
692
794
  decideWorkerAction,
693
- findStuckTasks,
694
- isCurrentlyIdle,
695
795
  isIdlePane,
696
- isMcpZombiePane,
697
- isNudgeEcho,
698
796
  isPaneBusy,
699
797
  isWorkerPaneIdle,
700
- runTaskEnforcementTick,
798
+ isCurrentlyIdle,
799
+ isNudgeEcho,
800
+ isMcpZombiePane,
701
801
  sendNudge,
802
+ _resetNudgeState,
803
+ STALE_DISPATCH_PENDING_THRESHOLD_MS,
702
804
  surfaceStaleDispatchPendingSignals,
703
- transitionCompletedDelegatedParents
805
+ transitionCompletedDelegatedParents,
806
+ findStuckTasks,
807
+ runTaskEnforcementTick
704
808
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  listReminders
3
- } from "./chunk-KMBEL7VB.js";
3
+ } from "./chunk-UUEKJDK6.js";
4
4
 
5
5
  // src/mcp/tools/list-reminders.ts
6
6
  import { z } from "zod";
@@ -23,8 +23,9 @@ function registerListReminders(server) {
23
23
  }
24
24
  const lines = reminders.map((r) => {
25
25
  const due = r.dueDate ? ` (due: ${r.dueDate})` : "";
26
+ const push = r.dailyPush ? ` (daily push: ${r.dailyPush})` : "";
26
27
  const done = r.completedAt ? " [DONE]" : "";
27
- return `\u2022 ${r.text}${due}${done} [id: ${r.id.slice(0, 8)}]`;
28
+ return `\u2022 ${r.text}${due}${push}${done} [id: ${r.id.slice(0, 8)}]`;
28
29
  });
29
30
  return {
30
31
  content: [{ type: "text", text: lines.join("\n") }]
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  extractSemanticText
3
- } from "./chunk-JBSCL2XT.js";
3
+ } from "./chunk-YLXTKI6M.js";
4
4
  import {
5
5
  detectError
6
6
  } from "./chunk-AHMUF6RO.js";
7
7
  import {
8
8
  redactSecrets
9
- } from "./chunk-Y25OJWOQ.js";
9
+ } from "./chunk-4QCFFW2H.js";
10
10
  import {
11
11
  getProjectName
12
12
  } from "./chunk-OPU3NYOO.js";