@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
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-2I23RPSI.js";
4
4
  import {
5
5
  listBackups
6
- } from "./chunk-ATOU6CYR.js";
6
+ } from "./chunk-OLMQ4UOF.js";
7
7
  import {
8
8
  getEmotionalBaseline,
9
9
  renderEmotionalBaselineSection
@@ -20,16 +20,108 @@ import {
20
20
  import {
21
21
  EXE_AI_DIR,
22
22
  loadConfigSync
23
- } from "./chunk-7Y5UDEVM.js";
23
+ } from "./chunk-WZHZCDDO.js";
24
24
  import {
25
25
  atomicWriteJson
26
- } from "./chunk-SHIICYJW.js";
26
+ } from "./chunk-BYTDMAGB.js";
27
27
 
28
28
  // src/lib/database.ts
29
- import { chmodSync, existsSync as existsSync3, statSync, copyFileSync, unlinkSync as unlinkSync2, openSync, closeSync, mkdirSync as mkdirSync2, renameSync as renameSync2, readFileSync as readFileSync3, writeSync, fsyncSync, fstatSync } from "fs";
29
+ import { chmodSync, existsSync as existsSync4, statSync, copyFileSync, unlinkSync as unlinkSync3, openSync as openSync2, closeSync as closeSync2, mkdirSync as mkdirSync2, renameSync as renameSync2, readFileSync as readFileSync3, writeSync, fsyncSync, fstatSync } from "fs";
30
30
  import { createClient } from "@libsql/client";
31
31
  import { homedir, totalmem } from "os";
32
- import { join } from "path";
32
+ import { join, dirname } from "path";
33
+
34
+ // src/lib/legacy-db-cleanup.ts
35
+ import { existsSync, lstatSync, openSync, readSync, closeSync, unlinkSync } from "fs";
36
+ import path from "path";
37
+ var SQLITE_PLAINTEXT_MAGIC = "SQLite format 3\0";
38
+ var LEGACY_MAIN_STUBS = [
39
+ "db.sqlite",
40
+ "db.sqlite3",
41
+ "db",
42
+ "db.sqlite.corrupted"
43
+ ];
44
+ var SIDECAR_PARENT = "db.sqlite";
45
+ var LEGACY_SIDECARS = [
46
+ "db.sqlite-wal",
47
+ "db.sqlite-shm",
48
+ "db.sqlite-journal"
49
+ ];
50
+ var PROTECTED_DB_NAMES = [
51
+ "memories.db",
52
+ "exe-mem.db",
53
+ "exe-os.db",
54
+ "exe.db"
55
+ ];
56
+ function isPlaintextSqlite(filePath) {
57
+ let fd = -1;
58
+ try {
59
+ fd = openSync(filePath, "r");
60
+ const buf = Buffer.alloc(16);
61
+ const read = readSync(fd, buf, 0, 16, 0);
62
+ if (read < 16) return false;
63
+ return buf.toString("latin1") === SQLITE_PLAINTEXT_MAGIC;
64
+ } catch {
65
+ return false;
66
+ } finally {
67
+ if (fd >= 0) {
68
+ try {
69
+ closeSync(fd);
70
+ } catch {
71
+ }
72
+ }
73
+ }
74
+ }
75
+ function inspect(filePath) {
76
+ try {
77
+ const st = lstatSync(filePath);
78
+ if (st.isSymbolicLink() || !st.isFile()) return { removable: false, size: -1 };
79
+ return { removable: true, size: st.size };
80
+ } catch {
81
+ return { removable: false, size: -1 };
82
+ }
83
+ }
84
+ function cleanupLegacyPlaintextStubs(dir, activeDbPath) {
85
+ const removed = [];
86
+ const activeBase = activeDbPath ? path.basename(activeDbPath) : null;
87
+ const skip = (name) => name === activeBase || PROTECTED_DB_NAMES.includes(name);
88
+ for (const name of LEGACY_MAIN_STUBS) {
89
+ if (skip(name)) continue;
90
+ const filePath = path.join(dir, name);
91
+ try {
92
+ const { removable, size } = inspect(filePath);
93
+ if (!removable) continue;
94
+ if (size === 0 || isPlaintextSqlite(filePath)) {
95
+ unlinkSync(filePath);
96
+ removed.push(filePath);
97
+ }
98
+ } catch {
99
+ }
100
+ }
101
+ const parentPath = path.join(dir, SIDECAR_PARENT);
102
+ const parentRemoved = removed.some((p) => path.basename(p) === SIDECAR_PARENT);
103
+ const parentGone = parentRemoved || !existsSync(parentPath);
104
+ if (parentGone) {
105
+ for (const name of LEGACY_SIDECARS) {
106
+ if (skip(name)) continue;
107
+ const filePath = path.join(dir, name);
108
+ try {
109
+ const { removable } = inspect(filePath);
110
+ if (!removable) continue;
111
+ unlinkSync(filePath);
112
+ removed.push(filePath);
113
+ } catch {
114
+ }
115
+ }
116
+ }
117
+ if (removed.length > 0) {
118
+ process.stderr.write(
119
+ `[exe-os] Removed ${removed.length} legacy plaintext SQLite stub(s) from ${dir}: ${removed.map((p) => path.basename(p)).join(", ")}
120
+ `
121
+ );
122
+ }
123
+ return removed;
124
+ }
33
125
 
34
126
  // src/lib/db-retry.ts
35
127
  var MAX_RETRIES = 5;
@@ -82,24 +174,24 @@ function wrapWithRetry(client) {
82
174
 
83
175
  // src/lib/employees.ts
84
176
  import { readFile, mkdir } from "fs/promises";
85
- import { existsSync as existsSync2, symlinkSync, readlinkSync, readFileSync as readFileSync2, renameSync, unlinkSync, writeFileSync as writeFileSync2 } from "fs";
177
+ import { existsSync as existsSync3, lstatSync as lstatSync2, symlinkSync, readlinkSync, readFileSync as readFileSync2, renameSync, unlinkSync as unlinkSync2, writeFileSync as writeFileSync2 } from "fs";
86
178
  import { execSync } from "child_process";
87
- import path2 from "path";
179
+ import path3 from "path";
88
180
  import os from "os";
89
181
 
90
182
  // src/lib/identity.ts
91
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
183
+ import { existsSync as existsSync2, mkdirSync, readFileSync, writeFileSync } from "fs";
92
184
  import { readdirSync } from "fs";
93
- import path from "path";
185
+ import path2 from "path";
94
186
  import { createHash } from "crypto";
95
- var IDENTITY_DIR = path.join(EXE_AI_DIR, "identity");
187
+ var IDENTITY_DIR = path2.join(EXE_AI_DIR, "identity");
96
188
  function ensureDir() {
97
- if (!existsSync(IDENTITY_DIR)) {
189
+ if (!existsSync2(IDENTITY_DIR)) {
98
190
  mkdirSync(IDENTITY_DIR, { recursive: true });
99
191
  }
100
192
  }
101
193
  function identityPath(agentId) {
102
- return path.join(IDENTITY_DIR, `${agentId}.md`);
194
+ return path2.join(IDENTITY_DIR, `${agentId}.md`);
103
195
  }
104
196
  function sanitizeIdentityBody(body) {
105
197
  return body.replace(/<!--[\s\S]*?-->/g, "").trim();
@@ -147,7 +239,7 @@ function contentHash(content) {
147
239
  }
148
240
  function getIdentity(agentId) {
149
241
  const filePath = identityPath(agentId);
150
- if (!existsSync(filePath)) return null;
242
+ if (!existsSync2(filePath)) return null;
151
243
  const raw = readFileSync(filePath, "utf-8");
152
244
  const { frontmatter, body } = parseFrontmatter(raw);
153
245
  return {
@@ -231,7 +323,7 @@ ${teamLines.join("\n")}`);
231
323
  }
232
324
 
233
325
  // src/lib/employees.ts
234
- var EMPLOYEES_PATH = path2.join(EXE_AI_DIR, "exe-employees.json");
326
+ var EMPLOYEES_PATH = path3.join(EXE_AI_DIR, "exe-employees.json");
235
327
  var DEFAULT_BOOT_TIMEOUT_MS = 45e3;
236
328
  var DEFAULT_COORDINATOR_TEMPLATE_NAME = "exe";
237
329
  var COORDINATOR_ROLE = "COO";
@@ -271,13 +363,40 @@ var MANAGER_ROLES = /* @__PURE__ */ new Map([
271
363
  ["cmo", /* @__PURE__ */ new Set(["content production specialist", "specialist"])],
272
364
  ["gm", /* @__PURE__ */ new Set(["specialist"])]
273
365
  ]);
366
+ function isManagementRole(role) {
367
+ return isCoordinatorRole(role) || MANAGER_ROLES.has(normalizeRole(role));
368
+ }
369
+ function isManagementIdentity(agentId, employees = loadEmployeesSync()) {
370
+ if (!agentId) return false;
371
+ if (agentId === "default") return true;
372
+ const base = baseAgentName(agentId, employees);
373
+ const emp = getEmployee(employees, base);
374
+ return isManagementRole(emp?.role);
375
+ }
376
+ var _authzUnenforcedWarned = false;
377
+ function warnAuthzUnenforcedOnce() {
378
+ if (_authzUnenforcedWarned) return;
379
+ _authzUnenforcedWarned = true;
380
+ console.warn(
381
+ "[employees] chain-of-command authz is UNENFORCED: no roster configured (exe-employees.json missing/empty). Cross-agent writes are permitted. Configure a roster to enforce the chain of command."
382
+ );
383
+ }
274
384
  function canManage(callerName, callerRole, targetName, employees = loadEmployeesSync()) {
275
- if (canCoordinate(callerName, callerRole, employees)) return true;
385
+ void callerRole;
386
+ if (callerName === "default") return true;
387
+ if (employees.length === 0) {
388
+ warnAuthzUnenforcedOnce();
389
+ return true;
390
+ }
391
+ const callerBase = baseAgentName(callerName ?? "", employees);
392
+ const callerEmp = getEmployee(employees, callerBase);
393
+ if (!callerEmp) return false;
394
+ const effectiveCallerRole = callerEmp.role;
395
+ if (isCoordinatorRole(effectiveCallerRole)) return true;
276
396
  const targetBase = baseAgentName(targetName, employees);
277
397
  const targetEmp = getEmployee(employees, targetBase);
278
398
  if (!targetEmp) return false;
279
- const normalizedCallerRole = normalizeRole(callerRole);
280
- const allowedSubordinates = MANAGER_ROLES.get(normalizedCallerRole);
399
+ const allowedSubordinates = MANAGER_ROLES.get(normalizeRole(effectiveCallerRole));
281
400
  if (!allowedSubordinates) return false;
282
401
  return allowedSubordinates.has(normalizeRole(targetEmp.role));
283
402
  }
@@ -299,7 +418,7 @@ function validateEmployeeName(name) {
299
418
  return { valid: true };
300
419
  }
301
420
  async function loadEmployees(employeesPath = EMPLOYEES_PATH) {
302
- if (!existsSync2(employeesPath)) {
421
+ if (!existsSync3(employeesPath)) {
303
422
  return [];
304
423
  }
305
424
  const raw = await readFile(employeesPath, "utf-8");
@@ -310,17 +429,36 @@ async function loadEmployees(employeesPath = EMPLOYEES_PATH) {
310
429
  }
311
430
  }
312
431
  async function saveEmployees(employees, employeesPath = EMPLOYEES_PATH) {
313
- await mkdir(path2.dirname(employeesPath), { recursive: true });
432
+ await mkdir(path3.dirname(employeesPath), { recursive: true });
314
433
  await atomicWriteJson(employeesPath, employees);
315
434
  }
316
- function loadEmployeesSync(employeesPath = EMPLOYEES_PATH) {
317
- if (!existsSync2(employeesPath)) return [];
435
+ function loadEmployeesState(employeesPath = EMPLOYEES_PATH) {
436
+ let raw;
318
437
  try {
319
- return JSON.parse(readFileSync2(employeesPath, "utf-8"));
438
+ raw = readFileSync2(employeesPath, "utf-8");
439
+ } catch (err) {
440
+ const code = err?.code;
441
+ if (code === "ENOENT") {
442
+ try {
443
+ lstatSync2(employeesPath);
444
+ return { employees: [], status: "error" };
445
+ } catch {
446
+ return { employees: [], status: "missing" };
447
+ }
448
+ }
449
+ return { employees: [], status: "error" };
450
+ }
451
+ try {
452
+ const parsed = JSON.parse(raw);
453
+ if (!Array.isArray(parsed)) return { employees: [], status: "error" };
454
+ return { employees: parsed, status: "ok" };
320
455
  } catch {
321
- return [];
456
+ return { employees: [], status: "error" };
322
457
  }
323
458
  }
459
+ function loadEmployeesSync(employeesPath = EMPLOYEES_PATH) {
460
+ return loadEmployeesState(employeesPath).employees;
461
+ }
324
462
  function getEmployee(employees, name) {
325
463
  return employees.find((e) => e.name.toLowerCase() === name.toLowerCase());
326
464
  }
@@ -340,8 +478,9 @@ function hasRole(agentName, role) {
340
478
  function baseAgentName(name, employees) {
341
479
  const match = name.match(/^([a-zA-Z]+)\d+$/);
342
480
  if (!match) return name;
343
- const base = match[1];
344
481
  const roster = employees ?? loadEmployeesSync();
482
+ if (getEmployee(roster, name)) return name;
483
+ const base = match[1];
345
484
  if (getEmployee(roster, base)) return base;
346
485
  return name;
347
486
  }
@@ -380,13 +519,13 @@ function addEmployee(employees, employee) {
380
519
  }
381
520
  return [...employees, normalized];
382
521
  }
383
- var IDENTITY_DIR2 = path2.join(EXE_AI_DIR, "identity");
522
+ var IDENTITY_DIR2 = path3.join(EXE_AI_DIR, "identity");
384
523
  var TEAM_SECTION_RE = /^## Team\b.*$/m;
385
524
  function appendToCoordinatorTeam(employee) {
386
525
  const coordinator = getCoordinatorEmployee(loadEmployeesSync());
387
526
  if (!coordinator) return;
388
- const idPath = path2.join(IDENTITY_DIR2, `${coordinator.name}.md`);
389
- if (!existsSync2(idPath)) return;
527
+ const idPath = path3.join(IDENTITY_DIR2, `${coordinator.name}.md`);
528
+ if (!existsSync3(idPath)) return;
390
529
  const content = readFileSync2(idPath, "utf-8");
391
530
  if (content.includes(`**${capitalize(employee.name)}`)) return;
392
531
  const teamMatch = content.match(TEAM_SECTION_RE);
@@ -437,16 +576,16 @@ async function normalizeRosterCase(rosterPath) {
437
576
  emp.name = emp.name.toLowerCase();
438
577
  changed = true;
439
578
  try {
440
- const identityDir = path2.join(os.homedir(), ".exe-os", "identity");
441
- const oldPath = path2.join(identityDir, `${oldName}.md`);
442
- const newPath = path2.join(identityDir, `${emp.name}.md`);
443
- if (existsSync2(oldPath) && !existsSync2(newPath)) {
579
+ const identityDir = path3.join(os.homedir(), ".exe-os", "identity");
580
+ const oldPath = path3.join(identityDir, `${oldName}.md`);
581
+ const newPath = path3.join(identityDir, `${emp.name}.md`);
582
+ if (existsSync3(oldPath) && !existsSync3(newPath)) {
444
583
  renameSync(oldPath, newPath);
445
- } else if (existsSync2(oldPath) && oldPath !== newPath) {
584
+ } else if (existsSync3(oldPath) && oldPath !== newPath) {
446
585
  const content = readFileSync2(oldPath, "utf-8");
447
586
  writeFileSync2(newPath, content, "utf-8");
448
587
  if (oldPath.toLowerCase() !== newPath.toLowerCase()) {
449
- unlinkSync(oldPath);
588
+ unlinkSync2(oldPath);
450
589
  }
451
590
  }
452
591
  } catch {
@@ -474,7 +613,7 @@ function registerBinSymlinks(name) {
474
613
  errors.push("Could not find 'exe-os' in PATH");
475
614
  return { created, skipped, errors };
476
615
  }
477
- const binDir = path2.dirname(exeBinPath);
616
+ const binDir = path3.dirname(exeBinPath);
478
617
  let target;
479
618
  try {
480
619
  target = readlinkSync(exeBinPath);
@@ -484,8 +623,8 @@ function registerBinSymlinks(name) {
484
623
  }
485
624
  for (const suffix of ["", "-opencode"]) {
486
625
  const linkName = `${name}${suffix}`;
487
- const linkPath = path2.join(binDir, linkName);
488
- if (existsSync2(linkPath)) {
626
+ const linkPath = path3.join(binDir, linkName);
627
+ if (existsSync3(linkPath)) {
489
628
  skipped.push(linkName);
490
629
  continue;
491
630
  }
@@ -501,7 +640,7 @@ function registerBinSymlinks(name) {
501
640
 
502
641
  // src/lib/database-adapter.ts
503
642
  import os2 from "os";
504
- import path3 from "path";
643
+ import path4 from "path";
505
644
  import { createRequire } from "module";
506
645
  import { pathToFileURL } from "url";
507
646
  var VIEW_MAPPINGS = [
@@ -865,8 +1004,8 @@ async function loadPrismaClient() {
865
1004
  }
866
1005
  return new PrismaClient2();
867
1006
  }
868
- const exeDbRoot = process.env.EXE_DB_ROOT ?? path3.join(os2.homedir(), "exe-db");
869
- const requireFromExeDb = createRequire(path3.join(exeDbRoot, "package.json"));
1007
+ const exeDbRoot = process.env.EXE_DB_ROOT ?? path4.join(os2.homedir(), "exe-db");
1008
+ const requireFromExeDb = createRequire(path4.join(exeDbRoot, "package.json"));
870
1009
  const prismaEntry = requireFromExeDb.resolve("@prisma/client");
871
1010
  const module = await import(pathToFileURL(prismaEntry).href);
872
1011
  const PrismaClient = module.PrismaClient ?? module.default?.PrismaClient;
@@ -1113,13 +1252,25 @@ async function executeAddColumn(client, sql, context = "migration add column") {
1113
1252
  return false;
1114
1253
  }
1115
1254
  }
1255
+ async function ensureIdempotencyKeyMigration(client) {
1256
+ await executeAddColumn(
1257
+ client,
1258
+ `ALTER TABLE tasks ADD COLUMN idempotency_key TEXT`,
1259
+ "migration add tasks.idempotency_key"
1260
+ );
1261
+ await client.execute(
1262
+ `CREATE UNIQUE INDEX IF NOT EXISTS idx_tasks_idempotency_key
1263
+ ON tasks(idempotency_key)
1264
+ WHERE idempotency_key IS NOT NULL`
1265
+ );
1266
+ }
1116
1267
  async function migrateReflectionDedup(client) {
1117
1268
  const added = await executeAddColumn(
1118
1269
  client,
1119
1270
  "ALTER TABLE memory_reflections ADD COLUMN dedup_key TEXT",
1120
1271
  "migration add memory_reflections.dedup_key"
1121
1272
  );
1122
- const { reflectionDedupKey } = await import("./memory-reflection-6N4J2FL7.js");
1273
+ const { reflectionDedupKey } = await import("./memory-reflection-WVNFBJAA.js");
1123
1274
  const keyForRow = (row) => {
1124
1275
  let sources = [];
1125
1276
  try {
@@ -1233,7 +1384,7 @@ function pidIsAlive(pid) {
1233
1384
  }
1234
1385
  }
1235
1386
  function tryTakeLock(lockPath) {
1236
- _lockFd = openSync(lockPath, "wx");
1387
+ _lockFd = openSync2(lockPath, "wx");
1237
1388
  try {
1238
1389
  writeSync(_lockFd, `${process.pid}
1239
1390
  `);
@@ -1244,6 +1395,18 @@ function tryTakeLock(lockPath) {
1244
1395
  logCatchDebug("lock pid write", e);
1245
1396
  }
1246
1397
  }
1398
+ function isDbLockHeldByLiveProcess() {
1399
+ try {
1400
+ const lockPath = dbLockPath();
1401
+ if (!existsSync4(lockPath)) return false;
1402
+ const holderPid = readLockHolderPid(lockPath);
1403
+ if (holderPid === null) return false;
1404
+ if (holderPid === process.pid) return false;
1405
+ return pidIsAlive(holderPid);
1406
+ } catch {
1407
+ return false;
1408
+ }
1409
+ }
1247
1410
  async function acquireDbLock(options = {}) {
1248
1411
  const lockPath = dbLockPath();
1249
1412
  const waitMs = options.waitMs ?? dbLockWaitMs();
@@ -1281,7 +1444,7 @@ async function acquireDbLock(options = {}) {
1281
1444
  `
1282
1445
  );
1283
1446
  try {
1284
- unlinkSync2(lockPath);
1447
+ unlinkSync3(lockPath);
1285
1448
  } catch (e) {
1286
1449
  logCatchDebug("stale lock unlink", e);
1287
1450
  }
@@ -1313,7 +1476,7 @@ function releaseDbLock() {
1313
1476
  if (_lockFd !== null) {
1314
1477
  const identity = _lockIdentity;
1315
1478
  try {
1316
- closeSync(_lockFd);
1479
+ closeSync2(_lockFd);
1317
1480
  } catch (e) {
1318
1481
  logCatchDebug("lock close", e);
1319
1482
  }
@@ -1323,7 +1486,7 @@ function releaseDbLock() {
1323
1486
  const lockPath = identity?.path ?? dbLockPath();
1324
1487
  const st = statSync(lockPath);
1325
1488
  if (!identity || st.dev === identity.dev && st.ino === identity.ino) {
1326
- unlinkSync2(lockPath);
1489
+ unlinkSync3(lockPath);
1327
1490
  }
1328
1491
  } catch (e) {
1329
1492
  logCatchDebug("lock unlink", e);
@@ -1376,7 +1539,7 @@ async function _attemptBackupRestore(config) {
1376
1539
  renameSync2(config.dbPath, corruptPath);
1377
1540
  for (const suffix of ["-wal", "-shm"]) {
1378
1541
  const sidePath = config.dbPath + suffix;
1379
- if (existsSync3(sidePath)) {
1542
+ if (existsSync4(sidePath)) {
1380
1543
  try {
1381
1544
  renameSync2(sidePath, corruptPath + suffix);
1382
1545
  } catch {
@@ -1402,7 +1565,7 @@ async function _attemptBackupRestore(config) {
1402
1565
  try {
1403
1566
  copyFileSync(backup.path, config.dbPath);
1404
1567
  const backupWal = backup.path + "-wal";
1405
- if (existsSync3(backupWal)) {
1568
+ if (existsSync4(backupWal)) {
1406
1569
  copyFileSync(backupWal, config.dbPath + "-wal");
1407
1570
  }
1408
1571
  const opts = {
@@ -1418,15 +1581,15 @@ async function _attemptBackupRestore(config) {
1418
1581
  if (isCorrupt) {
1419
1582
  testClient.close();
1420
1583
  try {
1421
- unlinkSync2(config.dbPath);
1584
+ unlinkSync3(config.dbPath);
1422
1585
  } catch {
1423
1586
  }
1424
1587
  try {
1425
- unlinkSync2(config.dbPath + "-wal");
1588
+ unlinkSync3(config.dbPath + "-wal");
1426
1589
  } catch {
1427
1590
  }
1428
1591
  try {
1429
- unlinkSync2(config.dbPath + "-shm");
1592
+ unlinkSync3(config.dbPath + "-shm");
1430
1593
  } catch {
1431
1594
  }
1432
1595
  process.stderr.write(
@@ -1447,7 +1610,7 @@ async function _attemptBackupRestore(config) {
1447
1610
  `
1448
1611
  );
1449
1612
  try {
1450
- const { recordDbRestoreEvent } = await import("./db-restore-events-JVEEP52Z.js");
1613
+ const { recordDbRestoreEvent } = await import("./db-restore-events-MQ2DBGEQ.js");
1451
1614
  recordDbRestoreEvent({
1452
1615
  kind: "auto-restore",
1453
1616
  restoredFrom: backup.name,
@@ -1459,7 +1622,7 @@ async function _attemptBackupRestore(config) {
1459
1622
  } catch {
1460
1623
  }
1461
1624
  try {
1462
- const { pruneCorruptQuarantine } = await import("./db-backup-DLD4QZBO.js");
1625
+ const { pruneCorruptQuarantine } = await import("./db-backup-W2QFSYQC.js");
1463
1626
  pruneCorruptQuarantine();
1464
1627
  } catch {
1465
1628
  }
@@ -1470,15 +1633,15 @@ async function _attemptBackupRestore(config) {
1470
1633
  `
1471
1634
  );
1472
1635
  try {
1473
- unlinkSync2(config.dbPath);
1636
+ unlinkSync3(config.dbPath);
1474
1637
  } catch {
1475
1638
  }
1476
1639
  try {
1477
- unlinkSync2(config.dbPath + "-wal");
1640
+ unlinkSync3(config.dbPath + "-wal");
1478
1641
  } catch {
1479
1642
  }
1480
1643
  try {
1481
- unlinkSync2(config.dbPath + "-shm");
1644
+ unlinkSync3(config.dbPath + "-shm");
1482
1645
  } catch {
1483
1646
  }
1484
1647
  continue;
@@ -1490,7 +1653,7 @@ async function _attemptBackupRestore(config) {
1490
1653
  `
1491
1654
  );
1492
1655
  try {
1493
- const { recordDbRestoreEvent } = await import("./db-restore-events-JVEEP52Z.js");
1656
+ const { recordDbRestoreEvent } = await import("./db-restore-events-MQ2DBGEQ.js");
1494
1657
  recordDbRestoreEvent({
1495
1658
  kind: "restore-failed",
1496
1659
  quarantinePath: corruptPath,
@@ -1570,21 +1733,25 @@ async function optimizeFtsIndexes(client = getRawClient(), pages = FTS_MERGE_PAG
1570
1733
  var initTurso = initDatabase;
1571
1734
  async function initDatabase(config) {
1572
1735
  assertValidDbPath(config?.dbPath, "initDatabase");
1736
+ try {
1737
+ cleanupLegacyPlaintextStubs(dirname(config.dbPath), config.dbPath);
1738
+ } catch {
1739
+ }
1573
1740
  await acquireDbLock();
1574
- if (existsSync3(config.dbPath)) {
1741
+ if (existsSync4(config.dbPath)) {
1575
1742
  const dbStat = statSync(config.dbPath);
1576
1743
  if (dbStat.size === 0) {
1577
1744
  const walPath = config.dbPath + "-wal";
1578
- if (existsSync3(walPath) && statSync(walPath).size > 0) {
1745
+ if (existsSync4(walPath) && statSync(walPath).size > 0) {
1579
1746
  const backupPath = config.dbPath + ".zeroed-" + Date.now();
1580
1747
  copyFileSync(config.dbPath, backupPath);
1581
- unlinkSync2(config.dbPath);
1748
+ unlinkSync3(config.dbPath);
1582
1749
  process.stderr.write(
1583
1750
  `[database] CRITICAL: DB was 0 bytes. Moved to ${backupPath}, attempting WAL recovery.
1584
1751
  `
1585
1752
  );
1586
1753
  try {
1587
- const { recordDbRestoreEvent } = await import("./db-restore-events-JVEEP52Z.js");
1754
+ const { recordDbRestoreEvent } = await import("./db-restore-events-MQ2DBGEQ.js");
1588
1755
  recordDbRestoreEvent({
1589
1756
  kind: "wal-recovery",
1590
1757
  quarantinePath: backupPath,
@@ -1598,7 +1765,7 @@ async function initDatabase(config) {
1598
1765
  `
1599
1766
  );
1600
1767
  try {
1601
- const { recordDbRestoreEvent } = await import("./db-restore-events-JVEEP52Z.js");
1768
+ const { recordDbRestoreEvent } = await import("./db-restore-events-MQ2DBGEQ.js");
1602
1769
  recordDbRestoreEvent({
1603
1770
  kind: "zeroed-no-wal",
1604
1771
  detail: "DB was 0 bytes at startup with no WAL available \u2014 data may be lost"
@@ -1865,7 +2032,7 @@ function getRawClient() {
1865
2032
  function tryGetRawClient() {
1866
2033
  return _client;
1867
2034
  }
1868
- var CURRENT_SCHEMA_VERSION = 10;
2035
+ var CURRENT_SCHEMA_VERSION = 17;
1869
2036
  var _migrationBlockRuns = 0;
1870
2037
  function _getMigrationBlockRuns() {
1871
2038
  return _migrationBlockRuns;
@@ -1897,6 +2064,23 @@ async function ensureSchema() {
1897
2064
  await client.execute("PRAGMA libsql_vector_search_ef = 128");
1898
2065
  } catch {
1899
2066
  }
2067
+ try {
2068
+ const idxProbe = await client.execute({
2069
+ sql: "SELECT name FROM sqlite_master WHERE type = 'index' AND name = ?",
2070
+ args: ["idx_tasks_idempotency_key"]
2071
+ });
2072
+ if (idxProbe.rows.length === 0) {
2073
+ process.stderr.write(
2074
+ "[database] repairing missing idx_tasks_idempotency_key on already-current DB (bug c06a8803)\n"
2075
+ );
2076
+ await ensureIdempotencyKeyMigration(client);
2077
+ }
2078
+ } catch (e) {
2079
+ process.stderr.write(
2080
+ `[database] idempotency index repair check failed: ${e instanceof Error ? e.message : String(e)}
2081
+ `
2082
+ );
2083
+ }
1900
2084
  return;
1901
2085
  }
1902
2086
  _migrationBlockRuns++;
@@ -1969,6 +2153,9 @@ async function ensureSchema() {
1969
2153
  }
1970
2154
  await executeAddColumn(client, "ALTER TABLE memories ADD COLUMN embedding_model TEXT", "migration add memories.embedding_model");
1971
2155
  await client.execute("CREATE INDEX IF NOT EXISTS idx_memories_embedding_model ON memories(embedding_model)");
2156
+ await client.execute(
2157
+ "CREATE INDEX IF NOT EXISTS idx_memories_null_vector ON memories(id) WHERE vector IS NULL"
2158
+ );
1972
2159
  let needsFtsMigration = false;
1973
2160
  try {
1974
2161
  const ftsCheck = await client.execute(
@@ -2073,6 +2260,12 @@ async function ensureSchema() {
2073
2260
 
2074
2261
  CREATE INDEX IF NOT EXISTS idx_tasks_assignee_status
2075
2262
  ON tasks(assigned_to, status);
2263
+
2264
+ -- Boot reconciles every exe/**/*.md task file against this table by
2265
+ -- task_file (exe-boot.ts). Without this index every lookup was a full table
2266
+ -- scan \u2014 576 of them per boot (bug 4b2d2d10). Additive: index only.
2267
+ CREATE INDEX IF NOT EXISTS idx_tasks_task_file
2268
+ ON tasks(task_file);
2076
2269
  `);
2077
2270
  await client.executeMultiple(`
2078
2271
  CREATE TABLE IF NOT EXISTS orchestration_events (
@@ -2220,14 +2413,43 @@ async function ensureSchema() {
2220
2413
  ON consolidations(consolidated_memory_id);
2221
2414
  `);
2222
2415
  await client.executeMultiple(`
2223
- CREATE TABLE IF NOT EXISTS reminders (
2416
+ CREATE TABLE IF NOT EXISTS memory_reads (
2224
2417
  id TEXT PRIMARY KEY,
2225
- text TEXT NOT NULL,
2226
- created_at TEXT NOT NULL,
2227
- due_date TEXT,
2228
- completed_at TEXT
2418
+ memory_id TEXT NOT NULL,
2419
+ agent_id TEXT,
2420
+ task_id TEXT,
2421
+ session_scope TEXT,
2422
+ source TEXT NOT NULL,
2423
+ query TEXT,
2424
+ rank_position INTEGER NOT NULL,
2425
+ timestamp TEXT NOT NULL
2229
2426
  );
2427
+
2428
+ CREATE INDEX IF NOT EXISTS idx_memory_reads_memory
2429
+ ON memory_reads(memory_id);
2430
+
2431
+ CREATE INDEX IF NOT EXISTS idx_memory_reads_task
2432
+ ON memory_reads(task_id);
2433
+
2434
+ CREATE INDEX IF NOT EXISTS idx_memory_reads_ts
2435
+ ON memory_reads(timestamp);
2436
+
2437
+ CREATE INDEX IF NOT EXISTS idx_memory_reads_agent
2438
+ ON memory_reads(agent_id, session_scope);
2230
2439
  `);
2440
+ await client.executeMultiple(`
2441
+ CREATE TABLE IF NOT EXISTS reminders (
2442
+ id TEXT PRIMARY KEY,
2443
+ text TEXT NOT NULL,
2444
+ created_at TEXT NOT NULL,
2445
+ due_date TEXT,
2446
+ completed_at TEXT,
2447
+ daily_push TEXT,
2448
+ last_pushed_at TEXT
2449
+ );
2450
+ `);
2451
+ await executeAddColumn(client, `ALTER TABLE reminders ADD COLUMN daily_push TEXT`, "migration add reminders.daily_push");
2452
+ await executeAddColumn(client, `ALTER TABLE reminders ADD COLUMN last_pushed_at TEXT`, "migration add reminders.last_pushed_at");
2231
2453
  await client.executeMultiple(`
2232
2454
  CREATE TABLE IF NOT EXISTS notifications (
2233
2455
  id TEXT PRIMARY KEY,
@@ -2312,6 +2534,46 @@ async function ensureSchema() {
2312
2534
  CREATE INDEX IF NOT EXISTS idx_messages_target_scope_status
2313
2535
  ON messages(target_agent, session_scope, status, created_at);
2314
2536
  `);
2537
+ await client.executeMultiple(`
2538
+ CREATE TABLE IF NOT EXISTS notification_ledger (
2539
+ id TEXT PRIMARY KEY,
2540
+ session_scope TEXT,
2541
+ project TEXT,
2542
+ target_agent TEXT NOT NULL,
2543
+ target_role TEXT NOT NULL DEFAULT 'employee',
2544
+ target_session TEXT,
2545
+ kind TEXT NOT NULL,
2546
+ intercom_reason TEXT,
2547
+ task_id TEXT,
2548
+ task_file TEXT,
2549
+ payload_json TEXT,
2550
+ dedup_key TEXT,
2551
+ delivery_state TEXT NOT NULL DEFAULT 'pending',
2552
+ ack_state TEXT NOT NULL DEFAULT 'unacked',
2553
+ retry_count INTEGER NOT NULL DEFAULT 0,
2554
+ max_retries INTEGER NOT NULL DEFAULT 10,
2555
+ next_retry_at TEXT,
2556
+ boot_generation INTEGER,
2557
+ created_at TEXT NOT NULL,
2558
+ delivered_at TEXT,
2559
+ acked_at TEXT,
2560
+ expires_at TEXT,
2561
+ last_error TEXT
2562
+ );
2563
+
2564
+ CREATE INDEX IF NOT EXISTS idx_nledger_scope_state
2565
+ ON notification_ledger(session_scope, delivery_state, next_retry_at);
2566
+
2567
+ CREATE INDEX IF NOT EXISTS idx_nledger_target
2568
+ ON notification_ledger(target_agent, session_scope, delivery_state);
2569
+
2570
+ CREATE INDEX IF NOT EXISTS idx_nledger_task
2571
+ ON notification_ledger(task_id);
2572
+
2573
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_nledger_dedup
2574
+ ON notification_ledger(session_scope, dedup_key)
2575
+ WHERE dedup_key IS NOT NULL AND delivery_state IN ('pending', 'delivered');
2576
+ `);
2315
2577
  try {
2316
2578
  await client.execute({
2317
2579
  sql: `UPDATE memories SET project_name = 'exe-create' WHERE project_name = 'web'`,
@@ -3563,6 +3825,8 @@ async function ensureSchema() {
3563
3825
  for (const table of founderIdTables) {
3564
3826
  await executeAddColumn(client, `ALTER TABLE ${table} ADD COLUMN founder_id TEXT DEFAULT NULL`);
3565
3827
  }
3828
+ await ensureIdempotencyKeyMigration(client);
3829
+ await executeAddColumn(client, `ALTER TABLE tasks ADD COLUMN enforcement_note TEXT`);
3566
3830
  await client.executeMultiple(`
3567
3831
  CREATE TABLE IF NOT EXISTS investigation_attempts (
3568
3832
  id TEXT PRIMARY KEY,
@@ -3795,6 +4059,7 @@ async function disposeDatabase() {
3795
4059
  export {
3796
4060
  dbLockWaitMs,
3797
4061
  DbLockHeldError,
4062
+ isDbLockHeldByLiveProcess,
3798
4063
  acquireDbLock,
3799
4064
  releaseDbLock,
3800
4065
  WAL_ESCALATION_THRESHOLD_BYTES,
@@ -3837,12 +4102,15 @@ export {
3837
4102
  getCoordinatorDisplayTitle,
3838
4103
  isCoordinatorName,
3839
4104
  canCoordinate,
4105
+ isManagementRole,
4106
+ isManagementIdentity,
3840
4107
  canManage,
3841
4108
  VALID_AGENT_NAME,
3842
4109
  VALID_AGENT_NAME_DESCRIPTION,
3843
4110
  validateEmployeeName,
3844
4111
  loadEmployees,
3845
4112
  saveEmployees,
4113
+ loadEmployeesState,
3846
4114
  loadEmployeesSync,
3847
4115
  getEmployee,
3848
4116
  getEmployeeByRole,