@askexenow/exe-os 0.9.340 → 0.9.342
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +159 -196
- package/deploy/compose/.env.customer.example +1 -0
- package/deploy/compose/.env.example +1 -0
- package/deploy/compose/docker-compose.yml +13 -4
- package/deploy/compose/generate-env.ts +4 -0
- package/dist/{active-agent-EC6M7KTX.js → active-agent-PVGE57FY.js} +5 -5
- package/dist/{active-agent-WHIUCHLA.js → active-agent-TNIO6IY3.js} +5 -5
- package/dist/{agentic-ontology-RNSXGXW4.js → agentic-ontology-3FXYMHKW.js} +1 -1
- package/dist/{backfill-gate-J7UXFNXU.js → backfill-gate-65LSYVE5.js} +3 -3
- package/dist/{backfill-metadata-MFY6BHKE.js → backfill-metadata-ZSMZC45J.js} +8 -8
- package/dist/{background-jobs-STURKDCS.js → background-jobs-EXR5RVGG.js} +3 -3
- package/dist/backup-verify-3Y2FHGZU.js +425 -0
- package/dist/{behaviors-HLZUJSMP.js → behaviors-KYRB3NGJ.js} +9 -9
- package/dist/bin/age-ontology-load.js +3 -3
- package/dist/bin/agentic-ontology-backfill.js +10 -10
- package/dist/bin/agentic-reflection-backfill.js +11 -11
- package/dist/bin/agentic-semantic-label.js +10 -10
- package/dist/bin/backfill-conversations.js +10 -10
- package/dist/bin/backfill-responses.js +10 -10
- package/dist/bin/backfill-vectors.js +14 -14
- package/dist/bin/bulk-sync-postgres.js +19 -19
- package/dist/bin/cc-doctor.js +10 -8
- package/dist/bin/cleanup-stale-review-tasks.js +26 -24
- package/dist/bin/cli.js +111 -25
- package/dist/bin/customer-readiness.js +1 -1
- package/dist/bin/deferred-daemon-restart.js +97 -90
- package/dist/bin/exe-agent-config.js +9 -8
- package/dist/bin/exe-agent.js +20 -20
- package/dist/bin/exe-assign.js +12 -12
- package/dist/bin/exe-boot.js +201 -68
- package/dist/bin/exe-call.js +7 -7
- package/dist/bin/exe-cloud.js +20 -20
- package/dist/bin/exe-config-dump.js +9 -8
- package/dist/bin/exe-dispatch.js +26 -24
- package/dist/bin/exe-doctor.js +10 -6
- package/dist/bin/exe-export-behaviors.js +11 -11
- package/dist/bin/exe-forget.js +12 -10
- package/dist/bin/exe-gateway.js +15 -10
- package/dist/bin/exe-grant.js +5 -5
- package/dist/bin/exe-healthcheck.js +14 -8
- package/dist/bin/exe-heartbeat.js +29 -28
- package/dist/bin/exe-kill.js +31 -29
- package/dist/bin/exe-launch-agent.js +129 -68
- package/dist/bin/exe-memory-reads.js +257 -0
- package/dist/bin/exe-new-employee.js +12 -11
- package/dist/bin/exe-pending-messages.js +27 -25
- package/dist/bin/exe-pending-notifications.js +26 -24
- package/dist/bin/exe-pending-reviews.js +26 -24
- package/dist/bin/exe-rename.js +7 -7
- package/dist/bin/exe-review.js +30 -28
- package/dist/bin/exe-search.js +11 -9
- package/dist/bin/exe-session-cleanup.js +116 -86
- package/dist/bin/exe-settings.js +24 -23
- package/dist/bin/exe-start-codex.js +163 -41
- package/dist/bin/exe-start-opencode.js +15 -15
- package/dist/bin/exe-status.js +27 -25
- package/dist/bin/exe-support.js +5 -5
- package/dist/bin/exe-team.js +5 -5
- package/dist/bin/exe-timers.js +32 -213
- package/dist/bin/exe-watchdog.js +6 -5
- package/dist/bin/git-sweep.js +27 -25
- package/dist/bin/graph-backfill.js +9 -9
- package/dist/bin/graph-export.js +9 -9
- package/dist/bin/import-history.js +11 -11
- package/dist/bin/install.js +102 -95
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +6 -6
- package/dist/bin/postgres-agentic-reflection-backfill.js +5 -5
- package/dist/bin/postgres-agentic-semantic-backfill.js +7 -7
- package/dist/bin/pre-publish.js +5 -3
- package/dist/bin/reconcile-backlog.js +484 -0
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/scan-tasks.js +26 -24
- package/dist/bin/setup.js +6 -5
- package/dist/bin/shard-migrate.js +9 -9
- package/dist/bin/stack-update.js +15 -9
- package/dist/bin/update.js +1 -1
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/boot-generation-BL2ISK4U.js +22 -0
- package/dist/boot-review-sections-DBMQJT5N.js +107 -0
- package/dist/branch-hygiene-TZWK6QCF.js +224 -0
- package/dist/{branding-JTEOF4ZV.js → branding-DVXBGVDH.js} +3 -3
- package/dist/{browser-session-store-CXQMOSEC.js → browser-session-store-B2NR3LIX.js} +2 -1
- package/dist/{capability-cards-YOKVMMOL.js → capability-cards-DN5UIKVN.js} +4 -4
- package/dist/{capacity-monitor-S54IOWRL.js → capacity-monitor-ZG5GGFR2.js} +27 -25
- package/dist/{catchup-brief-DRRQCMKA.js → catchup-brief-D6HH6DWS.js} +32 -29
- package/dist/{support-outbox-MGUVVGHT.js → chunk-25X4JD2V.js} +28 -12
- package/dist/{chunk-IYB2NIW3.js → chunk-2KZNGDSW.js} +1 -1
- package/dist/{chunk-FUIIVSW6.js → chunk-2WAVZ5UJ.js} +1 -1
- package/dist/{chunk-K5WFKEXQ.js → chunk-2ZYO73KO.js} +4 -3
- package/dist/{chunk-CLAYNAXC.js → chunk-3EUMUSLE.js} +1 -1
- package/dist/{chunk-BVV6NHKQ.js → chunk-3SW4OEHB.js} +5 -5
- package/dist/{task-enforcement-VI7L43DC.js → chunk-4CMVFVFC.js} +173 -69
- package/dist/{chunk-BU2QQWBQ.js → chunk-4J4PMPXZ.js} +3 -2
- package/dist/{chunk-JD5S5AAV.js → chunk-4N2NRGCM.js} +2 -2
- package/dist/chunk-4QCFFW2H.js +378 -0
- package/dist/{chunk-7EA7LYW4.js → chunk-4VSV5P4D.js} +4 -4
- package/dist/{chunk-52KNOQMK.js → chunk-4ZCD2UWW.js} +39 -10
- package/dist/{chunk-DZ6OQM67.js → chunk-5ERDIOV3.js} +2 -2
- package/dist/chunk-5H47VHB7.js +30 -0
- package/dist/{chunk-UCQITDLM.js → chunk-5TY4FPH6.js} +1 -1
- package/dist/{chunk-R44Z32O2.js → chunk-6CH3TPHR.js} +2 -2
- package/dist/{chunk-WYLV4S6A.js → chunk-6WQ3NNCE.js} +3 -3
- package/dist/{chunk-HHIBOU3P.js → chunk-6XWTQUO4.js} +1 -1
- package/dist/chunk-76CJBM36.js +88 -0
- package/dist/{chunk-H2L4PHGH.js → chunk-7CTRGNLW.js} +2 -2
- package/dist/{chunk-XUKPALWT.js → chunk-7V4JADD6.js} +2 -2
- package/dist/{chunk-RMOBQ6A5.js → chunk-AD2VCHSS.js} +1 -1
- package/dist/{chunk-QXSBB26A.js → chunk-AJYCFKJR.js} +1 -1
- package/dist/chunk-AM7S2TY6.js +54 -0
- package/dist/{chunk-HEPR6QTL.js → chunk-AOHXREB7.js} +334 -66
- package/dist/{chunk-FNZR3B7U.js → chunk-ASAFVDVR.js} +1 -1
- package/dist/{chunk-TALWBVZE.js → chunk-BUCXNV32.js} +1 -1
- package/dist/{chunk-SHIICYJW.js → chunk-BYTDMAGB.js} +4 -2
- package/dist/{chunk-32SXNM3G.js → chunk-C5QAPURN.js} +1 -1
- package/dist/{chunk-XCTGRD4S.js → chunk-CE7F6RHG.js} +587 -77
- package/dist/{chunk-7WPOJDTA.js → chunk-CNVBKDEY.js} +21 -15
- package/dist/{chunk-KPIN44GZ.js → chunk-CWXVH7WV.js} +1 -1
- package/dist/chunk-D74XYSA3.js +621 -0
- package/dist/{chunk-A47MXY2I.js → chunk-EQHQF5IM.js} +50 -32
- package/dist/{chunk-AOO77BDE.js → chunk-EUS4QUKP.js} +1 -1
- package/dist/{chunk-RLRT2BVM.js → chunk-EV46QTD3.js} +1 -1
- package/dist/{chunk-PAEXYFMY.js → chunk-F27XXN6C.js} +1 -1
- package/dist/{chunk-XQNNB5GY.js → chunk-F55P3H4S.js} +37 -2
- package/dist/{chunk-MWZFF3Q7.js → chunk-F5O7V7UK.js} +1 -1
- package/dist/{chunk-LMZISHSJ.js → chunk-FPFPLPUY.js} +6 -6
- package/dist/{chunk-7TS64TBG.js → chunk-G4RGKBCA.js} +8 -3
- package/dist/{chunk-4IYSBPX3.js → chunk-G5T6KDG4.js} +1 -1
- package/dist/{chunk-7WDXEKUL.js → chunk-GBTTBXAF.js} +4 -4
- package/dist/{chunk-6MRWJMI5.js → chunk-GDIJE6D7.js} +1 -1
- package/dist/{chunk-AVKXCSBI.js → chunk-GG5NDQNN.js} +2 -2
- package/dist/{chunk-I3XKO3KQ.js → chunk-GJ26DULE.js} +2 -2
- package/dist/chunk-GL57PO3K.js +104 -0
- package/dist/chunk-GWDSB25T.js +6 -0
- package/dist/{chunk-F55JF43M.js → chunk-H6BV5TKD.js} +39 -24
- package/dist/{chunk-HCJCW7X4.js → chunk-H7I47RS5.js} +34 -1
- package/dist/{chunk-65SVQELL.js → chunk-HA5R6USD.js} +31 -5
- package/dist/{chunk-VJHUVFIW.js → chunk-HAF2DJYV.js} +3 -3
- package/dist/chunk-HJ447YER.js +224 -0
- package/dist/chunk-HV4KESRY.js +395 -0
- package/dist/{chunk-B76TSEP3.js → chunk-I26FWCSP.js} +216 -9
- package/dist/{chunk-X2FHTDIU.js → chunk-IBYL4DHM.js} +1 -1
- package/dist/{chunk-JCBKARSK.js → chunk-IOEUAQWP.js} +1 -1
- package/dist/{chunk-MW2GJJ53.js → chunk-JGIPOUIK.js} +3 -3
- package/dist/{chunk-2233TQCA.js → chunk-JLZ4RYSD.js} +2 -2
- package/dist/{chunk-Q7L6G6KV.js → chunk-JMYHW3AL.js} +2 -2
- package/dist/{chunk-OJTJYEMX.js → chunk-JPUZPAAF.js} +4 -4
- package/dist/{chunk-XWHE4LZK.js → chunk-JTBIS4R5.js} +21 -2
- package/dist/{chunk-5Z5NATNS.js → chunk-K7KFGDWF.js} +1 -1
- package/dist/{chunk-UIV2WPBT.js → chunk-KGWRTRKC.js} +2 -2
- package/dist/{chunk-KTPG4XKI.js → chunk-KP3U5QGJ.js} +1 -1
- package/dist/{chunk-TLYAEISW.js → chunk-KW2SD2FL.js} +2 -2
- package/dist/{chunk-X7H3HMFH.js → chunk-KWZMQACA.js} +11 -7
- package/dist/{chunk-OFX5B2S7.js → chunk-L2R3LN2P.js} +1 -1
- package/dist/{chunk-T4KZ2Z2N.js → chunk-L4A5DL6Z.js} +3 -3
- package/dist/{chunk-X425OEYF.js → chunk-LU2FALL6.js} +3 -3
- package/dist/{chunk-6M36JFFD.js → chunk-MKYFAKDW.js} +4 -4
- package/dist/{chunk-I5RLNOFK.js → chunk-MOPUCPXK.js} +12 -4
- package/dist/{chunk-ZIVEA3NB.js → chunk-MR6LHP4F.js} +1 -1
- package/dist/chunk-MVYB76QG.js +341 -0
- package/dist/{chunk-2SG2UGCH.js → chunk-MZM6EJCU.js} +4 -4
- package/dist/{chunk-ZREGOV2Q.js → chunk-N7QJKQMX.js} +258 -14
- package/dist/{chunk-QLFRCA6I.js → chunk-NBZL5CGA.js} +93 -12
- package/dist/{chunk-QFPTDSY2.js → chunk-NN2B2QKU.js} +1 -1
- package/dist/chunk-NX5INHHG.js +40 -0
- package/dist/{chunk-B75BOKEI.js → chunk-NXUSDL37.js} +2 -2
- package/dist/{chunk-TPHCZDE3.js → chunk-O5V57XYE.js} +1 -1
- package/dist/chunk-O7LWR36Z.js +269 -0
- package/dist/{chunk-ATOU6CYR.js → chunk-OLMQ4UOF.js} +57 -11
- package/dist/{chunk-6HBURYON.js → chunk-OTF44GXL.js} +4 -4
- package/dist/{chunk-DILD54TU.js → chunk-OZEBAGKR.js} +277 -137
- package/dist/{chunk-DADMPMYX.js → chunk-P5HIWY2E.js} +1 -1
- package/dist/{chunk-EIF2LQHZ.js → chunk-PDWS3E22.js} +55 -4
- package/dist/{chunk-KTY7I7UH.js → chunk-PPCDBE6Z.js} +1 -1
- package/dist/{chunk-XACL67CS.js → chunk-PQIDGXSG.js} +13 -4
- package/dist/chunk-PWUFMX75.js +186 -0
- package/dist/{chunk-UPWE5NOG.js → chunk-QDGZJ653.js} +3 -3
- package/dist/{chunk-MQRFKSLI.js → chunk-QOO5RW3K.js} +6 -5
- package/dist/{chunk-KCC5A7YL.js → chunk-QQ4E2RYW.js} +95 -18
- package/dist/{chunk-BPC5LZ6Y.js → chunk-QRYVCDWS.js} +2 -2
- package/dist/{chunk-Z42MXYWW.js → chunk-QWVXN224.js} +110 -28
- package/dist/{chunk-542EWGY3.js → chunk-QYZJHTNE.js} +26 -27
- package/dist/{chunk-I7Z6KTGF.js → chunk-R2NN3JKH.js} +43 -6
- package/dist/{chunk-3OBWSCJN.js → chunk-RACAOE2Z.js} +14 -14
- package/dist/{chunk-5RACW3LX.js → chunk-RAXVPNMR.js} +1 -1
- package/dist/{chunk-2HZY3ECT.js → chunk-RHWZUUS4.js} +6 -6
- package/dist/{chunk-RNAYCUNM.js → chunk-S3THSOWV.js} +1 -1
- package/dist/{chunk-W7DHFGCB.js → chunk-S7QUM2UK.js} +2 -2
- package/dist/{chunk-SSTLTIF3.js → chunk-SKGMF2SO.js} +25 -2
- package/dist/{chunk-GN45PBWI.js → chunk-SQKXKV2Y.js} +2 -2
- package/dist/{chunk-QZLIZAS7.js → chunk-TLT7NZCW.js} +4 -4
- package/dist/chunk-TTCUG2CF.js +91 -0
- package/dist/chunk-UEA3LXOB.js +40 -0
- package/dist/{chunk-DRCRZIIJ.js → chunk-UNXQBELK.js} +1 -1
- package/dist/{chunk-PLRIJALF.js → chunk-UP75Z5X7.js} +921 -176
- package/dist/{chunk-TNJRWUCE.js → chunk-USSB56WK.js} +1 -1
- package/dist/{chunk-KMBEL7VB.js → chunk-UUEKJDK6.js} +90 -10
- package/dist/{chunk-XJI7Z6LZ.js → chunk-UUQBZPJJ.js} +1 -1
- package/dist/{chunk-RRWDYOQS.js → chunk-V3EEVY4L.js} +1 -1
- package/dist/{chunk-N5I7RL3I.js → chunk-VPZHJCKW.js} +2 -2
- package/dist/chunk-VRAQTFD6.js +265 -0
- package/dist/{chunk-H37HHX3E.js → chunk-VSRPS3J7.js} +14 -14
- package/dist/{chunk-5ZNY7IZI.js → chunk-WMESXBJM.js} +37 -3
- package/dist/{chunk-54QCG45Y.js → chunk-WOYADZF5.js} +56 -5
- package/dist/{chunk-7Y5UDEVM.js → chunk-WZHZCDDO.js} +6 -5
- package/dist/{chunk-3NGZ4PL7.js → chunk-X2Q5NLUL.js} +11 -2
- package/dist/{chunk-YE7NH53A.js → chunk-X33NYQYJ.js} +2 -2
- package/dist/{chunk-UXBD22CD.js → chunk-XHK3FS3W.js} +3 -2
- package/dist/{chunk-3QDSCJ3F.js → chunk-XZXBB3TN.js} +2 -2
- package/dist/{chunk-JSKBHUR7.js → chunk-YCANDMI2.js} +2 -2
- package/dist/{chunk-JBSCL2XT.js → chunk-YLXTKI6M.js} +1 -1
- package/dist/{chunk-G7WO77Z2.js → chunk-YTCFACP4.js} +812 -896
- package/dist/{chunk-LTVCRHHD.js → chunk-Z6RSN7KS.js} +7 -6
- package/dist/{cleanup-graph-garbage-KUABW6LS.js → cleanup-graph-garbage-XWUFAMFO.js} +6 -6
- package/dist/{co-activation-XMPHKGHR.js → co-activation-ZCHPLLP6.js} +4 -4
- package/dist/{co-occurrence-SHKSJ6CV.js → co-occurrence-KG3LKALN.js} +4 -4
- package/dist/{code-context-index-EXXDY3QZ.js → code-context-index-WSOJQ72R.js} +5 -5
- package/dist/{content-extractor-RHITF2KM.js → content-extractor-NXYNEF5K.js} +2 -2
- package/dist/{conversation-wiki-populator-WU4HEQ7C.js → conversation-wiki-populator-WQN3IUU6.js} +1 -1
- package/dist/{crdt-sync-UJELKSNX.js → crdt-sync-4PFGPZXV.js} +8 -1
- package/dist/{crm-webhook-HHNBS7LY.js → crm-webhook-II7Z45Q6.js} +2 -2
- package/dist/cto-delegation-gate-JWWOJPNC.js +669 -0
- package/dist/{daemon-auth-7IFSV5FG.js → daemon-auth-3FEAHFWC.js} +5 -3
- package/dist/{daemon-orchestration-7QB6QOXT.js → daemon-orchestration-FX4XZDR5.js} +46 -27
- package/dist/{daemon-ready-5XI5BIJD.js → daemon-ready-4JTSFKAY.js} +1 -1
- package/dist/{daemon-ready-signal-E7VMIQ6I.js → daemon-ready-signal-LPAZWQOV.js} +5 -1
- package/dist/daemon-restart-circuit-breaker-PEGEIP6H.js +35 -0
- package/dist/daemon-timer-report-NM44WQRH.js +25 -0
- package/dist/{db-backup-DLD4QZBO.js → db-backup-W2QFSYQC.js} +15 -5
- package/dist/{db-restore-events-JVEEP52Z.js → db-restore-events-MQ2DBGEQ.js} +2 -2
- package/dist/dispatch-ack-VYH3ONSS.js +27 -0
- package/dist/{doc-graph-extractor-3TRLGD7M.js → doc-graph-extractor-F6ODFIID.js} +4 -4
- package/dist/{documents-FHIBU7KJ.js → documents-23WX2FPQ.js} +12 -12
- package/dist/dreaming-NWD22UQ5.js +46 -0
- package/dist/{exe-drift-KY2KHZEL.js → exe-drift-CW72FBGE.js} +5 -5
- package/dist/{exe-export-SP6G3QF6.js → exe-export-AUJ7CV7G.js} +11 -11
- package/dist/{exe-import-KJU7FBVQ.js → exe-import-JX4I52VE.js} +11 -11
- package/dist/{exe-key-M6TYHNUW.js → exe-key-2N6LY2BU.js} +241 -226
- package/dist/{exe-org-BGZNNE4H.js → exe-org-X4CSNCKS.js} +3 -3
- package/dist/{exe-snapshot-ZNPGUKRZ.js → exe-snapshot-XZ7FVCYZ.js} +31 -29
- package/dist/{fast-db-init-QQB6IVWV.js → fast-db-init-4CWHSOOR.js} +1 -1
- package/dist/{founder-context-PQR3BUS7.js → founder-context-7L3CFPYN.js} +4 -4
- package/dist/gateway/index.js +14 -14
- package/dist/{gateway-client-GRBOJQYC.js → gateway-client-7LMZKHTH.js} +1 -1
- package/dist/git-main-guard-UZP3KXYI.js +39 -0
- package/dist/{git-staleness-UGB5J3K7.js → git-staleness-CI2R4QOJ.js} +4 -4
- package/dist/{global-procedures-R7KRREEK.js → global-procedures-XQX3LUH6.js} +6 -6
- package/dist/{graph-auto-extract-LKIQ57PL.js → graph-auto-extract-OURWMGBS.js} +4 -4
- package/dist/{hook-integrity-WURH6DS3.js → hook-integrity-XY47IM7G.js} +1 -1
- package/dist/hook-prefetch-PHRRKY4C.js +137 -0
- package/dist/hooks/bug-report-worker.js +32 -28
- package/dist/hooks/codex-stop-task-finalizer.js +32 -28
- package/dist/hooks/commit-complete.js +29 -27
- package/dist/hooks/error-recall.js +12 -11
- package/dist/hooks/exe-heartbeat-hook.js +6 -6
- package/dist/hooks/ingest-worker.js +11 -11
- package/dist/hooks/ingest.js +18 -18
- package/dist/hooks/instructions-loaded.js +7 -7
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +7 -7
- package/dist/hooks/post-compact.js +28 -26
- package/dist/hooks/post-tool-combined.js +12 -12
- package/dist/hooks/pre-compact.js +29 -27
- package/dist/hooks/pre-tool-use.js +180 -47
- package/dist/hooks/prompt-submit.js +324 -273
- package/dist/hooks/session-end.js +35 -33
- package/dist/hooks/session-start.js +28 -21
- package/dist/hooks/stop.js +35 -33
- package/dist/hooks/subagent-stop.js +28 -26
- package/dist/hooks/summary-worker.js +36 -34
- package/dist/index.js +39 -37
- package/dist/{installer-SB2N5NKH.js → installer-G3JAO3NT.js} +9 -9
- package/dist/{installer-MZWWBXM6.js → installer-JND3RJ6Q.js} +9 -9
- package/dist/{installer-MNPXDLGG.js → installer-L7EVH5U5.js} +9 -9
- package/dist/{intercom-queue-VU2G6F5R.js → intercom-queue-ZFEQALR3.js} +25 -23
- package/dist/{key-backup-status-TNEHXA2X.js → key-backup-status-LOSMVATJ.js} +2 -2
- package/dist/lib/agent-config.js +4 -3
- package/dist/lib/cloud-sync.js +19 -19
- package/dist/lib/config.js +2 -2
- package/dist/lib/consolidation.js +9 -9
- package/dist/lib/crypto.js +3 -3
- package/dist/lib/database.js +6 -4
- package/dist/lib/db-daemon-client.js +5 -5
- package/dist/lib/db-read-worker-client.js +9 -3
- package/dist/lib/db.js +6 -4
- package/dist/lib/device-registry.js +3 -3
- package/dist/lib/embed-worker.js +2 -2
- package/dist/lib/embedder.js +5 -5
- package/dist/lib/employee-templates.js +7 -7
- package/dist/lib/employees.js +10 -4
- package/dist/lib/exe-daemon-client.js +4 -4
- package/dist/lib/exe-daemon.js +651 -158
- package/dist/lib/hybrid-search.js +11 -9
- package/dist/lib/identity.js +4 -4
- package/dist/lib/keychain.js +1 -1
- package/dist/lib/license.js +4 -4
- package/dist/lib/messaging.js +28 -24
- package/dist/lib/post-tool-memory.js +3 -3
- package/dist/lib/registry-proxy.js +1 -1
- package/dist/lib/reminders.js +15 -7
- package/dist/lib/schedules.js +9 -9
- package/dist/lib/session-registry.js +6 -6
- package/dist/lib/skill-learning.js +10 -10
- package/dist/lib/status-brief.js +4 -4
- package/dist/lib/store.js +8 -8
- package/dist/lib/task-router.js +5 -5
- package/dist/lib/tasks.js +29 -25
- package/dist/lib/tmux-routing.js +56 -25
- package/dist/lib/tmux-status.js +9 -3
- package/dist/lib/tmux-transport.js +1 -1
- package/dist/lib/token-spend.js +5 -5
- package/dist/lib/transport.js +2 -2
- package/dist/lib/ws-client.js +1 -1
- package/dist/{license-gate-BYDMFMFT.js → license-gate-QTRQHV4F.js} +5 -5
- package/dist/{license-sync-N3RNYVP2.js → license-sync-N3UJFWAW.js} +4 -4
- package/dist/mcp/register-tools.js +96 -89
- package/dist/mcp/server.js +98 -91
- package/dist/mcp/tools/complete-reminder.js +6 -6
- package/dist/mcp/tools/create-reminder.js +6 -6
- package/dist/mcp/tools/create-task.js +37 -28
- package/dist/mcp/tools/deactivate-behavior.js +11 -11
- package/dist/mcp/tools/list-reminders.js +6 -6
- package/dist/mcp/tools/list-tasks.js +35 -29
- package/dist/mcp/tools/send-message.js +28 -26
- package/dist/mcp/tools/update-task.js +34 -28
- package/dist/{mcp-http-config-EMAVS2JI.js → mcp-http-config-BDL36JZ3.js} +6 -6
- package/dist/{mcp-port-config-FFAMMLLE.js → mcp-port-config-6HYY6J7K.js} +2 -2
- package/dist/mcp-session-identity-T7H2EKFQ.js +177 -0
- package/dist/{memory-cards-TQRLZI4D.js → memory-cards-ZRDW7QBX.js} +8 -8
- package/dist/{memory-graph-extractor-IWGNVAFU.js → memory-graph-extractor-QLXDMHRS.js} +5 -5
- package/dist/{memory-poisoning-defense-T4ITBGSG.js → memory-poisoning-defense-HJTXYCWH.js} +4 -4
- package/dist/{memory-pressure-watchdog-RRIAXPXQ.js → memory-pressure-watchdog-HN5X7AVN.js} +76 -37
- package/dist/{memory-queue-X2CSEAKE.js → memory-queue-2UOOF27L.js} +5 -3
- package/dist/{memory-queue-client-BKQHTYTH.js → memory-queue-client-O5U6F6XP.js} +6 -6
- package/dist/{memory-reflection-6N4J2FL7.js → memory-reflection-WVNFBJAA.js} +4 -4
- package/dist/{monitor-grants-RZOVSYVO.js → monitor-grants-E3ELDEWD.js} +5 -5
- package/dist/{monitor-identity-MOXISYNG.js → monitor-identity-GLFZSEAH.js} +2 -2
- package/dist/notification-ledger-SZEPGJQ7.js +409 -0
- package/dist/{notifications-KONB3C62.js → notifications-4UT53CDG.js} +25 -23
- package/dist/{orchestration-events-5SIJOE4H.js → orchestration-events-WV4NWKZH.js} +5 -5
- package/dist/{orchestration-phase-CXRCBCK7.js → orchestration-phase-AWBXPO52.js} +3 -3
- package/dist/orchestrator-UAC3RW2T.js +47 -0
- package/dist/{pipeline-router-O6HU7DKH.js → pipeline-router-LM53NMWJ.js} +5 -5
- package/dist/{plan-limits-GRNBOBB3.js → plan-limits-2FEY2GOS.js} +7 -7
- package/dist/platform-procedures-X5DFJFV7.js +13 -0
- package/dist/{preferences-TYTGDXQZ.js → preferences-TWIXZBKS.js} +2 -2
- package/dist/{project-boot-SD7GM24K.js → project-boot-4NUH5FRU.js} +2 -2
- package/dist/{projection-worker-ZVOFHTXT.js → projection-worker-FZ7YSN3G.js} +5 -5
- package/dist/{prospective-memory-W6S67LZZ.js → prospective-memory-6D2ASWM3.js} +4 -4
- package/dist/{push-notifications-W5JRXLKJ.js → push-notifications-U6FIBQRW.js} +3 -3
- package/dist/{reranker-QATGTAPC.js → reranker-GYYRPANK.js} +3 -3
- package/dist/{retrieval-health-TWHKYCRK.js → retrieval-health-4Z242P3B.js} +1 -1
- package/dist/{review-polling-PCMD5BFN.js → review-polling-HXAFJZDA.js} +26 -24
- package/dist/runtime/index.js +37 -35
- package/dist/{session-events-3LCVQEL7.js → session-events-O3BV56ZX.js} +26 -24
- package/dist/{session-kill-telemetry-CZSPN5V6.js → session-kill-telemetry-AELE4JDK.js} +26 -24
- package/dist/session-mcp-config-YKNXG5DW.js +50 -0
- package/dist/{session-scope-CFHVSVAQ.js → session-scope-5EAPUT45.js} +25 -23
- package/dist/setup-wizard-NB6R4QVS.js +14 -0
- package/dist/{shard-manager-MBWQEYNG.js → shard-manager-35PWFR3B.js} +3 -3
- package/dist/{skill-refinement-74T6VDFM.js → skill-refinement-DVSYXBBP.js} +5 -5
- package/dist/stack-promote-RSOWO6EY.js +130 -0
- package/dist/{stack-release-XXMV7SPX.js → stack-release-HGFFFCGC.js} +112 -22
- package/dist/{stack-update-E2TKHHSQ.js → stack-update-ATCJFOEK.js} +7 -5
- package/dist/{steward-gate-WT7WXQIE.js → steward-gate-3GQ5XKMJ.js} +5 -5
- package/dist/support-inbox-4L62P4EP.js +33 -0
- package/dist/support-outbox-WHGPUYL2.js +16 -0
- package/dist/task-enforcement-IPIZX2MM.js +90 -0
- package/dist/{task-scope-CQEG5SSJ.js → task-scope-FOIW25HR.js} +27 -23
- package/dist/{tasks-crud-UGK5A25L.js → tasks-crud-HBDKE6C5.js} +35 -23
- package/dist/tasks-notify-G2U2U2YA.js +53 -0
- package/dist/{tasks-review-JKBRACII.js → tasks-review-27SFX5XN.js} +27 -23
- package/dist/{telemetry-upload-7LBYGPCB.js → telemetry-upload-ZOXHRWR5.js} +9 -9
- package/dist/tmux-command-guard-KSJKIX3C.js +117 -0
- package/dist/{token-budget-QBRJR4M5.js → token-budget-5Y4YPDO3.js} +5 -5
- package/dist/{tool-capability-index-Q6YQDL7I.js → tool-capability-index-VYF5GNJ2.js} +1 -1
- package/dist/{tool-telemetry-ULIDUK3P.js → tool-telemetry-KBXSBDTK.js} +1 -1
- package/dist/tui/App.js +40 -38
- package/dist/{tui-data-NPTGKT37.js → tui-data-NLFMBIQI.js} +25 -23
- package/dist/{update-check-HFO4VHO4.js → update-check-3FHAWIG2.js} +7 -3
- package/dist/update-support-UVUSZG7R.js +355 -0
- package/dist/{whatsapp-accounts-BWRZUY23.js → whatsapp-accounts-BFIOXYW5.js} +1 -1
- package/dist/{whatsapp-config-GOSELKTE.js → whatsapp-config-FAX6EA5K.js} +20 -13
- package/dist/{worker-gate-MXUQUG4M.js → worker-gate-3KUBAU32.js} +3 -3
- package/dist/{workflow-engine-EWCOLD47.js → workflow-engine-YITHXZR5.js} +2 -2
- package/dist/{working-memory-PY4AG577.js → working-memory-NUVB5SFV.js} +1 -1
- package/dist/worktree-LL62PLQB.js +47 -0
- package/dist/{worktree-sweep-ZAG3V24E.js → worktree-sweep-WTK3MTKH.js} +7 -7
- package/package.json +3 -2
- package/release-notes.json +86 -76
- package/dist/branch-hygiene-R5NVTRAY.js +0 -138
- package/dist/chunk-6IRVGOUL.js +0 -30
- package/dist/chunk-HMP5VT6A.js +0 -118
- package/dist/chunk-PVYR4FCQ.js +0 -113
- package/dist/chunk-UFAXZ2PY.js +0 -138
- package/dist/chunk-Y25OJWOQ.js +0 -45
- package/dist/chunk-YGAAZN3E.js +0 -47
- package/dist/cto-delegation-gate-DXNF5HVW.js +0 -290
- package/dist/dispatch-ack-4S44HBWB.js +0 -15
- package/dist/dreaming-OMFUEUCQ.js +0 -44
- package/dist/orchestrator-DUUX7FQV.js +0 -45
- package/dist/setup-wizard-TOFEJPLF.js +0 -13
- package/dist/tasks-notify-SMLDFBWM.js +0 -50
- package/dist/worktree-GVF2I5FP.js +0 -31
- /package/dist/{chunk-FLNSJ2TC.js → chunk-GIBYNT6W.js} +0 -0
- /package/dist/{chunk-NQBRGXYR.js → chunk-JRM4TAGS.js} +0 -0
- /package/dist/{chunk-WHRTDN5J.js → chunk-MGGOSFCR.js} +0 -0
- /package/dist/{chunk-D3QASX2W.js → chunk-QIFYLIUF.js} +0 -0
- /package/dist/{chunk-OADURIIN.js → chunk-WTH4CSAP.js} +0 -0
- /package/dist/{core-memory-VO5ZIBKH.js → core-memory-GAC6EWOQ.js} +0 -0
- /package/dist/{entity-boost-DNI4A5I7.js → entity-boost-NT6UO2Z3.js} +0 -0
- /package/dist/{message-queue-client-Q5BW3O5W.js → message-queue-client-4EOQRUXW.js} +0 -0
- /package/dist/{oauth-server-ROQFOEMM.js → oauth-server-67YBDP32.js} +0 -0
- /package/dist/{webhook-pipe-FZYLO6RR.js → webhook-pipe-LEXMUQ5B.js} +0 -0
- /package/dist/{wiki-acl-JA5UCQZ4.js → wiki-acl-74BLWG6J.js} +0 -0
- /package/dist/{wiki-client-VNDOBK63.js → wiki-client-EAN7F5LV.js} +0 -0
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-2I23RPSI.js";
|
|
4
4
|
import {
|
|
5
5
|
listBackups
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-OLMQ4UOF.js";
|
|
7
7
|
import {
|
|
8
8
|
getEmotionalBaseline,
|
|
9
9
|
renderEmotionalBaselineSection
|
|
@@ -20,16 +20,108 @@ import {
|
|
|
20
20
|
import {
|
|
21
21
|
EXE_AI_DIR,
|
|
22
22
|
loadConfigSync
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-WZHZCDDO.js";
|
|
24
24
|
import {
|
|
25
25
|
atomicWriteJson
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-BYTDMAGB.js";
|
|
27
27
|
|
|
28
28
|
// src/lib/database.ts
|
|
29
|
-
import { chmodSync, existsSync as
|
|
29
|
+
import { chmodSync, existsSync as existsSync4, statSync, copyFileSync, unlinkSync as unlinkSync3, openSync as openSync2, closeSync as closeSync2, mkdirSync as mkdirSync2, renameSync as renameSync2, readFileSync as readFileSync3, writeSync, fsyncSync, fstatSync } from "fs";
|
|
30
30
|
import { createClient } from "@libsql/client";
|
|
31
31
|
import { homedir, totalmem } from "os";
|
|
32
|
-
import { join } from "path";
|
|
32
|
+
import { join, dirname } from "path";
|
|
33
|
+
|
|
34
|
+
// src/lib/legacy-db-cleanup.ts
|
|
35
|
+
import { existsSync, lstatSync, openSync, readSync, closeSync, unlinkSync } from "fs";
|
|
36
|
+
import path from "path";
|
|
37
|
+
var SQLITE_PLAINTEXT_MAGIC = "SQLite format 3\0";
|
|
38
|
+
var LEGACY_MAIN_STUBS = [
|
|
39
|
+
"db.sqlite",
|
|
40
|
+
"db.sqlite3",
|
|
41
|
+
"db",
|
|
42
|
+
"db.sqlite.corrupted"
|
|
43
|
+
];
|
|
44
|
+
var SIDECAR_PARENT = "db.sqlite";
|
|
45
|
+
var LEGACY_SIDECARS = [
|
|
46
|
+
"db.sqlite-wal",
|
|
47
|
+
"db.sqlite-shm",
|
|
48
|
+
"db.sqlite-journal"
|
|
49
|
+
];
|
|
50
|
+
var PROTECTED_DB_NAMES = [
|
|
51
|
+
"memories.db",
|
|
52
|
+
"exe-mem.db",
|
|
53
|
+
"exe-os.db",
|
|
54
|
+
"exe.db"
|
|
55
|
+
];
|
|
56
|
+
function isPlaintextSqlite(filePath) {
|
|
57
|
+
let fd = -1;
|
|
58
|
+
try {
|
|
59
|
+
fd = openSync(filePath, "r");
|
|
60
|
+
const buf = Buffer.alloc(16);
|
|
61
|
+
const read = readSync(fd, buf, 0, 16, 0);
|
|
62
|
+
if (read < 16) return false;
|
|
63
|
+
return buf.toString("latin1") === SQLITE_PLAINTEXT_MAGIC;
|
|
64
|
+
} catch {
|
|
65
|
+
return false;
|
|
66
|
+
} finally {
|
|
67
|
+
if (fd >= 0) {
|
|
68
|
+
try {
|
|
69
|
+
closeSync(fd);
|
|
70
|
+
} catch {
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function inspect(filePath) {
|
|
76
|
+
try {
|
|
77
|
+
const st = lstatSync(filePath);
|
|
78
|
+
if (st.isSymbolicLink() || !st.isFile()) return { removable: false, size: -1 };
|
|
79
|
+
return { removable: true, size: st.size };
|
|
80
|
+
} catch {
|
|
81
|
+
return { removable: false, size: -1 };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function cleanupLegacyPlaintextStubs(dir, activeDbPath) {
|
|
85
|
+
const removed = [];
|
|
86
|
+
const activeBase = activeDbPath ? path.basename(activeDbPath) : null;
|
|
87
|
+
const skip = (name) => name === activeBase || PROTECTED_DB_NAMES.includes(name);
|
|
88
|
+
for (const name of LEGACY_MAIN_STUBS) {
|
|
89
|
+
if (skip(name)) continue;
|
|
90
|
+
const filePath = path.join(dir, name);
|
|
91
|
+
try {
|
|
92
|
+
const { removable, size } = inspect(filePath);
|
|
93
|
+
if (!removable) continue;
|
|
94
|
+
if (size === 0 || isPlaintextSqlite(filePath)) {
|
|
95
|
+
unlinkSync(filePath);
|
|
96
|
+
removed.push(filePath);
|
|
97
|
+
}
|
|
98
|
+
} catch {
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const parentPath = path.join(dir, SIDECAR_PARENT);
|
|
102
|
+
const parentRemoved = removed.some((p) => path.basename(p) === SIDECAR_PARENT);
|
|
103
|
+
const parentGone = parentRemoved || !existsSync(parentPath);
|
|
104
|
+
if (parentGone) {
|
|
105
|
+
for (const name of LEGACY_SIDECARS) {
|
|
106
|
+
if (skip(name)) continue;
|
|
107
|
+
const filePath = path.join(dir, name);
|
|
108
|
+
try {
|
|
109
|
+
const { removable } = inspect(filePath);
|
|
110
|
+
if (!removable) continue;
|
|
111
|
+
unlinkSync(filePath);
|
|
112
|
+
removed.push(filePath);
|
|
113
|
+
} catch {
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (removed.length > 0) {
|
|
118
|
+
process.stderr.write(
|
|
119
|
+
`[exe-os] Removed ${removed.length} legacy plaintext SQLite stub(s) from ${dir}: ${removed.map((p) => path.basename(p)).join(", ")}
|
|
120
|
+
`
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
return removed;
|
|
124
|
+
}
|
|
33
125
|
|
|
34
126
|
// src/lib/db-retry.ts
|
|
35
127
|
var MAX_RETRIES = 5;
|
|
@@ -82,24 +174,24 @@ function wrapWithRetry(client) {
|
|
|
82
174
|
|
|
83
175
|
// src/lib/employees.ts
|
|
84
176
|
import { readFile, mkdir } from "fs/promises";
|
|
85
|
-
import { existsSync as
|
|
177
|
+
import { existsSync as existsSync3, lstatSync as lstatSync2, symlinkSync, readlinkSync, readFileSync as readFileSync2, renameSync, unlinkSync as unlinkSync2, writeFileSync as writeFileSync2 } from "fs";
|
|
86
178
|
import { execSync } from "child_process";
|
|
87
|
-
import
|
|
179
|
+
import path3 from "path";
|
|
88
180
|
import os from "os";
|
|
89
181
|
|
|
90
182
|
// src/lib/identity.ts
|
|
91
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
183
|
+
import { existsSync as existsSync2, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
92
184
|
import { readdirSync } from "fs";
|
|
93
|
-
import
|
|
185
|
+
import path2 from "path";
|
|
94
186
|
import { createHash } from "crypto";
|
|
95
|
-
var IDENTITY_DIR =
|
|
187
|
+
var IDENTITY_DIR = path2.join(EXE_AI_DIR, "identity");
|
|
96
188
|
function ensureDir() {
|
|
97
|
-
if (!
|
|
189
|
+
if (!existsSync2(IDENTITY_DIR)) {
|
|
98
190
|
mkdirSync(IDENTITY_DIR, { recursive: true });
|
|
99
191
|
}
|
|
100
192
|
}
|
|
101
193
|
function identityPath(agentId) {
|
|
102
|
-
return
|
|
194
|
+
return path2.join(IDENTITY_DIR, `${agentId}.md`);
|
|
103
195
|
}
|
|
104
196
|
function sanitizeIdentityBody(body) {
|
|
105
197
|
return body.replace(/<!--[\s\S]*?-->/g, "").trim();
|
|
@@ -147,7 +239,7 @@ function contentHash(content) {
|
|
|
147
239
|
}
|
|
148
240
|
function getIdentity(agentId) {
|
|
149
241
|
const filePath = identityPath(agentId);
|
|
150
|
-
if (!
|
|
242
|
+
if (!existsSync2(filePath)) return null;
|
|
151
243
|
const raw = readFileSync(filePath, "utf-8");
|
|
152
244
|
const { frontmatter, body } = parseFrontmatter(raw);
|
|
153
245
|
return {
|
|
@@ -231,7 +323,7 @@ ${teamLines.join("\n")}`);
|
|
|
231
323
|
}
|
|
232
324
|
|
|
233
325
|
// src/lib/employees.ts
|
|
234
|
-
var EMPLOYEES_PATH =
|
|
326
|
+
var EMPLOYEES_PATH = path3.join(EXE_AI_DIR, "exe-employees.json");
|
|
235
327
|
var DEFAULT_BOOT_TIMEOUT_MS = 45e3;
|
|
236
328
|
var DEFAULT_COORDINATOR_TEMPLATE_NAME = "exe";
|
|
237
329
|
var COORDINATOR_ROLE = "COO";
|
|
@@ -271,13 +363,40 @@ var MANAGER_ROLES = /* @__PURE__ */ new Map([
|
|
|
271
363
|
["cmo", /* @__PURE__ */ new Set(["content production specialist", "specialist"])],
|
|
272
364
|
["gm", /* @__PURE__ */ new Set(["specialist"])]
|
|
273
365
|
]);
|
|
366
|
+
function isManagementRole(role) {
|
|
367
|
+
return isCoordinatorRole(role) || MANAGER_ROLES.has(normalizeRole(role));
|
|
368
|
+
}
|
|
369
|
+
function isManagementIdentity(agentId, employees = loadEmployeesSync()) {
|
|
370
|
+
if (!agentId) return false;
|
|
371
|
+
if (agentId === "default") return true;
|
|
372
|
+
const base = baseAgentName(agentId, employees);
|
|
373
|
+
const emp = getEmployee(employees, base);
|
|
374
|
+
return isManagementRole(emp?.role);
|
|
375
|
+
}
|
|
376
|
+
var _authzUnenforcedWarned = false;
|
|
377
|
+
function warnAuthzUnenforcedOnce() {
|
|
378
|
+
if (_authzUnenforcedWarned) return;
|
|
379
|
+
_authzUnenforcedWarned = true;
|
|
380
|
+
console.warn(
|
|
381
|
+
"[employees] chain-of-command authz is UNENFORCED: no roster configured (exe-employees.json missing/empty). Cross-agent writes are permitted. Configure a roster to enforce the chain of command."
|
|
382
|
+
);
|
|
383
|
+
}
|
|
274
384
|
function canManage(callerName, callerRole, targetName, employees = loadEmployeesSync()) {
|
|
275
|
-
|
|
385
|
+
void callerRole;
|
|
386
|
+
if (callerName === "default") return true;
|
|
387
|
+
if (employees.length === 0) {
|
|
388
|
+
warnAuthzUnenforcedOnce();
|
|
389
|
+
return true;
|
|
390
|
+
}
|
|
391
|
+
const callerBase = baseAgentName(callerName ?? "", employees);
|
|
392
|
+
const callerEmp = getEmployee(employees, callerBase);
|
|
393
|
+
if (!callerEmp) return false;
|
|
394
|
+
const effectiveCallerRole = callerEmp.role;
|
|
395
|
+
if (isCoordinatorRole(effectiveCallerRole)) return true;
|
|
276
396
|
const targetBase = baseAgentName(targetName, employees);
|
|
277
397
|
const targetEmp = getEmployee(employees, targetBase);
|
|
278
398
|
if (!targetEmp) return false;
|
|
279
|
-
const
|
|
280
|
-
const allowedSubordinates = MANAGER_ROLES.get(normalizedCallerRole);
|
|
399
|
+
const allowedSubordinates = MANAGER_ROLES.get(normalizeRole(effectiveCallerRole));
|
|
281
400
|
if (!allowedSubordinates) return false;
|
|
282
401
|
return allowedSubordinates.has(normalizeRole(targetEmp.role));
|
|
283
402
|
}
|
|
@@ -299,7 +418,7 @@ function validateEmployeeName(name) {
|
|
|
299
418
|
return { valid: true };
|
|
300
419
|
}
|
|
301
420
|
async function loadEmployees(employeesPath = EMPLOYEES_PATH) {
|
|
302
|
-
if (!
|
|
421
|
+
if (!existsSync3(employeesPath)) {
|
|
303
422
|
return [];
|
|
304
423
|
}
|
|
305
424
|
const raw = await readFile(employeesPath, "utf-8");
|
|
@@ -310,17 +429,36 @@ async function loadEmployees(employeesPath = EMPLOYEES_PATH) {
|
|
|
310
429
|
}
|
|
311
430
|
}
|
|
312
431
|
async function saveEmployees(employees, employeesPath = EMPLOYEES_PATH) {
|
|
313
|
-
await mkdir(
|
|
432
|
+
await mkdir(path3.dirname(employeesPath), { recursive: true });
|
|
314
433
|
await atomicWriteJson(employeesPath, employees);
|
|
315
434
|
}
|
|
316
|
-
function
|
|
317
|
-
|
|
435
|
+
function loadEmployeesState(employeesPath = EMPLOYEES_PATH) {
|
|
436
|
+
let raw;
|
|
318
437
|
try {
|
|
319
|
-
|
|
438
|
+
raw = readFileSync2(employeesPath, "utf-8");
|
|
439
|
+
} catch (err) {
|
|
440
|
+
const code = err?.code;
|
|
441
|
+
if (code === "ENOENT") {
|
|
442
|
+
try {
|
|
443
|
+
lstatSync2(employeesPath);
|
|
444
|
+
return { employees: [], status: "error" };
|
|
445
|
+
} catch {
|
|
446
|
+
return { employees: [], status: "missing" };
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return { employees: [], status: "error" };
|
|
450
|
+
}
|
|
451
|
+
try {
|
|
452
|
+
const parsed = JSON.parse(raw);
|
|
453
|
+
if (!Array.isArray(parsed)) return { employees: [], status: "error" };
|
|
454
|
+
return { employees: parsed, status: "ok" };
|
|
320
455
|
} catch {
|
|
321
|
-
return [];
|
|
456
|
+
return { employees: [], status: "error" };
|
|
322
457
|
}
|
|
323
458
|
}
|
|
459
|
+
function loadEmployeesSync(employeesPath = EMPLOYEES_PATH) {
|
|
460
|
+
return loadEmployeesState(employeesPath).employees;
|
|
461
|
+
}
|
|
324
462
|
function getEmployee(employees, name) {
|
|
325
463
|
return employees.find((e) => e.name.toLowerCase() === name.toLowerCase());
|
|
326
464
|
}
|
|
@@ -340,8 +478,9 @@ function hasRole(agentName, role) {
|
|
|
340
478
|
function baseAgentName(name, employees) {
|
|
341
479
|
const match = name.match(/^([a-zA-Z]+)\d+$/);
|
|
342
480
|
if (!match) return name;
|
|
343
|
-
const base = match[1];
|
|
344
481
|
const roster = employees ?? loadEmployeesSync();
|
|
482
|
+
if (getEmployee(roster, name)) return name;
|
|
483
|
+
const base = match[1];
|
|
345
484
|
if (getEmployee(roster, base)) return base;
|
|
346
485
|
return name;
|
|
347
486
|
}
|
|
@@ -380,13 +519,13 @@ function addEmployee(employees, employee) {
|
|
|
380
519
|
}
|
|
381
520
|
return [...employees, normalized];
|
|
382
521
|
}
|
|
383
|
-
var IDENTITY_DIR2 =
|
|
522
|
+
var IDENTITY_DIR2 = path3.join(EXE_AI_DIR, "identity");
|
|
384
523
|
var TEAM_SECTION_RE = /^## Team\b.*$/m;
|
|
385
524
|
function appendToCoordinatorTeam(employee) {
|
|
386
525
|
const coordinator = getCoordinatorEmployee(loadEmployeesSync());
|
|
387
526
|
if (!coordinator) return;
|
|
388
|
-
const idPath =
|
|
389
|
-
if (!
|
|
527
|
+
const idPath = path3.join(IDENTITY_DIR2, `${coordinator.name}.md`);
|
|
528
|
+
if (!existsSync3(idPath)) return;
|
|
390
529
|
const content = readFileSync2(idPath, "utf-8");
|
|
391
530
|
if (content.includes(`**${capitalize(employee.name)}`)) return;
|
|
392
531
|
const teamMatch = content.match(TEAM_SECTION_RE);
|
|
@@ -437,16 +576,16 @@ async function normalizeRosterCase(rosterPath) {
|
|
|
437
576
|
emp.name = emp.name.toLowerCase();
|
|
438
577
|
changed = true;
|
|
439
578
|
try {
|
|
440
|
-
const identityDir =
|
|
441
|
-
const oldPath =
|
|
442
|
-
const newPath =
|
|
443
|
-
if (
|
|
579
|
+
const identityDir = path3.join(os.homedir(), ".exe-os", "identity");
|
|
580
|
+
const oldPath = path3.join(identityDir, `${oldName}.md`);
|
|
581
|
+
const newPath = path3.join(identityDir, `${emp.name}.md`);
|
|
582
|
+
if (existsSync3(oldPath) && !existsSync3(newPath)) {
|
|
444
583
|
renameSync(oldPath, newPath);
|
|
445
|
-
} else if (
|
|
584
|
+
} else if (existsSync3(oldPath) && oldPath !== newPath) {
|
|
446
585
|
const content = readFileSync2(oldPath, "utf-8");
|
|
447
586
|
writeFileSync2(newPath, content, "utf-8");
|
|
448
587
|
if (oldPath.toLowerCase() !== newPath.toLowerCase()) {
|
|
449
|
-
|
|
588
|
+
unlinkSync2(oldPath);
|
|
450
589
|
}
|
|
451
590
|
}
|
|
452
591
|
} catch {
|
|
@@ -474,7 +613,7 @@ function registerBinSymlinks(name) {
|
|
|
474
613
|
errors.push("Could not find 'exe-os' in PATH");
|
|
475
614
|
return { created, skipped, errors };
|
|
476
615
|
}
|
|
477
|
-
const binDir =
|
|
616
|
+
const binDir = path3.dirname(exeBinPath);
|
|
478
617
|
let target;
|
|
479
618
|
try {
|
|
480
619
|
target = readlinkSync(exeBinPath);
|
|
@@ -484,8 +623,8 @@ function registerBinSymlinks(name) {
|
|
|
484
623
|
}
|
|
485
624
|
for (const suffix of ["", "-opencode"]) {
|
|
486
625
|
const linkName = `${name}${suffix}`;
|
|
487
|
-
const linkPath =
|
|
488
|
-
if (
|
|
626
|
+
const linkPath = path3.join(binDir, linkName);
|
|
627
|
+
if (existsSync3(linkPath)) {
|
|
489
628
|
skipped.push(linkName);
|
|
490
629
|
continue;
|
|
491
630
|
}
|
|
@@ -501,7 +640,7 @@ function registerBinSymlinks(name) {
|
|
|
501
640
|
|
|
502
641
|
// src/lib/database-adapter.ts
|
|
503
642
|
import os2 from "os";
|
|
504
|
-
import
|
|
643
|
+
import path4 from "path";
|
|
505
644
|
import { createRequire } from "module";
|
|
506
645
|
import { pathToFileURL } from "url";
|
|
507
646
|
var VIEW_MAPPINGS = [
|
|
@@ -865,8 +1004,8 @@ async function loadPrismaClient() {
|
|
|
865
1004
|
}
|
|
866
1005
|
return new PrismaClient2();
|
|
867
1006
|
}
|
|
868
|
-
const exeDbRoot = process.env.EXE_DB_ROOT ??
|
|
869
|
-
const requireFromExeDb = createRequire(
|
|
1007
|
+
const exeDbRoot = process.env.EXE_DB_ROOT ?? path4.join(os2.homedir(), "exe-db");
|
|
1008
|
+
const requireFromExeDb = createRequire(path4.join(exeDbRoot, "package.json"));
|
|
870
1009
|
const prismaEntry = requireFromExeDb.resolve("@prisma/client");
|
|
871
1010
|
const module = await import(pathToFileURL(prismaEntry).href);
|
|
872
1011
|
const PrismaClient = module.PrismaClient ?? module.default?.PrismaClient;
|
|
@@ -1113,13 +1252,25 @@ async function executeAddColumn(client, sql, context = "migration add column") {
|
|
|
1113
1252
|
return false;
|
|
1114
1253
|
}
|
|
1115
1254
|
}
|
|
1255
|
+
async function ensureIdempotencyKeyMigration(client) {
|
|
1256
|
+
await executeAddColumn(
|
|
1257
|
+
client,
|
|
1258
|
+
`ALTER TABLE tasks ADD COLUMN idempotency_key TEXT`,
|
|
1259
|
+
"migration add tasks.idempotency_key"
|
|
1260
|
+
);
|
|
1261
|
+
await client.execute(
|
|
1262
|
+
`CREATE UNIQUE INDEX IF NOT EXISTS idx_tasks_idempotency_key
|
|
1263
|
+
ON tasks(idempotency_key)
|
|
1264
|
+
WHERE idempotency_key IS NOT NULL`
|
|
1265
|
+
);
|
|
1266
|
+
}
|
|
1116
1267
|
async function migrateReflectionDedup(client) {
|
|
1117
1268
|
const added = await executeAddColumn(
|
|
1118
1269
|
client,
|
|
1119
1270
|
"ALTER TABLE memory_reflections ADD COLUMN dedup_key TEXT",
|
|
1120
1271
|
"migration add memory_reflections.dedup_key"
|
|
1121
1272
|
);
|
|
1122
|
-
const { reflectionDedupKey } = await import("./memory-reflection-
|
|
1273
|
+
const { reflectionDedupKey } = await import("./memory-reflection-WVNFBJAA.js");
|
|
1123
1274
|
const keyForRow = (row) => {
|
|
1124
1275
|
let sources = [];
|
|
1125
1276
|
try {
|
|
@@ -1233,7 +1384,7 @@ function pidIsAlive(pid) {
|
|
|
1233
1384
|
}
|
|
1234
1385
|
}
|
|
1235
1386
|
function tryTakeLock(lockPath) {
|
|
1236
|
-
_lockFd =
|
|
1387
|
+
_lockFd = openSync2(lockPath, "wx");
|
|
1237
1388
|
try {
|
|
1238
1389
|
writeSync(_lockFd, `${process.pid}
|
|
1239
1390
|
`);
|
|
@@ -1244,6 +1395,18 @@ function tryTakeLock(lockPath) {
|
|
|
1244
1395
|
logCatchDebug("lock pid write", e);
|
|
1245
1396
|
}
|
|
1246
1397
|
}
|
|
1398
|
+
function isDbLockHeldByLiveProcess() {
|
|
1399
|
+
try {
|
|
1400
|
+
const lockPath = dbLockPath();
|
|
1401
|
+
if (!existsSync4(lockPath)) return false;
|
|
1402
|
+
const holderPid = readLockHolderPid(lockPath);
|
|
1403
|
+
if (holderPid === null) return false;
|
|
1404
|
+
if (holderPid === process.pid) return false;
|
|
1405
|
+
return pidIsAlive(holderPid);
|
|
1406
|
+
} catch {
|
|
1407
|
+
return false;
|
|
1408
|
+
}
|
|
1409
|
+
}
|
|
1247
1410
|
async function acquireDbLock(options = {}) {
|
|
1248
1411
|
const lockPath = dbLockPath();
|
|
1249
1412
|
const waitMs = options.waitMs ?? dbLockWaitMs();
|
|
@@ -1281,7 +1444,7 @@ async function acquireDbLock(options = {}) {
|
|
|
1281
1444
|
`
|
|
1282
1445
|
);
|
|
1283
1446
|
try {
|
|
1284
|
-
|
|
1447
|
+
unlinkSync3(lockPath);
|
|
1285
1448
|
} catch (e) {
|
|
1286
1449
|
logCatchDebug("stale lock unlink", e);
|
|
1287
1450
|
}
|
|
@@ -1313,7 +1476,7 @@ function releaseDbLock() {
|
|
|
1313
1476
|
if (_lockFd !== null) {
|
|
1314
1477
|
const identity = _lockIdentity;
|
|
1315
1478
|
try {
|
|
1316
|
-
|
|
1479
|
+
closeSync2(_lockFd);
|
|
1317
1480
|
} catch (e) {
|
|
1318
1481
|
logCatchDebug("lock close", e);
|
|
1319
1482
|
}
|
|
@@ -1323,7 +1486,7 @@ function releaseDbLock() {
|
|
|
1323
1486
|
const lockPath = identity?.path ?? dbLockPath();
|
|
1324
1487
|
const st = statSync(lockPath);
|
|
1325
1488
|
if (!identity || st.dev === identity.dev && st.ino === identity.ino) {
|
|
1326
|
-
|
|
1489
|
+
unlinkSync3(lockPath);
|
|
1327
1490
|
}
|
|
1328
1491
|
} catch (e) {
|
|
1329
1492
|
logCatchDebug("lock unlink", e);
|
|
@@ -1376,7 +1539,7 @@ async function _attemptBackupRestore(config) {
|
|
|
1376
1539
|
renameSync2(config.dbPath, corruptPath);
|
|
1377
1540
|
for (const suffix of ["-wal", "-shm"]) {
|
|
1378
1541
|
const sidePath = config.dbPath + suffix;
|
|
1379
|
-
if (
|
|
1542
|
+
if (existsSync4(sidePath)) {
|
|
1380
1543
|
try {
|
|
1381
1544
|
renameSync2(sidePath, corruptPath + suffix);
|
|
1382
1545
|
} catch {
|
|
@@ -1402,7 +1565,7 @@ async function _attemptBackupRestore(config) {
|
|
|
1402
1565
|
try {
|
|
1403
1566
|
copyFileSync(backup.path, config.dbPath);
|
|
1404
1567
|
const backupWal = backup.path + "-wal";
|
|
1405
|
-
if (
|
|
1568
|
+
if (existsSync4(backupWal)) {
|
|
1406
1569
|
copyFileSync(backupWal, config.dbPath + "-wal");
|
|
1407
1570
|
}
|
|
1408
1571
|
const opts = {
|
|
@@ -1418,15 +1581,15 @@ async function _attemptBackupRestore(config) {
|
|
|
1418
1581
|
if (isCorrupt) {
|
|
1419
1582
|
testClient.close();
|
|
1420
1583
|
try {
|
|
1421
|
-
|
|
1584
|
+
unlinkSync3(config.dbPath);
|
|
1422
1585
|
} catch {
|
|
1423
1586
|
}
|
|
1424
1587
|
try {
|
|
1425
|
-
|
|
1588
|
+
unlinkSync3(config.dbPath + "-wal");
|
|
1426
1589
|
} catch {
|
|
1427
1590
|
}
|
|
1428
1591
|
try {
|
|
1429
|
-
|
|
1592
|
+
unlinkSync3(config.dbPath + "-shm");
|
|
1430
1593
|
} catch {
|
|
1431
1594
|
}
|
|
1432
1595
|
process.stderr.write(
|
|
@@ -1447,7 +1610,7 @@ async function _attemptBackupRestore(config) {
|
|
|
1447
1610
|
`
|
|
1448
1611
|
);
|
|
1449
1612
|
try {
|
|
1450
|
-
const { recordDbRestoreEvent } = await import("./db-restore-events-
|
|
1613
|
+
const { recordDbRestoreEvent } = await import("./db-restore-events-MQ2DBGEQ.js");
|
|
1451
1614
|
recordDbRestoreEvent({
|
|
1452
1615
|
kind: "auto-restore",
|
|
1453
1616
|
restoredFrom: backup.name,
|
|
@@ -1459,7 +1622,7 @@ async function _attemptBackupRestore(config) {
|
|
|
1459
1622
|
} catch {
|
|
1460
1623
|
}
|
|
1461
1624
|
try {
|
|
1462
|
-
const { pruneCorruptQuarantine } = await import("./db-backup-
|
|
1625
|
+
const { pruneCorruptQuarantine } = await import("./db-backup-W2QFSYQC.js");
|
|
1463
1626
|
pruneCorruptQuarantine();
|
|
1464
1627
|
} catch {
|
|
1465
1628
|
}
|
|
@@ -1470,15 +1633,15 @@ async function _attemptBackupRestore(config) {
|
|
|
1470
1633
|
`
|
|
1471
1634
|
);
|
|
1472
1635
|
try {
|
|
1473
|
-
|
|
1636
|
+
unlinkSync3(config.dbPath);
|
|
1474
1637
|
} catch {
|
|
1475
1638
|
}
|
|
1476
1639
|
try {
|
|
1477
|
-
|
|
1640
|
+
unlinkSync3(config.dbPath + "-wal");
|
|
1478
1641
|
} catch {
|
|
1479
1642
|
}
|
|
1480
1643
|
try {
|
|
1481
|
-
|
|
1644
|
+
unlinkSync3(config.dbPath + "-shm");
|
|
1482
1645
|
} catch {
|
|
1483
1646
|
}
|
|
1484
1647
|
continue;
|
|
@@ -1490,7 +1653,7 @@ async function _attemptBackupRestore(config) {
|
|
|
1490
1653
|
`
|
|
1491
1654
|
);
|
|
1492
1655
|
try {
|
|
1493
|
-
const { recordDbRestoreEvent } = await import("./db-restore-events-
|
|
1656
|
+
const { recordDbRestoreEvent } = await import("./db-restore-events-MQ2DBGEQ.js");
|
|
1494
1657
|
recordDbRestoreEvent({
|
|
1495
1658
|
kind: "restore-failed",
|
|
1496
1659
|
quarantinePath: corruptPath,
|
|
@@ -1570,21 +1733,25 @@ async function optimizeFtsIndexes(client = getRawClient(), pages = FTS_MERGE_PAG
|
|
|
1570
1733
|
var initTurso = initDatabase;
|
|
1571
1734
|
async function initDatabase(config) {
|
|
1572
1735
|
assertValidDbPath(config?.dbPath, "initDatabase");
|
|
1736
|
+
try {
|
|
1737
|
+
cleanupLegacyPlaintextStubs(dirname(config.dbPath), config.dbPath);
|
|
1738
|
+
} catch {
|
|
1739
|
+
}
|
|
1573
1740
|
await acquireDbLock();
|
|
1574
|
-
if (
|
|
1741
|
+
if (existsSync4(config.dbPath)) {
|
|
1575
1742
|
const dbStat = statSync(config.dbPath);
|
|
1576
1743
|
if (dbStat.size === 0) {
|
|
1577
1744
|
const walPath = config.dbPath + "-wal";
|
|
1578
|
-
if (
|
|
1745
|
+
if (existsSync4(walPath) && statSync(walPath).size > 0) {
|
|
1579
1746
|
const backupPath = config.dbPath + ".zeroed-" + Date.now();
|
|
1580
1747
|
copyFileSync(config.dbPath, backupPath);
|
|
1581
|
-
|
|
1748
|
+
unlinkSync3(config.dbPath);
|
|
1582
1749
|
process.stderr.write(
|
|
1583
1750
|
`[database] CRITICAL: DB was 0 bytes. Moved to ${backupPath}, attempting WAL recovery.
|
|
1584
1751
|
`
|
|
1585
1752
|
);
|
|
1586
1753
|
try {
|
|
1587
|
-
const { recordDbRestoreEvent } = await import("./db-restore-events-
|
|
1754
|
+
const { recordDbRestoreEvent } = await import("./db-restore-events-MQ2DBGEQ.js");
|
|
1588
1755
|
recordDbRestoreEvent({
|
|
1589
1756
|
kind: "wal-recovery",
|
|
1590
1757
|
quarantinePath: backupPath,
|
|
@@ -1598,7 +1765,7 @@ async function initDatabase(config) {
|
|
|
1598
1765
|
`
|
|
1599
1766
|
);
|
|
1600
1767
|
try {
|
|
1601
|
-
const { recordDbRestoreEvent } = await import("./db-restore-events-
|
|
1768
|
+
const { recordDbRestoreEvent } = await import("./db-restore-events-MQ2DBGEQ.js");
|
|
1602
1769
|
recordDbRestoreEvent({
|
|
1603
1770
|
kind: "zeroed-no-wal",
|
|
1604
1771
|
detail: "DB was 0 bytes at startup with no WAL available \u2014 data may be lost"
|
|
@@ -1865,7 +2032,7 @@ function getRawClient() {
|
|
|
1865
2032
|
function tryGetRawClient() {
|
|
1866
2033
|
return _client;
|
|
1867
2034
|
}
|
|
1868
|
-
var CURRENT_SCHEMA_VERSION =
|
|
2035
|
+
var CURRENT_SCHEMA_VERSION = 17;
|
|
1869
2036
|
var _migrationBlockRuns = 0;
|
|
1870
2037
|
function _getMigrationBlockRuns() {
|
|
1871
2038
|
return _migrationBlockRuns;
|
|
@@ -1897,6 +2064,23 @@ async function ensureSchema() {
|
|
|
1897
2064
|
await client.execute("PRAGMA libsql_vector_search_ef = 128");
|
|
1898
2065
|
} catch {
|
|
1899
2066
|
}
|
|
2067
|
+
try {
|
|
2068
|
+
const idxProbe = await client.execute({
|
|
2069
|
+
sql: "SELECT name FROM sqlite_master WHERE type = 'index' AND name = ?",
|
|
2070
|
+
args: ["idx_tasks_idempotency_key"]
|
|
2071
|
+
});
|
|
2072
|
+
if (idxProbe.rows.length === 0) {
|
|
2073
|
+
process.stderr.write(
|
|
2074
|
+
"[database] repairing missing idx_tasks_idempotency_key on already-current DB (bug c06a8803)\n"
|
|
2075
|
+
);
|
|
2076
|
+
await ensureIdempotencyKeyMigration(client);
|
|
2077
|
+
}
|
|
2078
|
+
} catch (e) {
|
|
2079
|
+
process.stderr.write(
|
|
2080
|
+
`[database] idempotency index repair check failed: ${e instanceof Error ? e.message : String(e)}
|
|
2081
|
+
`
|
|
2082
|
+
);
|
|
2083
|
+
}
|
|
1900
2084
|
return;
|
|
1901
2085
|
}
|
|
1902
2086
|
_migrationBlockRuns++;
|
|
@@ -1969,6 +2153,9 @@ async function ensureSchema() {
|
|
|
1969
2153
|
}
|
|
1970
2154
|
await executeAddColumn(client, "ALTER TABLE memories ADD COLUMN embedding_model TEXT", "migration add memories.embedding_model");
|
|
1971
2155
|
await client.execute("CREATE INDEX IF NOT EXISTS idx_memories_embedding_model ON memories(embedding_model)");
|
|
2156
|
+
await client.execute(
|
|
2157
|
+
"CREATE INDEX IF NOT EXISTS idx_memories_null_vector ON memories(id) WHERE vector IS NULL"
|
|
2158
|
+
);
|
|
1972
2159
|
let needsFtsMigration = false;
|
|
1973
2160
|
try {
|
|
1974
2161
|
const ftsCheck = await client.execute(
|
|
@@ -2073,6 +2260,12 @@ async function ensureSchema() {
|
|
|
2073
2260
|
|
|
2074
2261
|
CREATE INDEX IF NOT EXISTS idx_tasks_assignee_status
|
|
2075
2262
|
ON tasks(assigned_to, status);
|
|
2263
|
+
|
|
2264
|
+
-- Boot reconciles every exe/**/*.md task file against this table by
|
|
2265
|
+
-- task_file (exe-boot.ts). Without this index every lookup was a full table
|
|
2266
|
+
-- scan \u2014 576 of them per boot (bug 4b2d2d10). Additive: index only.
|
|
2267
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_task_file
|
|
2268
|
+
ON tasks(task_file);
|
|
2076
2269
|
`);
|
|
2077
2270
|
await client.executeMultiple(`
|
|
2078
2271
|
CREATE TABLE IF NOT EXISTS orchestration_events (
|
|
@@ -2220,14 +2413,43 @@ async function ensureSchema() {
|
|
|
2220
2413
|
ON consolidations(consolidated_memory_id);
|
|
2221
2414
|
`);
|
|
2222
2415
|
await client.executeMultiple(`
|
|
2223
|
-
CREATE TABLE IF NOT EXISTS
|
|
2416
|
+
CREATE TABLE IF NOT EXISTS memory_reads (
|
|
2224
2417
|
id TEXT PRIMARY KEY,
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2418
|
+
memory_id TEXT NOT NULL,
|
|
2419
|
+
agent_id TEXT,
|
|
2420
|
+
task_id TEXT,
|
|
2421
|
+
session_scope TEXT,
|
|
2422
|
+
source TEXT NOT NULL,
|
|
2423
|
+
query TEXT,
|
|
2424
|
+
rank_position INTEGER NOT NULL,
|
|
2425
|
+
timestamp TEXT NOT NULL
|
|
2229
2426
|
);
|
|
2427
|
+
|
|
2428
|
+
CREATE INDEX IF NOT EXISTS idx_memory_reads_memory
|
|
2429
|
+
ON memory_reads(memory_id);
|
|
2430
|
+
|
|
2431
|
+
CREATE INDEX IF NOT EXISTS idx_memory_reads_task
|
|
2432
|
+
ON memory_reads(task_id);
|
|
2433
|
+
|
|
2434
|
+
CREATE INDEX IF NOT EXISTS idx_memory_reads_ts
|
|
2435
|
+
ON memory_reads(timestamp);
|
|
2436
|
+
|
|
2437
|
+
CREATE INDEX IF NOT EXISTS idx_memory_reads_agent
|
|
2438
|
+
ON memory_reads(agent_id, session_scope);
|
|
2230
2439
|
`);
|
|
2440
|
+
await client.executeMultiple(`
|
|
2441
|
+
CREATE TABLE IF NOT EXISTS reminders (
|
|
2442
|
+
id TEXT PRIMARY KEY,
|
|
2443
|
+
text TEXT NOT NULL,
|
|
2444
|
+
created_at TEXT NOT NULL,
|
|
2445
|
+
due_date TEXT,
|
|
2446
|
+
completed_at TEXT,
|
|
2447
|
+
daily_push TEXT,
|
|
2448
|
+
last_pushed_at TEXT
|
|
2449
|
+
);
|
|
2450
|
+
`);
|
|
2451
|
+
await executeAddColumn(client, `ALTER TABLE reminders ADD COLUMN daily_push TEXT`, "migration add reminders.daily_push");
|
|
2452
|
+
await executeAddColumn(client, `ALTER TABLE reminders ADD COLUMN last_pushed_at TEXT`, "migration add reminders.last_pushed_at");
|
|
2231
2453
|
await client.executeMultiple(`
|
|
2232
2454
|
CREATE TABLE IF NOT EXISTS notifications (
|
|
2233
2455
|
id TEXT PRIMARY KEY,
|
|
@@ -2312,6 +2534,46 @@ async function ensureSchema() {
|
|
|
2312
2534
|
CREATE INDEX IF NOT EXISTS idx_messages_target_scope_status
|
|
2313
2535
|
ON messages(target_agent, session_scope, status, created_at);
|
|
2314
2536
|
`);
|
|
2537
|
+
await client.executeMultiple(`
|
|
2538
|
+
CREATE TABLE IF NOT EXISTS notification_ledger (
|
|
2539
|
+
id TEXT PRIMARY KEY,
|
|
2540
|
+
session_scope TEXT,
|
|
2541
|
+
project TEXT,
|
|
2542
|
+
target_agent TEXT NOT NULL,
|
|
2543
|
+
target_role TEXT NOT NULL DEFAULT 'employee',
|
|
2544
|
+
target_session TEXT,
|
|
2545
|
+
kind TEXT NOT NULL,
|
|
2546
|
+
intercom_reason TEXT,
|
|
2547
|
+
task_id TEXT,
|
|
2548
|
+
task_file TEXT,
|
|
2549
|
+
payload_json TEXT,
|
|
2550
|
+
dedup_key TEXT,
|
|
2551
|
+
delivery_state TEXT NOT NULL DEFAULT 'pending',
|
|
2552
|
+
ack_state TEXT NOT NULL DEFAULT 'unacked',
|
|
2553
|
+
retry_count INTEGER NOT NULL DEFAULT 0,
|
|
2554
|
+
max_retries INTEGER NOT NULL DEFAULT 10,
|
|
2555
|
+
next_retry_at TEXT,
|
|
2556
|
+
boot_generation INTEGER,
|
|
2557
|
+
created_at TEXT NOT NULL,
|
|
2558
|
+
delivered_at TEXT,
|
|
2559
|
+
acked_at TEXT,
|
|
2560
|
+
expires_at TEXT,
|
|
2561
|
+
last_error TEXT
|
|
2562
|
+
);
|
|
2563
|
+
|
|
2564
|
+
CREATE INDEX IF NOT EXISTS idx_nledger_scope_state
|
|
2565
|
+
ON notification_ledger(session_scope, delivery_state, next_retry_at);
|
|
2566
|
+
|
|
2567
|
+
CREATE INDEX IF NOT EXISTS idx_nledger_target
|
|
2568
|
+
ON notification_ledger(target_agent, session_scope, delivery_state);
|
|
2569
|
+
|
|
2570
|
+
CREATE INDEX IF NOT EXISTS idx_nledger_task
|
|
2571
|
+
ON notification_ledger(task_id);
|
|
2572
|
+
|
|
2573
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_nledger_dedup
|
|
2574
|
+
ON notification_ledger(session_scope, dedup_key)
|
|
2575
|
+
WHERE dedup_key IS NOT NULL AND delivery_state IN ('pending', 'delivered');
|
|
2576
|
+
`);
|
|
2315
2577
|
try {
|
|
2316
2578
|
await client.execute({
|
|
2317
2579
|
sql: `UPDATE memories SET project_name = 'exe-create' WHERE project_name = 'web'`,
|
|
@@ -3563,6 +3825,8 @@ async function ensureSchema() {
|
|
|
3563
3825
|
for (const table of founderIdTables) {
|
|
3564
3826
|
await executeAddColumn(client, `ALTER TABLE ${table} ADD COLUMN founder_id TEXT DEFAULT NULL`);
|
|
3565
3827
|
}
|
|
3828
|
+
await ensureIdempotencyKeyMigration(client);
|
|
3829
|
+
await executeAddColumn(client, `ALTER TABLE tasks ADD COLUMN enforcement_note TEXT`);
|
|
3566
3830
|
await client.executeMultiple(`
|
|
3567
3831
|
CREATE TABLE IF NOT EXISTS investigation_attempts (
|
|
3568
3832
|
id TEXT PRIMARY KEY,
|
|
@@ -3795,6 +4059,7 @@ async function disposeDatabase() {
|
|
|
3795
4059
|
export {
|
|
3796
4060
|
dbLockWaitMs,
|
|
3797
4061
|
DbLockHeldError,
|
|
4062
|
+
isDbLockHeldByLiveProcess,
|
|
3798
4063
|
acquireDbLock,
|
|
3799
4064
|
releaseDbLock,
|
|
3800
4065
|
WAL_ESCALATION_THRESHOLD_BYTES,
|
|
@@ -3837,12 +4102,15 @@ export {
|
|
|
3837
4102
|
getCoordinatorDisplayTitle,
|
|
3838
4103
|
isCoordinatorName,
|
|
3839
4104
|
canCoordinate,
|
|
4105
|
+
isManagementRole,
|
|
4106
|
+
isManagementIdentity,
|
|
3840
4107
|
canManage,
|
|
3841
4108
|
VALID_AGENT_NAME,
|
|
3842
4109
|
VALID_AGENT_NAME_DESCRIPTION,
|
|
3843
4110
|
validateEmployeeName,
|
|
3844
4111
|
loadEmployees,
|
|
3845
4112
|
saveEmployees,
|
|
4113
|
+
loadEmployeesState,
|
|
3846
4114
|
loadEmployeesSync,
|
|
3847
4115
|
getEmployee,
|
|
3848
4116
|
getEmployeeByRole,
|