@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.
- package/deploy/compose/.env.askexe-control-plane.example +6 -0
- package/deploy/compose/.env.customer.example +1 -1
- package/deploy/compose/.env.example +1 -1
- package/deploy/compose/docker-compose.yml +16 -0
- package/deploy/compose/generate-env.ts +1 -1
- package/deploy/compose/sso-edge/sso-redirect.conf +18 -3
- package/deploy/stack-manifests/v0.9.json +1160 -1
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-F5V4E4UL.js → active-agent-RZ24KSJN.js} +8 -6
- package/dist/{active-agent-YTBB4ZQM.js → active-agent-YWSWPIEA.js} +8 -6
- package/dist/{agent-defs-generator-7TFISIJQ.js → agent-defs-generator-GY3UBREJ.js} +8 -6
- package/dist/{agent-heartbeat-CQPGJIFF.js → agent-heartbeat-GUVUUQVM.js} +1 -1
- package/dist/{agent-loop-EZ7LDAGD.js → agent-loop-HPNCH3HK.js} +1 -1
- package/dist/{agentic-ontology-XVTUVV7W.js → agentic-ontology-RHYNXEKE.js} +1 -1
- package/dist/{artifact-backup-TF6YWQT2.js → artifact-backup-HGUFSIJH.js} +19 -6
- package/dist/{backfill-metadata-J6MXIDCW.js → backfill-metadata-XLFASEOD.js} +11 -9
- package/dist/{backup-verify-6DVBQMDP.js → backup-verify-TUQEICWA.js} +1 -1
- package/dist/{behavior-injection-XDA7ZCYN.js → behavior-injection-GXO7ERGN.js} +14 -12
- package/dist/{behavior-promotion-4VLQ7LXK.js → behavior-promotion-V63WIZ4N.js} +13 -11
- package/dist/{behaviors-SCCZP7RZ.js → behaviors-RMLDPLOF.js} +18 -11
- package/dist/bin/agentic-ontology-backfill.js +12 -10
- package/dist/bin/agentic-reflection-backfill.js +13 -11
- package/dist/bin/agentic-semantic-label.js +12 -10
- package/dist/bin/backfill-conversations.js +11 -9
- package/dist/bin/backfill-responses.js +11 -9
- package/dist/bin/backfill-vectors.js +13 -11
- package/dist/bin/bulk-sync-postgres.js +20 -18
- package/dist/bin/cc-doctor.js +15 -13
- package/dist/bin/cleanup-stale-review-tasks.js +44 -32
- package/dist/bin/cli.js +109 -30
- package/dist/bin/customer-readiness.js +55 -25
- package/dist/bin/deferred-daemon-restart.js +111 -108
- package/dist/bin/exe-actions.js +7 -1
- package/dist/bin/exe-agent-config.js +8 -6
- package/dist/bin/exe-agent.js +18 -16
- package/dist/bin/exe-assign.js +13 -11
- package/dist/bin/exe-boot.js +49 -47
- package/dist/bin/exe-call.js +9 -7
- package/dist/bin/exe-cicd.js +19 -8
- package/dist/bin/exe-cloud.js +59 -25
- package/dist/bin/exe-config-dump.js +8 -6
- package/dist/bin/exe-dispatch.js +23 -21
- package/dist/bin/exe-doctor.js +11 -8
- package/dist/bin/exe-export-behaviors.js +16 -14
- package/dist/bin/exe-forget.js +14 -12
- package/dist/bin/exe-gateway.js +12 -10
- package/dist/bin/exe-grant.js +6 -6
- package/dist/bin/exe-healthcheck.js +15 -13
- package/dist/bin/exe-heartbeat.js +28 -26
- package/dist/bin/exe-kill.js +28 -26
- package/dist/bin/exe-launch-agent.js +35 -33
- package/dist/bin/exe-mcp.js +9 -7
- package/dist/bin/exe-memory-reads.js +11 -9
- package/dist/bin/exe-new-employee.js +13 -11
- package/dist/bin/exe-os-mcp-proxy.js +9 -7
- package/dist/bin/exe-pending-messages.js +23 -21
- package/dist/bin/exe-pending-notifications.js +22 -20
- package/dist/bin/exe-pending-reviews.js +23 -21
- package/dist/bin/exe-preflight.js +1 -1
- package/dist/bin/exe-rename.js +9 -7
- package/dist/bin/exe-review.js +59 -55
- package/dist/bin/exe-search-quality.js +16 -3
- package/dist/bin/exe-search.js +13 -11
- package/dist/bin/exe-session-cleanup.js +29 -27
- package/dist/bin/exe-settings.js +22 -20
- package/dist/bin/exe-start-codex.js +23 -21
- package/dist/bin/exe-start-opencode.js +21 -19
- package/dist/bin/exe-status.js +24 -22
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +8 -6
- package/dist/bin/exe-verify-running-images.js +644 -17
- package/dist/bin/git-sweep.js +24 -22
- package/dist/bin/graph-backfill.js +12 -10
- package/dist/bin/graph-export.js +12 -10
- package/dist/bin/hooks-cli.js +4 -4
- package/dist/bin/import-history.js +16 -14
- package/dist/bin/install.js +113 -110
- package/dist/bin/intercom-check.js +5 -5
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +8 -6
- package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- package/dist/bin/pre-build-guard.js +55 -16
- package/dist/bin/pre-publish.js +1 -1
- package/dist/bin/prune-orphan-chunks.js +154 -28
- package/dist/bin/reconcile-backlog.js +5 -3
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/repair-document-chunks.js +11 -9
- package/dist/bin/scan-tasks.js +23 -21
- package/dist/bin/setup.js +3 -3
- package/dist/bin/shard-migrate.js +12 -10
- package/dist/bin/stack-update.js +622 -43
- package/dist/bin/verify-stack.js +2 -2
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-Q7LGQ3AO.js → boot-generation-VCQXVYGT.js} +7 -5
- package/dist/{boot-review-sections-G5774FR5.js → boot-review-sections-3QO6Q7MP.js} +21 -19
- package/dist/{branch-hygiene-44WLSOZR.js → branch-hygiene-DDXXI6ZA.js} +59 -21
- package/dist/bug-landed-reconciler-TQVNOUCU.js +353 -0
- package/dist/build-manifest.json +1269 -1194
- package/dist/{capability-cards-I3RHCF4F.js → capability-cards-XPDLT6LU.js} +6 -4
- package/dist/{capacity-monitor-7I7GDONU.js → capacity-monitor-N3AW242L.js} +23 -21
- package/dist/{catchup-brief-3T5PARIR.js → catchup-brief-3PKX7FUP.js} +29 -27
- package/dist/{chunk-C5ISP5FO.js → chunk-2BKJAOO4.js} +11 -1
- package/dist/{chunk-JJTPPAZY.js → chunk-2CUQHG6H.js} +1609 -1356
- package/dist/{chunk-HU3VD4MQ.js → chunk-2Q2GGYBX.js} +1 -1
- package/dist/{chunk-CHIUS5QB.js → chunk-36LMIOVU.js} +9 -9
- package/dist/{chunk-46VSBDUW.js → chunk-3DCBDG4T.js} +2 -2
- package/dist/{chunk-W3KPQE7H.js → chunk-3GL3E4TD.js} +3 -3
- package/dist/{chunk-GL47M7NY.js → chunk-3UD3OF3X.js} +202 -117
- package/dist/{chunk-WNBZJSQT.js → chunk-3VW5ZP2F.js} +1 -1
- package/dist/{chunk-JDDM6C57.js → chunk-3X74IQBU.js} +1 -1
- package/dist/{chunk-NVFNADTX.js → chunk-3ZL4MDQ6.js} +18 -4
- package/dist/{chunk-R5E7WNAC.js → chunk-4ESNDGMB.js} +3 -3
- package/dist/{chunk-CYCIX7AW.js → chunk-4FLLIQRQ.js} +2 -2
- package/dist/{chunk-3RGTLZNO.js → chunk-4GAKF7KR.js} +99 -74
- package/dist/{chunk-RVO5O5SR.js → chunk-4S3A52AV.js} +38 -10
- package/dist/{chunk-7J2ZQ4XN.js → chunk-4VQ3QR6B.js} +29 -28
- package/dist/{chunk-MROSARM5.js → chunk-5BJBTFFQ.js} +7 -1
- package/dist/chunk-5LQZABW5.js +6 -0
- package/dist/chunk-5ONMHTNI.js +236 -0
- package/dist/{chunk-APL7HUE3.js → chunk-5QQJUO3F.js} +200 -31
- package/dist/{chunk-UOPCVFVR.js → chunk-5RK75SWH.js} +205 -278
- package/dist/{chunk-T5FEAQES.js → chunk-5TYJYGS5.js} +1 -1
- package/dist/{chunk-P3QQ52QK.js → chunk-5U6EOTZV.js} +3 -3
- package/dist/{chunk-ALRHGEAJ.js → chunk-637FL62O.js} +1 -1
- package/dist/{chunk-PUBA5B4M.js → chunk-6L4VIYLZ.js} +33 -19
- package/dist/{chunk-VF2KRROX.js → chunk-754P2UXM.js} +1 -1
- package/dist/{chunk-CM7N5MBY.js → chunk-7FZG7WP4.js} +5 -5
- package/dist/{chunk-NYLJQ2M2.js → chunk-7NEBFB3L.js} +4 -4
- package/dist/{chunk-E7C2WNR5.js → chunk-AEIOFFFX.js} +5 -5
- package/dist/{chunk-VOVFUKEB.js → chunk-AIB2EWO2.js} +5 -5
- package/dist/{chunk-EGOEB42T.js → chunk-AP2C4OGS.js} +3 -3
- package/dist/{chunk-MPZ2AVNS.js → chunk-ATNV3BVZ.js} +1 -1
- package/dist/{chunk-F4BBMIPG.js → chunk-B4XJQBQB.js} +2 -2
- package/dist/{chunk-BPVFZ6Q4.js → chunk-B5EGDNG6.js} +2 -2
- package/dist/{chunk-AGC2V7JS.js → chunk-B6CBN6EF.js} +1 -1
- package/dist/{chunk-KTKIFXIP.js → chunk-B7FDRN7G.js} +1 -1
- package/dist/{chunk-C5HUMAA7.js → chunk-B7WVYLAQ.js} +67 -15
- package/dist/chunk-BGVP5RMT.js +185 -0
- package/dist/{chunk-FVLNNNH6.js → chunk-BNI4LIU5.js} +35 -4
- package/dist/{chunk-P4XLIPB7.js → chunk-BU5JRLZT.js} +1 -1
- package/dist/{chunk-PHUHIVD5.js → chunk-C6U7XWOC.js} +34 -5
- package/dist/chunk-C7GHNJPW.js +8 -0
- package/dist/{chunk-4AR5XKCH.js → chunk-CL2MU3OX.js} +1 -1
- package/dist/{chunk-ZPP63JSQ.js → chunk-CL3AB7Z2.js} +1 -1
- package/dist/{chunk-FHIFTSPL.js → chunk-CP7XUSOF.js} +8 -3
- package/dist/{chunk-3OX34OC3.js → chunk-CUDNRHHT.js} +30 -10
- package/dist/chunk-CYUUNIEL.js +21 -0
- package/dist/{chunk-P2UY34XE.js → chunk-D4C57S2H.js} +5 -5
- package/dist/{chunk-XSUALA32.js → chunk-DDYFNBYV.js} +3 -3
- package/dist/{chunk-LSNBTGW4.js → chunk-DPYZW42H.js} +1 -1
- package/dist/{chunk-FMIYFHLE.js → chunk-E2PRXEZK.js} +9 -3
- package/dist/{chunk-L63V25HS.js → chunk-E54SPUYJ.js} +3 -3
- package/dist/{chunk-DMUOTCDN.js → chunk-E5CKRHIZ.js} +1 -1
- package/dist/{chunk-BV2IET6B.js → chunk-EVMOKRBC.js} +15 -2
- package/dist/{chunk-YLFCH3VA.js → chunk-FDWI3T6I.js} +133 -31
- package/dist/{chunk-PWC3C5ME.js → chunk-FNJTCJGY.js} +4 -4
- package/dist/{chunk-TNS63ATU.js → chunk-FWRPDSO3.js} +350 -50
- package/dist/{chunk-JA3Y5TV6.js → chunk-GDLB6BPM.js} +141 -74
- package/dist/{chunk-IGJMS7C5.js → chunk-GOVGG7HU.js} +2 -2
- package/dist/{chunk-MB47DRF5.js → chunk-GP7CTIUK.js} +2 -2
- package/dist/{chunk-L5EPGGDP.js → chunk-GWAN2BDB.js} +4 -4
- package/dist/{chunk-YRQ26MNP.js → chunk-H3YF7X4J.js} +12 -5
- package/dist/{chunk-VLBHZ6TF.js → chunk-H6PLIFUE.js} +2 -2
- package/dist/{chunk-GSLFH4AI.js → chunk-HRNM3N4Y.js} +6 -15
- package/dist/chunk-IG2ISRTF.js +48 -0
- package/dist/{chunk-MWEIBVBS.js → chunk-IJCWBYA5.js} +14 -1
- package/dist/{chunk-NKEFYE4R.js → chunk-IPTUKX3N.js} +1 -1
- package/dist/{chunk-RB3J2WYQ.js → chunk-IVE7H6KA.js} +1 -1
- package/dist/{chunk-HA63SH5W.js → chunk-IWY2OGQG.js} +1 -1
- package/dist/{chunk-BQEZPRUC.js → chunk-IZWMWJZT.js} +64 -46
- package/dist/{chunk-AHESD3KW.js → chunk-J4UVI652.js} +1 -1
- package/dist/{chunk-PLII76NJ.js → chunk-JBUCA4OX.js} +33 -6
- package/dist/{chunk-2PZTMSMG.js → chunk-JOF4HQDF.js} +5 -5
- package/dist/{chunk-OBBO6EJR.js → chunk-JQN3QGSF.js} +1 -1
- package/dist/{chunk-P4PIZOL2.js → chunk-JWYIH5DR.js} +3 -3
- package/dist/{chunk-3XY57PKT.js → chunk-KZLKE7I3.js} +210 -48
- package/dist/{chunk-DYVLEMKS.js → chunk-L3GXMYBK.js} +1 -1
- package/dist/{chunk-72V3S44T.js → chunk-LUA4SLJY.js} +46 -19
- package/dist/{chunk-ZT4LFTUJ.js → chunk-LW3JCBXP.js} +20 -3
- package/dist/{chunk-YLB365YX.js → chunk-M5XHN4OM.js} +3 -3
- package/dist/{chunk-VHHX4UCP.js → chunk-MDTWARSF.js} +22 -93
- package/dist/{chunk-JFJP6ATJ.js → chunk-MWKXQSF6.js} +3 -2
- package/dist/{chunk-VJEJ7JNB.js → chunk-N32DVIKY.js} +1 -1
- package/dist/{chunk-MUCNYSJP.js → chunk-NRLJOV7M.js} +32 -4
- package/dist/{chunk-PL4CFSQ7.js → chunk-NSXJOSH7.js} +1 -1
- package/dist/{chunk-NF5FOSLD.js → chunk-NVTG66CK.js} +1 -1
- package/dist/chunk-O45GBJEH.js +1500 -0
- package/dist/{chunk-4AAMFWJT.js → chunk-OHZSTZXN.js} +4 -2
- package/dist/chunk-OSIS7ZQW.js +344 -0
- package/dist/{chunk-E3ZM32LF.js → chunk-P22VFGFK.js} +14 -5
- package/dist/{chunk-KILR4FBR.js → chunk-PAFLR7WD.js} +3 -3
- package/dist/{chunk-R3CZWFFC.js → chunk-PEYQ6MWO.js} +15 -3
- package/dist/{chunk-RDWIKDMY.js → chunk-PZR54BEI.js} +8 -20
- package/dist/{chunk-2FKU4ZEO.js → chunk-QDBKMEYY.js} +9 -9
- package/dist/{chunk-7UHZBVP3.js → chunk-QDVLVLXP.js} +97 -31
- package/dist/{chunk-PRDDPQLC.js → chunk-QLXEQRHD.js} +5 -5
- package/dist/{chunk-MUAWCFW6.js → chunk-QNPDXV5V.js} +5 -2
- package/dist/{chunk-LR5O2XWZ.js → chunk-QUZYLDNJ.js} +5 -5
- package/dist/chunk-RBQUXHYK.js +48 -0
- package/dist/{chunk-3SUPEE6H.js → chunk-RDMBSHGG.js} +3 -3
- package/dist/{chunk-I5XIW2BP.js → chunk-RGUM474V.js} +7 -7
- package/dist/{chunk-OAFENIHN.js → chunk-RJ67XAJU.js} +76 -28
- package/dist/{chunk-LFUBEHFW.js → chunk-RT57D7C4.js} +39 -1
- package/dist/{chunk-MKM6D7JM.js → chunk-RWG7DLOG.js} +42 -5
- package/dist/{chunk-P3UX5EH4.js → chunk-RWKAHHIX.js} +3 -3
- package/dist/{chunk-XEBKIWI7.js → chunk-RYNT3HB7.js} +12 -12
- package/dist/{chunk-EUGEFBGV.js → chunk-S2V272KJ.js} +3 -3
- package/dist/{chunk-W6BZ4UGA.js → chunk-SGYEM2PD.js} +1 -1
- package/dist/{chunk-VROK4X2L.js → chunk-SJP57MQM.js} +1 -1
- package/dist/{chunk-5MVKTNZP.js → chunk-SL4JWAMQ.js} +54 -4
- package/dist/{chunk-MOANZQXF.js → chunk-SLMKLEU6.js} +1 -1
- package/dist/{chunk-RZN2LEAK.js → chunk-SQA7XCYI.js} +3 -3
- package/dist/{chunk-4YNA3CM6.js → chunk-SSFS4NCH.js} +262 -56
- package/dist/{chunk-6FIC57PH.js → chunk-T4P2G3PO.js} +1 -1
- package/dist/{chunk-5U2IJBFV.js → chunk-TA3B4N24.js} +1 -1
- package/dist/{chunk-ZOTTYCP5.js → chunk-TEWWBVQP.js} +40 -4
- package/dist/{chunk-SDYWZRPN.js → chunk-TLSFGXXE.js} +1 -1
- package/dist/{chunk-L3VUW5M4.js → chunk-TQS2YHLB.js} +1 -1
- package/dist/{chunk-KXYKSLW4.js → chunk-TU4M757W.js} +399 -116
- package/dist/{chunk-MC4IM2CC.js → chunk-TYD4F4XU.js} +6 -6
- package/dist/{chunk-TKS5GMYA.js → chunk-U44Y7RC7.js} +2 -0
- package/dist/{chunk-B7AMNZTC.js → chunk-UKBPEEEQ.js} +2 -2
- package/dist/{chunk-ZBPZDADW.js → chunk-UWVXQEQQ.js} +467 -78
- package/dist/{chunk-P2VVMGMI.js → chunk-V4WH3FV7.js} +35 -16
- package/dist/{worktree-ownership-guard-O6JQF2CL.js → chunk-V6F4I2XY.js} +13 -14
- package/dist/{chunk-JFTUAV4J.js → chunk-VBKUESIW.js} +1 -1
- package/dist/{chunk-AZSTIAVL.js → chunk-VBPYYJPC.js} +1 -1
- package/dist/{chunk-LKTN22L6.js → chunk-VIP4LKLO.js} +57 -24
- package/dist/{chunk-L5CGXEZC.js → chunk-WAAGVFFN.js} +63 -71
- package/dist/{chunk-D3LXVAIQ.js → chunk-WC7AE3PT.js} +244 -103
- package/dist/{chunk-EOTZSAQL.js → chunk-WUCUDHKR.js} +1 -1
- package/dist/{chunk-VF3BZOZK.js → chunk-X7HZHKY4.js} +50 -3
- package/dist/{chunk-LFBLQE2P.js → chunk-XCAKYVKI.js} +1 -1
- package/dist/{chunk-UXN4BICC.js → chunk-XMX5J52Z.js} +1 -1
- package/dist/{chunk-6YDY6ZTD.js → chunk-XTCXGWTV.js} +9 -4
- package/dist/{chunk-XUZK23V7.js → chunk-XW2FW6LS.js} +2 -2
- package/dist/{chunk-CH7BUBP3.js → chunk-XWVHUDEK.js} +5 -4
- package/dist/{chunk-S26CV7BE.js → chunk-YA5LK6KB.js} +45 -8
- package/dist/{chunk-ELCRJGCH.js → chunk-YMRQIENV.js} +2 -2
- package/dist/{chunk-QNZ4562V.js → chunk-Z3LXWCB7.js} +1 -1
- package/dist/{chunk-EYMFVITZ.js → chunk-Z7I6NQMA.js} +2 -2
- package/dist/{chunk-6BJCDWSM.js → chunk-ZB4FS2EG.js} +1 -1
- package/dist/{chunk-ZAEUEDTN.js → chunk-ZD6FZ3WL.js} +1 -1
- package/dist/{chunk-FEU6QEEL.js → chunk-ZM6EZAVY.js} +1 -0
- package/dist/{chunk-2KY7WZZF.js → chunk-ZPA4R2UI.js} +1 -1
- package/dist/chunk-ZPPPHVSU.js +285 -0
- package/dist/{chunk-ELEGH4DX.js → chunk-ZUGQPYUY.js} +51 -4
- package/dist/{chunk-UX2EO653.js → chunk-ZZWFZ46U.js} +66 -8
- package/dist/{cleanup-graph-garbage-VQAJ2RBT.js → cleanup-graph-garbage-HFUD5ZQT.js} +12 -10
- package/dist/{cloud-sync-command-J7NEFUY7.js → cloud-sync-command-3JHJJKPN.js} +25 -3
- package/dist/{cloud-sync-db-init-KWEMNMGA.js → cloud-sync-db-init-2LHIQOSF.js} +1 -1
- package/dist/{cloud-sync-shutdown-P63AUTUI.js → cloud-sync-shutdown-ZXAXA3Z7.js} +6 -4
- package/dist/{cloud-sync-state-QF3TMMJ4.js → cloud-sync-state-VSQFGPP6.js} +1 -1
- package/dist/{co-activation-7IHRPBZN.js → co-activation-NX4EH4AP.js} +6 -4
- package/dist/{co-occurrence-R5AG4OAU.js → co-occurrence-5LBYCW3U.js} +10 -8
- package/dist/{consent-passphrase-5ZBDJ5G7.js → consent-passphrase-65W3DJIJ.js} +2 -2
- package/dist/{content-extractor-ZLXC6GNR.js → content-extractor-OGXETBOX.js} +2 -2
- package/dist/{conversation-entity-extractor-7FRKLLBD.js → conversation-entity-extractor-FQCOAH4F.js} +5 -4
- package/dist/conversations-retention-XTBFJBUM.js +166 -0
- package/dist/{crdt-sync-IFRZOEIS.js → crdt-sync-7TDUBTLH.js} +4 -4
- package/dist/{crm-webhook-L2S63ASV.js → crm-webhook-776JTY55.js} +2 -2
- package/dist/{cto-delegation-gate-3WU7OHX7.js → cto-delegation-gate-ZNUWVYCN.js} +25 -23
- package/dist/{daemon-orchestration-3VQYKLOR.js → daemon-orchestration-76BOFDEP.js} +30 -24
- package/dist/{doc-graph-extractor-YIR5E7OF.js → doc-graph-extractor-F724KZJX.js} +10 -8
- package/dist/{documents-QEHPTYIY.js → documents-Q24V4GRD.js} +13 -11
- package/dist/{dreaming-LNFE7DTN.js → dreaming-IY6NQTSP.js} +27 -25
- package/dist/{employee-boot-brief-ZTXDYNWM.js → employee-boot-brief-CCTXO5DQ.js} +35 -29
- package/dist/{entity-boost-R5N6JWXD.js → entity-boost-XGOB7HDM.js} +1 -1
- package/dist/{exe-drift-WYSJVZFO.js → exe-drift-NEPXLNGP.js} +7 -5
- package/dist/{exe-export-GOLNAEAV.js → exe-export-ZHJQFKR2.js} +14 -12
- package/dist/{exe-import-U4BSI6OH.js → exe-import-7SVNI4FW.js} +14 -12
- package/dist/{exe-key-V42G3NGO.js → exe-key-QJKU56WZ.js} +119 -108
- package/dist/{exe-org-U4GLQ6OP.js → exe-org-SJXHLV6K.js} +76 -51
- package/dist/{exe-snapshot-U7ONBYNY.js → exe-snapshot-EFWPXTXE.js} +45 -36
- package/dist/{fast-db-init-W3NGKAEU.js → fast-db-init-BQZOQNT3.js} +1 -1
- package/dist/{founder-context-ZSIBRVDM.js → founder-context-KG2ZAOXY.js} +2 -2
- package/dist/{founder-monitor-envelope-L3IWZLFY.js → founder-monitor-envelope-NYB5LLU4.js} +4 -4
- package/dist/gateway/index.js +20 -18
- package/dist/{gateway-client-DJFCVIPT.js → gateway-client-ODMUXUL3.js} +1 -1
- package/dist/{git-staleness-OF24QXFZ.js → git-staleness-OPGEAJA7.js} +6 -4
- package/dist/{global-procedures-WSIOWO43.js → global-procedures-3KXY4LL6.js} +8 -6
- package/dist/{graph-auto-extract-IEVVN3L3.js → graph-auto-extract-I7H2F5NJ.js} +10 -8
- package/dist/{graph-query-JDZWAVCU.js → graph-query-E7JBSNY5.js} +1 -1
- package/dist/{graph-rag-BKAD2XQA.js → graph-rag-H24CMFP2.js} +5 -4
- package/dist/{hook-integrity-TPWDGX2M.js → hook-integrity-PGQ3OX4S.js} +1 -1
- package/dist/{hook-prefetch-FD6VGJJA.js → hook-prefetch-7AZJER6Z.js} +23 -21
- package/dist/hook-registration-liveness-NGQRFKAA.js +11 -0
- package/dist/hooks/bug-report-worker.js +26 -24
- package/dist/hooks/codex-stop-task-finalizer.js +28 -26
- package/dist/hooks/commit-complete.js +26 -24
- package/dist/hooks/error-recall.js +16 -14
- package/dist/hooks/exe-heartbeat-hook.js +9 -7
- package/dist/hooks/ingest-worker.js +12 -10
- package/dist/hooks/ingest.js +22 -17
- package/dist/hooks/instructions-loaded.js +11 -9
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +10 -8
- package/dist/hooks/post-compact.js +9 -7
- package/dist/hooks/post-tool-combined.js +14 -14
- package/dist/hooks/pre-compact.js +26 -24
- package/dist/hooks/pre-tool-use.js +2 -2
- package/dist/hooks/prompt-submit.js +47 -41
- package/dist/hooks/session-end.js +38 -42
- package/dist/hooks/session-start.js +26 -18
- package/dist/hooks/stop.js +29 -27
- package/dist/hooks/subagent-stop.js +29 -27
- package/dist/hooks/summary-worker.js +32 -30
- package/dist/index.js +37 -35
- package/dist/{installer-OTI5SA43.js → installer-2ZS3LHCU.js} +12 -9
- package/dist/{installer-NMOBSEZ2.js → installer-NH3A3HWC.js} +14 -9
- package/dist/{installer-SRJGE4GU.js → installer-UJ73PGRD.js} +21 -9
- package/dist/{intercom-queue-4FFXCBHO.js → intercom-queue-OE25GJF2.js} +21 -19
- package/dist/lib/agent-config.js +2 -2
- package/dist/lib/cloud-sync.js +24 -18
- package/dist/lib/consolidation.js +13 -11
- package/dist/lib/crypto.js +3 -3
- package/dist/lib/database.js +6 -4
- package/dist/lib/db-backup.js +1 -1
- package/dist/lib/db-write-worker-client.js +3 -1
- package/dist/lib/db-write-worker.js +65 -89
- package/dist/lib/db.js +6 -4
- package/dist/lib/delivery-truth.js +5 -1
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/embedder.js +2 -2
- package/dist/lib/employee-templates.js +9 -7
- package/dist/lib/employees.js +6 -4
- package/dist/lib/exe-daemon.js +425 -314
- package/dist/lib/file-grep.js +15 -21
- package/dist/lib/hybrid-search.js +19 -13
- package/dist/lib/identity-templates.js +1 -1
- package/dist/lib/identity.js +6 -4
- package/dist/lib/keychain.js +1 -1
- package/dist/lib/license.js +22 -6
- package/dist/lib/messaging.js +22 -20
- package/dist/lib/post-tool-memory.js +10 -8
- package/dist/lib/registry-proxy.js +1 -1
- package/dist/lib/reminders.js +7 -5
- package/dist/lib/runtime-table.js +1 -1
- package/dist/lib/schedules.js +12 -10
- package/dist/lib/session-registry.js +8 -6
- package/dist/lib/skill-learning.js +13 -11
- package/dist/lib/status-brief.js +2 -2
- package/dist/lib/store.js +17 -9
- package/dist/lib/task-router.js +7 -5
- package/dist/lib/tasks.js +23 -21
- package/dist/lib/tmux-routing.js +21 -19
- package/dist/lib/tmux-status.js +4 -1
- package/dist/lib/token-spend.js +7 -5
- package/dist/lib/ws-client.js +1 -1
- package/dist/{license-gate-R4JWTWM4.js → license-gate-XQ2KN5I5.js} +3 -3
- package/dist/{license-recheck-3MBJ4IJX.js → license-recheck-IIBKR2V5.js} +1 -1
- package/dist/{license-sync-BVSG3WMW.js → license-sync-76JVI2M5.js} +151 -8
- package/dist/{local-secret-inventory-JWNBHZZ4.js → local-secret-inventory-MJT7NJLY.js} +2 -2
- package/dist/{mailbox-inbox-MTAT4MXX.js → mailbox-inbox-BPZP4GIZ.js} +1 -1
- package/dist/maintenance-worker-54VZTFIK.js +371 -0
- package/dist/mcp/register-tools.js +110 -107
- package/dist/mcp/server.js +113 -110
- package/dist/mcp/tools/complete-reminder.js +8 -6
- package/dist/mcp/tools/create-reminder.js +8 -6
- package/dist/mcp/tools/create-task.js +26 -24
- package/dist/mcp/tools/deactivate-behavior.js +15 -13
- package/dist/mcp/tools/list-reminders.js +8 -6
- package/dist/mcp/tools/list-tasks.js +26 -24
- package/dist/mcp/tools/send-message.js +25 -23
- package/dist/mcp/tools/update-task.js +24 -22
- package/dist/{mcp-child-registry-TIZERM7O.js → mcp-child-registry-5VUG5ATZ.js} +1 -1
- package/dist/{mcp-http-config-VUMSFWFH.js → mcp-http-config-SKXESWHA.js} +9 -7
- package/dist/{mcp-session-identity-DZHWEJRV.js → mcp-session-identity-HYMLJXXA.js} +21 -19
- package/dist/{memory-cards-JVXTMSAT.js → memory-cards-PAZDUQ3B.js} +16 -32
- package/dist/{memory-graph-extractor-PPBJMYFJ.js → memory-graph-extractor-BC6QKBY6.js} +11 -9
- package/dist/{memory-poisoning-defense-K5Q74XQ4.js → memory-poisoning-defense-BRGIHF6J.js} +9 -7
- package/dist/{memory-pressure-watchdog-YMJH5CSA.js → memory-pressure-watchdog-HR6TPOMT.js} +22 -20
- package/dist/{memory-reflection-7BZWIHRE.js → memory-reflection-LO7VFBL3.js} +38 -59
- package/dist/memory-write-repository-J25USX63.js +16 -0
- package/dist/{monitor-grants-Q7X3MYQP.js → monitor-grants-YQTO6NWR.js} +3 -3
- package/dist/{monitor-identity-ZQB4IXEE.js → monitor-identity-POVTG76Y.js} +2 -2
- package/dist/{notification-ledger-XRAXL5OI.js → notification-ledger-KLD6GZTG.js} +22 -20
- package/dist/{notifications-JE3PX55X.js → notifications-3R6HNHDR.js} +21 -19
- package/dist/{orchestration-events-JCQ5F5IJ.js → orchestration-events-CHY3GOJD.js} +7 -5
- package/dist/{orchestrator-X65INDTR.js → orchestrator-GAL3HOAD.js} +23 -21
- package/dist/{org-brief-session-3PQ22UIX.js → org-brief-session-LQ2DBYVF.js} +17 -15
- package/dist/{org-consent-policy-VGELJ7K7.js → org-consent-policy-KFUP7QPG.js} +5 -5
- package/dist/{org-join-6TO5ZYUZ.js → org-join-MXZCIQWX.js} +8 -8
- package/dist/{org-key-admin-XHYVRRAZ.js → org-key-admin-4UK6QUT7.js} +9 -9
- package/dist/{org-key-pin-TTTYGTQL.js → org-key-pin-ZOX4OM3O.js} +3 -3
- package/dist/{org-membership-Y7T2BS57.js → org-membership-D5TPN45F.js} +4 -4
- package/dist/{org-partner-config-OP4NEUNF.js → org-partner-config-3FXSYPQA.js} +7 -7
- package/dist/{org-partner-runtime-YNVUNT2R.js → org-partner-runtime-TH3LMPII.js} +20 -16
- package/dist/{org-row-visibility-JBBXNYXD.js → org-row-visibility-Y5R33C5U.js} +1 -1
- package/dist/{pipeline-router-EIBB7QNG.js → pipeline-router-E2JZLDK6.js} +7 -5
- package/dist/{plan-limits-MEWXYLEN.js → plan-limits-NYI6R4IK.js} +9 -7
- package/dist/{platform-procedures-Z7ZGBJWN.js → platform-procedures-RTD5E3BD.js} +5 -3
- package/dist/{pre-tool-use-impl-C6KJY22W.js → pre-tool-use-impl-LT4FRXBP.js} +127 -83
- package/dist/{project-boot-VEYFCCSL.js → project-boot-LIMXQKAF.js} +25 -17
- package/dist/{project-name-UYORSNGE.js → project-name-V62GWALX.js} +7 -5
- package/dist/{projection-worker-WYFDWS57.js → projection-worker-KLE3IZQ2.js} +5 -2
- package/dist/{prospective-memory-E6XBQFJA.js → prospective-memory-HRN7JFT2.js} +6 -4
- package/dist/{push-notifications-M7YU63FY.js → push-notifications-XC6EQEXF.js} +22 -20
- package/dist/{reproject-worktree-memories-B5XMGJSD.js → reproject-worktree-memories-4CAVZSFE.js} +21 -19
- package/dist/{reranker-SRA4BR7N.js → reranker-2RU6IIX2.js} +1 -1
- package/dist/{retrieval-health-P2JPZUPV.js → retrieval-health-4Q5TOV2S.js} +1 -1
- package/dist/{review-polling-KQPN7IQE.js → review-polling-WOWIMBCL.js} +22 -20
- package/dist/runtime/index.js +30 -28
- package/dist/{session-events-6LDDKKY3.js → session-events-OPMS2C5F.js} +22 -20
- package/dist/{session-kill-telemetry-5DSRGWCL.js → session-kill-telemetry-3GWATSIX.js} +22 -20
- package/dist/{session-scope-XG5R3P3D.js → session-scope-TIRGR4MH.js} +21 -19
- package/dist/{setup-wizard-7QFLZIKT.js → setup-wizard-B2JBVGNH.js} +3 -3
- package/dist/{shard-manager-HHHHV2KZ.js → shard-manager-C7LYX6E4.js} +5 -1
- package/dist/{skill-refinement-I5RMAHSC.js → skill-refinement-FWQFYNBI.js} +7 -5
- package/dist/skill-retrieval-PPLFC5RY.js +166 -0
- package/dist/skill-usage-NDB67PU2.js +25 -0
- package/dist/{stack-generate-manifest-AKMZ3AUX.js → stack-generate-manifest-AXI55MEQ.js} +6 -6
- package/dist/{stack-promote-34CE2HHF.js → stack-promote-6N23OGZY.js} +6 -6
- package/dist/stack-release-2CXFYVWM.js +2770 -0
- package/dist/{stack-update-ZQQ5YYPJ.js → stack-update-U53FBVCQ.js} +13 -5
- package/dist/{steward-gate-AQJ6KT2C.js → steward-gate-TUA3QCN7.js} +7 -5
- package/dist/{subagent-brief-injection-3GU7YAWY.js → subagent-brief-injection-N52RWYFZ.js} +34 -32
- package/dist/{subagent-spawn-ledger-52I66CLW.js → subagent-spawn-ledger-OI23OT4I.js} +1 -1
- package/dist/support-bug-actions-XWCJI6S5.js +30 -0
- package/dist/support-inbox-MMVTCXRX.js +77 -0
- package/dist/{support-outbox-KNI3FR3G.js → support-outbox-2TG2UV6J.js} +2 -2
- package/dist/{task-enforcement-CAA6D2MH.js → task-enforcement-JDMBAAOY.js} +22 -20
- package/dist/{task-request-inbox-QBZVU66E.js → task-request-inbox-PKJCYKJV.js} +9 -5
- package/dist/{task-scope-NHXB4ZRN.js → task-scope-32HQEV6W.js} +27 -19
- package/dist/{tasks-crud-JHSWL5NM.js → tasks-crud-CYKUKS3F.js} +21 -19
- package/dist/{tasks-notify-7PBE4U7T.js → tasks-notify-YND5MKWJ.js} +22 -20
- package/dist/{tasks-review-PPPVEE62.js → tasks-review-CG2A5GM3.js} +23 -19
- package/dist/{telemetry-upload-YU2VRNHX.js → telemetry-upload-WLUMEFAB.js} +11 -9
- package/dist/{token-budget-QCMWKG3K.js → token-budget-3YHAY5LL.js} +7 -5
- package/dist/{tool-capability-index-7AWQAJRP.js → tool-capability-index-2ADOWH43.js} +2 -2
- package/dist/{tool-gates-5Q3RSQEG.js → tool-gates-7ENOOYMR.js} +5 -3
- package/dist/{tool-gates-QD26D2NE.js → tool-gates-EKJTLVGN.js} +1 -1
- package/dist/{tool-telemetry-LTOIC64I.js → tool-telemetry-VUP7S6HC.js} +1 -1
- package/dist/tui/App.js +59 -35
- package/dist/{tui-data-NDBXD6U7.js → tui-data-BOQTOW2G.js} +25 -23
- package/dist/{update-support-BMJM4NG7.js → update-support-WT3S3AQ4.js} +21 -21
- package/dist/{whatsapp-QQLDAHUX.js → whatsapp-OZGIF2EM.js} +2 -2
- package/dist/{wiki-acl-W6WDCVCP.js → wiki-acl-LTEQJVDA.js} +1 -1
- package/dist/{work-claims-6DM32MGO.js → work-claims-CMV2GWIW.js} +8 -6
- package/dist/{work-state-heartbeat-HG7D4AWJ.js → work-state-heartbeat-S45TXK4M.js} +1 -1
- package/dist/{worker-gate-FTMW7GBB.js → worker-gate-7Z6NMM3G.js} +1 -1
- package/dist/{workflow-engine-ZWC6CCXE.js → workflow-engine-ZSQDXZQ7.js} +2 -2
- package/dist/{worktree-EMQCPGFE.js → worktree-NMWDVT6N.js} +8 -6
- package/dist/worktree-ownership-guard-ZVIWJAOP.js +35 -0
- package/dist/{worktree-sweep-XVUJZBXV.js → worktree-sweep-Q62ZIT3U.js} +9 -7
- package/package.json +14 -8
- package/release-notes.json +7 -41
- package/src/commands/exe/afk.md +6 -0
- package/src/commands/exe/call.md +6 -0
- package/src/commands/exe/employee-heartbeat.md +6 -0
- package/src/commands/exe/intercom.md +6 -0
- package/src/commands/exe/kill.md +6 -0
- package/src/commands/exe/launch.md +6 -0
- package/src/commands/exe/logs.md +1 -1
- package/src/commands/exe/sessions.md +6 -0
- package/src/commands/exe/setup.md +7 -3
- package/src/commands/exe/status.md +6 -0
- package/src/commands/exe-reference.md +25 -36
- package/src/commands/exe.md +19 -28
- package/stack.release.json +11 -11
- package/dist/chunk-3B6FLNLV.js +0 -30
- package/dist/chunk-FXU7JOXK.js +0 -6
- package/dist/chunk-QFAFKEB5.js +0 -820
- package/dist/conversations-retention-C4BLKFEL.js +0 -54
- package/dist/stack-release-5PGWV5D4.js +0 -1607
- package/dist/support-inbox-NY5TB3FN.js +0 -51
- /package/dist/{chunk-U2D6PJ5T.js → chunk-65G7ZTGE.js} +0 -0
- /package/dist/{chunk-DN3ZR3UE.js → chunk-CP7Z35MJ.js} +0 -0
- /package/dist/{chunk-XDVOGDBC.js → chunk-KBBWALJV.js} +0 -0
- /package/dist/{chunk-JRIH6I7D.js → chunk-LZXYPTY4.js} +0 -0
- /package/dist/{chunk-GIRD7O5X.js → chunk-MCWEW2SG.js} +0 -0
- /package/dist/{chunk-TKAU7IJ2.js → chunk-MQHUJLCA.js} +0 -0
- /package/dist/{chunk-M4XY4JRK.js → chunk-O53LTOXK.js} +0 -0
- /package/dist/{chunk-DZN7SDY2.js → chunk-OSVTH3SG.js} +0 -0
- /package/dist/{chunk-AJK2PVQW.js → chunk-QXXEXGX3.js} +0 -0
- /package/dist/{chunk-AWWDKF22.js → chunk-SFWNTO2F.js} +0 -0
- /package/dist/{chunk-2Q2CD6CD.js → chunk-WC5HF2FN.js} +0 -0
- /package/dist/{core-memory-O6D5UC3T.js → core-memory-MMMW3TF3.js} +0 -0
- /package/dist/{memory-isolation-EBFFC6HF.js → memory-isolation-67ACKQ2M.js} +0 -0
- /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
|
-
|
|
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
|
-
|
|
1626
|
+
cur = path2.isAbsolute(p) ? path2.parse(path2.resolve(p)).root : realDir(path2.resolve(cwd));
|
|
1619
1627
|
} catch {
|
|
1620
|
-
return
|
|
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 (
|
|
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
|
|
1641
|
-
function
|
|
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
|
|
1648
|
-
HOME
|
|
1649
|
-
|
|
1650
|
-
|
|
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
|
|
1663
|
-
|
|
1664
|
-
const
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
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
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
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
|
{
|
|
@@ -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-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
92
|
+
return dedupPredicate(input).args;
|
|
77
93
|
}
|
|
78
94
|
function scopedDedupSql(excludeId = false) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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-
|
|
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;
|