@askexenow/exe-os 0.9.336 → 0.9.338
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/dist/{active-agent-IM37G7MO.js → active-agent-EC6M7KTX.js} +3 -3
- package/dist/{active-agent-W5TKWMYT.js → active-agent-WHIUCHLA.js} +3 -3
- package/dist/{agentic-ontology-FG4YCUZG.js → agentic-ontology-RNSXGXW4.js} +1 -1
- package/dist/{backfill-metadata-AFXONF76.js → backfill-metadata-MFY6BHKE.js} +4 -4
- package/dist/{behaviors-EHEN4II7.js → behaviors-HLZUJSMP.js} +5 -5
- package/dist/bin/agentic-ontology-backfill.js +5 -5
- package/dist/bin/agentic-reflection-backfill.js +6 -6
- package/dist/bin/agentic-semantic-label.js +5 -5
- package/dist/bin/backfill-conversations.js +4 -4
- package/dist/bin/backfill-responses.js +4 -4
- package/dist/bin/backfill-vectors.js +5 -5
- package/dist/bin/bulk-sync-postgres.js +12 -10
- package/dist/bin/cc-doctor.js +4 -4
- package/dist/bin/cleanup-stale-review-tasks.js +14 -14
- package/dist/bin/cli.js +19 -16
- package/dist/bin/deferred-daemon-restart.js +71 -69
- package/dist/bin/exe-agent-config.js +3 -3
- package/dist/bin/exe-agent.js +14 -14
- package/dist/bin/exe-assign.js +5 -5
- package/dist/bin/exe-boot.js +24 -24
- package/dist/bin/exe-call.js +4 -4
- package/dist/bin/exe-cloud.js +12 -10
- package/dist/bin/exe-config-dump.js +3 -3
- package/dist/bin/exe-dispatch.js +14 -14
- package/dist/bin/exe-doctor.js +4 -4
- package/dist/bin/exe-export-behaviors.js +7 -7
- package/dist/bin/exe-forget.js +6 -6
- package/dist/bin/exe-gateway.js +7 -7
- package/dist/bin/exe-grant.js +126 -0
- package/dist/bin/exe-healthcheck.js +4 -4
- package/dist/bin/exe-heartbeat.js +14 -14
- package/dist/bin/exe-kill.js +17 -17
- package/dist/bin/exe-launch-agent.js +22 -22
- package/dist/bin/exe-new-employee.js +8 -8
- package/dist/bin/exe-pending-messages.js +15 -15
- package/dist/bin/exe-pending-notifications.js +14 -14
- package/dist/bin/exe-pending-reviews.js +14 -14
- package/dist/bin/exe-rename.js +4 -4
- package/dist/bin/exe-review.js +16 -16
- package/dist/bin/exe-search.js +5 -5
- package/dist/bin/exe-session-cleanup.js +18 -18
- package/dist/bin/exe-settings.js +13 -11
- package/dist/bin/exe-start-codex.js +12 -12
- package/dist/bin/exe-start-opencode.js +8 -8
- package/dist/bin/exe-status.js +15 -15
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +3 -3
- package/dist/bin/git-sweep.js +15 -15
- package/dist/bin/graph-backfill.js +6 -6
- package/dist/bin/graph-export.js +5 -5
- package/dist/bin/import-history.js +9 -9
- package/dist/bin/install.js +73 -71
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +4 -4
- package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/scan-tasks.js +14 -14
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +4 -4
- package/dist/bin/stack-update.js +7 -7
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{branch-hygiene-55TKIWAZ.js → branch-hygiene-R5NVTRAY.js} +17 -15
- package/dist/{capability-cards-DUM76MEW.js → capability-cards-YOKVMMOL.js} +2 -2
- package/dist/{capacity-monitor-XY6TLPQR.js → capacity-monitor-S54IOWRL.js} +15 -15
- package/dist/{catchup-brief-JGRVXTBF.js → catchup-brief-S35QLMG3.js} +17 -17
- package/dist/{chunk-EVWJQBCW.js → chunk-2HZY3ECT.js} +5 -5
- package/dist/{chunk-5M7RPT2V.js → chunk-2SG2UGCH.js} +4 -4
- package/dist/{chunk-6E5DEC2D.js → chunk-3OBWSCJN.js} +11 -11
- package/dist/{chunk-VVFWJU3D.js → chunk-4IYSBPX3.js} +1 -1
- package/dist/{chunk-7JM2LGHO.js → chunk-52KNOQMK.js} +3 -3
- package/dist/{chunk-NCS7UNML.js → chunk-542EWGY3.js} +7 -7
- package/dist/{chunk-XUOSKPVP.js → chunk-65SVQELL.js} +1 -1
- package/dist/{chunk-S7LMZ6VM.js → chunk-6HBURYON.js} +1 -1
- package/dist/{chunk-UPH5EY5F.js → chunk-6IRVGOUL.js} +1 -1
- package/dist/{chunk-2DJTSJWW.js → chunk-6M36JFFD.js} +3 -3
- package/dist/{chunk-QWWGMK4Y.js → chunk-6MRWJMI5.js} +1 -1
- package/dist/{chunk-6ND3MBX7.js → chunk-7EA7LYW4.js} +2 -2
- package/dist/{chunk-5OM6Z22T.js → chunk-7WDXEKUL.js} +3 -3
- package/dist/{chunk-OMU7HDKI.js → chunk-AOO77BDE.js} +1 -1
- package/dist/{chunk-O2RF5NGI.js → chunk-AVKXCSBI.js} +1 -1
- package/dist/{chunk-JGHVEDZG.js → chunk-B2GLEEGY.js} +1 -1
- package/dist/chunk-B75BOKEI.js +193 -0
- package/dist/{chunk-SKFA42EO.js → chunk-B76TSEP3.js} +1 -1
- package/dist/{chunk-ELOJZIVD.js → chunk-BPC5LZ6Y.js} +1 -1
- package/dist/{chunk-DUSZ2ZQE.js → chunk-BU2QQWBQ.js} +1 -1
- package/dist/{chunk-B6QRDKL3.js → chunk-DADMPMYX.js} +1 -1
- package/dist/{chunk-5TWCO22U.js → chunk-DILD54TU.js} +46 -13
- package/dist/{chunk-YBVKLDT3.js → chunk-DZ6OQM67.js} +1 -1
- package/dist/{chunk-SGLZZJWX.js → chunk-EIF2LQHZ.js} +1 -1
- package/dist/{chunk-XYKCPHWT.js → chunk-FNZR3B7U.js} +1 -1
- package/dist/{chunk-X7BGMYZS.js → chunk-FUIIVSW6.js} +1 -1
- package/dist/{chunk-EFFE6UVN.js → chunk-GN45PBWI.js} +2 -2
- package/dist/{chunk-XGQU34XA.js → chunk-H2L4PHGH.js} +2 -2
- package/dist/{chunk-YOZJWU2I.js → chunk-H37HHX3E.js} +9 -9
- package/dist/{chunk-XZHA3WO2.js → chunk-HEPR6QTL.js} +4 -4
- package/dist/{chunk-YDTW2KYM.js → chunk-I3XKO3KQ.js} +1 -1
- package/dist/{chunk-W33EMSZB.js → chunk-I7Z6KTGF.js} +5 -5
- package/dist/{chunk-AMBCXARR.js → chunk-ISD7ZD45.js} +140 -140
- package/dist/chunk-JCBKARSK.js +113 -0
- package/dist/{chunk-2AWXDWUB.js → chunk-K5WFKEXQ.js} +67 -78
- package/dist/{chunk-BE7NKEGL.js → chunk-KCC5A7YL.js} +5 -5
- package/dist/{chunk-EGCYJ4LJ.js → chunk-KMBEL7VB.js} +1 -1
- package/dist/{chunk-FYPSGPYS.js → chunk-KTY7I7UH.js} +1 -1
- package/dist/{chunk-U5QPEYCA.js → chunk-LMZISHSJ.js} +13 -13
- package/dist/{chunk-AVOP32R7.js → chunk-LTVCRHHD.js} +4 -4
- package/dist/{chunk-6F2DZQQS.js → chunk-MQRFKSLI.js} +3 -3
- package/dist/{chunk-BF252PDD.js → chunk-MW2GJJ53.js} +2 -2
- package/dist/{chunk-K4SSTJHJ.js → chunk-N5I7RL3I.js} +1 -1
- package/dist/{chunk-CMZLULTW.js → chunk-OFX5B2S7.js} +1 -1
- package/dist/{chunk-FHOI6AFU.js → chunk-OJTJYEMX.js} +3 -3
- package/dist/{chunk-FQ55TZWJ.js → chunk-PAEXYFMY.js} +1 -1
- package/dist/{chunk-ROAUSSJI.js → chunk-PLRIJALF.js} +160 -34
- package/dist/{chunk-RIOJ7RWQ.js → chunk-Q7L6G6KV.js} +2 -2
- package/dist/{chunk-DUBZDAXS.js → chunk-QBTWXDFK.js} +9 -9
- package/dist/{chunk-Z6MVHWJF.js → chunk-QFPTDSY2.js} +1 -1
- package/dist/{chunk-4ZH65EXT.js → chunk-QXSBB26A.js} +1 -1
- package/dist/{chunk-UE7SPA54.js → chunk-QZLIZAS7.js} +2 -2
- package/dist/{chunk-LAVL2OMB.js → chunk-R44Z32O2.js} +3 -3
- package/dist/{chunk-QAD4YR57.js → chunk-RDTZTLVQ.js} +20 -11
- package/dist/{chunk-RQ3EUVVT.js → chunk-RLRT2BVM.js} +1 -1
- package/dist/chunk-RNAYCUNM.js +271 -0
- package/dist/{chunk-XDIYCXMJ.js → chunk-RRWDYOQS.js} +1 -1
- package/dist/{chunk-MZ222PUT.js → chunk-T4KZ2Z2N.js} +3 -3
- package/dist/{chunk-HDALYSEP.js → chunk-TLYAEISW.js} +2 -2
- package/dist/{chunk-QIJEW462.js → chunk-UIV2WPBT.js} +1 -13
- package/dist/{chunk-AVFMDS5Z.js → chunk-UPWE5NOG.js} +2 -2
- package/dist/{chunk-C5KHGDWX.js → chunk-UXBD22CD.js} +1 -1
- package/dist/{chunk-U3WSLO2R.js → chunk-VJHUVFIW.js} +3 -3
- package/dist/{chunk-SEEMHG5A.js → chunk-WYLV4S6A.js} +3 -3
- package/dist/{chunk-EVV2G3CW.js → chunk-X425OEYF.js} +4 -4
- package/dist/{chunk-RLY3O2F7.js → chunk-X7H3HMFH.js} +3 -3
- package/dist/{chunk-P6OW236E.js → chunk-XACL67CS.js} +1 -1
- package/dist/{chunk-IIEKPBKB.js → chunk-XCTGRD4S.js} +175 -11
- package/dist/{chunk-MS6F63JW.js → chunk-XJI7Z6LZ.js} +1 -1
- package/dist/{chunk-JGKV5DLX.js → chunk-XUKPALWT.js} +3 -3
- package/dist/{chunk-FUX5ZEB3.js → chunk-XWHE4LZK.js} +1 -1
- package/dist/{chunk-4E7DFDVQ.js → chunk-YE7NH53A.js} +1 -1
- package/dist/{chunk-N2JXHW4E.js → chunk-ZIVEA3NB.js} +1 -1
- package/dist/{cleanup-graph-garbage-MKSRWINB.js → cleanup-graph-garbage-KUABW6LS.js} +6 -6
- package/dist/{co-activation-W7QBHSUR.js → co-activation-XMPHKGHR.js} +2 -2
- package/dist/{co-occurrence-C5YW5JZ6.js → co-occurrence-SHKSJ6CV.js} +4 -4
- package/dist/{conversation-entity-extractor-FPAMTL3C.js → conversation-entity-extractor-D3EFTLT4.js} +2 -2
- package/dist/{crdt-sync-OTFYRPW2.js → crdt-sync-UJELKSNX.js} +1 -1
- package/dist/{crm-webhook-5WHYZW6K.js → crm-webhook-HHNBS7LY.js} +2 -2
- package/dist/{cto-delegation-gate-U2AEMPQD.js → cto-delegation-gate-DXNF5HVW.js} +13 -13
- package/dist/{daemon-orchestration-DIT3JLV7.js → daemon-orchestration-7QB6QOXT.js} +29 -17
- package/dist/{db-backup-CXNB2ZAG.js → db-backup-DLD4QZBO.js} +1 -1
- package/dist/{doc-graph-extractor-SDH4QDWF.js → doc-graph-extractor-3TRLGD7M.js} +4 -4
- package/dist/{documents-WBKAVVMO.js → documents-FHIBU7KJ.js} +5 -5
- package/dist/{dreaming-M23FLJDE.js → dreaming-OMFUEUCQ.js} +14 -14
- package/dist/{exe-drift-AZGPQH73.js → exe-drift-KY2KHZEL.js} +3 -3
- package/dist/{exe-export-523RIUSC.js → exe-export-SP6G3QF6.js} +6 -6
- package/dist/{exe-import-CCF76ZK7.js → exe-import-KJU7FBVQ.js} +6 -6
- package/dist/{exe-key-5ADXQDJY.js → exe-key-RWGMIHK7.js} +71 -69
- package/dist/{exe-snapshot-NQMKIQQO.js → exe-snapshot-ZNPGUKRZ.js} +17 -17
- package/dist/{fast-db-init-YDAY7TVI.js → fast-db-init-QQB6IVWV.js} +1 -1
- package/dist/{founder-context-CTNPSPVO.js → founder-context-PQR3BUS7.js} +2 -2
- package/dist/gateway/index.js +11 -11
- package/dist/{git-staleness-FIPWVHRJ.js → git-staleness-UGB5J3K7.js} +2 -2
- package/dist/{global-procedures-YT2RDNUD.js → global-procedures-R7KRREEK.js} +3 -3
- package/dist/{graph-auto-extract-T63GAUZF.js → graph-auto-extract-LKIQ57PL.js} +4 -4
- package/dist/{graph-rag-WAK2BRJH.js → graph-rag-JZZAB7PC.js} +2 -2
- package/dist/hooks/bug-report-worker.js +16 -16
- package/dist/hooks/codex-stop-task-finalizer.js +16 -16
- package/dist/hooks/commit-complete.js +16 -16
- package/dist/hooks/error-recall.js +6 -6
- package/dist/hooks/exe-heartbeat-hook.js +3 -3
- package/dist/hooks/ingest.js +6 -6
- package/dist/hooks/instructions-loaded.js +4 -4
- package/dist/hooks/manifest.json +19 -19
- package/dist/hooks/notification.js +4 -4
- package/dist/hooks/post-compact.js +15 -15
- package/dist/hooks/post-tool-combined.js +7 -7
- package/dist/hooks/pre-compact.js +16 -16
- package/dist/hooks/pre-tool-use.js +19 -19
- package/dist/hooks/prompt-submit.js +30 -30
- package/dist/hooks/session-end.js +20 -20
- package/dist/hooks/session-start.js +12 -12
- package/dist/hooks/stop.js +19 -19
- package/dist/hooks/subagent-stop.js +15 -15
- package/dist/hooks/summary-worker.js +19 -19
- package/dist/index.js +25 -25
- package/dist/{installer-UEPVZPFE.js → installer-MNPXDLGG.js} +6 -6
- package/dist/{installer-EGY5GPB7.js → installer-MZWWBXM6.js} +9 -9
- package/dist/{installer-MHVZ4RJU.js → installer-SB2N5NKH.js} +9 -9
- package/dist/{intercom-queue-NQFQZXQP.js → intercom-queue-VU2G6F5R.js} +15 -13
- package/dist/lib/agent-config.js +1 -1
- package/dist/lib/cloud-sync.js +12 -10
- package/dist/lib/consolidation.js +7 -7
- package/dist/lib/crypto.js +5 -1
- package/dist/lib/database.js +2 -2
- package/dist/lib/db.js +2 -2
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/employee-templates.js +4 -4
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon.js +330 -103
- package/dist/lib/hybrid-search.js +5 -5
- package/dist/lib/identity.js +2 -2
- package/dist/lib/license.js +2 -2
- package/dist/lib/messaging.js +14 -14
- package/dist/lib/registry-proxy.js +1 -1
- package/dist/lib/reminders.js +3 -3
- package/dist/lib/schedules.js +5 -5
- package/dist/lib/session-registry.js +4 -4
- package/dist/lib/skill-learning.js +6 -6
- package/dist/lib/store.js +4 -4
- package/dist/lib/task-router.js +3 -3
- package/dist/lib/tasks.js +15 -15
- package/dist/lib/tmux-routing.js +13 -13
- package/dist/lib/token-spend.js +3 -3
- package/dist/{license-gate-WCBZ4EBB.js → license-gate-BYDMFMFT.js} +3 -3
- package/dist/{license-sync-N63ORPQY.js → license-sync-N3RNYVP2.js} +2 -2
- package/dist/mcp/register-tools.js +70 -68
- package/dist/mcp/server.js +73 -71
- package/dist/mcp/tools/complete-reminder.js +4 -4
- package/dist/mcp/tools/create-reminder.js +4 -4
- package/dist/mcp/tools/create-task.js +17 -17
- package/dist/mcp/tools/deactivate-behavior.js +7 -7
- package/dist/mcp/tools/list-reminders.js +4 -4
- package/dist/mcp/tools/list-tasks.js +17 -17
- package/dist/mcp/tools/send-message.js +16 -16
- package/dist/mcp/tools/update-task.js +16 -16
- package/dist/{mcp-http-config-I2XKM6Y6.js → mcp-http-config-EMAVS2JI.js} +3 -3
- package/dist/{memory-cards-LJLITM2D.js → memory-cards-TQRLZI4D.js} +4 -4
- package/dist/{memory-graph-extractor-WIK2X7NW.js → memory-graph-extractor-IWGNVAFU.js} +5 -5
- package/dist/{memory-poisoning-defense-K5ZYLCBS.js → memory-poisoning-defense-T4ITBGSG.js} +2 -2
- package/dist/{memory-pressure-watchdog-GAIU4DFY.js → memory-pressure-watchdog-RRIAXPXQ.js} +14 -14
- package/dist/{memory-reflection-ERYZ6SJH.js → memory-reflection-6N4J2FL7.js} +2 -2
- package/dist/monitor-grants-RZOVSYVO.js +27 -0
- package/dist/monitor-identity-MOXISYNG.js +34 -0
- package/dist/{notifications-A43CXO7Q.js → notifications-KONB3C62.js} +13 -13
- package/dist/{orchestration-events-CRVRCTHR.js → orchestration-events-5SIJOE4H.js} +3 -3
- package/dist/{orchestrator-65ZCLW5C.js → orchestrator-DUUX7FQV.js} +15 -15
- package/dist/{pipeline-router-VZUIXWWJ.js → pipeline-router-O6HU7DKH.js} +3 -3
- package/dist/{plan-limits-QNY6FVQQ.js → plan-limits-GRNBOBB3.js} +5 -5
- package/dist/{projection-worker-EASTW4IP.js → projection-worker-ZVOFHTXT.js} +2 -2
- package/dist/{prospective-memory-T7Z67MF7.js → prospective-memory-W6S67LZZ.js} +2 -2
- package/dist/{reranker-2S766AWB.js → reranker-6UQSZVV2.js} +1 -1
- package/dist/{retrieval-health-HQ6JHDTD.js → retrieval-health-TWHKYCRK.js} +1 -1
- package/dist/{review-polling-4R7EPAHG.js → review-polling-PCMD5BFN.js} +14 -14
- package/dist/runtime/index.js +21 -21
- package/dist/{session-events-ZPPOVRDJ.js → session-events-3LCVQEL7.js} +14 -14
- package/dist/{session-kill-telemetry-BEAPGQEF.js → session-kill-telemetry-CZSPN5V6.js} +14 -14
- package/dist/{session-scope-B6Y2VP75.js → session-scope-CFHVSVAQ.js} +13 -13
- package/dist/{setup-wizard-X6HICSAF.js → setup-wizard-CJZMM43G.js} +1 -1
- package/dist/{skill-refinement-XYACEWES.js → skill-refinement-74T6VDFM.js} +3 -3
- package/dist/{stack-release-3AF7TQ5N.js → stack-release-XXMV7SPX.js} +40 -3
- package/dist/{stack-update-4JALV4DZ.js → stack-update-E2TKHHSQ.js} +3 -3
- package/dist/{steward-gate-WGP4QWXQ.js → steward-gate-WT7WXQIE.js} +3 -3
- package/dist/{task-enforcement-WFHEKFC3.js → task-enforcement-VI7L43DC.js} +14 -14
- package/dist/{task-scope-VMYGYVCH.js → task-scope-CQEG5SSJ.js} +13 -13
- package/dist/{tasks-crud-ELQ2JSRG.js → tasks-crud-UGK5A25L.js} +13 -13
- package/dist/{tasks-notify-R6KGKW5R.js → tasks-notify-SMLDFBWM.js} +14 -14
- package/dist/{tasks-review-E3YTGOFJ.js → tasks-review-JKBRACII.js} +13 -13
- package/dist/{telemetry-upload-RDJX4ZFD.js → telemetry-upload-7LBYGPCB.js} +7 -7
- package/dist/{token-budget-XZVEGHCT.js → token-budget-QBRJR4M5.js} +3 -3
- package/dist/{tool-telemetry-OQ423YOE.js → tool-telemetry-ULIDUK3P.js} +1 -1
- package/dist/tui/App.js +21 -21
- package/dist/{tui-data-7UMFG6GY.js → tui-data-NPTGKT37.js} +13 -13
- package/dist/{worker-gate-QENGURPJ.js → worker-gate-MXUQUG4M.js} +1 -1
- package/dist/{workflow-engine-HUSIWUSV.js → workflow-engine-EWCOLD47.js} +2 -2
- package/dist/{worktree-EZ3EZUOV.js → worktree-GVF2I5FP.js} +4 -4
- package/dist/{worktree-sweep-O2UXISLE.js → worktree-sweep-ZAG3V24E.js} +5 -5
- package/package.json +4 -3
- package/release-notes.json +28 -20
- package/dist/chunk-LO6L5ADL.js +0 -76
- package/dist/{chunk-DFJVHZ6Z.js → chunk-5Z5NATNS.js} +0 -0
- package/dist/{chunk-7UMCQQWS.js → chunk-A4DVMPYB.js} +3 -3
- /package/dist/{chunk-5KCRWAWF.js → chunk-ATOU6CYR.js} +0 -0
- /package/dist/{chunk-KK64O2G4.js → chunk-D3QASX2W.js} +0 -0
- /package/dist/{chunk-GOAPKDWS.js → chunk-HHIBOU3P.js} +0 -0
- /package/dist/{chunk-F6VD2OWU.js → chunk-IYB2NIW3.js} +0 -0
- /package/dist/{chunk-XETUG5DN.js → chunk-KTPG4XKI.js} +0 -0
- /package/dist/{chunk-LUO2MYQH.js → chunk-NQBRGXYR.js} +0 -0
- /package/dist/{chunk-IO3Z2JBX.js → chunk-QLFRCA6I.js} +0 -0
- /package/dist/{chunk-HHFQRC3F.js → chunk-TNJRWUCE.js} +0 -0
- /package/dist/{chunk-JIE4ZUMV.js → chunk-UFAXZ2PY.js} +0 -0
- /package/dist/{chunk-TBRNCEV4.js → chunk-UNVHIH7N.js} +0 -0
- /package/dist/{chunk-OG5CXUHI.js → chunk-Z7OZP3ET.js} +0 -0
- /package/dist/{core-memory-V2Q5G7CJ.js → core-memory-VO5ZIBKH.js} +0 -0
- /package/dist/{oauth-server-MLE5MGQO.js → oauth-server-ROQFOEMM.js} +0 -0
- /package/dist/{project-boot-27QXVGY3.js → project-boot-SD7GM24K.js} +0 -0
- /package/dist/{wiki-acl-NZMJUJGL.js → wiki-acl-JA5UCQZ4.js} +0 -0
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
import {
|
|
2
2
|
lightweightSearch
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QBTWXDFK.js";
|
|
4
4
|
import "./chunk-AB4PAQYK.js";
|
|
5
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-H37HHX3E.js";
|
|
6
6
|
import "./chunk-CHCA3ZM2.js";
|
|
7
7
|
import "./chunk-OTVEIJUQ.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-HHIBOU3P.js";
|
|
9
9
|
import "./chunk-Y25OJWOQ.js";
|
|
10
10
|
import {
|
|
11
11
|
sessionScopeFilter,
|
|
12
12
|
strictSessionScopeFilter
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-PLRIJALF.js";
|
|
14
|
+
import "./chunk-OFX5B2S7.js";
|
|
15
|
+
import "./chunk-B76TSEP3.js";
|
|
16
|
+
import "./chunk-RLRT2BVM.js";
|
|
17
|
+
import "./chunk-4JERP7NT.js";
|
|
17
18
|
import "./chunk-EIKATSE4.js";
|
|
18
19
|
import "./chunk-E23LNUWJ.js";
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-QIJEW462.js";
|
|
20
|
+
import "./chunk-UIV2WPBT.js";
|
|
21
21
|
import "./chunk-SSTLTIF3.js";
|
|
22
22
|
import "./chunk-RMOBQ6A5.js";
|
|
23
23
|
import "./chunk-54QCG45Y.js";
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-FUIIVSW6.js";
|
|
25
|
+
import "./chunk-65SVQELL.js";
|
|
26
26
|
import "./chunk-NGP6LSV2.js";
|
|
27
|
-
import "./chunk-
|
|
27
|
+
import "./chunk-MW2GJJ53.js";
|
|
28
28
|
import "./chunk-CVYC6DUW.js";
|
|
29
29
|
import "./chunk-2233TQCA.js";
|
|
30
30
|
import "./chunk-HCJCW7X4.js";
|
|
@@ -38,16 +38,16 @@ import "./chunk-GJV3WDWM.js";
|
|
|
38
38
|
import "./chunk-MP2AFCGL.js";
|
|
39
39
|
import {
|
|
40
40
|
getClient
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-HEPR6QTL.js";
|
|
42
42
|
import "./chunk-2I23RPSI.js";
|
|
43
|
-
import "./chunk-
|
|
43
|
+
import "./chunk-ATOU6CYR.js";
|
|
44
44
|
import "./chunk-PNQDP3OA.js";
|
|
45
45
|
import "./chunk-H73TUI4Y.js";
|
|
46
46
|
import "./chunk-7HLWBYH7.js";
|
|
47
47
|
import "./chunk-FXU7JOXK.js";
|
|
48
48
|
import "./chunk-Z42MXYWW.js";
|
|
49
|
-
import "./chunk-
|
|
50
|
-
import "./chunk-
|
|
49
|
+
import "./chunk-XACL67CS.js";
|
|
50
|
+
import "./chunk-5Z5NATNS.js";
|
|
51
51
|
import "./chunk-7Y5UDEVM.js";
|
|
52
52
|
import "./chunk-SHIICYJW.js";
|
|
53
53
|
import "./chunk-MLKGABMK.js";
|
|
@@ -156,7 +156,7 @@ ${msgLines}`);
|
|
|
156
156
|
} catch {
|
|
157
157
|
}
|
|
158
158
|
try {
|
|
159
|
-
const { getPendingProspective, markSurfaced } = await import("./prospective-memory-
|
|
159
|
+
const { getPendingProspective, markSurfaced } = await import("./prospective-memory-W6S67LZZ.js");
|
|
160
160
|
const due = await getPendingProspective(agentId, { projectName, limit: 5 });
|
|
161
161
|
if (due.length > 0) {
|
|
162
162
|
const now = Date.now();
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
IMessageAdapter
|
|
3
|
+
} from "./chunk-2SRG3B3D.js";
|
|
1
4
|
import {
|
|
2
5
|
createCRMWebhookHandler,
|
|
3
6
|
parseTwentyWebhook
|
|
4
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-6MRWJMI5.js";
|
|
5
8
|
import {
|
|
6
9
|
WhatsAppAdapter
|
|
7
10
|
} from "./chunk-ECSNSHZ7.js";
|
|
@@ -17,9 +20,6 @@ import {
|
|
|
17
20
|
import {
|
|
18
21
|
SlackAdapter
|
|
19
22
|
} from "./chunk-ORCCI2VV.js";
|
|
20
|
-
import {
|
|
21
|
-
IMessageAdapter
|
|
22
|
-
} from "./chunk-2SRG3B3D.js";
|
|
23
23
|
import {
|
|
24
24
|
BotRegistry,
|
|
25
25
|
BotRuntime,
|
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
retryWithBackoff,
|
|
43
43
|
routeMessage,
|
|
44
44
|
validateGatewayConfig
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-7EA7LYW4.js";
|
|
46
46
|
import {
|
|
47
47
|
OllamaProvider
|
|
48
48
|
} from "./chunk-FWFFZGSC.js";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
deactivateBehavior
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-TLYAEISW.js";
|
|
4
4
|
import {
|
|
5
5
|
getActiveAgent
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-DZ6OQM67.js";
|
|
7
7
|
import {
|
|
8
8
|
canCoordinate,
|
|
9
9
|
getClient
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-HEPR6QTL.js";
|
|
11
11
|
|
|
12
12
|
// src/mcp/tools/deactivate-behavior.ts
|
|
13
13
|
import { z } from "zod";
|
|
@@ -24,7 +24,7 @@ function registerDeactivateBehavior(server) {
|
|
|
24
24
|
async ({ behavior_id }) => {
|
|
25
25
|
const caller = getActiveAgent();
|
|
26
26
|
try {
|
|
27
|
-
const { StewardGate } = await import("./steward-gate-
|
|
27
|
+
const { StewardGate } = await import("./steward-gate-WT7WXQIE.js");
|
|
28
28
|
const steward = new StewardGate();
|
|
29
29
|
const gateDecision = await steward.checkAuthority(caller.agentId || "unknown", "deactivate_behavior", behavior_id);
|
|
30
30
|
if (!gateDecision.allowed) {
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createTokenBudgetMiddleware
|
|
3
|
-
} from "./chunk-XDIYCXMJ.js";
|
|
4
1
|
import {
|
|
5
2
|
MultiAgentOrchestrator
|
|
6
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-52KNOQMK.js";
|
|
4
|
+
import {
|
|
5
|
+
createTokenBudgetMiddleware
|
|
6
|
+
} from "./chunk-RRWDYOQS.js";
|
|
7
7
|
import {
|
|
8
8
|
createQuietRenderer,
|
|
9
9
|
createTerminalRenderer,
|
|
10
10
|
renderAgentEvents
|
|
11
11
|
} from "./chunk-YZFZDJWZ.js";
|
|
12
|
+
import {
|
|
13
|
+
checkDangerousPatterns,
|
|
14
|
+
hasCriticalPattern
|
|
15
|
+
} from "./chunk-CMCYL2JC.js";
|
|
12
16
|
import {
|
|
13
17
|
checkPathSafety,
|
|
14
18
|
checkReadPathSafety,
|
|
15
19
|
containsPathTraversal
|
|
16
20
|
} from "./chunk-NGVOA6ZQ.js";
|
|
17
|
-
import {
|
|
18
|
-
checkDangerousPatterns,
|
|
19
|
-
hasCriticalPattern
|
|
20
|
-
} from "./chunk-CMCYL2JC.js";
|
|
21
21
|
import {
|
|
22
22
|
ContextManager,
|
|
23
23
|
agentLoop,
|
|
@@ -209,7 +209,7 @@ function createExeOSHooks(config) {
|
|
|
209
209
|
);
|
|
210
210
|
}
|
|
211
211
|
try {
|
|
212
|
-
const { listBehaviors } = await import("./behaviors-
|
|
212
|
+
const { listBehaviors } = await import("./behaviors-HLZUJSMP.js");
|
|
213
213
|
const behaviors = await listBehaviors(config.agentId, config.projectName, 12);
|
|
214
214
|
if (behaviors.length > 0) {
|
|
215
215
|
process.stderr.write(
|
|
@@ -330,7 +330,7 @@ function createExeOSHooks(config) {
|
|
|
330
330
|
async onSubagentStop(_reason) {
|
|
331
331
|
try {
|
|
332
332
|
const { getClient } = await import("./lib/database.js");
|
|
333
|
-
const { sessionScopeFilter } = await import("./task-scope-
|
|
333
|
+
const { sessionScopeFilter } = await import("./task-scope-CQEG5SSJ.js");
|
|
334
334
|
const client = getClient();
|
|
335
335
|
const ehScope = sessionScopeFilter();
|
|
336
336
|
const tasks = await client.execute({
|
|
@@ -422,7 +422,7 @@ function createExeOSHooks(config) {
|
|
|
422
422
|
try {
|
|
423
423
|
const { writeMemory, flushBatch } = await import("./lib/store.js");
|
|
424
424
|
const { getClient } = await import("./lib/database.js");
|
|
425
|
-
const { sessionScopeFilter: cpScopeFilter } = await import("./task-scope-
|
|
425
|
+
const { sessionScopeFilter: cpScopeFilter } = await import("./task-scope-CQEG5SSJ.js");
|
|
426
426
|
const client = getClient();
|
|
427
427
|
const cpScope = cpScopeFilter();
|
|
428
428
|
const tasks = await client.execute({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
routeTask
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4IYSBPX3.js";
|
|
4
4
|
import {
|
|
5
5
|
createTaskCore,
|
|
6
6
|
employeeSessionName,
|
|
@@ -9,11 +9,11 @@ import {
|
|
|
9
9
|
isEmployeeAlive,
|
|
10
10
|
sessionScopeFilter,
|
|
11
11
|
updateTaskStatus
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-PLRIJALF.js";
|
|
13
13
|
import {
|
|
14
14
|
DEFAULT_COORDINATOR_TEMPLATE_NAME,
|
|
15
15
|
getCoordinatorName
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-HEPR6QTL.js";
|
|
17
17
|
|
|
18
18
|
// src/runtime/orchestrator.ts
|
|
19
19
|
var STALE_THRESHOLD_MS = 2 * 60 * 60 * 1e3;
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
dispatchTaskToEmployee,
|
|
3
3
|
markTaskNotificationsRead,
|
|
4
4
|
notifyTaskDone
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-I7Z6KTGF.js";
|
|
6
6
|
import {
|
|
7
7
|
cleanupReviewFile,
|
|
8
8
|
createTaskCore,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
sessionScopeFilter,
|
|
12
12
|
updateTaskStatus,
|
|
13
13
|
writeNotification
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-PLRIJALF.js";
|
|
15
15
|
import {
|
|
16
16
|
orgBus
|
|
17
17
|
} from "./chunk-MP2AFCGL.js";
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
getClient,
|
|
20
20
|
getCoordinatorName,
|
|
21
21
|
isCoordinatorName
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-HEPR6QTL.js";
|
|
23
23
|
import {
|
|
24
24
|
EXE_AI_DIR
|
|
25
25
|
} from "./chunk-7Y5UDEVM.js";
|
|
@@ -61,7 +61,7 @@ async function cascadeUnblock(taskId, baseDir, now) {
|
|
|
61
61
|
}
|
|
62
62
|
if (unblockedRows.rows.length > 0 && !process.env.VITEST) {
|
|
63
63
|
try {
|
|
64
|
-
const { dispatchTaskToEmployee: dispatchTaskToEmployee2 } = await import("./tasks-notify-
|
|
64
|
+
const { dispatchTaskToEmployee: dispatchTaskToEmployee2 } = await import("./tasks-notify-SMLDFBWM.js");
|
|
65
65
|
const dispatched = /* @__PURE__ */ new Set();
|
|
66
66
|
for (const ur of unblockedRows.rows) {
|
|
67
67
|
const assignee = String(ur.assigned_to);
|
|
@@ -86,7 +86,7 @@ async function cascadeUnblock(taskId, baseDir, now) {
|
|
|
86
86
|
}
|
|
87
87
|
} catch {
|
|
88
88
|
try {
|
|
89
|
-
const { queueIntercom } = await import("./intercom-queue-
|
|
89
|
+
const { queueIntercom } = await import("./intercom-queue-VU2G6F5R.js");
|
|
90
90
|
const dispatched = /* @__PURE__ */ new Set();
|
|
91
91
|
for (const ur of unblockedRows.rows) {
|
|
92
92
|
const assignee = String(ur.assigned_to);
|
|
@@ -289,7 +289,7 @@ async function updateTask(input) {
|
|
|
289
289
|
try {
|
|
290
290
|
process.stderr.write(`[tasks] EVENT: tmux delivery failed for reviewer="${reviewer}". Queueing for daemon delivery.
|
|
291
291
|
`);
|
|
292
|
-
const { queueIntercom } = await import("./intercom-queue-
|
|
292
|
+
const { queueIntercom } = await import("./intercom-queue-VU2G6F5R.js");
|
|
293
293
|
const { resolveExeSession } = await import("./lib/tmux-routing.js");
|
|
294
294
|
const exeSession = row.session_scope ? String(row.session_scope) : resolveExeSession();
|
|
295
295
|
if (exeSession) {
|
|
@@ -333,7 +333,7 @@ async function updateTask(input) {
|
|
|
333
333
|
await markTaskNotificationsRead(taskFile);
|
|
334
334
|
if (isCompletionReviewTransition && !isCoordinator && row.reviewer) {
|
|
335
335
|
try {
|
|
336
|
-
const { writeNotification: writeNotification2 } = await import("./notifications-
|
|
336
|
+
const { writeNotification: writeNotification2 } = await import("./notifications-KONB3C62.js");
|
|
337
337
|
const reviewer = String(row.reviewer);
|
|
338
338
|
await writeNotification2({
|
|
339
339
|
agentId: reviewer,
|
|
@@ -17,7 +17,7 @@ var AGENT_CONFIG_PATH = path.join(EXE_AI_DIR, "agent-config.json");
|
|
|
17
17
|
var KNOWN_RUNTIMES = {
|
|
18
18
|
claude: ["claude-opus-4.8", "claude-opus-4.8-1m", "claude-opus-4.6", "claude-sonnet-4.8", "claude-sonnet-4.6", "claude-haiku-4.5", "claude-fable-5"],
|
|
19
19
|
codex: ["gpt-5.4", "gpt-5.5", "gpt-5.3-codex-spark", "o3", "o4-mini"],
|
|
20
|
-
opencode: ["anthropic/claude-opus-4-8", "anthropic/claude-sonnet-4-8", "anthropic/claude-sonnet-4-6", "openai/gpt-5.4", "google/gemini-2.5-pro", "deepseek/deepseek-r3", "minimax/minimax-m2.5"]
|
|
20
|
+
opencode: ["anthropic/claude-opus-4-8", "anthropic/claude-sonnet-4-8", "anthropic/claude-sonnet-4-6", "openai/gpt-5.4", "google/gemini-2.5-pro", "deepseek/deepseek-r3", "minimax/minimax-m2.5", "xai/grok-4", "xai/grok-3", "xai/grok-2-latest", "xai/grok-2-1212", "xai/grok-beta"]
|
|
21
21
|
};
|
|
22
22
|
var RETIRED_MODELS = {
|
|
23
23
|
"claude-sonnet-4": "claude-sonnet-4.6",
|
|
@@ -4,10 +4,10 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
reserveVersions,
|
|
6
6
|
vectorToBlob
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-H37HHX3E.js";
|
|
8
8
|
import {
|
|
9
9
|
getClient
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-HEPR6QTL.js";
|
|
11
11
|
|
|
12
12
|
// src/lib/documents.ts
|
|
13
13
|
import crypto from "crypto";
|
|
@@ -270,7 +270,7 @@ async function ingestDocument(input) {
|
|
|
270
270
|
await client.batch([documentStmt, ...chunkStmts], "write");
|
|
271
271
|
const embedded = vectors.filter((v) => v !== null).length;
|
|
272
272
|
const originalTexts = input.chunks.map((c) => c.text);
|
|
273
|
-
import("./doc-graph-extractor-
|
|
273
|
+
import("./doc-graph-extractor-3TRLGD7M.js").then(
|
|
274
274
|
({ extractAndStoreDocumentGraph }) => extractAndStoreDocumentGraph(documentId, originalTexts)
|
|
275
275
|
).catch((err) => {
|
|
276
276
|
process.stderr.write(
|
|
@@ -2,10 +2,10 @@ import {
|
|
|
2
2
|
listWorkflowDefinitions,
|
|
3
3
|
runWorkflow,
|
|
4
4
|
startWorkflow
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-QXSBB26A.js";
|
|
6
6
|
import {
|
|
7
7
|
ingest
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-7WDXEKUL.js";
|
|
9
9
|
import {
|
|
10
10
|
initCRMBridge
|
|
11
11
|
} from "./chunk-ML4S5SHZ.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HEPR6QTL.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/pipeline-router.ts
|
|
6
6
|
import crypto from "crypto";
|
|
@@ -140,8 +140,8 @@ Agent response: ${agentResponse}` : ""
|
|
|
140
140
|
}
|
|
141
141
|
async function sinkEntityExtraction(msg, agentResponse, agentName) {
|
|
142
142
|
try {
|
|
143
|
-
const { extractFromConversation } = await import("./conversation-entity-extractor-
|
|
144
|
-
const { storeExtraction } = await import("./graph-rag-
|
|
143
|
+
const { extractFromConversation } = await import("./conversation-entity-extractor-D3EFTLT4.js");
|
|
144
|
+
const { storeExtraction } = await import("./graph-rag-JZZAB7PC.js");
|
|
145
145
|
if ((msg.text?.length ?? 0) < 20) return false;
|
|
146
146
|
if (msg.isHistorical) return false;
|
|
147
147
|
const extraction = await extractFromConversation(msg, agentResponse, agentName);
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isValidX25519Recipient,
|
|
3
|
+
pubKeyHash
|
|
4
|
+
} from "./chunk-JCBKARSK.js";
|
|
5
|
+
import {
|
|
6
|
+
EXE_AI_DIR
|
|
7
|
+
} from "./chunk-7Y5UDEVM.js";
|
|
8
|
+
|
|
9
|
+
// src/lib/monitor-grants.ts
|
|
10
|
+
import crypto from "crypto";
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync } from "fs";
|
|
12
|
+
import path from "path";
|
|
13
|
+
var GRANTS_MAC_HKDF_INFO = "exe-os-monitor-grants-mac-v1";
|
|
14
|
+
var _macKey = null;
|
|
15
|
+
var _warnedUnverified = false;
|
|
16
|
+
var _warnedActiveMonitoring = false;
|
|
17
|
+
function primeGrantsMacKey(masterKey) {
|
|
18
|
+
if (masterKey.length !== 32) {
|
|
19
|
+
throw new Error(`Master key must be 32 bytes, got ${masterKey.length}`);
|
|
20
|
+
}
|
|
21
|
+
_macKey = Buffer.from(crypto.hkdfSync("sha256", masterKey, "", GRANTS_MAC_HKDF_INFO, 32));
|
|
22
|
+
}
|
|
23
|
+
function isGrantsMacPrimed() {
|
|
24
|
+
return _macKey !== null;
|
|
25
|
+
}
|
|
26
|
+
function dataDir() {
|
|
27
|
+
return process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
|
|
28
|
+
}
|
|
29
|
+
function grantsPath() {
|
|
30
|
+
return path.join(dataDir(), "monitor-grants.json");
|
|
31
|
+
}
|
|
32
|
+
function macMessage(grants) {
|
|
33
|
+
return Buffer.from(JSON.stringify(grants), "utf8");
|
|
34
|
+
}
|
|
35
|
+
function computeMac(grants) {
|
|
36
|
+
if (!_macKey) throw new Error("Grants MAC key not primed");
|
|
37
|
+
return crypto.createHmac("sha256", _macKey).update(macMessage(grants)).digest("hex");
|
|
38
|
+
}
|
|
39
|
+
function warnUnverifiedOnce(reason) {
|
|
40
|
+
if (_warnedUnverified) return;
|
|
41
|
+
_warnedUnverified = true;
|
|
42
|
+
process.stderr.write(
|
|
43
|
+
`[exe-os] \u26A0 monitor-grants.json ${reason} \u2014 refusing to honor it. Monitoring is treated as OFF. If you did not expect this, your grants file may have been tampered with; re-add trusted grants with \`exe-os grant add\`.
|
|
44
|
+
`
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
function isWellFormedGrant(g) {
|
|
48
|
+
if (typeof g !== "object" || g === null) return false;
|
|
49
|
+
const r = g;
|
|
50
|
+
if (typeof r.owner_pub_b64 !== "string") return false;
|
|
51
|
+
if (typeof r.grant_id !== "string") return false;
|
|
52
|
+
if (typeof r.added_at !== "string") return false;
|
|
53
|
+
if (!(r.revoked_at === null || typeof r.revoked_at === "string")) return false;
|
|
54
|
+
if (!(r.label === void 0 || typeof r.label === "string")) return false;
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
function loadFile() {
|
|
58
|
+
const p = grantsPath();
|
|
59
|
+
if (!existsSync(p)) return { version: 1, grants: [] };
|
|
60
|
+
let raw;
|
|
61
|
+
try {
|
|
62
|
+
raw = JSON.parse(readFileSync(p, "utf8"));
|
|
63
|
+
} catch {
|
|
64
|
+
warnUnverifiedOnce("is unreadable/corrupt");
|
|
65
|
+
return { version: 1, grants: [] };
|
|
66
|
+
}
|
|
67
|
+
if (!raw || !Array.isArray(raw.grants)) return { version: 1, grants: [] };
|
|
68
|
+
if (!raw.grants.every(isWellFormedGrant)) {
|
|
69
|
+
warnUnverifiedOnce("contains a malformed grant entry");
|
|
70
|
+
return { version: 1, grants: [] };
|
|
71
|
+
}
|
|
72
|
+
const grants = raw.grants;
|
|
73
|
+
if (!_macKey) {
|
|
74
|
+
warnUnverifiedOnce("cannot be integrity-verified (encryption key unavailable)");
|
|
75
|
+
return { version: 1, grants: [] };
|
|
76
|
+
}
|
|
77
|
+
if (typeof raw.mac !== "string") {
|
|
78
|
+
warnUnverifiedOnce("is missing its integrity MAC");
|
|
79
|
+
return { version: 1, grants: [] };
|
|
80
|
+
}
|
|
81
|
+
const expected = computeMac(grants);
|
|
82
|
+
const got = raw.mac;
|
|
83
|
+
const a = Buffer.from(expected, "hex");
|
|
84
|
+
const b = Buffer.from(got, "hex");
|
|
85
|
+
if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
|
|
86
|
+
warnUnverifiedOnce("has an invalid integrity MAC");
|
|
87
|
+
return { version: 1, grants: [] };
|
|
88
|
+
}
|
|
89
|
+
return { version: 1, grants };
|
|
90
|
+
}
|
|
91
|
+
function saveFile(grants) {
|
|
92
|
+
if (!_macKey) {
|
|
93
|
+
throw new Error(
|
|
94
|
+
"Cannot write monitoring grants: encryption key not available to sign the grants file. Run this from a device where `exe-os` can read the master key."
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
const dir = dataDir();
|
|
98
|
+
if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 448 });
|
|
99
|
+
const p = grantsPath();
|
|
100
|
+
const tmp = `${p}.tmp`;
|
|
101
|
+
const file = { version: 1, grants, mac: computeMac(grants) };
|
|
102
|
+
writeFileSync(tmp, JSON.stringify(file, null, 2) + "\n", { mode: 384 });
|
|
103
|
+
renameSync(tmp, p);
|
|
104
|
+
}
|
|
105
|
+
function assertValidPub(ownerPubB64) {
|
|
106
|
+
let buf;
|
|
107
|
+
try {
|
|
108
|
+
buf = Buffer.from(ownerPubB64, "base64");
|
|
109
|
+
} catch {
|
|
110
|
+
throw new Error("owner public key is not valid base64");
|
|
111
|
+
}
|
|
112
|
+
if (buf.length !== 32) {
|
|
113
|
+
throw new Error(`owner public key must decode to 32 bytes, got ${buf.length}`);
|
|
114
|
+
}
|
|
115
|
+
if (!isValidX25519Recipient(buf)) {
|
|
116
|
+
throw new Error("owner public key is not a valid X25519 point (rejected low-order/degenerate key)");
|
|
117
|
+
}
|
|
118
|
+
return buf;
|
|
119
|
+
}
|
|
120
|
+
function listGrants() {
|
|
121
|
+
return loadFile().grants.slice().sort((a, b) => b.added_at.localeCompare(a.added_at));
|
|
122
|
+
}
|
|
123
|
+
function addGrant(ownerPubB64, label) {
|
|
124
|
+
const pub = assertValidPub(ownerPubB64);
|
|
125
|
+
const canonical = pub.toString("base64");
|
|
126
|
+
const grants = loadFile().grants;
|
|
127
|
+
const existing = grants.find(
|
|
128
|
+
(g) => g.revoked_at === null && Buffer.from(g.owner_pub_b64, "base64").toString("base64") === canonical
|
|
129
|
+
);
|
|
130
|
+
if (existing) return { grant_id: existing.grant_id, created: false };
|
|
131
|
+
const grant = {
|
|
132
|
+
grant_id: crypto.randomBytes(8).toString("hex"),
|
|
133
|
+
owner_pub_b64: canonical,
|
|
134
|
+
added_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
135
|
+
revoked_at: null,
|
|
136
|
+
...label ? { label } : {}
|
|
137
|
+
};
|
|
138
|
+
grants.push(grant);
|
|
139
|
+
saveFile(grants);
|
|
140
|
+
return { grant_id: grant.grant_id, created: true };
|
|
141
|
+
}
|
|
142
|
+
function revokeGrant(grantIdOrOwnerPub) {
|
|
143
|
+
const grants = loadFile().grants;
|
|
144
|
+
let canonical = null;
|
|
145
|
+
try {
|
|
146
|
+
const buf = Buffer.from(grantIdOrOwnerPub, "base64");
|
|
147
|
+
if (buf.length === 32) canonical = buf.toString("base64");
|
|
148
|
+
} catch {
|
|
149
|
+
}
|
|
150
|
+
let revoked = 0;
|
|
151
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
152
|
+
for (const g of grants) {
|
|
153
|
+
if (g.revoked_at !== null) continue;
|
|
154
|
+
const matchesId = g.grant_id === grantIdOrOwnerPub;
|
|
155
|
+
const matchesPub = canonical !== null && g.owner_pub_b64 === canonical;
|
|
156
|
+
if (matchesId || matchesPub) {
|
|
157
|
+
g.revoked_at = now;
|
|
158
|
+
revoked++;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (revoked > 0) saveFile(grants);
|
|
162
|
+
return revoked;
|
|
163
|
+
}
|
|
164
|
+
function activeRecipientPubKeys() {
|
|
165
|
+
return loadFile().grants.filter((g) => g.revoked_at === null).map((g) => Buffer.from(g.owner_pub_b64, "base64")).filter((buf) => buf.length === 32);
|
|
166
|
+
}
|
|
167
|
+
function warnActiveMonitoringOnce(recipientPubKeys) {
|
|
168
|
+
if (_warnedActiveMonitoring || recipientPubKeys.length === 0) return;
|
|
169
|
+
_warnedActiveMonitoring = true;
|
|
170
|
+
const hashes = recipientPubKeys.map((p) => pubKeyHash(p).toString("hex")).join(", ");
|
|
171
|
+
process.stderr.write(
|
|
172
|
+
`[exe-os] \u26A0 ${recipientPubKeys.length} active monitoring recipient(s) \u2014 your memories are being encrypted to external key(s): ${hashes}
|
|
173
|
+
[exe-os] Review or revoke with: exe-os grant list
|
|
174
|
+
`
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
function _resetGrantsStateForTest() {
|
|
178
|
+
_macKey = null;
|
|
179
|
+
_warnedUnverified = false;
|
|
180
|
+
_warnedActiveMonitoring = false;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export {
|
|
184
|
+
primeGrantsMacKey,
|
|
185
|
+
isGrantsMacPrimed,
|
|
186
|
+
grantsPath,
|
|
187
|
+
listGrants,
|
|
188
|
+
addGrant,
|
|
189
|
+
revokeGrant,
|
|
190
|
+
activeRecipientPubKeys,
|
|
191
|
+
warnActiveMonitoringOnce,
|
|
192
|
+
_resetGrantsStateForTest
|
|
193
|
+
};
|