@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
|
@@ -1,12 +1,32 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-AOHXREB7.js";
|
|
4
4
|
import {
|
|
5
5
|
loadConfig
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-WZHZCDDO.js";
|
|
7
7
|
|
|
8
8
|
// src/lib/reminders.ts
|
|
9
9
|
import crypto from "crypto";
|
|
10
|
+
function parseDailyPushHours(dailyPush) {
|
|
11
|
+
if (!dailyPush || dailyPush.trim().length === 0) return [];
|
|
12
|
+
try {
|
|
13
|
+
const parsed = JSON.parse(dailyPush);
|
|
14
|
+
if (!Array.isArray(parsed.hours)) return [];
|
|
15
|
+
const hours = parsed.hours.filter((h) => typeof h === "number" && Number.isInteger(h) && h >= 0 && h <= 23);
|
|
16
|
+
return [...new Set(hours)].sort((a, b) => a - b);
|
|
17
|
+
} catch {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function normalizeDailyPush(dailyPush) {
|
|
22
|
+
if (dailyPush === void 0 || dailyPush === null) return null;
|
|
23
|
+
if (dailyPush.trim().length === 0) return null;
|
|
24
|
+
const hours = parseDailyPushHours(dailyPush);
|
|
25
|
+
if (hours.length === 0) {
|
|
26
|
+
throw new Error(`Invalid daily_push: expected JSON like {"hours":[9,18]} with integer hours 0\u201323`);
|
|
27
|
+
}
|
|
28
|
+
return JSON.stringify({ hours });
|
|
29
|
+
}
|
|
10
30
|
async function getCloudConfig() {
|
|
11
31
|
try {
|
|
12
32
|
const config = await loadConfig();
|
|
@@ -62,6 +82,9 @@ async function cloudFetchReminders(cloud) {
|
|
|
62
82
|
createdAt: r.created_at,
|
|
63
83
|
dueDate: r.due_date,
|
|
64
84
|
completedAt: r.completed_at,
|
|
85
|
+
dailyPush: null,
|
|
86
|
+
// cloud KV does not carry the local push schedule
|
|
87
|
+
lastPushedAt: null,
|
|
65
88
|
source: "cloud"
|
|
66
89
|
}));
|
|
67
90
|
} catch (err) {
|
|
@@ -103,31 +126,42 @@ function dedup(local, cloud) {
|
|
|
103
126
|
}
|
|
104
127
|
return merged;
|
|
105
128
|
}
|
|
106
|
-
async function createReminder(text, dueDate) {
|
|
129
|
+
async function createReminder(text, dueDate, dailyPush) {
|
|
107
130
|
const client = getClient();
|
|
108
131
|
const id = crypto.randomUUID();
|
|
109
132
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
133
|
+
const normalizedPush = normalizeDailyPush(dailyPush);
|
|
110
134
|
await client.execute({
|
|
111
|
-
sql: `INSERT INTO reminders (id, text, created_at, due_date) VALUES (?, ?, ?, ?)`,
|
|
112
|
-
args: [id, text, now, dueDate ?? null]
|
|
135
|
+
sql: `INSERT INTO reminders (id, text, created_at, due_date, daily_push) VALUES (?, ?, ?, ?, ?)`,
|
|
136
|
+
args: [id, text, now, dueDate ?? null, normalizedPush]
|
|
113
137
|
});
|
|
114
138
|
const cloud = await getCloudConfig();
|
|
115
139
|
if (cloud) {
|
|
116
140
|
cloudPushReminder(cloud, text, dueDate ?? null).catch(() => {
|
|
117
141
|
});
|
|
118
142
|
}
|
|
119
|
-
return {
|
|
143
|
+
return {
|
|
144
|
+
id,
|
|
145
|
+
text,
|
|
146
|
+
createdAt: now,
|
|
147
|
+
dueDate: dueDate ?? null,
|
|
148
|
+
completedAt: null,
|
|
149
|
+
dailyPush: normalizedPush,
|
|
150
|
+
lastPushedAt: null
|
|
151
|
+
};
|
|
120
152
|
}
|
|
121
153
|
async function listReminders(includeCompleted = false) {
|
|
122
154
|
const client = getClient();
|
|
123
|
-
const sql = includeCompleted ? `SELECT id, text, created_at, due_date, completed_at FROM reminders ORDER BY due_date ASC NULLS LAST LIMIT 500` : `SELECT id, text, created_at, due_date, completed_at FROM reminders WHERE completed_at IS NULL ORDER BY due_date ASC NULLS LAST LIMIT 500`;
|
|
155
|
+
const sql = includeCompleted ? `SELECT id, text, created_at, due_date, completed_at, daily_push, last_pushed_at FROM reminders ORDER BY due_date ASC NULLS LAST LIMIT 500` : `SELECT id, text, created_at, due_date, completed_at, daily_push, last_pushed_at FROM reminders WHERE completed_at IS NULL ORDER BY due_date ASC NULLS LAST LIMIT 500`;
|
|
124
156
|
const result = await client.execute(sql);
|
|
125
157
|
const local = result.rows.map((row) => ({
|
|
126
158
|
id: String(row.id),
|
|
127
159
|
text: String(row.text),
|
|
128
160
|
createdAt: String(row.created_at),
|
|
129
161
|
dueDate: row.due_date ? String(row.due_date) : null,
|
|
130
|
-
completedAt: row.completed_at ? String(row.completed_at) : null
|
|
162
|
+
completedAt: row.completed_at ? String(row.completed_at) : null,
|
|
163
|
+
dailyPush: row.daily_push ? String(row.daily_push) : null,
|
|
164
|
+
lastPushedAt: row.last_pushed_at ? String(row.last_pushed_at) : null
|
|
131
165
|
}));
|
|
132
166
|
const cloud = await getCloudConfig();
|
|
133
167
|
if (cloud) {
|
|
@@ -171,11 +205,57 @@ async function completeReminder(idOrText) {
|
|
|
171
205
|
}).catch(() => {
|
|
172
206
|
});
|
|
173
207
|
}
|
|
174
|
-
return { id, text, createdAt: "", dueDate: null, completedAt: now };
|
|
208
|
+
return { id, text, createdAt: "", dueDate: null, completedAt: now, dailyPush: null };
|
|
209
|
+
}
|
|
210
|
+
function alreadyPushedThisHour(lastPushedAt, now) {
|
|
211
|
+
if (!lastPushedAt) return false;
|
|
212
|
+
const last = new Date(lastPushedAt);
|
|
213
|
+
if (Number.isNaN(last.getTime())) return false;
|
|
214
|
+
return last.getFullYear() === now.getFullYear() && last.getMonth() === now.getMonth() && last.getDate() === now.getDate() && last.getHours() === now.getHours();
|
|
215
|
+
}
|
|
216
|
+
async function getDuePushReminders(now = /* @__PURE__ */ new Date()) {
|
|
217
|
+
const client = getClient();
|
|
218
|
+
const result = await client.execute({
|
|
219
|
+
sql: `SELECT id, text, due_date, daily_push, last_pushed_at
|
|
220
|
+
FROM reminders
|
|
221
|
+
WHERE completed_at IS NULL AND daily_push IS NOT NULL
|
|
222
|
+
LIMIT 500`,
|
|
223
|
+
args: []
|
|
224
|
+
});
|
|
225
|
+
const hour = now.getHours();
|
|
226
|
+
const due = [];
|
|
227
|
+
for (const row of result.rows) {
|
|
228
|
+
const hours = parseDailyPushHours(row.daily_push ? String(row.daily_push) : null);
|
|
229
|
+
if (!hours.includes(hour)) continue;
|
|
230
|
+
if (alreadyPushedThisHour(row.last_pushed_at ? String(row.last_pushed_at) : null, now)) continue;
|
|
231
|
+
due.push({
|
|
232
|
+
id: String(row.id),
|
|
233
|
+
text: String(row.text),
|
|
234
|
+
hour,
|
|
235
|
+
dueDate: row.due_date ? String(row.due_date) : null
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
return due;
|
|
239
|
+
}
|
|
240
|
+
async function markReminderPushed(id, now = /* @__PURE__ */ new Date()) {
|
|
241
|
+
try {
|
|
242
|
+
const client = getClient();
|
|
243
|
+
await client.execute({
|
|
244
|
+
sql: `UPDATE reminders SET last_pushed_at = ? WHERE id = ?`,
|
|
245
|
+
args: [now.toISOString(), id]
|
|
246
|
+
});
|
|
247
|
+
} catch (err) {
|
|
248
|
+
process.stderr.write(`[reminders] markReminderPushed failed: ${err instanceof Error ? err.message : String(err)}
|
|
249
|
+
`);
|
|
250
|
+
}
|
|
175
251
|
}
|
|
176
252
|
|
|
177
253
|
export {
|
|
254
|
+
parseDailyPushHours,
|
|
255
|
+
normalizeDailyPush,
|
|
178
256
|
createReminder,
|
|
179
257
|
listReminders,
|
|
180
|
-
completeReminder
|
|
258
|
+
completeReminder,
|
|
259
|
+
getDuePushReminders,
|
|
260
|
+
markReminderPushed
|
|
181
261
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EXE_AI_DIR
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-WZHZCDDO.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/worker-gate.ts
|
|
6
6
|
import { readdirSync, writeFileSync, unlinkSync, mkdirSync, existsSync, readFileSync } from "fs";
|
|
@@ -119,7 +119,7 @@ function releaseBackfillLock() {
|
|
|
119
119
|
}
|
|
120
120
|
async function getTaskAwareCapacity() {
|
|
121
121
|
const { getClient } = await import("./lib/database.js");
|
|
122
|
-
const { sessionScopeFilter } = await import("./task-scope-
|
|
122
|
+
const { sessionScopeFilter } = await import("./task-scope-FOIW25HR.js");
|
|
123
123
|
const client = getClient();
|
|
124
124
|
const scope = sessionScopeFilter();
|
|
125
125
|
const result = await client.execute({
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import {
|
|
2
|
+
redactSecrets
|
|
3
|
+
} from "./chunk-4QCFFW2H.js";
|
|
4
|
+
import {
|
|
5
|
+
EXE_AI_DIR
|
|
6
|
+
} from "./chunk-WZHZCDDO.js";
|
|
7
|
+
|
|
8
|
+
// src/lib/local-secret-inventory.ts
|
|
9
|
+
import {
|
|
10
|
+
chmodSync,
|
|
11
|
+
lstatSync,
|
|
12
|
+
mkdirSync,
|
|
13
|
+
readFileSync,
|
|
14
|
+
readdirSync,
|
|
15
|
+
realpathSync,
|
|
16
|
+
rmSync
|
|
17
|
+
} from "fs";
|
|
18
|
+
import path from "path";
|
|
19
|
+
var SQLITE_HEADER = "SQLite format 3\0";
|
|
20
|
+
var CRDT_STATE_ENC_MAGIC = "EXEO-CRDT-ENC1:";
|
|
21
|
+
function isEncryptedCrdtState(head) {
|
|
22
|
+
const magic = Buffer.from(CRDT_STATE_ENC_MAGIC, "utf8");
|
|
23
|
+
if (head.length < magic.length) return false;
|
|
24
|
+
return head.subarray(0, magic.length).equals(magic);
|
|
25
|
+
}
|
|
26
|
+
function safeStat(filePath) {
|
|
27
|
+
try {
|
|
28
|
+
return lstatSync(filePath);
|
|
29
|
+
} catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function addIfFile(residues, filePath, kind, detail, cleanup, deletable = true) {
|
|
34
|
+
const st = safeStat(filePath);
|
|
35
|
+
if (!st?.isFile()) return;
|
|
36
|
+
residues.push({ kind, path: filePath, sizeBytes: Number(st.size), detail, cleanup, deletable });
|
|
37
|
+
}
|
|
38
|
+
function firstBytes(filePath, n) {
|
|
39
|
+
try {
|
|
40
|
+
return readFileSync(filePath).subarray(0, n);
|
|
41
|
+
} catch {
|
|
42
|
+
return Buffer.alloc(0);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function isPlaintextSqliteFile(filePath) {
|
|
46
|
+
const st = safeStat(filePath);
|
|
47
|
+
if (!st?.isFile()) return false;
|
|
48
|
+
if (st.size === 0) return true;
|
|
49
|
+
return firstBytes(filePath, SQLITE_HEADER.length).toString("binary") === SQLITE_HEADER;
|
|
50
|
+
}
|
|
51
|
+
function walk(dir, maxDepth) {
|
|
52
|
+
if (maxDepth < 0) return [];
|
|
53
|
+
let entries;
|
|
54
|
+
try {
|
|
55
|
+
entries = readdirSync(dir);
|
|
56
|
+
} catch {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
const out = [];
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
const full = path.join(dir, entry);
|
|
62
|
+
const st = safeStat(full);
|
|
63
|
+
if (!st) continue;
|
|
64
|
+
if (st.isFile()) out.push(full);
|
|
65
|
+
else if (st.isDirectory()) out.push(...walk(full, maxDepth - 1));
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
function segmentIsEmergencyRecovery(segment) {
|
|
70
|
+
if (/emergency[-_]?recovery/i.test(segment)) return true;
|
|
71
|
+
if (/recovery[-_]?export/i.test(segment)) return true;
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
function isEmergencyRecoveryExport(filePath) {
|
|
75
|
+
const base = path.basename(filePath);
|
|
76
|
+
if (/^NEW_KEY_DO_NOT_SHARE\.base64$/i.test(base)) return true;
|
|
77
|
+
if (/^OLD_KEY_BACKUP_DELETE_AFTER_VERIFICATION\.base64$/i.test(base)) return true;
|
|
78
|
+
return segmentIsEmergencyRecovery(base);
|
|
79
|
+
}
|
|
80
|
+
function isUnderEmergencyRecoveryDir(dataDir, filePath) {
|
|
81
|
+
const rel = path.relative(dataDir, filePath);
|
|
82
|
+
if (rel.startsWith("..")) return false;
|
|
83
|
+
const segments = rel.split(path.sep);
|
|
84
|
+
return segments.slice(0, -1).some(segmentIsEmergencyRecovery);
|
|
85
|
+
}
|
|
86
|
+
function findEmergencyRecoveryDirs(dataDir, maxDepth) {
|
|
87
|
+
const out = [];
|
|
88
|
+
const recurse = (dir, depth) => {
|
|
89
|
+
if (depth < 0) return;
|
|
90
|
+
let entries;
|
|
91
|
+
try {
|
|
92
|
+
entries = readdirSync(dir);
|
|
93
|
+
} catch {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
for (const entry of entries) {
|
|
97
|
+
const full = path.join(dir, entry);
|
|
98
|
+
const st = safeStat(full);
|
|
99
|
+
if (!st?.isDirectory()) continue;
|
|
100
|
+
if (segmentIsEmergencyRecovery(entry)) out.push(full);
|
|
101
|
+
recurse(full, depth - 1);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
recurse(dataDir, maxDepth);
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
function dirSize(dir) {
|
|
108
|
+
let total = 0;
|
|
109
|
+
for (const f of walk(dir, 8)) {
|
|
110
|
+
const st = safeStat(f);
|
|
111
|
+
if (st?.isFile()) total += Number(st.size);
|
|
112
|
+
}
|
|
113
|
+
return total;
|
|
114
|
+
}
|
|
115
|
+
function inventoryLocalSecretResidue(dataDir = EXE_AI_DIR) {
|
|
116
|
+
const residues = [];
|
|
117
|
+
addIfFile(
|
|
118
|
+
residues,
|
|
119
|
+
path.join(dataDir, "recovery-phrase.txt"),
|
|
120
|
+
"recovery-phrase",
|
|
121
|
+
"Headless setup recovery phrase is still on disk. Do not print it; move it to a password manager or offline vault, then delete the file.",
|
|
122
|
+
"Vault the phrase, then run: exe-os doctor --delete-local-secret-residue"
|
|
123
|
+
);
|
|
124
|
+
for (const filePath of walk(dataDir, 4)) {
|
|
125
|
+
if (isEmergencyRecoveryExport(filePath) || isUnderEmergencyRecoveryDir(dataDir, filePath)) {
|
|
126
|
+
addIfFile(
|
|
127
|
+
residues,
|
|
128
|
+
filePath,
|
|
129
|
+
"emergency-recovery-export",
|
|
130
|
+
"Plaintext key/recovery export residue from an emergency recovery or key rotation flow.",
|
|
131
|
+
"Confirm the key/phrase is vaulted or no longer needed, then run: exe-os doctor --delete-local-secret-residue"
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
for (const emDir of findEmergencyRecoveryDirs(dataDir, 4)) {
|
|
136
|
+
const st = safeStat(emDir);
|
|
137
|
+
if (!st?.isDirectory()) continue;
|
|
138
|
+
residues.push({
|
|
139
|
+
kind: "emergency-recovery-export",
|
|
140
|
+
path: emDir,
|
|
141
|
+
sizeBytes: dirSize(emDir),
|
|
142
|
+
detail: "Emergency recovery / key rotation export directory. May hold a multi-GB plaintext memories.jsonl and key material.",
|
|
143
|
+
cleanup: "Confirm the key/phrase is vaulted or no longer needed, then run: exe-os doctor --delete-local-secret-residue",
|
|
144
|
+
deletable: true
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
{
|
|
148
|
+
const crdtPath = path.join(dataDir, "crdt-state.bin");
|
|
149
|
+
const crdtStat = safeStat(crdtPath);
|
|
150
|
+
if (crdtStat?.isFile() && crdtStat.size > 0 && !isEncryptedCrdtState(firstBytes(crdtPath, CRDT_STATE_ENC_MAGIC.length))) {
|
|
151
|
+
residues.push({
|
|
152
|
+
kind: "crdt-plaintext-state",
|
|
153
|
+
path: crdtPath,
|
|
154
|
+
sizeBytes: Number(crdtStat.size),
|
|
155
|
+
detail: "Plaintext CRDT sync state \u2014 an unencrypted mirror of decrypted memory rows. Persists even after CRDT sync is disabled.",
|
|
156
|
+
cleanup: "Safe to delete (rebuilt from the encrypted DB on next sync). Run: exe-os doctor --delete-local-secret-residue",
|
|
157
|
+
deletable: true
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const supportArtifactDirs = [
|
|
162
|
+
{ dir: "bug-reports", kind: "unredacted-bug-report", label: "Bug-report" },
|
|
163
|
+
{ dir: "feature-requests", kind: "unredacted-support-artifact", label: "Feature-request" },
|
|
164
|
+
{ dir: "reviews", kind: "unredacted-support-artifact", label: "Review" }
|
|
165
|
+
];
|
|
166
|
+
for (const { dir, kind, label } of supportArtifactDirs) {
|
|
167
|
+
const artifactDir = path.join(dataDir, dir);
|
|
168
|
+
if (!safeStat(artifactDir)?.isDirectory()) continue;
|
|
169
|
+
for (const filePath of walk(artifactDir, 4)) {
|
|
170
|
+
const st = safeStat(filePath);
|
|
171
|
+
if (!st?.isFile() || st.size === 0) continue;
|
|
172
|
+
if (st.size > 5 * 1024 * 1024) continue;
|
|
173
|
+
let content;
|
|
174
|
+
try {
|
|
175
|
+
content = readFileSync(filePath, "utf8");
|
|
176
|
+
} catch {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if (redactSecrets(content).redactedCount > 0) {
|
|
180
|
+
residues.push({
|
|
181
|
+
kind,
|
|
182
|
+
path: filePath,
|
|
183
|
+
sizeBytes: Number(st.size),
|
|
184
|
+
detail: `${label} file on disk contains secret-shaped content (e.g. an API key or private key) written before local redaction shipped. Rotate any exposed key.`,
|
|
185
|
+
cleanup: "Review the file, rotate any exposed secret, then delete it manually. Not auto-deleted (it is your own artifact).",
|
|
186
|
+
deletable: false
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
let rootEntries = [];
|
|
192
|
+
try {
|
|
193
|
+
rootEntries = readdirSync(dataDir);
|
|
194
|
+
} catch {
|
|
195
|
+
rootEntries = [];
|
|
196
|
+
}
|
|
197
|
+
for (const entry of rootEntries) {
|
|
198
|
+
if (!/\.(db|sqlite|sqlite3)$/i.test(entry)) continue;
|
|
199
|
+
const filePath = path.join(dataDir, entry);
|
|
200
|
+
if (!isPlaintextSqliteFile(filePath)) continue;
|
|
201
|
+
addIfFile(
|
|
202
|
+
residues,
|
|
203
|
+
filePath,
|
|
204
|
+
"legacy-plaintext-sqlite",
|
|
205
|
+
"Legacy plaintext SQLite database/stub detected in the exe-os data directory. SQLCipher databases should not expose a SQLite header.",
|
|
206
|
+
"Confirm this is not the active encrypted DB, back it up if needed, then run: exe-os doctor --delete-local-secret-residue"
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
residues.sort((a, b) => a.path.localeCompare(b.path));
|
|
210
|
+
return { dataDir, residues };
|
|
211
|
+
}
|
|
212
|
+
function isContainedWithin(target, dataDirReal) {
|
|
213
|
+
let targetReal;
|
|
214
|
+
try {
|
|
215
|
+
targetReal = realpathSync(target);
|
|
216
|
+
} catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
if (targetReal === dataDirReal) return false;
|
|
220
|
+
const rel = path.relative(dataDirReal, targetReal);
|
|
221
|
+
return rel.length > 0 && !rel.startsWith("..") && !path.isAbsolute(rel);
|
|
222
|
+
}
|
|
223
|
+
function cleanupLocalSecretResidue(opts = {}) {
|
|
224
|
+
const inventory = inventoryLocalSecretResidue(opts.dataDir);
|
|
225
|
+
const deleted = [];
|
|
226
|
+
const skipped = [];
|
|
227
|
+
let dataDirReal;
|
|
228
|
+
try {
|
|
229
|
+
dataDirReal = realpathSync(inventory.dataDir);
|
|
230
|
+
} catch {
|
|
231
|
+
dataDirReal = path.resolve(inventory.dataDir);
|
|
232
|
+
}
|
|
233
|
+
for (const residue of inventory.residues) {
|
|
234
|
+
if (!residue.deletable) {
|
|
235
|
+
skipped.push(residue.path);
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (!isContainedWithin(residue.path, dataDirReal)) {
|
|
239
|
+
console.warn(`[local-secret-inventory] refusing to delete path outside data dir: ${residue.path}`);
|
|
240
|
+
skipped.push(residue.path);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (opts.dryRun) {
|
|
244
|
+
deleted.push(residue.path);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
try {
|
|
248
|
+
rmSync(residue.path, { force: true, recursive: true });
|
|
249
|
+
deleted.push(residue.path);
|
|
250
|
+
} catch {
|
|
251
|
+
skipped.push(residue.path);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
try {
|
|
255
|
+
mkdirSync(inventory.dataDir, { recursive: true, mode: 448 });
|
|
256
|
+
chmodSync(inventory.dataDir, 448);
|
|
257
|
+
} catch {
|
|
258
|
+
}
|
|
259
|
+
return { deleted, skipped };
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export {
|
|
263
|
+
inventoryLocalSecretResidue,
|
|
264
|
+
cleanupLocalSecretResidue
|
|
265
|
+
};
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
findScopedDuplicate,
|
|
10
10
|
governMemoryRecord,
|
|
11
11
|
schedulePostWriteMemoryHygiene
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-6XWTQUO4.js";
|
|
13
13
|
import {
|
|
14
14
|
orgBus
|
|
15
15
|
} from "./chunk-MP2AFCGL.js";
|
|
@@ -18,16 +18,16 @@ import {
|
|
|
18
18
|
ensureSchema,
|
|
19
19
|
getClient,
|
|
20
20
|
initTurso
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-AOHXREB7.js";
|
|
22
22
|
import {
|
|
23
23
|
EMBEDDING_DIM
|
|
24
24
|
} from "./chunk-FXU7JOXK.js";
|
|
25
25
|
import {
|
|
26
26
|
getMasterKey
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-QWVXN224.js";
|
|
28
28
|
import {
|
|
29
29
|
loadConfig
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-WZHZCDDO.js";
|
|
31
31
|
|
|
32
32
|
// src/lib/store.ts
|
|
33
33
|
var _debugStore = process.env.EXE_DEBUG === "1";
|
|
@@ -68,7 +68,7 @@ function recordShardFailure(project, error) {
|
|
|
68
68
|
`[store] Shard circuit OPEN for "${project}" after ${state.failures} consecutive failures. Will retry in ${SHARD_CB_COOLDOWN_MS / 6e4}min. Last error: ${error}
|
|
69
69
|
`
|
|
70
70
|
);
|
|
71
|
-
void import("./orchestration-events-
|
|
71
|
+
void import("./orchestration-events-WV4NWKZH.js").then(({ recordOrchestrationEventBestEffort }) => {
|
|
72
72
|
recordOrchestrationEventBestEffort({
|
|
73
73
|
eventType: "shard.circuit_open",
|
|
74
74
|
source: "store.recordShardFailure",
|
|
@@ -152,7 +152,7 @@ async function initStore(options) {
|
|
|
152
152
|
if (!options?.lightweight) {
|
|
153
153
|
try {
|
|
154
154
|
if (process.env.EXE_DISABLE_SHARDING !== "1") {
|
|
155
|
-
const { initShardManager } = await import("./shard-manager-
|
|
155
|
+
const { initShardManager } = await import("./shard-manager-35PWFR3B.js");
|
|
156
156
|
initShardManager(hexKey);
|
|
157
157
|
}
|
|
158
158
|
} catch (e) {
|
|
@@ -165,7 +165,7 @@ async function initStore(options) {
|
|
|
165
165
|
);
|
|
166
166
|
_nextVersion = (Number(vResult.rows[0]?.max_v) || 0) + 1;
|
|
167
167
|
try {
|
|
168
|
-
const { loadGlobalProcedures } = await import("./global-procedures-
|
|
168
|
+
const { loadGlobalProcedures } = await import("./global-procedures-XQX3LUH6.js");
|
|
169
169
|
await loadGlobalProcedures();
|
|
170
170
|
} catch (e) {
|
|
171
171
|
logStoreWarn("catch", e);
|
|
@@ -293,7 +293,7 @@ async function writeMemory(record) {
|
|
|
293
293
|
founder_id: record.founder_id ?? null
|
|
294
294
|
};
|
|
295
295
|
try {
|
|
296
|
-
const { checkMemoryPoisoning } = await import("./memory-poisoning-defense-
|
|
296
|
+
const { checkMemoryPoisoning } = await import("./memory-poisoning-defense-HJTXYCWH.js");
|
|
297
297
|
const poisonResult = await checkMemoryPoisoning({
|
|
298
298
|
memoryId: dbRow.id,
|
|
299
299
|
vector: Array.isArray(dbRow.vector) ? dbRow.vector : void 0,
|
|
@@ -486,19 +486,19 @@ async function flushBatch() {
|
|
|
486
486
|
}
|
|
487
487
|
_nextVersion = baseVersion;
|
|
488
488
|
try {
|
|
489
|
-
const { insertMemoryCardsForBatch } = await import("./memory-cards-
|
|
489
|
+
const { insertMemoryCardsForBatch } = await import("./memory-cards-ZRDW7QBX.js");
|
|
490
490
|
await insertMemoryCardsForBatch(batch);
|
|
491
491
|
} catch (e) {
|
|
492
492
|
logStoreWarn("catch", e);
|
|
493
493
|
}
|
|
494
494
|
try {
|
|
495
|
-
const { insertOntologyForBatch } = await import("./agentic-ontology-
|
|
495
|
+
const { insertOntologyForBatch } = await import("./agentic-ontology-3FXYMHKW.js");
|
|
496
496
|
await insertOntologyForBatch(batch);
|
|
497
497
|
} catch (e) {
|
|
498
498
|
logStoreWarn("catch", e);
|
|
499
499
|
}
|
|
500
500
|
try {
|
|
501
|
-
const { extractGraphForBatch } = await import("./memory-graph-extractor-
|
|
501
|
+
const { extractGraphForBatch } = await import("./memory-graph-extractor-QLXDMHRS.js");
|
|
502
502
|
await extractGraphForBatch(batch);
|
|
503
503
|
} catch (e) {
|
|
504
504
|
logStoreWarn("catch", e);
|
|
@@ -506,7 +506,7 @@ async function flushBatch() {
|
|
|
506
506
|
schedulePostWriteMemoryHygiene(batch.map((row) => row.id));
|
|
507
507
|
_pendingRecords.splice(0, batch.length);
|
|
508
508
|
try {
|
|
509
|
-
const { isShardingEnabled, getReadyShardClient } = await import("./shard-manager-
|
|
509
|
+
const { isShardingEnabled, getReadyShardClient } = await import("./shard-manager-35PWFR3B.js");
|
|
510
510
|
if (process.env.EXE_DISABLE_SHARDING !== "1" && isShardingEnabled()) {
|
|
511
511
|
const byProject = /* @__PURE__ */ new Map();
|
|
512
512
|
let skippedUnknown = 0;
|
|
@@ -590,7 +590,7 @@ async function searchMemories(queryVector, agentId, options) {
|
|
|
590
590
|
let client;
|
|
591
591
|
let isMainDb = true;
|
|
592
592
|
try {
|
|
593
|
-
const { isShardingEnabled, shardExists, getReadyShardClient } = await import("./shard-manager-
|
|
593
|
+
const { isShardingEnabled, shardExists, getReadyShardClient } = await import("./shard-manager-35PWFR3B.js");
|
|
594
594
|
if (isShardingEnabled() && options?.projectName && shardExists(options.projectName)) {
|
|
595
595
|
client = await getReadyShardClient(options.projectName);
|
|
596
596
|
isMainDb = false;
|
|
@@ -629,7 +629,7 @@ async function searchMemories(queryVector, agentId, options) {
|
|
|
629
629
|
args.push(activeEmbeddingModel);
|
|
630
630
|
}
|
|
631
631
|
try {
|
|
632
|
-
const { founderScopeFilter } = await import("./founder-context-
|
|
632
|
+
const { founderScopeFilter } = await import("./founder-context-7L3CFPYN.js");
|
|
633
633
|
const founderFilter = founderScopeFilter(options?.founderId);
|
|
634
634
|
sql += founderFilter.sql;
|
|
635
635
|
args.push(...founderFilter.args.filter((a) => a !== null));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getBrandName
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-O5V57XYE.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/status-brief.ts
|
|
6
6
|
import pathMod from "path";
|
|
@@ -198,6 +198,8 @@ function buildReminders(data) {
|
|
|
198
198
|
return lines;
|
|
199
199
|
}
|
|
200
200
|
function buildDegradedBanner(data) {
|
|
201
|
+
const breakerLines = buildBreakerBanner();
|
|
202
|
+
if (breakerLines.length > 0) return breakerLines;
|
|
201
203
|
const dh = data.daemonHealth;
|
|
202
204
|
if (!dh) return [];
|
|
203
205
|
const lines = [];
|
|
@@ -230,6 +232,32 @@ function buildDegradedBanner(data) {
|
|
|
230
232
|
}
|
|
231
233
|
return [];
|
|
232
234
|
}
|
|
235
|
+
function buildBreakerBanner() {
|
|
236
|
+
const alert = readBreakerAlertSync();
|
|
237
|
+
if (!alert) return [];
|
|
238
|
+
const lines = [];
|
|
239
|
+
lines.push("\u{1F6A8}\u{1F6A8}\u{1F6A8} DAEMON DEGRADED \u2014 RESTART BREAKER TRIPPED \u{1F6A8}\u{1F6A8}\u{1F6A8}");
|
|
240
|
+
lines.push("");
|
|
241
|
+
lines.push(` \u274C ${String(alert.reason ?? "crash-loop circuit breaker open")}`);
|
|
242
|
+
lines.push(` Crash restarts in window: ${String(alert.crashRestartsInWindow ?? "?")}`);
|
|
243
|
+
if (typeof alert.lastBootClassification === "string") lines.push(` Last boot: ${alert.lastBootClassification}`);
|
|
244
|
+
lines.push("");
|
|
245
|
+
lines.push(" \u{1F527} TO FIX:");
|
|
246
|
+
lines.push(" 1. Run: exe-os daemon status (see crash timestamps + last exit)");
|
|
247
|
+
lines.push(" 2. Run: exe-os daemon reset-breaker (clear the breaker)");
|
|
248
|
+
lines.push(" 3. Relaunch the daemon, then /mcp");
|
|
249
|
+
return lines;
|
|
250
|
+
}
|
|
251
|
+
function readBreakerAlertSync() {
|
|
252
|
+
try {
|
|
253
|
+
const home = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? pathMod.join(osMod.homedir(), ".exe-os");
|
|
254
|
+
const p = pathMod.join(home, "daemon-restart-breaker.ALERT.json");
|
|
255
|
+
if (!fsMod.existsSync(p)) return null;
|
|
256
|
+
return JSON.parse(fsMod.readFileSync(p, "utf8"));
|
|
257
|
+
} catch {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
233
261
|
function buildOrchestrationPhase(data, employees) {
|
|
234
262
|
if (!data.orchestrationPhase) return [];
|
|
235
263
|
const phase = data.orchestrationPhase;
|
|
@@ -332,9 +360,15 @@ function buildActionRequired(data) {
|
|
|
332
360
|
);
|
|
333
361
|
for (const b of ub.branches.slice(0, 5)) {
|
|
334
362
|
const age = b.ageHours >= 24 ? `${(b.ageHours / 24).toFixed(1)}d` : `${b.ageHours.toFixed(0)}h`;
|
|
335
|
-
lines.push(` \u2022 ${b.name} (+${b.ahead} commit${b.ahead === 1 ? "" : "s"}, ${
|
|
363
|
+
lines.push(` \u2022 ${b.name} (+${b.ahead} commit${b.ahead === 1 ? "" : "s"}, ${age})`);
|
|
336
364
|
}
|
|
337
|
-
if (ub.total > 5) lines.push(` ... ${ub.total - 5} more \u2014
|
|
365
|
+
if (ub.total > 5) lines.push(` ... ${ub.total - 5} more \u2014 list all: git branch -r --no-merged origin/main`);
|
|
366
|
+
}
|
|
367
|
+
if (data.localMainAhead && data.localMainAhead.ahead > 0) {
|
|
368
|
+
hasIssues = true;
|
|
369
|
+
const ahead = data.localMainAhead;
|
|
370
|
+
lines.push(` \u{1F534} Local ${ahead.branch} is ${ahead.ahead} commit${ahead.ahead === 1 ? "" : "s"} ahead of origin/${ahead.branch} \u2014 do NOT reset`);
|
|
371
|
+
for (const c of ahead.commits.slice(0, 5)) lines.push(` \u2022 ${c}`);
|
|
338
372
|
}
|
|
339
373
|
if (data.failedMessages && data.failedMessages.length > 0) {
|
|
340
374
|
hasIssues = true;
|