@askexenow/exe-os 0.9.384 → 0.9.389

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 (481) hide show
  1. package/deploy/compose/.env.askexe-control-plane.example +6 -0
  2. package/deploy/compose/.env.customer.example +1 -1
  3. package/deploy/compose/.env.example +1 -1
  4. package/deploy/compose/docker-compose.yml +16 -0
  5. package/deploy/compose/generate-env.ts +1 -1
  6. package/deploy/compose/sso-edge/sso-redirect.conf +18 -3
  7. package/deploy/stack-manifests/v0.9.json +1160 -1
  8. package/dist/.dist-verified.json +3 -3
  9. package/dist/{active-agent-F5V4E4UL.js → active-agent-RZ24KSJN.js} +8 -6
  10. package/dist/{active-agent-YTBB4ZQM.js → active-agent-YWSWPIEA.js} +8 -6
  11. package/dist/{agent-defs-generator-7TFISIJQ.js → agent-defs-generator-GY3UBREJ.js} +8 -6
  12. package/dist/{agent-heartbeat-CQPGJIFF.js → agent-heartbeat-GUVUUQVM.js} +1 -1
  13. package/dist/{agent-loop-EZ7LDAGD.js → agent-loop-HPNCH3HK.js} +1 -1
  14. package/dist/{agentic-ontology-XVTUVV7W.js → agentic-ontology-RHYNXEKE.js} +1 -1
  15. package/dist/{artifact-backup-TF6YWQT2.js → artifact-backup-HGUFSIJH.js} +19 -6
  16. package/dist/{backfill-metadata-J6MXIDCW.js → backfill-metadata-XLFASEOD.js} +11 -9
  17. package/dist/{backup-verify-6DVBQMDP.js → backup-verify-TUQEICWA.js} +1 -1
  18. package/dist/{behavior-injection-XDA7ZCYN.js → behavior-injection-GXO7ERGN.js} +14 -12
  19. package/dist/{behavior-promotion-4VLQ7LXK.js → behavior-promotion-V63WIZ4N.js} +13 -11
  20. package/dist/{behaviors-SCCZP7RZ.js → behaviors-RMLDPLOF.js} +18 -11
  21. package/dist/bin/agentic-ontology-backfill.js +12 -10
  22. package/dist/bin/agentic-reflection-backfill.js +13 -11
  23. package/dist/bin/agentic-semantic-label.js +12 -10
  24. package/dist/bin/backfill-conversations.js +11 -9
  25. package/dist/bin/backfill-responses.js +11 -9
  26. package/dist/bin/backfill-vectors.js +13 -11
  27. package/dist/bin/bulk-sync-postgres.js +20 -18
  28. package/dist/bin/cc-doctor.js +15 -13
  29. package/dist/bin/cleanup-stale-review-tasks.js +44 -32
  30. package/dist/bin/cli.js +109 -30
  31. package/dist/bin/customer-readiness.js +55 -25
  32. package/dist/bin/deferred-daemon-restart.js +111 -108
  33. package/dist/bin/exe-actions.js +7 -1
  34. package/dist/bin/exe-agent-config.js +8 -6
  35. package/dist/bin/exe-agent.js +18 -16
  36. package/dist/bin/exe-assign.js +13 -11
  37. package/dist/bin/exe-boot.js +49 -47
  38. package/dist/bin/exe-call.js +9 -7
  39. package/dist/bin/exe-cicd.js +19 -8
  40. package/dist/bin/exe-cloud.js +59 -25
  41. package/dist/bin/exe-config-dump.js +8 -6
  42. package/dist/bin/exe-dispatch.js +23 -21
  43. package/dist/bin/exe-doctor.js +11 -8
  44. package/dist/bin/exe-export-behaviors.js +16 -14
  45. package/dist/bin/exe-forget.js +14 -12
  46. package/dist/bin/exe-gateway.js +12 -10
  47. package/dist/bin/exe-grant.js +6 -6
  48. package/dist/bin/exe-healthcheck.js +15 -13
  49. package/dist/bin/exe-heartbeat.js +28 -26
  50. package/dist/bin/exe-kill.js +28 -26
  51. package/dist/bin/exe-launch-agent.js +35 -33
  52. package/dist/bin/exe-mcp.js +9 -7
  53. package/dist/bin/exe-memory-reads.js +11 -9
  54. package/dist/bin/exe-new-employee.js +13 -11
  55. package/dist/bin/exe-os-mcp-proxy.js +9 -7
  56. package/dist/bin/exe-pending-messages.js +23 -21
  57. package/dist/bin/exe-pending-notifications.js +22 -20
  58. package/dist/bin/exe-pending-reviews.js +23 -21
  59. package/dist/bin/exe-preflight.js +1 -1
  60. package/dist/bin/exe-rename.js +9 -7
  61. package/dist/bin/exe-review.js +59 -55
  62. package/dist/bin/exe-search-quality.js +16 -3
  63. package/dist/bin/exe-search.js +13 -11
  64. package/dist/bin/exe-session-cleanup.js +29 -27
  65. package/dist/bin/exe-settings.js +22 -20
  66. package/dist/bin/exe-start-codex.js +23 -21
  67. package/dist/bin/exe-start-opencode.js +21 -19
  68. package/dist/bin/exe-status.js +24 -22
  69. package/dist/bin/exe-support.js +3 -3
  70. package/dist/bin/exe-team.js +8 -6
  71. package/dist/bin/exe-verify-running-images.js +644 -17
  72. package/dist/bin/git-sweep.js +24 -22
  73. package/dist/bin/graph-backfill.js +12 -10
  74. package/dist/bin/graph-export.js +12 -10
  75. package/dist/bin/hooks-cli.js +4 -4
  76. package/dist/bin/import-history.js +16 -14
  77. package/dist/bin/install.js +113 -110
  78. package/dist/bin/intercom-check.js +5 -5
  79. package/dist/bin/mcp-sessions.js +2 -2
  80. package/dist/bin/orchestration-metrics.js +8 -6
  81. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  82. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  83. package/dist/bin/pre-build-guard.js +55 -16
  84. package/dist/bin/pre-publish.js +1 -1
  85. package/dist/bin/prune-orphan-chunks.js +154 -28
  86. package/dist/bin/reconcile-backlog.js +5 -3
  87. package/dist/bin/registry-proxy.js +1 -1
  88. package/dist/bin/repair-document-chunks.js +11 -9
  89. package/dist/bin/scan-tasks.js +23 -21
  90. package/dist/bin/setup.js +3 -3
  91. package/dist/bin/shard-migrate.js +12 -10
  92. package/dist/bin/stack-update.js +622 -43
  93. package/dist/bin/verify-stack.js +2 -2
  94. package/dist/bin/vps-health-gate.js +1 -1
  95. package/dist/{boot-generation-Q7LGQ3AO.js → boot-generation-VCQXVYGT.js} +7 -5
  96. package/dist/{boot-review-sections-G5774FR5.js → boot-review-sections-3QO6Q7MP.js} +21 -19
  97. package/dist/{branch-hygiene-44WLSOZR.js → branch-hygiene-DDXXI6ZA.js} +59 -21
  98. package/dist/bug-landed-reconciler-TQVNOUCU.js +353 -0
  99. package/dist/build-manifest.json +1269 -1194
  100. package/dist/{capability-cards-I3RHCF4F.js → capability-cards-XPDLT6LU.js} +6 -4
  101. package/dist/{capacity-monitor-7I7GDONU.js → capacity-monitor-N3AW242L.js} +23 -21
  102. package/dist/{catchup-brief-3T5PARIR.js → catchup-brief-3PKX7FUP.js} +29 -27
  103. package/dist/{chunk-C5ISP5FO.js → chunk-2BKJAOO4.js} +11 -1
  104. package/dist/{chunk-JJTPPAZY.js → chunk-2CUQHG6H.js} +1609 -1356
  105. package/dist/{chunk-HU3VD4MQ.js → chunk-2Q2GGYBX.js} +1 -1
  106. package/dist/{chunk-CHIUS5QB.js → chunk-36LMIOVU.js} +9 -9
  107. package/dist/{chunk-46VSBDUW.js → chunk-3DCBDG4T.js} +2 -2
  108. package/dist/{chunk-W3KPQE7H.js → chunk-3GL3E4TD.js} +3 -3
  109. package/dist/{chunk-GL47M7NY.js → chunk-3UD3OF3X.js} +202 -117
  110. package/dist/{chunk-WNBZJSQT.js → chunk-3VW5ZP2F.js} +1 -1
  111. package/dist/{chunk-JDDM6C57.js → chunk-3X74IQBU.js} +1 -1
  112. package/dist/{chunk-NVFNADTX.js → chunk-3ZL4MDQ6.js} +18 -4
  113. package/dist/{chunk-R5E7WNAC.js → chunk-4ESNDGMB.js} +3 -3
  114. package/dist/{chunk-CYCIX7AW.js → chunk-4FLLIQRQ.js} +2 -2
  115. package/dist/{chunk-3RGTLZNO.js → chunk-4GAKF7KR.js} +99 -74
  116. package/dist/{chunk-RVO5O5SR.js → chunk-4S3A52AV.js} +38 -10
  117. package/dist/{chunk-7J2ZQ4XN.js → chunk-4VQ3QR6B.js} +29 -28
  118. package/dist/{chunk-MROSARM5.js → chunk-5BJBTFFQ.js} +7 -1
  119. package/dist/chunk-5LQZABW5.js +6 -0
  120. package/dist/chunk-5ONMHTNI.js +236 -0
  121. package/dist/{chunk-APL7HUE3.js → chunk-5QQJUO3F.js} +200 -31
  122. package/dist/{chunk-UOPCVFVR.js → chunk-5RK75SWH.js} +205 -278
  123. package/dist/{chunk-T5FEAQES.js → chunk-5TYJYGS5.js} +1 -1
  124. package/dist/{chunk-P3QQ52QK.js → chunk-5U6EOTZV.js} +3 -3
  125. package/dist/{chunk-ALRHGEAJ.js → chunk-637FL62O.js} +1 -1
  126. package/dist/{chunk-PUBA5B4M.js → chunk-6L4VIYLZ.js} +33 -19
  127. package/dist/{chunk-VF2KRROX.js → chunk-754P2UXM.js} +1 -1
  128. package/dist/{chunk-CM7N5MBY.js → chunk-7FZG7WP4.js} +5 -5
  129. package/dist/{chunk-NYLJQ2M2.js → chunk-7NEBFB3L.js} +4 -4
  130. package/dist/{chunk-E7C2WNR5.js → chunk-AEIOFFFX.js} +5 -5
  131. package/dist/{chunk-VOVFUKEB.js → chunk-AIB2EWO2.js} +5 -5
  132. package/dist/{chunk-EGOEB42T.js → chunk-AP2C4OGS.js} +3 -3
  133. package/dist/{chunk-MPZ2AVNS.js → chunk-ATNV3BVZ.js} +1 -1
  134. package/dist/{chunk-F4BBMIPG.js → chunk-B4XJQBQB.js} +2 -2
  135. package/dist/{chunk-BPVFZ6Q4.js → chunk-B5EGDNG6.js} +2 -2
  136. package/dist/{chunk-AGC2V7JS.js → chunk-B6CBN6EF.js} +1 -1
  137. package/dist/{chunk-KTKIFXIP.js → chunk-B7FDRN7G.js} +1 -1
  138. package/dist/{chunk-C5HUMAA7.js → chunk-B7WVYLAQ.js} +67 -15
  139. package/dist/chunk-BGVP5RMT.js +185 -0
  140. package/dist/{chunk-FVLNNNH6.js → chunk-BNI4LIU5.js} +35 -4
  141. package/dist/{chunk-P4XLIPB7.js → chunk-BU5JRLZT.js} +1 -1
  142. package/dist/{chunk-PHUHIVD5.js → chunk-C6U7XWOC.js} +34 -5
  143. package/dist/chunk-C7GHNJPW.js +8 -0
  144. package/dist/{chunk-4AR5XKCH.js → chunk-CL2MU3OX.js} +1 -1
  145. package/dist/{chunk-ZPP63JSQ.js → chunk-CL3AB7Z2.js} +1 -1
  146. package/dist/{chunk-FHIFTSPL.js → chunk-CP7XUSOF.js} +8 -3
  147. package/dist/{chunk-3OX34OC3.js → chunk-CUDNRHHT.js} +30 -10
  148. package/dist/chunk-CYUUNIEL.js +21 -0
  149. package/dist/{chunk-P2UY34XE.js → chunk-D4C57S2H.js} +5 -5
  150. package/dist/{chunk-XSUALA32.js → chunk-DDYFNBYV.js} +3 -3
  151. package/dist/{chunk-LSNBTGW4.js → chunk-DPYZW42H.js} +1 -1
  152. package/dist/{chunk-FMIYFHLE.js → chunk-E2PRXEZK.js} +9 -3
  153. package/dist/{chunk-L63V25HS.js → chunk-E54SPUYJ.js} +3 -3
  154. package/dist/{chunk-DMUOTCDN.js → chunk-E5CKRHIZ.js} +1 -1
  155. package/dist/{chunk-BV2IET6B.js → chunk-EVMOKRBC.js} +15 -2
  156. package/dist/{chunk-YLFCH3VA.js → chunk-FDWI3T6I.js} +133 -31
  157. package/dist/{chunk-PWC3C5ME.js → chunk-FNJTCJGY.js} +4 -4
  158. package/dist/{chunk-TNS63ATU.js → chunk-FWRPDSO3.js} +350 -50
  159. package/dist/{chunk-JA3Y5TV6.js → chunk-GDLB6BPM.js} +141 -74
  160. package/dist/{chunk-IGJMS7C5.js → chunk-GOVGG7HU.js} +2 -2
  161. package/dist/{chunk-MB47DRF5.js → chunk-GP7CTIUK.js} +2 -2
  162. package/dist/{chunk-L5EPGGDP.js → chunk-GWAN2BDB.js} +4 -4
  163. package/dist/{chunk-YRQ26MNP.js → chunk-H3YF7X4J.js} +12 -5
  164. package/dist/{chunk-VLBHZ6TF.js → chunk-H6PLIFUE.js} +2 -2
  165. package/dist/{chunk-GSLFH4AI.js → chunk-HRNM3N4Y.js} +6 -15
  166. package/dist/chunk-IG2ISRTF.js +48 -0
  167. package/dist/{chunk-MWEIBVBS.js → chunk-IJCWBYA5.js} +14 -1
  168. package/dist/{chunk-NKEFYE4R.js → chunk-IPTUKX3N.js} +1 -1
  169. package/dist/{chunk-RB3J2WYQ.js → chunk-IVE7H6KA.js} +1 -1
  170. package/dist/{chunk-HA63SH5W.js → chunk-IWY2OGQG.js} +1 -1
  171. package/dist/{chunk-BQEZPRUC.js → chunk-IZWMWJZT.js} +64 -46
  172. package/dist/{chunk-AHESD3KW.js → chunk-J4UVI652.js} +1 -1
  173. package/dist/{chunk-PLII76NJ.js → chunk-JBUCA4OX.js} +33 -6
  174. package/dist/{chunk-2PZTMSMG.js → chunk-JOF4HQDF.js} +5 -5
  175. package/dist/{chunk-OBBO6EJR.js → chunk-JQN3QGSF.js} +1 -1
  176. package/dist/{chunk-P4PIZOL2.js → chunk-JWYIH5DR.js} +3 -3
  177. package/dist/{chunk-3XY57PKT.js → chunk-KZLKE7I3.js} +210 -48
  178. package/dist/{chunk-DYVLEMKS.js → chunk-L3GXMYBK.js} +1 -1
  179. package/dist/{chunk-72V3S44T.js → chunk-LUA4SLJY.js} +46 -19
  180. package/dist/{chunk-ZT4LFTUJ.js → chunk-LW3JCBXP.js} +20 -3
  181. package/dist/{chunk-YLB365YX.js → chunk-M5XHN4OM.js} +3 -3
  182. package/dist/{chunk-VHHX4UCP.js → chunk-MDTWARSF.js} +22 -93
  183. package/dist/{chunk-JFJP6ATJ.js → chunk-MWKXQSF6.js} +3 -2
  184. package/dist/{chunk-VJEJ7JNB.js → chunk-N32DVIKY.js} +1 -1
  185. package/dist/{chunk-MUCNYSJP.js → chunk-NRLJOV7M.js} +32 -4
  186. package/dist/{chunk-PL4CFSQ7.js → chunk-NSXJOSH7.js} +1 -1
  187. package/dist/{chunk-NF5FOSLD.js → chunk-NVTG66CK.js} +1 -1
  188. package/dist/chunk-O45GBJEH.js +1500 -0
  189. package/dist/{chunk-4AAMFWJT.js → chunk-OHZSTZXN.js} +4 -2
  190. package/dist/chunk-OSIS7ZQW.js +344 -0
  191. package/dist/{chunk-E3ZM32LF.js → chunk-P22VFGFK.js} +14 -5
  192. package/dist/{chunk-KILR4FBR.js → chunk-PAFLR7WD.js} +3 -3
  193. package/dist/{chunk-R3CZWFFC.js → chunk-PEYQ6MWO.js} +15 -3
  194. package/dist/{chunk-RDWIKDMY.js → chunk-PZR54BEI.js} +8 -20
  195. package/dist/{chunk-2FKU4ZEO.js → chunk-QDBKMEYY.js} +9 -9
  196. package/dist/{chunk-7UHZBVP3.js → chunk-QDVLVLXP.js} +97 -31
  197. package/dist/{chunk-PRDDPQLC.js → chunk-QLXEQRHD.js} +5 -5
  198. package/dist/{chunk-MUAWCFW6.js → chunk-QNPDXV5V.js} +5 -2
  199. package/dist/{chunk-LR5O2XWZ.js → chunk-QUZYLDNJ.js} +5 -5
  200. package/dist/chunk-RBQUXHYK.js +48 -0
  201. package/dist/{chunk-3SUPEE6H.js → chunk-RDMBSHGG.js} +3 -3
  202. package/dist/{chunk-I5XIW2BP.js → chunk-RGUM474V.js} +7 -7
  203. package/dist/{chunk-OAFENIHN.js → chunk-RJ67XAJU.js} +76 -28
  204. package/dist/{chunk-LFUBEHFW.js → chunk-RT57D7C4.js} +39 -1
  205. package/dist/{chunk-MKM6D7JM.js → chunk-RWG7DLOG.js} +42 -5
  206. package/dist/{chunk-P3UX5EH4.js → chunk-RWKAHHIX.js} +3 -3
  207. package/dist/{chunk-XEBKIWI7.js → chunk-RYNT3HB7.js} +12 -12
  208. package/dist/{chunk-EUGEFBGV.js → chunk-S2V272KJ.js} +3 -3
  209. package/dist/{chunk-W6BZ4UGA.js → chunk-SGYEM2PD.js} +1 -1
  210. package/dist/{chunk-VROK4X2L.js → chunk-SJP57MQM.js} +1 -1
  211. package/dist/{chunk-5MVKTNZP.js → chunk-SL4JWAMQ.js} +54 -4
  212. package/dist/{chunk-MOANZQXF.js → chunk-SLMKLEU6.js} +1 -1
  213. package/dist/{chunk-RZN2LEAK.js → chunk-SQA7XCYI.js} +3 -3
  214. package/dist/{chunk-4YNA3CM6.js → chunk-SSFS4NCH.js} +262 -56
  215. package/dist/{chunk-6FIC57PH.js → chunk-T4P2G3PO.js} +1 -1
  216. package/dist/{chunk-5U2IJBFV.js → chunk-TA3B4N24.js} +1 -1
  217. package/dist/{chunk-ZOTTYCP5.js → chunk-TEWWBVQP.js} +40 -4
  218. package/dist/{chunk-SDYWZRPN.js → chunk-TLSFGXXE.js} +1 -1
  219. package/dist/{chunk-L3VUW5M4.js → chunk-TQS2YHLB.js} +1 -1
  220. package/dist/{chunk-KXYKSLW4.js → chunk-TU4M757W.js} +399 -116
  221. package/dist/{chunk-MC4IM2CC.js → chunk-TYD4F4XU.js} +6 -6
  222. package/dist/{chunk-TKS5GMYA.js → chunk-U44Y7RC7.js} +2 -0
  223. package/dist/{chunk-B7AMNZTC.js → chunk-UKBPEEEQ.js} +2 -2
  224. package/dist/{chunk-ZBPZDADW.js → chunk-UWVXQEQQ.js} +467 -78
  225. package/dist/{chunk-P2VVMGMI.js → chunk-V4WH3FV7.js} +35 -16
  226. package/dist/{worktree-ownership-guard-O6JQF2CL.js → chunk-V6F4I2XY.js} +13 -14
  227. package/dist/{chunk-JFTUAV4J.js → chunk-VBKUESIW.js} +1 -1
  228. package/dist/{chunk-AZSTIAVL.js → chunk-VBPYYJPC.js} +1 -1
  229. package/dist/{chunk-LKTN22L6.js → chunk-VIP4LKLO.js} +57 -24
  230. package/dist/{chunk-L5CGXEZC.js → chunk-WAAGVFFN.js} +63 -71
  231. package/dist/{chunk-D3LXVAIQ.js → chunk-WC7AE3PT.js} +244 -103
  232. package/dist/{chunk-EOTZSAQL.js → chunk-WUCUDHKR.js} +1 -1
  233. package/dist/{chunk-VF3BZOZK.js → chunk-X7HZHKY4.js} +50 -3
  234. package/dist/{chunk-LFBLQE2P.js → chunk-XCAKYVKI.js} +1 -1
  235. package/dist/{chunk-UXN4BICC.js → chunk-XMX5J52Z.js} +1 -1
  236. package/dist/{chunk-6YDY6ZTD.js → chunk-XTCXGWTV.js} +9 -4
  237. package/dist/{chunk-XUZK23V7.js → chunk-XW2FW6LS.js} +2 -2
  238. package/dist/{chunk-CH7BUBP3.js → chunk-XWVHUDEK.js} +5 -4
  239. package/dist/{chunk-S26CV7BE.js → chunk-YA5LK6KB.js} +45 -8
  240. package/dist/{chunk-ELCRJGCH.js → chunk-YMRQIENV.js} +2 -2
  241. package/dist/{chunk-QNZ4562V.js → chunk-Z3LXWCB7.js} +1 -1
  242. package/dist/{chunk-EYMFVITZ.js → chunk-Z7I6NQMA.js} +2 -2
  243. package/dist/{chunk-6BJCDWSM.js → chunk-ZB4FS2EG.js} +1 -1
  244. package/dist/{chunk-ZAEUEDTN.js → chunk-ZD6FZ3WL.js} +1 -1
  245. package/dist/{chunk-FEU6QEEL.js → chunk-ZM6EZAVY.js} +1 -0
  246. package/dist/{chunk-2KY7WZZF.js → chunk-ZPA4R2UI.js} +1 -1
  247. package/dist/chunk-ZPPPHVSU.js +285 -0
  248. package/dist/{chunk-ELEGH4DX.js → chunk-ZUGQPYUY.js} +51 -4
  249. package/dist/{chunk-UX2EO653.js → chunk-ZZWFZ46U.js} +66 -8
  250. package/dist/{cleanup-graph-garbage-VQAJ2RBT.js → cleanup-graph-garbage-HFUD5ZQT.js} +12 -10
  251. package/dist/{cloud-sync-command-J7NEFUY7.js → cloud-sync-command-3JHJJKPN.js} +25 -3
  252. package/dist/{cloud-sync-db-init-KWEMNMGA.js → cloud-sync-db-init-2LHIQOSF.js} +1 -1
  253. package/dist/{cloud-sync-shutdown-P63AUTUI.js → cloud-sync-shutdown-ZXAXA3Z7.js} +6 -4
  254. package/dist/{cloud-sync-state-QF3TMMJ4.js → cloud-sync-state-VSQFGPP6.js} +1 -1
  255. package/dist/{co-activation-7IHRPBZN.js → co-activation-NX4EH4AP.js} +6 -4
  256. package/dist/{co-occurrence-R5AG4OAU.js → co-occurrence-5LBYCW3U.js} +10 -8
  257. package/dist/{consent-passphrase-5ZBDJ5G7.js → consent-passphrase-65W3DJIJ.js} +2 -2
  258. package/dist/{content-extractor-ZLXC6GNR.js → content-extractor-OGXETBOX.js} +2 -2
  259. package/dist/{conversation-entity-extractor-7FRKLLBD.js → conversation-entity-extractor-FQCOAH4F.js} +5 -4
  260. package/dist/conversations-retention-XTBFJBUM.js +166 -0
  261. package/dist/{crdt-sync-IFRZOEIS.js → crdt-sync-7TDUBTLH.js} +4 -4
  262. package/dist/{crm-webhook-L2S63ASV.js → crm-webhook-776JTY55.js} +2 -2
  263. package/dist/{cto-delegation-gate-3WU7OHX7.js → cto-delegation-gate-ZNUWVYCN.js} +25 -23
  264. package/dist/{daemon-orchestration-3VQYKLOR.js → daemon-orchestration-76BOFDEP.js} +30 -24
  265. package/dist/{doc-graph-extractor-YIR5E7OF.js → doc-graph-extractor-F724KZJX.js} +10 -8
  266. package/dist/{documents-QEHPTYIY.js → documents-Q24V4GRD.js} +13 -11
  267. package/dist/{dreaming-LNFE7DTN.js → dreaming-IY6NQTSP.js} +27 -25
  268. package/dist/{employee-boot-brief-ZTXDYNWM.js → employee-boot-brief-CCTXO5DQ.js} +35 -29
  269. package/dist/{entity-boost-R5N6JWXD.js → entity-boost-XGOB7HDM.js} +1 -1
  270. package/dist/{exe-drift-WYSJVZFO.js → exe-drift-NEPXLNGP.js} +7 -5
  271. package/dist/{exe-export-GOLNAEAV.js → exe-export-ZHJQFKR2.js} +14 -12
  272. package/dist/{exe-import-U4BSI6OH.js → exe-import-7SVNI4FW.js} +14 -12
  273. package/dist/{exe-key-V42G3NGO.js → exe-key-QJKU56WZ.js} +119 -108
  274. package/dist/{exe-org-U4GLQ6OP.js → exe-org-SJXHLV6K.js} +76 -51
  275. package/dist/{exe-snapshot-U7ONBYNY.js → exe-snapshot-EFWPXTXE.js} +45 -36
  276. package/dist/{fast-db-init-W3NGKAEU.js → fast-db-init-BQZOQNT3.js} +1 -1
  277. package/dist/{founder-context-ZSIBRVDM.js → founder-context-KG2ZAOXY.js} +2 -2
  278. package/dist/{founder-monitor-envelope-L3IWZLFY.js → founder-monitor-envelope-NYB5LLU4.js} +4 -4
  279. package/dist/gateway/index.js +20 -18
  280. package/dist/{gateway-client-DJFCVIPT.js → gateway-client-ODMUXUL3.js} +1 -1
  281. package/dist/{git-staleness-OF24QXFZ.js → git-staleness-OPGEAJA7.js} +6 -4
  282. package/dist/{global-procedures-WSIOWO43.js → global-procedures-3KXY4LL6.js} +8 -6
  283. package/dist/{graph-auto-extract-IEVVN3L3.js → graph-auto-extract-I7H2F5NJ.js} +10 -8
  284. package/dist/{graph-query-JDZWAVCU.js → graph-query-E7JBSNY5.js} +1 -1
  285. package/dist/{graph-rag-BKAD2XQA.js → graph-rag-H24CMFP2.js} +5 -4
  286. package/dist/{hook-integrity-TPWDGX2M.js → hook-integrity-PGQ3OX4S.js} +1 -1
  287. package/dist/{hook-prefetch-FD6VGJJA.js → hook-prefetch-7AZJER6Z.js} +23 -21
  288. package/dist/hook-registration-liveness-NGQRFKAA.js +11 -0
  289. package/dist/hooks/bug-report-worker.js +26 -24
  290. package/dist/hooks/codex-stop-task-finalizer.js +28 -26
  291. package/dist/hooks/commit-complete.js +26 -24
  292. package/dist/hooks/error-recall.js +16 -14
  293. package/dist/hooks/exe-heartbeat-hook.js +9 -7
  294. package/dist/hooks/ingest-worker.js +12 -10
  295. package/dist/hooks/ingest.js +22 -17
  296. package/dist/hooks/instructions-loaded.js +11 -9
  297. package/dist/hooks/manifest.json +20 -20
  298. package/dist/hooks/notification.js +10 -8
  299. package/dist/hooks/post-compact.js +9 -7
  300. package/dist/hooks/post-tool-combined.js +14 -14
  301. package/dist/hooks/pre-compact.js +26 -24
  302. package/dist/hooks/pre-tool-use.js +2 -2
  303. package/dist/hooks/prompt-submit.js +47 -41
  304. package/dist/hooks/session-end.js +38 -42
  305. package/dist/hooks/session-start.js +26 -18
  306. package/dist/hooks/stop.js +29 -27
  307. package/dist/hooks/subagent-stop.js +29 -27
  308. package/dist/hooks/summary-worker.js +32 -30
  309. package/dist/index.js +37 -35
  310. package/dist/{installer-OTI5SA43.js → installer-2ZS3LHCU.js} +12 -9
  311. package/dist/{installer-NMOBSEZ2.js → installer-NH3A3HWC.js} +14 -9
  312. package/dist/{installer-SRJGE4GU.js → installer-UJ73PGRD.js} +21 -9
  313. package/dist/{intercom-queue-4FFXCBHO.js → intercom-queue-OE25GJF2.js} +21 -19
  314. package/dist/lib/agent-config.js +2 -2
  315. package/dist/lib/cloud-sync.js +24 -18
  316. package/dist/lib/consolidation.js +13 -11
  317. package/dist/lib/crypto.js +3 -3
  318. package/dist/lib/database.js +6 -4
  319. package/dist/lib/db-backup.js +1 -1
  320. package/dist/lib/db-write-worker-client.js +3 -1
  321. package/dist/lib/db-write-worker.js +65 -89
  322. package/dist/lib/db.js +6 -4
  323. package/dist/lib/delivery-truth.js +5 -1
  324. package/dist/lib/device-registry.js +1 -1
  325. package/dist/lib/embedder.js +2 -2
  326. package/dist/lib/employee-templates.js +9 -7
  327. package/dist/lib/employees.js +6 -4
  328. package/dist/lib/exe-daemon.js +425 -314
  329. package/dist/lib/file-grep.js +15 -21
  330. package/dist/lib/hybrid-search.js +19 -13
  331. package/dist/lib/identity-templates.js +1 -1
  332. package/dist/lib/identity.js +6 -4
  333. package/dist/lib/keychain.js +1 -1
  334. package/dist/lib/license.js +22 -6
  335. package/dist/lib/messaging.js +22 -20
  336. package/dist/lib/post-tool-memory.js +10 -8
  337. package/dist/lib/registry-proxy.js +1 -1
  338. package/dist/lib/reminders.js +7 -5
  339. package/dist/lib/runtime-table.js +1 -1
  340. package/dist/lib/schedules.js +12 -10
  341. package/dist/lib/session-registry.js +8 -6
  342. package/dist/lib/skill-learning.js +13 -11
  343. package/dist/lib/status-brief.js +2 -2
  344. package/dist/lib/store.js +17 -9
  345. package/dist/lib/task-router.js +7 -5
  346. package/dist/lib/tasks.js +23 -21
  347. package/dist/lib/tmux-routing.js +21 -19
  348. package/dist/lib/tmux-status.js +4 -1
  349. package/dist/lib/token-spend.js +7 -5
  350. package/dist/lib/ws-client.js +1 -1
  351. package/dist/{license-gate-R4JWTWM4.js → license-gate-XQ2KN5I5.js} +3 -3
  352. package/dist/{license-recheck-3MBJ4IJX.js → license-recheck-IIBKR2V5.js} +1 -1
  353. package/dist/{license-sync-BVSG3WMW.js → license-sync-76JVI2M5.js} +151 -8
  354. package/dist/{local-secret-inventory-JWNBHZZ4.js → local-secret-inventory-MJT7NJLY.js} +2 -2
  355. package/dist/{mailbox-inbox-MTAT4MXX.js → mailbox-inbox-BPZP4GIZ.js} +1 -1
  356. package/dist/maintenance-worker-54VZTFIK.js +371 -0
  357. package/dist/mcp/register-tools.js +110 -107
  358. package/dist/mcp/server.js +113 -110
  359. package/dist/mcp/tools/complete-reminder.js +8 -6
  360. package/dist/mcp/tools/create-reminder.js +8 -6
  361. package/dist/mcp/tools/create-task.js +26 -24
  362. package/dist/mcp/tools/deactivate-behavior.js +15 -13
  363. package/dist/mcp/tools/list-reminders.js +8 -6
  364. package/dist/mcp/tools/list-tasks.js +26 -24
  365. package/dist/mcp/tools/send-message.js +25 -23
  366. package/dist/mcp/tools/update-task.js +24 -22
  367. package/dist/{mcp-child-registry-TIZERM7O.js → mcp-child-registry-5VUG5ATZ.js} +1 -1
  368. package/dist/{mcp-http-config-VUMSFWFH.js → mcp-http-config-SKXESWHA.js} +9 -7
  369. package/dist/{mcp-session-identity-DZHWEJRV.js → mcp-session-identity-HYMLJXXA.js} +21 -19
  370. package/dist/{memory-cards-JVXTMSAT.js → memory-cards-PAZDUQ3B.js} +16 -32
  371. package/dist/{memory-graph-extractor-PPBJMYFJ.js → memory-graph-extractor-BC6QKBY6.js} +11 -9
  372. package/dist/{memory-poisoning-defense-K5Q74XQ4.js → memory-poisoning-defense-BRGIHF6J.js} +9 -7
  373. package/dist/{memory-pressure-watchdog-YMJH5CSA.js → memory-pressure-watchdog-HR6TPOMT.js} +22 -20
  374. package/dist/{memory-reflection-7BZWIHRE.js → memory-reflection-LO7VFBL3.js} +38 -59
  375. package/dist/memory-write-repository-J25USX63.js +16 -0
  376. package/dist/{monitor-grants-Q7X3MYQP.js → monitor-grants-YQTO6NWR.js} +3 -3
  377. package/dist/{monitor-identity-ZQB4IXEE.js → monitor-identity-POVTG76Y.js} +2 -2
  378. package/dist/{notification-ledger-XRAXL5OI.js → notification-ledger-KLD6GZTG.js} +22 -20
  379. package/dist/{notifications-JE3PX55X.js → notifications-3R6HNHDR.js} +21 -19
  380. package/dist/{orchestration-events-JCQ5F5IJ.js → orchestration-events-CHY3GOJD.js} +7 -5
  381. package/dist/{orchestrator-X65INDTR.js → orchestrator-GAL3HOAD.js} +23 -21
  382. package/dist/{org-brief-session-3PQ22UIX.js → org-brief-session-LQ2DBYVF.js} +17 -15
  383. package/dist/{org-consent-policy-VGELJ7K7.js → org-consent-policy-KFUP7QPG.js} +5 -5
  384. package/dist/{org-join-6TO5ZYUZ.js → org-join-MXZCIQWX.js} +8 -8
  385. package/dist/{org-key-admin-XHYVRRAZ.js → org-key-admin-4UK6QUT7.js} +9 -9
  386. package/dist/{org-key-pin-TTTYGTQL.js → org-key-pin-ZOX4OM3O.js} +3 -3
  387. package/dist/{org-membership-Y7T2BS57.js → org-membership-D5TPN45F.js} +4 -4
  388. package/dist/{org-partner-config-OP4NEUNF.js → org-partner-config-3FXSYPQA.js} +7 -7
  389. package/dist/{org-partner-runtime-YNVUNT2R.js → org-partner-runtime-TH3LMPII.js} +20 -16
  390. package/dist/{org-row-visibility-JBBXNYXD.js → org-row-visibility-Y5R33C5U.js} +1 -1
  391. package/dist/{pipeline-router-EIBB7QNG.js → pipeline-router-E2JZLDK6.js} +7 -5
  392. package/dist/{plan-limits-MEWXYLEN.js → plan-limits-NYI6R4IK.js} +9 -7
  393. package/dist/{platform-procedures-Z7ZGBJWN.js → platform-procedures-RTD5E3BD.js} +5 -3
  394. package/dist/{pre-tool-use-impl-C6KJY22W.js → pre-tool-use-impl-LT4FRXBP.js} +127 -83
  395. package/dist/{project-boot-VEYFCCSL.js → project-boot-LIMXQKAF.js} +25 -17
  396. package/dist/{project-name-UYORSNGE.js → project-name-V62GWALX.js} +7 -5
  397. package/dist/{projection-worker-WYFDWS57.js → projection-worker-KLE3IZQ2.js} +5 -2
  398. package/dist/{prospective-memory-E6XBQFJA.js → prospective-memory-HRN7JFT2.js} +6 -4
  399. package/dist/{push-notifications-M7YU63FY.js → push-notifications-XC6EQEXF.js} +22 -20
  400. package/dist/{reproject-worktree-memories-B5XMGJSD.js → reproject-worktree-memories-4CAVZSFE.js} +21 -19
  401. package/dist/{reranker-SRA4BR7N.js → reranker-2RU6IIX2.js} +1 -1
  402. package/dist/{retrieval-health-P2JPZUPV.js → retrieval-health-4Q5TOV2S.js} +1 -1
  403. package/dist/{review-polling-KQPN7IQE.js → review-polling-WOWIMBCL.js} +22 -20
  404. package/dist/runtime/index.js +30 -28
  405. package/dist/{session-events-6LDDKKY3.js → session-events-OPMS2C5F.js} +22 -20
  406. package/dist/{session-kill-telemetry-5DSRGWCL.js → session-kill-telemetry-3GWATSIX.js} +22 -20
  407. package/dist/{session-scope-XG5R3P3D.js → session-scope-TIRGR4MH.js} +21 -19
  408. package/dist/{setup-wizard-7QFLZIKT.js → setup-wizard-B2JBVGNH.js} +3 -3
  409. package/dist/{shard-manager-HHHHV2KZ.js → shard-manager-C7LYX6E4.js} +5 -1
  410. package/dist/{skill-refinement-I5RMAHSC.js → skill-refinement-FWQFYNBI.js} +7 -5
  411. package/dist/skill-retrieval-PPLFC5RY.js +166 -0
  412. package/dist/skill-usage-NDB67PU2.js +25 -0
  413. package/dist/{stack-generate-manifest-AKMZ3AUX.js → stack-generate-manifest-AXI55MEQ.js} +6 -6
  414. package/dist/{stack-promote-34CE2HHF.js → stack-promote-6N23OGZY.js} +6 -6
  415. package/dist/stack-release-2CXFYVWM.js +2770 -0
  416. package/dist/{stack-update-ZQQ5YYPJ.js → stack-update-U53FBVCQ.js} +13 -5
  417. package/dist/{steward-gate-AQJ6KT2C.js → steward-gate-TUA3QCN7.js} +7 -5
  418. package/dist/{subagent-brief-injection-3GU7YAWY.js → subagent-brief-injection-N52RWYFZ.js} +34 -32
  419. package/dist/{subagent-spawn-ledger-52I66CLW.js → subagent-spawn-ledger-OI23OT4I.js} +1 -1
  420. package/dist/support-bug-actions-XWCJI6S5.js +30 -0
  421. package/dist/support-inbox-MMVTCXRX.js +77 -0
  422. package/dist/{support-outbox-KNI3FR3G.js → support-outbox-2TG2UV6J.js} +2 -2
  423. package/dist/{task-enforcement-CAA6D2MH.js → task-enforcement-JDMBAAOY.js} +22 -20
  424. package/dist/{task-request-inbox-QBZVU66E.js → task-request-inbox-PKJCYKJV.js} +9 -5
  425. package/dist/{task-scope-NHXB4ZRN.js → task-scope-32HQEV6W.js} +27 -19
  426. package/dist/{tasks-crud-JHSWL5NM.js → tasks-crud-CYKUKS3F.js} +21 -19
  427. package/dist/{tasks-notify-7PBE4U7T.js → tasks-notify-YND5MKWJ.js} +22 -20
  428. package/dist/{tasks-review-PPPVEE62.js → tasks-review-CG2A5GM3.js} +23 -19
  429. package/dist/{telemetry-upload-YU2VRNHX.js → telemetry-upload-WLUMEFAB.js} +11 -9
  430. package/dist/{token-budget-QCMWKG3K.js → token-budget-3YHAY5LL.js} +7 -5
  431. package/dist/{tool-capability-index-7AWQAJRP.js → tool-capability-index-2ADOWH43.js} +2 -2
  432. package/dist/{tool-gates-5Q3RSQEG.js → tool-gates-7ENOOYMR.js} +5 -3
  433. package/dist/{tool-gates-QD26D2NE.js → tool-gates-EKJTLVGN.js} +1 -1
  434. package/dist/{tool-telemetry-LTOIC64I.js → tool-telemetry-VUP7S6HC.js} +1 -1
  435. package/dist/tui/App.js +59 -35
  436. package/dist/{tui-data-NDBXD6U7.js → tui-data-BOQTOW2G.js} +25 -23
  437. package/dist/{update-support-BMJM4NG7.js → update-support-WT3S3AQ4.js} +21 -21
  438. package/dist/{whatsapp-QQLDAHUX.js → whatsapp-OZGIF2EM.js} +2 -2
  439. package/dist/{wiki-acl-W6WDCVCP.js → wiki-acl-LTEQJVDA.js} +1 -1
  440. package/dist/{work-claims-6DM32MGO.js → work-claims-CMV2GWIW.js} +8 -6
  441. package/dist/{work-state-heartbeat-HG7D4AWJ.js → work-state-heartbeat-S45TXK4M.js} +1 -1
  442. package/dist/{worker-gate-FTMW7GBB.js → worker-gate-7Z6NMM3G.js} +1 -1
  443. package/dist/{workflow-engine-ZWC6CCXE.js → workflow-engine-ZSQDXZQ7.js} +2 -2
  444. package/dist/{worktree-EMQCPGFE.js → worktree-NMWDVT6N.js} +8 -6
  445. package/dist/worktree-ownership-guard-ZVIWJAOP.js +35 -0
  446. package/dist/{worktree-sweep-XVUJZBXV.js → worktree-sweep-Q62ZIT3U.js} +9 -7
  447. package/package.json +14 -8
  448. package/release-notes.json +7 -41
  449. package/src/commands/exe/afk.md +6 -0
  450. package/src/commands/exe/call.md +6 -0
  451. package/src/commands/exe/employee-heartbeat.md +6 -0
  452. package/src/commands/exe/intercom.md +6 -0
  453. package/src/commands/exe/kill.md +6 -0
  454. package/src/commands/exe/launch.md +6 -0
  455. package/src/commands/exe/logs.md +1 -1
  456. package/src/commands/exe/sessions.md +6 -0
  457. package/src/commands/exe/setup.md +7 -3
  458. package/src/commands/exe/status.md +6 -0
  459. package/src/commands/exe-reference.md +25 -36
  460. package/src/commands/exe.md +19 -28
  461. package/stack.release.json +11 -11
  462. package/dist/chunk-3B6FLNLV.js +0 -30
  463. package/dist/chunk-FXU7JOXK.js +0 -6
  464. package/dist/chunk-QFAFKEB5.js +0 -820
  465. package/dist/conversations-retention-C4BLKFEL.js +0 -54
  466. package/dist/stack-release-5PGWV5D4.js +0 -1607
  467. package/dist/support-inbox-NY5TB3FN.js +0 -51
  468. /package/dist/{chunk-U2D6PJ5T.js → chunk-65G7ZTGE.js} +0 -0
  469. /package/dist/{chunk-DN3ZR3UE.js → chunk-CP7Z35MJ.js} +0 -0
  470. /package/dist/{chunk-XDVOGDBC.js → chunk-KBBWALJV.js} +0 -0
  471. /package/dist/{chunk-JRIH6I7D.js → chunk-LZXYPTY4.js} +0 -0
  472. /package/dist/{chunk-GIRD7O5X.js → chunk-MCWEW2SG.js} +0 -0
  473. /package/dist/{chunk-TKAU7IJ2.js → chunk-MQHUJLCA.js} +0 -0
  474. /package/dist/{chunk-M4XY4JRK.js → chunk-O53LTOXK.js} +0 -0
  475. /package/dist/{chunk-DZN7SDY2.js → chunk-OSVTH3SG.js} +0 -0
  476. /package/dist/{chunk-AJK2PVQW.js → chunk-QXXEXGX3.js} +0 -0
  477. /package/dist/{chunk-AWWDKF22.js → chunk-SFWNTO2F.js} +0 -0
  478. /package/dist/{chunk-2Q2CD6CD.js → chunk-WC5HF2FN.js} +0 -0
  479. /package/dist/{core-memory-O6D5UC3T.js → core-memory-MMMW3TF3.js} +0 -0
  480. /package/dist/{memory-isolation-EBFFC6HF.js → memory-isolation-67ACKQ2M.js} +0 -0
  481. /package/dist/{oauth-server-ZKBUHDFI.js → oauth-server-OILIKR7D.js} +0 -0
@@ -1,3 +1,6 @@
1
+ import {
2
+ isInertAssignment
3
+ } from "./chunk-V6F4I2XY.js";
1
4
  import {
2
5
  MAIN_GUARD_OVERRIDE_ENV,
3
6
  MAIN_GUARD_OVERRIDE_TOKEN,
@@ -1613,78 +1616,237 @@ var LEDGER_READ_ONLY_PROGRAMS = /* @__PURE__ */ new Set([
1613
1616
  var TRUSTED_SYSTEM_BIN_DIRS = /* @__PURE__ */ new Set(["/bin", "/usr/bin", "/sbin", "/usr/sbin"]);
1614
1617
  function isTrustedAbsoluteProgramPath(tok, cwd) {
1615
1618
  if (!tok.includes("/")) return true;
1616
- let real;
1619
+ const real = realResolve(cwd, tok);
1620
+ if (real === null) return false;
1621
+ return TRUSTED_SYSTEM_BIN_DIRS.has(path2.dirname(real));
1622
+ }
1623
+ function realResolve(cwd, p) {
1624
+ let cur;
1617
1625
  try {
1618
- real = fs.realpathSync(path2.resolve(cwd, tok));
1626
+ cur = path2.isAbsolute(p) ? path2.parse(path2.resolve(p)).root : realDir(path2.resolve(cwd));
1619
1627
  } catch {
1620
- return false;
1628
+ return null;
1629
+ }
1630
+ for (const seg of p.split(/[\\/]+/)) {
1631
+ if (seg === "" || seg === ".") continue;
1632
+ if (seg === "..") {
1633
+ cur = path2.dirname(cur);
1634
+ continue;
1635
+ }
1636
+ cur = realDir(path2.join(cur, seg));
1637
+ }
1638
+ return cur;
1639
+ }
1640
+ function realDir(dir) {
1641
+ try {
1642
+ return fs.realpathSync.native(dir);
1643
+ } catch {
1644
+ return dir;
1621
1645
  }
1622
- return TRUSTED_SYSTEM_BIN_DIRS.has(path2.dirname(real));
1623
1646
  }
1624
1647
  function splitShellSegments2(command) {
1625
1648
  return command.split(/\|\||&&|[|;\n&]/).map((seg) => seg.trim()).filter((seg) => seg.length > 0);
1626
1649
  }
1627
1650
  function segmentProgram(segment, cwd) {
1628
- let pathOverridden = false;
1629
1651
  for (const tok of tokenizeShell(segment).tokens) {
1630
1652
  if (/^[A-Za-z_][A-Za-z0-9_]*=/.test(tok)) {
1631
- if (/^PATH=/.test(tok)) pathOverridden = true;
1653
+ if (!isInertAssignment(tok)) return "";
1632
1654
  continue;
1633
1655
  }
1634
- if (pathOverridden) return "";
1635
1656
  if (!isTrustedAbsoluteProgramPath(tok, cwd)) return "";
1636
1657
  return path2.basename(tok);
1637
1658
  }
1638
1659
  return "";
1639
1660
  }
1640
- var LEDGER_RESOLVABLE_ENV_VARS = ["HOME", "EXE_GATEWAY_LEDGER_DIR", "EXE_OS_DIR"];
1641
- function hasUnresolvedShellExpansion(token) {
1642
- const known = LEDGER_RESOLVABLE_ENV_VARS.join("|");
1643
- return new RegExp("\\$\\(|\\$\\{(?!(?:" + known + ")\\})|\\$(?!(?:" + known + ")\\b)[A-Za-z_]|`").test(token);
1644
- }
1645
- function expandKnownEnvReferences(token, homeDir, env) {
1661
+ var UNRESOLVABLE_EXPANSION = /\$\(|`|\$\{(?![A-Za-z_][A-Za-z0-9_]*\})|\$(?![A-Za-z_])/;
1662
+ function expandEnvReferences(token, homeDir, env) {
1646
1663
  const home = env.HOME ?? homeDir;
1647
- const values = {
1648
- HOME: home,
1649
- EXE_GATEWAY_LEDGER_DIR: env.EXE_GATEWAY_LEDGER_DIR,
1650
- // Mirrors resolveLedgerPath()'s own fallback chain exactly (ledger.ts).
1651
- EXE_OS_DIR: env.EXE_OS_DIR ?? path2.join(home, ".exe-os")
1664
+ const lookup = (name) => {
1665
+ if (name === "HOME") return home;
1666
+ if (name === "EXE_OS_DIR") return env.EXE_OS_DIR ?? path2.join(home, ".exe-os");
1667
+ return env[name] ?? "";
1652
1668
  };
1653
- let out = token;
1654
- for (const name of LEDGER_RESOLVABLE_ENV_VARS) {
1655
- const value = values[name];
1656
- if (value === void 0) continue;
1657
- out = out.replace(new RegExp(`\\$\\{${name}\\}`, "g"), value).replace(new RegExp(`\\$${name}\\b`, "g"), value);
1658
- }
1669
+ let out = token.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (_m, name) => lookup(name)).replace(/\$([A-Za-z_][A-Za-z0-9_]*)/g, (_m, name) => lookup(name));
1659
1670
  if (out === "~" || out.startsWith("~/")) out = home + out.slice(1);
1660
1671
  return out;
1661
1672
  }
1662
- function commandMutatesLedger(command, ledgerPath, homeDir, cwd, env) {
1663
- const resolvedLedger = path2.resolve(ledgerPath);
1664
- const ledgerDir = path2.dirname(resolvedLedger);
1665
- const base = path2.basename(resolvedLedger);
1666
- const mentionsLedgerPath = (text) => text.includes(ledgerPath) || text.includes(base) || text.includes(ledgerDir);
1667
- const segmentNamesLedger = (text) => {
1668
- if (mentionsLedgerPath(text)) return true;
1669
- if (mentionsLedgerPath(expandKnownEnvReferences(text, homeDir, env))) return true;
1670
- return tokenizeShell(text).tokens.some((tok) => {
1671
- const stripped = tok.replace(/\/+\*+\/?$/, "");
1672
- const expanded = expandKnownEnvReferences(stripped, homeDir, env);
1673
- if (hasUnresolvedShellExpansion(expanded)) return false;
1674
- const resolved = path2.resolve(cwd, expanded);
1675
- return resolved === resolvedLedger || resolved === ledgerDir || resolved.startsWith(ledgerDir + path2.sep);
1676
- });
1673
+ function isUnverifiablePathToken(expanded) {
1674
+ if (!UNRESOLVABLE_EXPANSION.test(expanded)) return false;
1675
+ const residue = expanded.replace(/\$\([^)]*\)/g, "").replace(/`[^`]*`/g, "").replace(/\$\{[^}]*\}/g, "").replace(/\$[^A-Za-z_\s]/g, "");
1676
+ return residue.includes("/") || residue.includes("~");
1677
+ }
1678
+ function inAuditDir(resolved, auditDir, ledgerFile) {
1679
+ return resolved === ledgerFile || resolved === auditDir || resolved.startsWith(auditDir + path2.sep);
1680
+ }
1681
+ function globComponentPattern(component) {
1682
+ let pattern = "";
1683
+ for (let i = 0; i < component.length; i++) {
1684
+ const char = component[i];
1685
+ if (char === "*") pattern += ".*";
1686
+ else if (char === "?") pattern += ".";
1687
+ else if (char === "[") {
1688
+ let start = i + 1;
1689
+ const negated = component[start] === "!" || component[start] === "^";
1690
+ if (negated) start++;
1691
+ const end = component.indexOf("]", component[start] === "]" ? start + 1 : start);
1692
+ if (end < 0) throw new Error("Unverified glob character class");
1693
+ const chars = component.slice(start, end);
1694
+ if (chars.includes("[") || chars.includes("\\")) throw new Error("Unverified glob character class");
1695
+ pattern += `[${negated ? "^" : ""}${chars.replace(/[\]^]/g, "\\$&")}]`;
1696
+ i = end;
1697
+ } else pattern += char.replace(/[.+^${}()|\\\]]/g, "\\$&");
1698
+ }
1699
+ return new RegExp(`^${pattern}$`, "s");
1700
+ }
1701
+ function globDirectoryEntries(directory) {
1702
+ try {
1703
+ return fs.readdirSync(directory);
1704
+ } catch (error) {
1705
+ const code = error.code;
1706
+ if (code === "ENOENT" || code === "ENOTDIR") return [];
1707
+ throw error;
1708
+ }
1709
+ }
1710
+ function globAuditVerdict(expanded, cwd, auditDir, ledgerFile) {
1711
+ let directories = [path2.isAbsolute(expanded) ? path2.parse(expanded).root : cwd];
1712
+ let visited = 0;
1713
+ const resolve = (directory, name) => {
1714
+ if (++visited > 1e4) throw new Error("Unverified glob: traversal limit exceeded");
1715
+ const resolved = realResolve(directory, name);
1716
+ if (resolved === null) throw new Error("Unverified glob path");
1717
+ return resolved;
1677
1718
  };
1678
- const namesLedgerLiterally = command.includes(ledgerPath) || command.includes(base) || command.includes(ledgerDir);
1679
- const namesLedgerResolved = segmentNamesLedger(command);
1680
- if (!namesLedgerLiterally && !namesLedgerResolved) return false;
1681
- const segments = splitShellSegments2(command);
1682
- const namingSegments = segments.filter((seg) => segmentNamesLedger(seg));
1683
- if (namingSegments.length === 0) return true;
1684
- return namingSegments.some((seg) => {
1685
- if (/[<>]/.test(seg)) return true;
1686
- return !LEDGER_READ_ONLY_PROGRAMS.has(segmentProgram(seg, cwd));
1719
+ try {
1720
+ for (const component of expanded.split("/")) {
1721
+ if (!component) continue;
1722
+ const next = /* @__PURE__ */ new Set();
1723
+ if (component === "**") {
1724
+ const pending = [...directories];
1725
+ while (pending.length > 0) {
1726
+ const directory = resolve(pending.pop(), ".");
1727
+ if (inAuditDir(directory, auditDir, ledgerFile)) return "yes";
1728
+ if (next.has(directory)) continue;
1729
+ next.add(directory);
1730
+ for (const name of globDirectoryEntries(directory)) pending.push(resolve(directory, name));
1731
+ }
1732
+ directories = [...next];
1733
+ continue;
1734
+ }
1735
+ const pattern = /[*?\[]/.test(component) ? globComponentPattern(component) : null;
1736
+ for (const directory of directories) {
1737
+ const matches = pattern ? globDirectoryEntries(directory).filter((name) => pattern.test(name)) : [component];
1738
+ for (const match of matches) {
1739
+ const resolved = resolve(directory, match);
1740
+ if (inAuditDir(resolved, auditDir, ledgerFile)) return "yes";
1741
+ next.add(resolved);
1742
+ }
1743
+ }
1744
+ directories = [...next];
1745
+ }
1746
+ return "no";
1747
+ } catch {
1748
+ return "unverified";
1749
+ }
1750
+ }
1751
+ function segmentAuditVerdict(text, auditDir, ledgerFile, rawLedgerPath, rawAuditDir, homeDir, cwd, env) {
1752
+ const mentions = (s) => s.includes(rawLedgerPath) || s.includes(rawAuditDir);
1753
+ if (mentions(text) || mentions(expandEnvReferences(text, homeDir, env))) return "yes";
1754
+ let unverified = false;
1755
+ for (const frag of text.split(/\s+/)) {
1756
+ if (isUnverifiablePathToken(expandEnvReferences(frag, homeDir, env))) unverified = true;
1757
+ }
1758
+ for (const tok of tokenizeShell(text).tokens) {
1759
+ const stripped = tok.replace(/\/+\*+\/?$/, "");
1760
+ const expanded = expandEnvReferences(stripped, homeDir, env);
1761
+ if (isUnverifiablePathToken(expanded)) {
1762
+ unverified = true;
1763
+ continue;
1764
+ }
1765
+ if (UNRESOLVABLE_EXPANSION.test(expanded)) continue;
1766
+ if (/[*?\[]/.test(expanded)) {
1767
+ const verdict = globAuditVerdict(expanded, cwd, auditDir, ledgerFile);
1768
+ if (verdict === "yes") return "yes";
1769
+ if (verdict === "unverified") unverified = true;
1770
+ continue;
1771
+ }
1772
+ const resolved = realResolve(cwd, expanded);
1773
+ if (resolved === null) {
1774
+ unverified = true;
1775
+ continue;
1776
+ }
1777
+ if (inAuditDir(resolved, auditDir, ledgerFile)) return "yes";
1778
+ }
1779
+ for (const call of text.matchAll(/\.join\s*\(\s*((?:(?:"[^"\\]*"|'[^'\\]*')\s*,?\s*)+)\)/g)) {
1780
+ const fragments = [...call[1].matchAll(/"([^"]*)"|'([^']*)'/g)].map((match) => expandEnvReferences(match[1] ?? match[2], homeDir, env));
1781
+ if (fragments.some((fragment) => UNRESOLVABLE_EXPANSION.test(fragment))) {
1782
+ unverified = true;
1783
+ continue;
1784
+ }
1785
+ let lastAbsolute = 0;
1786
+ fragments.forEach((fragment, index) => {
1787
+ if (path2.isAbsolute(fragment)) lastAbsolute = index;
1788
+ });
1789
+ for (const joined of [path2.join(...fragments), fragments.slice(lastAbsolute).join("/")]) {
1790
+ const resolved = realResolve(cwd, joined);
1791
+ if (resolved === null) unverified = true;
1792
+ else if (inAuditDir(resolved, auditDir, ledgerFile)) return "yes";
1793
+ }
1794
+ }
1795
+ for (const frag of text.match(/[A-Za-z0-9_.~${}\/-]+/g) ?? []) {
1796
+ if (!frag.includes("/")) continue;
1797
+ const expanded = expandEnvReferences(frag.replace(/\/+\*+\/?$/, ""), homeDir, env);
1798
+ if (UNRESOLVABLE_EXPANSION.test(expanded)) continue;
1799
+ const resolved = realResolve(cwd, expanded);
1800
+ if (resolved !== null && inAuditDir(resolved, auditDir, ledgerFile)) return "yes";
1801
+ }
1802
+ return unverified ? "unverified" : "no";
1803
+ }
1804
+ function commandMutatesLedger(command, ledgerPath, homeDir, cwd, env, depth = 0) {
1805
+ const rawLedgerPath = path2.resolve(ledgerPath);
1806
+ const rawAuditDir = path2.dirname(rawLedgerPath);
1807
+ const auditDir = realResolve(cwd, rawAuditDir) ?? rawAuditDir;
1808
+ const ledgerFile = realResolve(cwd, rawLedgerPath) ?? rawLedgerPath;
1809
+ const verdictOf = (text, directory = cwd) => segmentAuditVerdict(text, auditDir, ledgerFile, rawLedgerPath, rawAuditDir, homeDir, directory, env);
1810
+ if (depth > 8) return true;
1811
+ const segments = splitShellSegments(command).flatMap((segment) => {
1812
+ const tokens = tokenizeShell(segment).tokens;
1813
+ return tokens.some((_token, index) => shellDashCScriptIndex(tokens, index) >= 0) ? [segment] : splitShellSegments2(segment);
1687
1814
  });
1815
+ if (segments.length === 0) return verdictOf(command) !== "no";
1816
+ let accountedFor = false;
1817
+ const directories = /* @__PURE__ */ new Set([cwd]);
1818
+ let unknownDirectory = false;
1819
+ for (const seg of segments) {
1820
+ const tokens = tokenizeShell(seg).tokens;
1821
+ for (let index = 0; index < tokens.length; index++) {
1822
+ const scriptIndex = shellDashCScriptIndex(tokens, index);
1823
+ if (scriptIndex < 0) continue;
1824
+ if (unknownDirectory || [...directories].some((directory) => commandMutatesLedger(tokens[scriptIndex], ledgerPath, homeDir, directory, env, depth + 1))) return true;
1825
+ }
1826
+ const changesDirectory = ["cd", "pushd", "popd"].includes(tokens[0] ?? "");
1827
+ if (changesDirectory && /\$\(|`/.test(seg)) return true;
1828
+ if (changesDirectory && !/[<>]/.test(seg)) {
1829
+ accountedFor ||= [...directories].some((directory) => verdictOf(seg, directory) !== "no");
1830
+ const target = expandEnvReferences(tokens[1] ?? "~", homeDir, env);
1831
+ if (tokens[0] !== "cd" || tokens.length > 2 || target.startsWith("-") || UNRESOLVABLE_EXPANSION.test(target) || /[*?\[]/.test(target)) {
1832
+ unknownDirectory = true;
1833
+ } else {
1834
+ for (const directory of [...directories]) {
1835
+ const resolved = realResolve(directory, target);
1836
+ if (resolved === null) unknownDirectory = true;
1837
+ else directories.add(resolved);
1838
+ }
1839
+ }
1840
+ continue;
1841
+ }
1842
+ const verdicts = [...directories].map((directory) => verdictOf(seg, directory));
1843
+ const verdict = verdicts.includes("yes") ? "yes" : unknownDirectory || verdicts.includes("unverified") ? "unverified" : "no";
1844
+ if (verdict === "no") continue;
1845
+ accountedFor = true;
1846
+ if (!/[<>]/.test(seg) && [...directories].every((directory) => LEDGER_READ_ONLY_PROGRAMS.has(segmentProgram(seg, directory)))) continue;
1847
+ return true;
1848
+ }
1849
+ return !accountedFor && verdictOf(command) === "yes";
1688
1850
  }
1689
1851
  var ACTION_POLICY = [
1690
1852
  {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  processCRMEvent
3
- } from "./chunk-P2VVMGMI.js";
3
+ } from "./chunk-V4WH3FV7.js";
4
4
 
5
5
  // src/gateway/adapters/crm-webhook.ts
6
6
  function parseTwentyWebhook(payload) {
@@ -466,7 +466,7 @@ async function createBackupAsync(reason = "manual", opts = {}) {
466
466
  let artifactState = "not-checked";
467
467
  let artifactDetail = "artifact read-back did not run";
468
468
  try {
469
- const { manifestWriteEnabled, readBackBackupArtifact, manifestPathFor } = await import("./backup-verify-6DVBQMDP.js");
469
+ const { manifestWriteEnabled, readBackBackupArtifact, manifestPathFor } = await import("./backup-verify-TUQEICWA.js");
470
470
  if (manifestWriteEnabled()) {
471
471
  const readback = await readBackBackupArtifact(backupPath, dbName, { keyHex: encryptionKey });
472
472
  artifactState = readback.artifact;
@@ -694,7 +694,7 @@ function recordMissedBackup(entry) {
694
694
  function alertMissedBackup(message, skipped) {
695
695
  void (async () => {
696
696
  try {
697
- const { pushNotifyAsync } = await import("./push-notifications-M7YU63FY.js");
697
+ const { pushNotifyAsync } = await import("./push-notifications-XC6EQEXF.js");
698
698
  pushNotifyAsync({
699
699
  event: "backup_failed",
700
700
  title: skipped ? "Backup SKIPPED \u2014 disk full" : "Backup FAILED \u2014 disk full",
@@ -833,6 +833,16 @@ function backupSizeCapBytes() {
833
833
  }
834
834
  return Math.max(3 * currentDbSize, DEFAULT_BACKUP_SIZE_CAP_FLOOR_BYTES);
835
835
  }
836
+ function backupVerifiedProbe(backupPath) {
837
+ try {
838
+ statSync(backupPath + ".manifest.json");
839
+ return true;
840
+ } catch (err) {
841
+ const code = err.code;
842
+ if (code === "ENOENT" || code === "ENOTDIR") return false;
843
+ return null;
844
+ }
845
+ }
836
846
  function enforceSizeRetention() {
837
847
  if (!existsSync(BACKUP_DIR)) return 0;
838
848
  let deleted = 0;
@@ -843,16 +853,21 @@ function enforceSizeRetention() {
843
853
  if (!file.endsWith(".db")) continue;
844
854
  if (reasonFromBackupName(file) === null) continue;
845
855
  const filePath = path.join(BACKUP_DIR, file);
856
+ let st;
846
857
  try {
847
- const st = statSync(filePath);
848
- backups.push({
849
- path: filePath,
850
- mtimeMs: st.mtimeMs,
851
- sizeBytes: st.size,
852
- verified: existsSync(filePath + ".manifest.json")
853
- });
858
+ st = statSync(filePath);
854
859
  } catch {
860
+ continue;
855
861
  }
862
+ const verified = backupVerifiedProbe(filePath);
863
+ if (verified === null) {
864
+ process.stderr.write(
865
+ `[db-backup] size retention SKIPPED this pass \u2014 could not determine whether ${path.basename(filePath)} is verified, and an unverified-by-default list would strip the newest verified backup of its protection.
866
+ `
867
+ );
868
+ return 0;
869
+ }
870
+ backups.push({ path: filePath, mtimeMs: st.mtimeMs, sizeBytes: st.size, verified });
856
871
  }
857
872
  for (const target of selectBackupsToDeleteBySize(backups, backupSizeCapBytes())) {
858
873
  for (const p of [target, target + "-wal", target + "-shm", target + ".manifest.json"]) {
@@ -952,20 +967,32 @@ function cleanupCrashDebris() {
952
967
  }
953
968
  function listBackups() {
954
969
  if (!existsSync(BACKUP_DIR)) return [];
955
- try {
956
- const files = readdirSync(BACKUP_DIR).filter((f) => f.endsWith(".db") && !f.endsWith(".tmp") && !f.endsWith("-wal") && !f.endsWith("-shm"));
957
- return files.map((name) => {
958
- const p = path.join(BACKUP_DIR, name);
959
- const stat = statSync(p);
960
- return { path: p, name, size: stat.size, date: stat.mtime };
961
- }).sort((a, b) => b.date.getTime() - a.date.getTime());
962
- } catch {
963
- return [];
970
+ const files = readdirSync(BACKUP_DIR).filter((f) => f.endsWith(".db") && !f.endsWith(".tmp") && !f.endsWith("-wal") && !f.endsWith("-shm"));
971
+ const found = [];
972
+ for (const name of files) {
973
+ const p = path.join(BACKUP_DIR, name);
974
+ let stat;
975
+ try {
976
+ stat = statSync(p);
977
+ } catch (e) {
978
+ if (e.code === "ENOENT") continue;
979
+ throw new Error(
980
+ `backup inventory is incomplete: ${p} could not be stat'ed (${e.code ?? "unknown"}). Refusing to report a partial backup list as the whole one.`,
981
+ { cause: e }
982
+ );
983
+ }
984
+ found.push({ path: p, name, size: stat.size, date: stat.mtime });
964
985
  }
986
+ return found.sort((a, b) => b.date.getTime() - a.date.getTime());
965
987
  }
966
988
  function hasBackupToday(reason) {
967
989
  const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
968
- const backups = listBackups();
990
+ let backups;
991
+ try {
992
+ backups = listBackups();
993
+ } catch {
994
+ return false;
995
+ }
969
996
  return backups.some((b) => b.name.includes(reason) && b.name.includes(today.replace(/-/g, "-")));
970
997
  }
971
998
  var DEFAULT_PRE_RESTART_DEDUP_MS = 30 * 60 * 1e3;
@@ -2,7 +2,7 @@ import {
2
2
  getClient,
3
3
  isCoordinatorName,
4
4
  loadEmployeesSync
5
- } from "./chunk-GL47M7NY.js";
5
+ } from "./chunk-3UD3OF3X.js";
6
6
 
7
7
  // src/lib/steward-gate.ts
8
8
  import crypto from "crypto";
@@ -54,9 +54,11 @@ var StewardGate = class {
54
54
  let reason;
55
55
  if (!allowed && role === "specialist" && operation === "deactivate_behavior") {
56
56
  const isOwn = await this.isOwnBehavior(agent, target);
57
- if (isOwn) {
57
+ if (isOwn === true) {
58
58
  allowed = true;
59
59
  reason = `Specialist "${agent}" can deactivate their own behavior.`;
60
+ } else if (isOwn === null) {
61
+ reason = `Ownership of behavior "${target}" could not be verified \u2014 the behaviors table could not be read (database locked, unreachable, or opened with the wrong key). Denying because unverified ownership is not ownership; this is NOT a finding that the behavior belongs to another agent. Fix the database access and retry.`;
60
62
  } else {
61
63
  reason = `Specialist "${agent}" cannot deactivate behaviors belonging to other agents.`;
62
64
  }
@@ -170,6 +172,21 @@ var StewardGate = class {
170
172
  }
171
173
  /**
172
174
  * Check if a behavior belongs to the given agent.
175
+ *
176
+ * THREE-VALUED. `null` means "I could not check" — a DB lock, a wrong
177
+ * SQLCipher key, a missing `behaviors` table. It is NOT `false`.
178
+ *
179
+ * Bug d11c5049 (catch-as-absence sweep, finding C6). The catch used to
180
+ * return `false`, which is the correct fail-CLOSED direction and stays that
181
+ * way — but the caller turns `false` into
182
+ *
183
+ * Specialist "X" cannot deactivate behaviors belonging to other agents
184
+ *
185
+ * and told that to a specialist whose behavior it IS, because the database
186
+ * was unreachable. The denial was right; the reason was a fabrication, and it
187
+ * aims the operator at a permissions problem instead of at their database.
188
+ * The reference pattern for this is prompt-submit.ts:281 — `null` as a
189
+ * distinct third state, with the decision unchanged.
173
190
  */
174
191
  async isOwnBehavior(agent, behaviorId) {
175
192
  try {
@@ -181,7 +198,7 @@ var StewardGate = class {
181
198
  if (result.rows.length === 0) return false;
182
199
  return String(result.rows[0].agent_id) === agent;
183
200
  } catch {
184
- return false;
201
+ return null;
185
202
  }
186
203
  }
187
204
  /**
@@ -8,14 +8,14 @@ import {
8
8
  resolveExeSession,
9
9
  sendIntercom,
10
10
  strictSessionScopeFilter
11
- } from "./chunk-7UHZBVP3.js";
11
+ } from "./chunk-QDVLVLXP.js";
12
12
  import {
13
13
  parseMessage,
14
14
  serializeMessage
15
15
  } from "./chunk-TDF2XKLK.js";
16
16
  import {
17
17
  recordOrchestrationEventBestEffort
18
- } from "./chunk-LSNBTGW4.js";
18
+ } from "./chunk-DPYZW42H.js";
19
19
  import {
20
20
  getSessionKey
21
21
  } from "./chunk-CVYC6DUW.js";
@@ -24,7 +24,7 @@ import {
24
24
  } from "./chunk-BTSWFMEH.js";
25
25
  import {
26
26
  getClient
27
- } from "./chunk-GL47M7NY.js";
27
+ } from "./chunk-3UD3OF3X.js";
28
28
 
29
29
  // src/lib/messaging.ts
30
30
  import crypto from "crypto";
@@ -3,7 +3,10 @@ import {
3
3
  } from "./chunk-5MOYSU5A.js";
4
4
  import {
5
5
  redactSecrets
6
- } from "./chunk-ELEGH4DX.js";
6
+ } from "./chunk-ZUGQPYUY.js";
7
+ import {
8
+ memoryDuplicatePredicate
9
+ } from "./chunk-RBQUXHYK.js";
7
10
 
8
11
  // src/lib/memory-write-governor.ts
9
12
  import { createHash } from "crypto";
@@ -72,25 +75,26 @@ function shouldSkipEmbedding(input) {
72
75
  function hashMemoryContent(text) {
73
76
  return createHash("sha256").update(normalizeMemoryText(text)).digest("hex");
74
77
  }
78
+ function dedupPredicate(input) {
79
+ return memoryDuplicatePredicate({
80
+ content_hash: input.contentHash,
81
+ agent_id: input.agentId,
82
+ project_name: input.projectName,
83
+ memory_type: input.memoryType,
84
+ session_scope: input.sessionScope ?? null,
85
+ workspace_id: input.workspaceId ?? null,
86
+ user_id: input.userId ?? null,
87
+ supersedes_id: input.supersedesId ?? null,
88
+ draft: input.draft ? 1 : 0
89
+ });
90
+ }
75
91
  function scopedDedupArgs(input) {
76
- return [input.contentHash, input.agentId, input.projectName, input.memoryType];
92
+ return dedupPredicate(input).args;
77
93
  }
78
94
  function scopedDedupSql(excludeId = false) {
79
- let sql = `SELECT id FROM memories
80
- WHERE content_hash = ?
81
- -- Bug d23040c2: force SQLite away from idx_memories_agent_ts.
82
- -- The old agent_id predicate plus ORDER BY timestamp DESC made
83
- -- non-duplicate writes walk every row for the agent
84
- -- (idx_memories_agent_ts; 1477ms on 60K rows). Unary plus keeps
85
- -- the predicate semantics identical while disqualifying the
86
- -- agent indexes, so the planner uses idx_memories_content_hash
87
- -- (content_hash, agent_id); measured 0.03ms.
88
- AND +agent_id = ?
89
- AND project_name = ?
90
- AND COALESCE(memory_type, 'raw') = ?
91
- AND COALESCE(status, 'active') != 'deleted'`;
92
- if (excludeId) sql += " AND id != ?";
93
- return `${sql} ORDER BY timestamp DESC LIMIT 1`;
95
+ const predicate = dedupPredicate({ contentHash: "", agentId: "", projectName: "", memoryType: "raw" });
96
+ return `SELECT id FROM memories WHERE ${predicate.sql}${excludeId ? " AND id != ?" : ""}
97
+ ORDER BY timestamp DESC, id DESC LIMIT 1`;
94
98
  }
95
99
  function governMemoryRecord(record) {
96
100
  const redacted = redactSecrets(record.raw_text);
@@ -143,84 +147,9 @@ async function findScopedDuplicate(input) {
143
147
  const result = await client.execute({ sql, args });
144
148
  return result.rows[0]?.id ? String(result.rows[0].id) : null;
145
149
  }
146
- async function runPostWriteMemoryHygiene(memoryId) {
147
- try {
148
- const { getClient } = await import("./lib/database.js");
149
- const client = getClient();
150
- const current = await client.execute({
151
- sql: `SELECT id, agent_id, project_name, memory_type, content_hash, supersedes_id,
152
- importance, timestamp
153
- FROM memories
154
- WHERE id = ?
155
- LIMIT 1`,
156
- args: [memoryId]
157
- });
158
- const row = current.rows[0];
159
- if (!row) return;
160
- const memoryType = String(row.memory_type ?? "raw");
161
- const contentHash = row.content_hash ? String(row.content_hash) : null;
162
- const agentId = String(row.agent_id);
163
- const projectName = String(row.project_name);
164
- if (contentHash) {
165
- await client.execute({
166
- sql: `UPDATE memories
167
- SET status = 'deleted',
168
- outcome = COALESCE(outcome, 'superseded')
169
- WHERE id != ?
170
- AND content_hash = ?
171
- AND agent_id = ?
172
- AND project_name = ?
173
- AND COALESCE(memory_type, 'raw') = ?
174
- AND COALESCE(status, 'active') = 'active'`,
175
- args: [memoryId, contentHash, agentId, projectName, memoryType]
176
- });
177
- }
178
- const supersedesId = row.supersedes_id ? String(row.supersedes_id) : null;
179
- if (supersedesId && HIGH_VALUE_SUPERSESSION_TYPES.has(memoryType)) {
180
- const old = await client.execute({
181
- sql: `SELECT importance FROM memories WHERE id = ? LIMIT 1`,
182
- args: [supersedesId]
183
- });
184
- const oldImportance = Number(old.rows[0]?.importance ?? 0);
185
- const newImportance = Number(row.importance ?? 0);
186
- await client.batch([
187
- {
188
- sql: `UPDATE memories
189
- SET status = 'archived',
190
- outcome = COALESCE(outcome, 'superseded')
191
- WHERE id = ?`,
192
- args: [supersedesId]
193
- },
194
- {
195
- sql: `UPDATE memories
196
- SET importance = MAX(COALESCE(importance, 5), ?),
197
- parent_memory_id = COALESCE(parent_memory_id, ?)
198
- WHERE id = ?`,
199
- args: [Math.max(oldImportance, newImportance), supersedesId, memoryId]
200
- }
201
- ], "write");
202
- }
203
- } catch (err) {
204
- process.stderr.write(
205
- `[memory-governor] post-write hygiene failed for ${memoryId}: ${err instanceof Error ? err.message : String(err)}
206
- `
207
- );
208
- }
209
- }
210
- function schedulePostWriteMemoryHygiene(memoryIds) {
211
- if (process.env.EXE_SKIP_MEMORY_HYGIENE === "1") return;
212
- if (memoryIds.length === 0) return;
213
- const run = () => {
214
- void Promise.all(memoryIds.map((id) => runPostWriteMemoryHygiene(id)));
215
- };
216
- if (typeof setImmediate === "function") setImmediate(run);
217
- else setTimeout(run, 0);
218
- }
219
150
 
220
151
  export {
221
152
  hashMemoryContent,
222
153
  governMemoryRecord,
223
- findScopedDuplicate,
224
- runPostWriteMemoryHygiene,
225
- schedulePostWriteMemoryHygiene
154
+ findScopedDuplicate
226
155
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isExeSession
3
- } from "./chunk-7UHZBVP3.js";
3
+ } from "./chunk-QDVLVLXP.js";
4
4
  import {
5
5
  loadConfigSync
6
6
  } from "./chunk-MMS2HBRT.js";
@@ -17,7 +17,8 @@ var DEFAULT_NOTIFY_ON = [
17
17
  "context_full",
18
18
  "error_spike",
19
19
  "daemon_crash",
20
- "review_ready"
20
+ "review_ready",
21
+ "hooks_dead"
21
22
  ];
22
23
  var _cachedConfig = null;
23
24
  var _notifyOn = null;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-GL47M7NY.js";
3
+ } from "./chunk-3UD3OF3X.js";
4
4
 
5
5
  // src/lib/skill-refinement.ts
6
6
  import crypto from "crypto";