@askexenow/exe-os 0.9.288 → 0.9.290
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deploy/compose/README.md +6 -0
- package/deploy/compose/docker-compose.yml +48 -53
- package/dist/active-agent-DVMG6WVY.js +27 -0
- package/dist/active-agent-JJVXXRZV.js +26 -0
- package/dist/active-agent-L22OENGJ.js +26 -0
- package/dist/active-agent-SVG6F6HY.js +27 -0
- package/dist/agentic-ontology-2LJST3BE.js +25 -0
- package/dist/agentic-ontology-3GHJHLDY.js +25 -0
- package/dist/backfill-metadata-HJNVBORD.js +599 -0
- package/dist/backfill-metadata-W7PJ6YGP.js +599 -0
- package/dist/background-jobs-YTYZRTCM.js +25 -0
- package/dist/behaviors-EM5KZSHT.js +39 -0
- package/dist/behaviors-ROOZS234.js +39 -0
- package/dist/bin/age-ontology-load.js +2 -2
- package/dist/bin/agentic-ontology-backfill.js +8 -8
- package/dist/bin/agentic-reflection-backfill.js +9 -9
- package/dist/bin/agentic-semantic-label.js +8 -8
- package/dist/bin/backfill-conversations.js +8 -8
- package/dist/bin/backfill-responses.js +8 -8
- package/dist/bin/backfill-vectors.js +104 -19
- package/dist/bin/bulk-sync-postgres.js +9 -9
- package/dist/bin/cc-doctor.js +7 -7
- package/dist/bin/cleanup-stale-review-tasks.js +13 -13
- package/dist/bin/cli.js +56 -20
- package/dist/bin/deferred-daemon-restart.js +1 -1
- package/dist/bin/exe-agent-config.js +5 -5
- package/dist/bin/exe-agent.js +6 -6
- package/dist/bin/exe-assign.js +10 -10
- package/dist/bin/exe-boot.js +20 -20
- package/dist/bin/exe-call.js +6 -6
- package/dist/bin/exe-cloud.js +27 -9
- package/dist/bin/exe-dispatch.js +13 -13
- package/dist/bin/exe-doctor.js +1 -1
- package/dist/bin/exe-export-behaviors.js +9 -9
- package/dist/bin/exe-forget.js +8 -8
- package/dist/bin/exe-gateway.js +9 -9
- package/dist/bin/exe-healthcheck.js +7 -7
- package/dist/bin/exe-heartbeat.js +13 -13
- package/dist/bin/exe-kill.js +16 -16
- package/dist/bin/exe-launch-agent.js +20 -20
- package/dist/bin/exe-new-employee.js +9 -9
- package/dist/bin/exe-pending-messages.js +14 -14
- package/dist/bin/exe-pending-notifications.js +13 -13
- package/dist/bin/exe-pending-reviews.js +13 -13
- package/dist/bin/exe-rename.js +6 -6
- package/dist/bin/exe-review.js +15 -15
- package/dist/bin/exe-search.js +7 -7
- package/dist/bin/exe-session-cleanup.js +18 -18
- package/dist/bin/exe-settings.js +8 -8
- package/dist/bin/exe-start-codex.js +13 -13
- package/dist/bin/exe-start-opencode.js +10 -10
- package/dist/bin/exe-start.sh +29 -7
- package/dist/bin/exe-status.js +14 -14
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +5 -5
- package/dist/bin/git-sweep.js +14 -14
- package/dist/bin/graph-backfill.js +7 -7
- package/dist/bin/graph-export.js +7 -7
- package/dist/bin/import-history.js +9 -9
- package/dist/bin/install-launchd.js +24 -1
- package/dist/bin/install.js +36 -12
- 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 +4 -4
- package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
- package/dist/bin/scan-tasks.js +13 -13
- package/dist/bin/setup.js +2 -2
- package/dist/bin/shard-migrate.js +7 -7
- package/dist/bin/stack-update.js +7 -6
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/branding-PCLBJ3EP.js +97 -0
- package/dist/capability-cards-O6XB2AU4.js +88 -0
- package/dist/capability-cards-OEL47N2B.js +88 -0
- package/dist/capacity-monitor-UGMHVSUD.js +50 -0
- package/dist/capacity-monitor-ZE7CFVWH.js +50 -0
- package/dist/catchup-brief-3NONSIMA.js +174 -0
- package/dist/catchup-brief-HNEUKB7X.js +174 -0
- package/dist/chunk-232DHK5C.js +1119 -0
- package/dist/chunk-272SJ4RN.js +129 -0
- package/dist/chunk-2F5SG3CE.js +230 -0
- package/dist/chunk-2QMWIGJK.js +197 -0
- package/dist/chunk-2ZAOSGBX.js +668 -0
- package/dist/chunk-32K5NWMR.js +42 -0
- package/dist/chunk-32VOJ4GK.js +181 -0
- package/dist/chunk-3AUM4JVV.js +127 -0
- package/dist/chunk-3Q4UEXDE.js +297 -0
- package/dist/chunk-3RZNDPPW.js +2113 -0
- package/dist/chunk-3X2ZT5FN.js +3276 -0
- package/dist/chunk-44CP7NR2.js +333 -0
- package/dist/chunk-4FMNDJMY.js +50 -0
- package/dist/chunk-4NMTGHUE.js +127 -0
- package/dist/chunk-5J2L25OK.js +203 -0
- package/dist/chunk-5NQOIKAB.js +214 -0
- package/dist/chunk-5P3HOBZX.js +487 -0
- package/dist/chunk-5PLW3QL6.js +668 -0
- package/dist/chunk-5VAARLQR.js +58 -0
- package/dist/chunk-64GBV67L.js +1068 -0
- package/dist/chunk-66EIYAF2.js +157 -0
- package/dist/chunk-6IPJF5QD.js +630 -0
- package/dist/chunk-6MFM4N37.js +574 -0
- package/dist/chunk-6NSJTOXE.js +122 -0
- package/dist/chunk-6TLURATK.js +4318 -0
- package/dist/chunk-6WEETM7D.js +81 -0
- package/dist/chunk-6ZD3MW7T.js +97 -0
- package/dist/chunk-73JAJQRY.js +85 -0
- package/dist/chunk-73ORCJNJ.js +231 -0
- package/dist/chunk-75GH76GO.js +129 -0
- package/dist/chunk-7CHKD5IP.js +38 -0
- package/dist/chunk-7FTKXL5A.js +286 -0
- package/dist/chunk-7GTKCVVG.js +735 -0
- package/dist/chunk-7IRQSO3F.js +735 -0
- package/dist/chunk-7K4YVOAK.js +76 -0
- package/dist/chunk-7LOYIUOF.js +456 -0
- package/dist/chunk-7MINWZ3J.js +214 -0
- package/dist/chunk-7T5PS5DG.js +14439 -0
- package/dist/chunk-7XUJF3LZ.js +284 -0
- package/dist/chunk-A74WXY4S.js +227 -0
- package/dist/chunk-AVD5C3NG.js +197 -0
- package/dist/chunk-B36MRLEP.js +58 -0
- package/dist/chunk-B4TCZ3PS.js +373 -0
- package/dist/chunk-BJYLTU2G.js +621 -0
- package/dist/chunk-BPLEJ3EU.js +411 -0
- package/dist/chunk-BR2OA4AZ.js +123 -0
- package/dist/chunk-BTDPLFGK.js +221 -0
- package/dist/chunk-BTP3LPMP.js +210 -0
- package/dist/chunk-BU45UYTK.js +185 -0
- package/dist/chunk-BYOEIN37.js +176 -0
- package/dist/chunk-CCAA6XOZ.js +284 -0
- package/dist/chunk-CMDKYYFK.js +630 -0
- package/dist/chunk-D6LUKYKM.js +731 -0
- package/dist/chunk-DBQ6I6K2.js +3276 -0
- package/dist/chunk-DDWFHEPG.js +345 -0
- package/dist/chunk-DFSI6HFJ.js +2078 -0
- package/dist/chunk-DJLDKRXK.js +30 -0
- package/dist/chunk-DSOKTUTT.js +167 -0
- package/dist/chunk-EESAZNRC.js +348 -0
- package/dist/chunk-EQY6GDVD.js +369 -0
- package/dist/chunk-ETCARC76.js +836 -0
- package/dist/chunk-EYLU6MJT.js +192 -0
- package/dist/chunk-EZHTLPOS.js +280 -0
- package/dist/chunk-F23GFLKY.js +4318 -0
- package/dist/chunk-F3DQ3HDH.js +333 -0
- package/dist/chunk-F5SADWWW.js +240 -0
- package/dist/chunk-F6ZCUDCN.js +244 -0
- package/dist/chunk-FE6HKM2N.js +157 -0
- package/dist/chunk-FI5Q6F5S.js +382 -0
- package/dist/chunk-FNQZGNSG.js +1094 -0
- package/dist/chunk-FTG36JG5.js +280 -0
- package/dist/chunk-FVKTXXKK.js +128 -0
- package/dist/chunk-FZDW76SH.js +89 -0
- package/dist/chunk-G6GC2YSP.js +262 -0
- package/dist/chunk-HH2JVSKL.js +1157 -0
- package/dist/chunk-HHR5NB6N.js +377 -0
- package/dist/chunk-HJQQ7746.js +185 -0
- package/dist/chunk-HLFNLJSB.js +271 -0
- package/dist/chunk-HRZLGHT6.js +290 -0
- package/dist/chunk-HSSRWMVA.js +68 -0
- package/dist/chunk-HX735WX7.js +33 -0
- package/dist/chunk-I3NVB5MG.js +85 -0
- package/dist/chunk-I7Z6MK2B.js +240 -0
- package/dist/chunk-ID4SMRYX.js +2078 -0
- package/dist/chunk-IUQBMSBI.js +1350 -0
- package/dist/chunk-J6PDP2GY.js +221 -0
- package/dist/chunk-JGOGSH55.js +14378 -0
- package/dist/chunk-JRZ47IFL.js +82 -0
- package/dist/chunk-JXGHDROV.js +546 -0
- package/dist/chunk-JZEROVAU.js +546 -0
- package/dist/chunk-KFHAVF6J.js +97 -0
- package/dist/chunk-KJALZ6F6.js +128 -0
- package/dist/chunk-KMAIBYV3.js +402 -0
- package/dist/chunk-KMTNAXIB.js +54 -0
- package/dist/chunk-KQY4QIEN.js +731 -0
- package/dist/chunk-LHW7TZGJ.js +244 -0
- package/dist/chunk-LIH36DXG.js +159 -0
- package/dist/chunk-LRSU2ZU2.js +38 -0
- package/dist/chunk-M3VHV2RV.js +106 -0
- package/dist/chunk-MFCL4GAN.js +2113 -0
- package/dist/chunk-MFGMVKGM.js +150 -0
- package/dist/chunk-MFTGN7KN.js +411 -0
- package/dist/chunk-MUHKJCF7.js +128 -0
- package/dist/chunk-NHGBVLCD.js +210 -0
- package/dist/chunk-NOEBJMNN.js +33 -0
- package/dist/chunk-NQ2VNTGL.js +538 -0
- package/dist/chunk-NV5SSKZE.js +171 -0
- package/dist/chunk-NXJ2CP2C.js +290 -0
- package/dist/chunk-O4PZPM6H.js +204 -0
- package/dist/chunk-O5OW3YGQ.js +262 -0
- package/dist/chunk-OJQTONDJ.js +171 -0
- package/dist/chunk-OKZGUHE5.js +76 -0
- package/dist/chunk-OOH5M36Q.js +448 -0
- package/dist/chunk-OXUHCIGV.js +1352 -0
- package/dist/chunk-P5ARTZP2.js +128 -0
- package/dist/chunk-PKRSYS7F.js +402 -0
- package/dist/chunk-PNQDP3OA.js +800 -0
- package/dist/chunk-PQWO5D3F.js +348 -0
- package/dist/chunk-PYTSVZWG.js +377 -0
- package/dist/chunk-Q2R3WUW4.js +448 -0
- package/dist/chunk-Q6MJIJ2O.js +1352 -0
- package/dist/chunk-QFGJERAP.js +1119 -0
- package/dist/chunk-QKDRYZ2N.js +231 -0
- package/dist/chunk-QO7M774X.js +1094 -0
- package/dist/chunk-QODXLGH2.js +70 -0
- package/dist/chunk-RAV356E6.js +30 -0
- package/dist/chunk-RHC57KVT.js +85 -0
- package/dist/chunk-RHE7SHZJ.js +345 -0
- package/dist/chunk-RJY45A5J.js +133 -0
- package/dist/chunk-RK7EAA53.js +1157 -0
- package/dist/chunk-RSLVAYWS.js +192 -0
- package/dist/chunk-RVOPNDGY.js +150 -0
- package/dist/chunk-S3QEHFGE.js +373 -0
- package/dist/chunk-SCQEAMO3.js +299 -0
- package/dist/chunk-SL6WJP2Q.js +123 -0
- package/dist/chunk-SYOGNG2R.js +379 -0
- package/dist/chunk-T57DOVGE.js +97 -0
- package/dist/chunk-TEOJ63HX.js +362 -0
- package/dist/chunk-TMCKL43Q.js +181 -0
- package/dist/chunk-TMV5LCTC.js +167 -0
- package/dist/chunk-TO5ZXGDF.js +190 -0
- package/dist/chunk-TQZABASE.js +97 -0
- package/dist/chunk-U5RKF7MQ.js +836 -0
- package/dist/chunk-UBWBEY6I.js +81 -0
- package/dist/chunk-UDMFABWN.js +510 -0
- package/dist/chunk-UKS5CXQU.js +382 -0
- package/dist/chunk-UP7DNYG7.js +456 -0
- package/dist/chunk-V2OOLS63.js +41 -0
- package/dist/chunk-V5MGYIZS.js +70 -0
- package/dist/chunk-VBAY3OA7.js +604 -0
- package/dist/chunk-VK4KORCQ.js +204 -0
- package/dist/chunk-XCPVYQVK.js +336 -0
- package/dist/chunk-XWVBLZRP.js +50 -0
- package/dist/chunk-Y4ZA4GCQ.js +85 -0
- package/dist/chunk-YBTN5F2U.js +1068 -0
- package/dist/chunk-YMMYZXVZ.js +55 -0
- package/dist/chunk-Z5RXZRUC.js +227 -0
- package/dist/chunk-Z772TGD2.js +54 -0
- package/dist/chunk-ZAMPIXLH.js +1350 -0
- package/dist/chunk-ZPILUBWK.js +2142 -0
- package/dist/chunk-ZYEOHGU5.js +362 -0
- package/dist/co-activation-WCLF766F.js +73 -0
- package/dist/co-activation-WJTFJOTK.js +73 -0
- package/dist/co-occurrence-KFP6ZS7G.js +94 -0
- package/dist/co-occurrence-LPHW6UTZ.js +94 -0
- package/dist/code-context-index-QR5PAXM4.js +30 -0
- package/dist/conversation-wiki-populator-IMHNWKEU.js +105 -0
- package/dist/core-memory-3LSCC75D.js +110 -0
- package/dist/core-memory-DBZJ72TV.js +110 -0
- package/dist/crdt-sync-6DVGRMTV.js +33 -0
- package/dist/crdt-sync-UQ3PXFRB.js +33 -0
- package/dist/crm-webhook-55T4Z6XJ.js +10 -0
- package/dist/crm-webhook-VONTDB3M.js +10 -0
- package/dist/cto-delegation-gate-B7AKO7FX.js +279 -0
- package/dist/cto-delegation-gate-SPM6LAL2.js +279 -0
- package/dist/daemon-auth-55T2DI6G.js +13 -0
- package/dist/daemon-orchestration-XZLWWIV4.js +138 -0
- package/dist/daemon-orchestration-ZBDBRKVR.js +138 -0
- package/dist/db-backup-JHCI47JQ.js +37 -0
- package/dist/db-backup-LPCCZYIL.js +33 -0
- package/dist/db-restore-events-QF3KCGVZ.js +76 -0
- package/dist/doc-graph-extractor-4X23NP4I.js +132 -0
- package/dist/doc-graph-extractor-IOSZSDDW.js +132 -0
- package/dist/dreaming-KA3SN53N.js +33 -0
- package/dist/dreaming-TFZDGA72.js +33 -0
- package/dist/entity-boost-YFIFLE6N.js +375 -0
- package/dist/exe-drift-CLJ74KCO.js +69 -0
- package/dist/exe-drift-TEM7ELNY.js +69 -0
- package/dist/exe-export-CRCA4T4S.js +75 -0
- package/dist/exe-export-QF5V54XC.js +75 -0
- package/dist/exe-import-M4VYXCJZ.js +78 -0
- package/dist/exe-import-UZMMWNHJ.js +78 -0
- package/dist/exe-key-7PDQ72W2.js +580 -0
- package/dist/exe-key-NQQXEDUA.js +672 -0
- package/dist/exe-org-VAUMR7TL.js +73 -0
- package/dist/exe-snapshot-P7PUAJTV.js +337 -0
- package/dist/exe-snapshot-W5IVP6VF.js +337 -0
- package/dist/fast-db-init-G63PRINQ.js +7 -0
- package/dist/fast-db-init-MZOQZ2BW.js +7 -0
- package/dist/founder-context-QGKRISJH.js +96 -0
- package/dist/gateway/index.js +10 -10
- package/dist/git-staleness-42TTCFDP.js +111 -0
- package/dist/git-staleness-U7ADZARV.js +111 -0
- package/dist/git-task-sweep-4LW5RYYO.js +41 -0
- package/dist/git-task-sweep-T27IFHBH.js +41 -0
- package/dist/global-procedures-BVFRWJAV.js +21 -0
- package/dist/global-procedures-VJUQAYZ5.js +21 -0
- package/dist/graph-auto-extract-4ZA7UC6C.js +182 -0
- package/dist/graph-auto-extract-ZTZ44VKT.js +182 -0
- package/dist/hook-integrity-YPMNLP7B.js +89 -0
- package/dist/hooks/bug-report-worker.js +15 -15
- package/dist/hooks/codex-stop-task-finalizer.js +15 -15
- package/dist/hooks/commit-complete.js +16 -16
- package/dist/hooks/error-recall.js +9 -9
- package/dist/hooks/exe-heartbeat-hook.js +6 -6
- package/dist/hooks/ingest-worker.js +5 -5
- package/dist/hooks/ingest.js +13 -13
- 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 +15 -15
- package/dist/hooks/post-tool-combined.js +7 -7
- package/dist/hooks/pre-compact.js +20 -20
- package/dist/hooks/pre-tool-use.js +19 -19
- package/dist/hooks/prompt-submit.js +27 -27
- package/dist/hooks/session-end.js +25 -25
- package/dist/hooks/session-start.js +24 -18
- package/dist/hooks/stop.js +22 -22
- package/dist/hooks/subagent-stop.js +15 -15
- package/dist/hooks/summary-worker.js +22 -22
- package/dist/index.js +21 -21
- package/dist/installer-2MDIUMZS.js +343 -0
- package/dist/installer-CBGRTGIF.js +297 -0
- package/dist/installer-DGU4WZKJ.js +39 -0
- package/dist/installer-DS7H47GB.js +297 -0
- package/dist/installer-JSUC44TR.js +39 -0
- package/dist/installer-WTWEOSEK.js +343 -0
- package/dist/key-backup-status-X5CBECJ3.js +39 -0
- package/dist/lib/agent-config.js +2 -2
- package/dist/lib/cloud-sync.js +7 -7
- package/dist/lib/config.js +7 -1
- package/dist/lib/consolidation.js +9 -7
- package/dist/lib/database.js +4 -4
- package/dist/lib/db-daemon-client.js +3 -3
- package/dist/lib/db.js +4 -4
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/embed-worker.js +18 -7
- package/dist/lib/embedder.js +4 -4
- package/dist/lib/employee-templates.js +6 -6
- package/dist/lib/employees.js +4 -4
- package/dist/lib/exe-daemon-client.js +3 -3
- package/dist/lib/exe-daemon.js +165 -67
- package/dist/lib/hybrid-search.js +7 -7
- package/dist/lib/identity-templates.js +1 -1
- package/dist/lib/identity.js +4 -4
- package/dist/lib/license.js +2 -2
- package/dist/lib/messaging.js +13 -13
- package/dist/lib/reminders.js +5 -5
- package/dist/lib/schedules.js +7 -7
- package/dist/lib/session-registry.js +6 -6
- package/dist/lib/skill-learning.js +8 -8
- package/dist/lib/store.js +6 -6
- package/dist/lib/task-router.js +5 -5
- package/dist/lib/tasks.js +14 -14
- package/dist/lib/tmux-routing.js +12 -12
- package/dist/lib/token-spend.js +5 -5
- package/dist/lib/ws-client.js +5 -0
- package/dist/license-gate-OSPA2OD7.js +16 -0
- package/dist/license-gate-R5EZ7HD3.js +14 -0
- package/dist/mcp/register-tools.js +67 -67
- package/dist/mcp/server.js +128 -84
- 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 +16 -16
- package/dist/mcp/tools/deactivate-behavior.js +9 -9
- package/dist/mcp/tools/list-reminders.js +6 -6
- package/dist/mcp/tools/list-tasks.js +16 -16
- package/dist/mcp/tools/send-message.js +15 -15
- package/dist/mcp/tools/update-task.js +15 -15
- package/dist/mcp-http-config-DV6S22TF.js +28 -0
- package/dist/mcp-http-config-OGFPLJYH.js +28 -0
- package/dist/memory-cards-AUWC6FN6.js +179 -0
- package/dist/memory-cards-GJ3VHKAM.js +179 -0
- package/dist/memory-graph-extractor-7OWSK2ON.js +21 -0
- package/dist/memory-graph-extractor-TCTCM7PZ.js +21 -0
- package/dist/memory-poisoning-defense-FVLGA35X.js +223 -0
- package/dist/memory-poisoning-defense-TLVXFY43.js +223 -0
- package/dist/memory-queue-4QU434ZH.js +19 -0
- package/dist/memory-queue-client-6KTL3U3I.js +16 -0
- package/dist/memory-reflection-BYJFIFSV.js +243 -0
- package/dist/memory-reflection-C52FI4W2.js +243 -0
- package/dist/message-queue-client-DFXF7LJD.js +92 -0
- package/dist/notifications-AQKZFSR3.js +46 -0
- package/dist/notifications-U3NJYMXX.js +46 -0
- package/dist/oauth-server-NR3XEPA4.js +437 -0
- package/dist/orchestration-events-RDSYLFXZ.js +26 -0
- package/dist/orchestration-events-TKODYRYP.js +26 -0
- package/dist/orchestration-phase-UCTFU32J.js +23 -0
- package/dist/orchestrator-2JTJQLPG.js +34 -0
- package/dist/orchestrator-GNI5PCA6.js +34 -0
- package/dist/pipeline-router-HBSTKHG5.js +14 -0
- package/dist/pipeline-router-P2QAQHUY.js +14 -0
- package/dist/plan-limits-GQENSNTG.js +27 -0
- package/dist/plan-limits-UDKZ2O7W.js +27 -0
- package/dist/project-boot-5R3GLCVN.js +299 -0
- package/dist/project-boot-W2LTP7WW.js +299 -0
- package/dist/projection-worker-7EWWMJHG.js +1034 -0
- package/dist/projection-worker-ZMT5KNJJ.js +1084 -0
- package/dist/prospective-memory-7B65EHWB.js +231 -0
- package/dist/prospective-memory-LANRNOJX.js +231 -0
- package/dist/push-notifications-X7E7GSC7.js +15 -0
- package/dist/reranker-EUG4XM44.js +19 -0
- package/dist/reranker-QGJO6EHO.js +19 -0
- package/dist/retrieval-health-JE66LJ3I.js +11 -0
- package/dist/retrieval-health-WLNAPJCX.js +11 -0
- package/dist/review-polling-IXJ57M6Q.js +125 -0
- package/dist/review-polling-WHPJUENR.js +125 -0
- package/dist/runtime/index.js +15 -15
- package/dist/session-events-WMK6FCKZ.js +37 -0
- package/dist/session-events-XKG66APL.js +37 -0
- package/dist/session-kill-telemetry-2BU72YXD.js +30 -0
- package/dist/session-kill-telemetry-VTU7YBII.js +30 -0
- package/dist/session-scope-RYBNHQ43.js +87 -0
- package/dist/session-scope-TQZONLZL.js +87 -0
- package/dist/setup-wizard-NID5EPDN.js +12 -0
- package/dist/setup-wizard-PXK6SC2D.js +12 -0
- package/dist/shard-manager-F3YYEG5S.js +30 -0
- package/dist/skill-refinement-KRMGOT5M.js +158 -0
- package/dist/skill-refinement-Y6LLKYRL.js +158 -0
- package/dist/stack-update-3LZQWW3G.js +80 -0
- package/dist/steward-gate-KC4NOULU.js +14 -0
- package/dist/steward-gate-QV2APBFB.js +14 -0
- package/dist/task-enforcement-AI433TPY.js +439 -0
- package/dist/task-enforcement-GLDD2W5D.js +505 -0
- package/dist/task-scope-HMPIP6XB.js +36 -0
- package/dist/task-scope-XRH4KDJB.js +36 -0
- package/dist/tasks-crud-2KYGDJG2.js +78 -0
- package/dist/tasks-crud-FH2SFCNQ.js +78 -0
- package/dist/tasks-notify-3ZW2GLCS.js +39 -0
- package/dist/tasks-notify-AJSRQHLZ.js +39 -0
- package/dist/tasks-review-ISSCHGTG.js +48 -0
- package/dist/tasks-review-XERV6KZD.js +48 -0
- package/dist/telemetry-upload-R77W7I7G.js +740 -0
- package/dist/telemetry-upload-VZ3A6EPD.js +740 -0
- package/dist/token-budget-NA4WQAY6.js +85 -0
- package/dist/token-budget-SIXJ7ED5.js +85 -0
- package/dist/tool-capability-index-TK5K76RB.js +10 -0
- package/dist/tool-telemetry-D4Q76LAS.js +17 -0
- package/dist/tool-telemetry-NTFTPF3L.js +17 -0
- package/dist/tui/App.js +25 -25
- package/dist/tui-data-2LNENF36.js +259 -0
- package/dist/tui-data-NJSEIA2Q.js +259 -0
- package/dist/webhook-pipe-VQMOLXMW.js +114 -0
- package/dist/wiki-acl-33D5QTU4.js +111 -0
- package/dist/wiki-acl-RE5IR5VV.js +111 -0
- package/dist/wiki-client-XZ6VZTH6.js +157 -0
- package/dist/worker-gate-NCEAKLJE.js +21 -0
- package/dist/worker-gate-VN2POPFL.js +21 -0
- package/dist/workflow-engine-D7ALMSDM.js +28 -0
- package/dist/workflow-engine-WFN3HPAZ.js +28 -0
- package/dist/worktree-6I45JV5N.js +27 -0
- package/dist/worktree-O66YDTSF.js +27 -0
- package/dist/worktree-sweep-IMDR3XHT.js +20 -0
- package/dist/worktree-sweep-M2ENRTY6.js +20 -0
- package/package.json +1 -1
- package/release-notes.json +127 -127
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getClient
|
|
3
|
+
} from "./chunk-3X2ZT5FN.js";
|
|
4
|
+
|
|
5
|
+
// src/lib/pipeline-router.ts
|
|
6
|
+
import crypto from "crypto";
|
|
7
|
+
async function sinkConversationStore(msg, agentResponse, agentName) {
|
|
8
|
+
try {
|
|
9
|
+
const client = getClient();
|
|
10
|
+
const id = crypto.randomUUID();
|
|
11
|
+
const mediaJson = msg.media ? JSON.stringify(msg.media) : null;
|
|
12
|
+
await client.execute({
|
|
13
|
+
sql: `INSERT INTO conversations
|
|
14
|
+
(id, platform, external_id, sender_id, sender_name, sender_phone, sender_email,
|
|
15
|
+
recipient_id, channel_id, thread_id, reply_to_id,
|
|
16
|
+
content_text, content_media, agent_response, agent_name,
|
|
17
|
+
timestamp, ingested_at)
|
|
18
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
19
|
+
args: [
|
|
20
|
+
id,
|
|
21
|
+
msg.platform,
|
|
22
|
+
msg.messageId,
|
|
23
|
+
msg.senderId,
|
|
24
|
+
msg.senderName ?? null,
|
|
25
|
+
msg.senderPhone ?? null,
|
|
26
|
+
msg.senderEmail ?? null,
|
|
27
|
+
msg.accountId ?? null,
|
|
28
|
+
msg.channelId,
|
|
29
|
+
msg.threadId ?? `${msg.platform}:${msg.channelId}`,
|
|
30
|
+
msg.replyTo?.messageId ?? null,
|
|
31
|
+
msg.text ?? null,
|
|
32
|
+
mediaJson,
|
|
33
|
+
agentResponse ?? null,
|
|
34
|
+
agentName ?? null,
|
|
35
|
+
msg.timestamp,
|
|
36
|
+
(/* @__PURE__ */ new Date()).toISOString()
|
|
37
|
+
]
|
|
38
|
+
});
|
|
39
|
+
return true;
|
|
40
|
+
} catch (err) {
|
|
41
|
+
process.stderr.write(
|
|
42
|
+
`[pipeline] conversation-store error: ${err instanceof Error ? err.message : String(err)}
|
|
43
|
+
`
|
|
44
|
+
);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function sinkMemory(msg, agentResponse, agentName) {
|
|
49
|
+
try {
|
|
50
|
+
const { embed } = await import("./lib/embedder.js");
|
|
51
|
+
const { writeMemory, flushBatch } = await import("./lib/store.js");
|
|
52
|
+
const direction = agentResponse ? "conversation" : "inbound";
|
|
53
|
+
const rawText = [
|
|
54
|
+
`[${msg.platform}] ${direction} from ${msg.senderName ?? msg.senderId}`,
|
|
55
|
+
msg.text ? `Message: ${msg.text}` : null,
|
|
56
|
+
agentResponse ? `Agent (${agentName ?? "unknown"}): ${agentResponse}` : null
|
|
57
|
+
].filter(Boolean).join("\n");
|
|
58
|
+
const vector = await embed(rawText);
|
|
59
|
+
await writeMemory({
|
|
60
|
+
id: crypto.randomUUID(),
|
|
61
|
+
agent_id: agentName ?? "gateway",
|
|
62
|
+
agent_role: "gateway",
|
|
63
|
+
session_id: `gateway-${msg.platform}`,
|
|
64
|
+
timestamp: msg.timestamp,
|
|
65
|
+
tool_name: `gateway-${msg.platform}`,
|
|
66
|
+
project_name: "exe-os",
|
|
67
|
+
has_error: false,
|
|
68
|
+
raw_text: rawText,
|
|
69
|
+
vector,
|
|
70
|
+
importance: 4,
|
|
71
|
+
confidence: 0.8
|
|
72
|
+
});
|
|
73
|
+
await flushBatch();
|
|
74
|
+
return true;
|
|
75
|
+
} catch (err) {
|
|
76
|
+
process.stderr.write(
|
|
77
|
+
`[pipeline] memory-sink error: ${err instanceof Error ? err.message : String(err)}
|
|
78
|
+
`
|
|
79
|
+
);
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function sinkCRM(msg, agentResponse, agentName) {
|
|
84
|
+
try {
|
|
85
|
+
const { isCRMBridgeEnabled, pushConversationToCRM, pushInboundMessageToCRM } = await import("./crm-bridge-BVTB6LZK.js");
|
|
86
|
+
if (!isCRMBridgeEnabled()) return false;
|
|
87
|
+
if (agentResponse) {
|
|
88
|
+
await pushConversationToCRM({
|
|
89
|
+
platform: msg.platform,
|
|
90
|
+
senderId: msg.senderId,
|
|
91
|
+
senderName: msg.senderName,
|
|
92
|
+
messageText: msg.text,
|
|
93
|
+
agentResponse,
|
|
94
|
+
agentName: agentName ?? "unknown",
|
|
95
|
+
timestamp: msg.timestamp,
|
|
96
|
+
accountId: msg.accountId
|
|
97
|
+
});
|
|
98
|
+
} else {
|
|
99
|
+
await pushInboundMessageToCRM({
|
|
100
|
+
platform: msg.platform,
|
|
101
|
+
senderId: msg.senderId,
|
|
102
|
+
senderName: msg.senderName,
|
|
103
|
+
messageText: msg.text,
|
|
104
|
+
timestamp: msg.timestamp,
|
|
105
|
+
accountId: msg.accountId
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
} catch (err) {
|
|
110
|
+
process.stderr.write(
|
|
111
|
+
`[pipeline] crm-sink error: ${err instanceof Error ? err.message : String(err)}
|
|
112
|
+
`
|
|
113
|
+
);
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function sinkWiki(msg, agentResponse) {
|
|
118
|
+
try {
|
|
119
|
+
const { createWikiClient } = await import("./wiki-client-XZ6VZTH6.js");
|
|
120
|
+
const client = await createWikiClient();
|
|
121
|
+
if (!client) return false;
|
|
122
|
+
const content = msg.text ?? "";
|
|
123
|
+
if (content.length < 50) return false;
|
|
124
|
+
const { chatInWorkspace } = await import("./wiki-client-XZ6VZTH6.js");
|
|
125
|
+
const ingestText = [
|
|
126
|
+
`[${msg.platform}] Message from ${msg.senderName ?? msg.senderId} (${msg.timestamp}):`,
|
|
127
|
+
content,
|
|
128
|
+
agentResponse ? `
|
|
129
|
+
Agent response: ${agentResponse}` : ""
|
|
130
|
+
].join("\n");
|
|
131
|
+
await chatInWorkspace(client, "conversations", ingestText, "chat");
|
|
132
|
+
return true;
|
|
133
|
+
} catch (err) {
|
|
134
|
+
process.stderr.write(
|
|
135
|
+
`[pipeline] wiki-sink error: ${err instanceof Error ? err.message : String(err)}
|
|
136
|
+
`
|
|
137
|
+
);
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function sinkEntityExtraction(msg, agentResponse, agentName) {
|
|
142
|
+
try {
|
|
143
|
+
const { extractFromConversation } = await import("./conversation-entity-extractor-W25VJFOH.js");
|
|
144
|
+
const { storeExtraction } = await import("./graph-rag-4BVYONA4.js");
|
|
145
|
+
if ((msg.text?.length ?? 0) < 20) return false;
|
|
146
|
+
if (msg.isHistorical) return false;
|
|
147
|
+
const extraction = await extractFromConversation(msg, agentResponse, agentName);
|
|
148
|
+
if (extraction.entities.length === 0) return false;
|
|
149
|
+
const client = getClient();
|
|
150
|
+
const memoryId = `conv:${msg.messageId}`;
|
|
151
|
+
await storeExtraction(client, extraction, memoryId, msg.timestamp);
|
|
152
|
+
import("./conversation-wiki-populator-IMHNWKEU.js").then(
|
|
153
|
+
({ populateWikiFromExtraction }) => populateWikiFromExtraction(extraction, msg, agentResponse, agentName)
|
|
154
|
+
).catch((err) => {
|
|
155
|
+
process.stderr.write(
|
|
156
|
+
`[pipeline] wiki-population error: ${err instanceof Error ? err.message : String(err)}
|
|
157
|
+
`
|
|
158
|
+
);
|
|
159
|
+
});
|
|
160
|
+
return true;
|
|
161
|
+
} catch (err) {
|
|
162
|
+
process.stderr.write(
|
|
163
|
+
`[pipeline] entity-extraction-sink error: ${err instanceof Error ? err.message : String(err)}
|
|
164
|
+
`
|
|
165
|
+
);
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async function ingest(msg, agentResponse, agentName) {
|
|
170
|
+
const errors = [];
|
|
171
|
+
const [conversationStored, memorySunk, crmSunk, wikiSunk, entityExtracted] = await Promise.all([
|
|
172
|
+
sinkConversationStore(msg, agentResponse, agentName).catch((e) => {
|
|
173
|
+
errors.push(`conversation: ${e}`);
|
|
174
|
+
return false;
|
|
175
|
+
}),
|
|
176
|
+
sinkMemory(msg, agentResponse, agentName).catch((e) => {
|
|
177
|
+
errors.push(`memory: ${e}`);
|
|
178
|
+
return false;
|
|
179
|
+
}),
|
|
180
|
+
sinkCRM(msg, agentResponse, agentName).catch((e) => {
|
|
181
|
+
errors.push(`crm: ${e}`);
|
|
182
|
+
return false;
|
|
183
|
+
}),
|
|
184
|
+
sinkWiki(msg, agentResponse).catch((e) => {
|
|
185
|
+
errors.push(`wiki: ${e}`);
|
|
186
|
+
return false;
|
|
187
|
+
}),
|
|
188
|
+
sinkEntityExtraction(msg, agentResponse, agentName).catch((e) => {
|
|
189
|
+
errors.push(`entity-extraction: ${e}`);
|
|
190
|
+
return false;
|
|
191
|
+
})
|
|
192
|
+
]);
|
|
193
|
+
if (errors.length > 0) {
|
|
194
|
+
process.stderr.write(
|
|
195
|
+
`[pipeline] ${errors.length} sink error(s): ${errors.join("; ")}
|
|
196
|
+
`
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
return { conversationStored, memorySunk, crmSunk, wikiSunk, entityExtracted, errors };
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export {
|
|
203
|
+
ingest
|
|
204
|
+
};
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EXE_AI_DIR
|
|
3
|
+
} from "./chunk-5P3HOBZX.js";
|
|
4
|
+
|
|
5
|
+
// src/lib/db-backup.ts
|
|
6
|
+
import { existsSync, readdirSync, unlinkSync, statSync, statfsSync } from "fs";
|
|
7
|
+
import { copyFile, mkdir, unlink, rename } from "fs/promises";
|
|
8
|
+
import path from "path";
|
|
9
|
+
var BACKUP_DIR = path.join(EXE_AI_DIR, "backups");
|
|
10
|
+
var DEFAULT_KEEP_DAYS = 3;
|
|
11
|
+
var DB_NAMES = ["memories.db", "exe-mem.db", "exe-os.db", "exe.db"];
|
|
12
|
+
var REASON_COUNT_CAP = {
|
|
13
|
+
"pre-restart": 5,
|
|
14
|
+
"pre-consolidation": 5,
|
|
15
|
+
"pre-fix": 5,
|
|
16
|
+
"pre-restore": 5,
|
|
17
|
+
// Bug 91b1b167: daily snapshots are full uncompressed SQLCipher copies
|
|
18
|
+
// (~2-3GB apiece on large enterprise DBs). Time-based rotation alone left
|
|
19
|
+
// 19GB accumulating when mtimes drifted / the disk guard tripped. A hard
|
|
20
|
+
// count cap is a belt-and-braces safety net on top of day-based rotation.
|
|
21
|
+
"daily": 3
|
|
22
|
+
};
|
|
23
|
+
var MIN_FREE_BYTES = 5 * 1024 * 1024 * 1024;
|
|
24
|
+
var STALE_TMP_MAX_AGE_MS = 60 * 60 * 1e3;
|
|
25
|
+
function findActiveDb() {
|
|
26
|
+
for (const name of DB_NAMES) {
|
|
27
|
+
const p = path.join(EXE_AI_DIR, name);
|
|
28
|
+
if (existsSync(p)) return p;
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
async function createBackup(reason = "manual") {
|
|
33
|
+
return createBackupAsync(reason);
|
|
34
|
+
}
|
|
35
|
+
async function createBackupAsync(reason = "manual", opts = {}) {
|
|
36
|
+
const dbPath = findActiveDb();
|
|
37
|
+
if (!dbPath) return null;
|
|
38
|
+
await mkdir(BACKUP_DIR, { recursive: true });
|
|
39
|
+
try {
|
|
40
|
+
let dbSize = 0;
|
|
41
|
+
try {
|
|
42
|
+
dbSize = statSync(dbPath).size;
|
|
43
|
+
} catch {
|
|
44
|
+
}
|
|
45
|
+
const freeBytes = getFreeBytes(BACKUP_DIR);
|
|
46
|
+
if (!hasEnoughDiskSpace(freeBytes, dbSize)) {
|
|
47
|
+
process.stderr.write(
|
|
48
|
+
`[db-backup] DISK GUARD: skipping "${reason}" backup \u2014 ${Math.round(freeBytes / 1024 / 1024)}MB free, need >${Math.round(Math.max(MIN_FREE_BYTES, dbSize * 2) / 1024 / 1024)}MB. Disk is nearly full; refusing to make it worse.
|
|
49
|
+
`
|
|
50
|
+
);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
} catch {
|
|
54
|
+
}
|
|
55
|
+
const dbName = path.basename(dbPath, ".db");
|
|
56
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").slice(0, 19);
|
|
57
|
+
const backupName = `${dbName}-${reason}-${timestamp}.db`;
|
|
58
|
+
const backupPath = path.join(BACKUP_DIR, backupName);
|
|
59
|
+
const tmpBackupPath = `${backupPath}.tmp`;
|
|
60
|
+
const checkpointMode = opts.checkpointMode ?? "TRUNCATE";
|
|
61
|
+
try {
|
|
62
|
+
const { getClient } = await import("./lib/database.js");
|
|
63
|
+
const client = getClient();
|
|
64
|
+
await client.execute(`PRAGMA wal_checkpoint(${checkpointMode})`);
|
|
65
|
+
} catch {
|
|
66
|
+
try {
|
|
67
|
+
const { execFile: execFileCb } = await import("child_process");
|
|
68
|
+
const { promisify } = await import("util");
|
|
69
|
+
const execFileAsync = promisify(execFileCb);
|
|
70
|
+
await execFileAsync("sqlite3", [dbPath, `PRAGMA wal_checkpoint(${checkpointMode});`], { timeout: 3e4 });
|
|
71
|
+
} catch {
|
|
72
|
+
process.stderr.write(`[db-backup] WAL checkpoint skipped \u2014 proceeding with copy (backup may include stale WAL)
|
|
73
|
+
`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
await unlink(tmpBackupPath);
|
|
78
|
+
} catch {
|
|
79
|
+
}
|
|
80
|
+
await copyFile(dbPath, tmpBackupPath);
|
|
81
|
+
await rename(tmpBackupPath, backupPath);
|
|
82
|
+
try {
|
|
83
|
+
const { getClient } = await import("./lib/database.js");
|
|
84
|
+
const client = getClient();
|
|
85
|
+
const chk = await client.execute("PRAGMA quick_check;");
|
|
86
|
+
const result = String(chk.rows[0]?.quick_check ?? chk.rows[0]?.[0] ?? "").trim();
|
|
87
|
+
if (result && result !== "ok") {
|
|
88
|
+
process.stderr.write(`[db-backup] WARNING: backup source failed quick_check (${reason}): ${result}
|
|
89
|
+
`);
|
|
90
|
+
try {
|
|
91
|
+
await unlink(backupPath);
|
|
92
|
+
} catch {
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
} catch {
|
|
97
|
+
process.stderr.write(`[db-backup] Backup validation skipped (encrypted DB or CLI context) \u2014 proceeding with checkpoint-consistent copy.
|
|
98
|
+
`);
|
|
99
|
+
}
|
|
100
|
+
const walPath = dbPath + "-wal";
|
|
101
|
+
if (existsSync(walPath)) {
|
|
102
|
+
try {
|
|
103
|
+
await copyFile(walPath, backupPath + "-wal.tmp");
|
|
104
|
+
await rename(backupPath + "-wal.tmp", backupPath + "-wal");
|
|
105
|
+
} catch {
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const shmPath = dbPath + "-shm";
|
|
109
|
+
if (existsSync(shmPath)) {
|
|
110
|
+
try {
|
|
111
|
+
await copyFile(shmPath, backupPath + "-shm.tmp");
|
|
112
|
+
await rename(backupPath + "-shm.tmp", backupPath + "-shm");
|
|
113
|
+
} catch {
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return backupPath;
|
|
117
|
+
}
|
|
118
|
+
function rotateBackups(keepDays = DEFAULT_KEEP_DAYS) {
|
|
119
|
+
if (!existsSync(BACKUP_DIR)) return 0;
|
|
120
|
+
const cutoff = Date.now() - keepDays * 24 * 60 * 60 * 1e3;
|
|
121
|
+
let deleted = 0;
|
|
122
|
+
try {
|
|
123
|
+
const files = readdirSync(BACKUP_DIR);
|
|
124
|
+
for (const file of files) {
|
|
125
|
+
if (file.endsWith(".tmp")) continue;
|
|
126
|
+
if (!file.endsWith(".db") && !file.endsWith(".db-wal") && !file.endsWith(".db-shm")) continue;
|
|
127
|
+
const filePath = path.join(BACKUP_DIR, file);
|
|
128
|
+
try {
|
|
129
|
+
const stat = statSync(filePath);
|
|
130
|
+
if (stat.mtimeMs < cutoff) {
|
|
131
|
+
unlinkSync(filePath);
|
|
132
|
+
deleted++;
|
|
133
|
+
}
|
|
134
|
+
} catch {
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
} catch {
|
|
138
|
+
}
|
|
139
|
+
return deleted;
|
|
140
|
+
}
|
|
141
|
+
function selectBackupsToDelete(backups, keep) {
|
|
142
|
+
if (keep < 0) keep = 0;
|
|
143
|
+
const sorted = [...backups].sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
144
|
+
return sorted.slice(keep).map((b) => b.path);
|
|
145
|
+
}
|
|
146
|
+
function selectStaleTmpFiles(tmpFiles, cutoffMs) {
|
|
147
|
+
return tmpFiles.filter((f) => f.mtimeMs < cutoffMs).map((f) => f.path);
|
|
148
|
+
}
|
|
149
|
+
function cleanupStaleTmp(maxAgeMs = STALE_TMP_MAX_AGE_MS) {
|
|
150
|
+
if (!existsSync(BACKUP_DIR)) return 0;
|
|
151
|
+
const cutoffMs = Date.now() - maxAgeMs;
|
|
152
|
+
let deleted = 0;
|
|
153
|
+
try {
|
|
154
|
+
const candidates = [];
|
|
155
|
+
for (const file of readdirSync(BACKUP_DIR)) {
|
|
156
|
+
if (!file.endsWith(".tmp")) continue;
|
|
157
|
+
const filePath = path.join(BACKUP_DIR, file);
|
|
158
|
+
try {
|
|
159
|
+
candidates.push({ path: filePath, mtimeMs: statSync(filePath).mtimeMs });
|
|
160
|
+
} catch {
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
for (const target of selectStaleTmpFiles(candidates, cutoffMs)) {
|
|
164
|
+
try {
|
|
165
|
+
unlinkSync(target);
|
|
166
|
+
deleted++;
|
|
167
|
+
} catch {
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
} catch {
|
|
171
|
+
}
|
|
172
|
+
return deleted;
|
|
173
|
+
}
|
|
174
|
+
function hasEnoughDiskSpace(freeBytes, backupSizeBytes, minFreeBytes = MIN_FREE_BYTES) {
|
|
175
|
+
const required = Math.max(minFreeBytes, backupSizeBytes * 2);
|
|
176
|
+
return freeBytes >= required;
|
|
177
|
+
}
|
|
178
|
+
function getFreeBytes(dir) {
|
|
179
|
+
try {
|
|
180
|
+
const s = statfsSync(dir);
|
|
181
|
+
return s.bavail * s.bsize;
|
|
182
|
+
} catch {
|
|
183
|
+
return Number.POSITIVE_INFINITY;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async function quickCheckBackupSource(source) {
|
|
187
|
+
try {
|
|
188
|
+
const { execFile: execFileCb } = await import("child_process");
|
|
189
|
+
const { promisify } = await import("util");
|
|
190
|
+
const execFileAsync = promisify(execFileCb);
|
|
191
|
+
const { stdout } = await execFileAsync("sqlite3", [source, "PRAGMA quick_check;"], { timeout: 3e4 });
|
|
192
|
+
const result = String(stdout ?? "").trim();
|
|
193
|
+
if (result !== "ok") {
|
|
194
|
+
throw new Error(result || "quick_check returned no result");
|
|
195
|
+
}
|
|
196
|
+
} catch (err) {
|
|
197
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
198
|
+
if (/file is not a database|not an error/i.test(msg)) {
|
|
199
|
+
process.stderr.write(`[db-backup] Backup source quick_check unavailable for encrypted backup (${path.basename(source)}); proceeding with atomic restore.
|
|
200
|
+
`);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
throw new Error(`Backup source failed quick_check: ${msg}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function rotateBackupsByReason(reason, keep) {
|
|
207
|
+
if (!existsSync(BACKUP_DIR)) return 0;
|
|
208
|
+
let deleted = 0;
|
|
209
|
+
try {
|
|
210
|
+
const files = readdirSync(BACKUP_DIR);
|
|
211
|
+
const matches = [];
|
|
212
|
+
for (const file of files) {
|
|
213
|
+
if (file.endsWith(".tmp")) continue;
|
|
214
|
+
if (!file.endsWith(".db")) continue;
|
|
215
|
+
if (!file.includes(`-${reason}-`)) continue;
|
|
216
|
+
const filePath = path.join(BACKUP_DIR, file);
|
|
217
|
+
try {
|
|
218
|
+
matches.push({ path: filePath, mtimeMs: statSync(filePath).mtimeMs });
|
|
219
|
+
} catch {
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
for (const target of selectBackupsToDelete(matches, keep)) {
|
|
223
|
+
for (const p of [target, target + "-wal", target + "-shm"]) {
|
|
224
|
+
try {
|
|
225
|
+
if (existsSync(p)) {
|
|
226
|
+
unlinkSync(p);
|
|
227
|
+
if (p === target) deleted++;
|
|
228
|
+
}
|
|
229
|
+
} catch {
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
} catch {
|
|
234
|
+
}
|
|
235
|
+
return deleted;
|
|
236
|
+
}
|
|
237
|
+
function enforceRetention(reason, keepDays = DEFAULT_KEEP_DAYS) {
|
|
238
|
+
let deleted = rotateBackups(keepDays);
|
|
239
|
+
const cap = REASON_COUNT_CAP[reason];
|
|
240
|
+
if (typeof cap === "number") {
|
|
241
|
+
deleted += rotateBackupsByReason(reason, cap);
|
|
242
|
+
}
|
|
243
|
+
deleted += cleanupStaleTmp();
|
|
244
|
+
return deleted;
|
|
245
|
+
}
|
|
246
|
+
function listBackups() {
|
|
247
|
+
if (!existsSync(BACKUP_DIR)) return [];
|
|
248
|
+
try {
|
|
249
|
+
const files = readdirSync(BACKUP_DIR).filter((f) => f.endsWith(".db") && !f.endsWith(".tmp") && !f.endsWith("-wal") && !f.endsWith("-shm"));
|
|
250
|
+
return files.map((name) => {
|
|
251
|
+
const p = path.join(BACKUP_DIR, name);
|
|
252
|
+
const stat = statSync(p);
|
|
253
|
+
return { path: p, name, size: stat.size, date: stat.mtime };
|
|
254
|
+
}).sort((a, b) => b.date.getTime() - a.date.getTime());
|
|
255
|
+
} catch {
|
|
256
|
+
return [];
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function hasBackupToday(reason) {
|
|
260
|
+
const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
261
|
+
const backups = listBackups();
|
|
262
|
+
return backups.some((b) => b.name.includes(reason) && b.name.includes(today.replace(/-/g, "-")));
|
|
263
|
+
}
|
|
264
|
+
function getLatestBackup() {
|
|
265
|
+
const backups = listBackups();
|
|
266
|
+
return backups.length > 0 ? backups[0].path : null;
|
|
267
|
+
}
|
|
268
|
+
async function restoreBackup(backupPath) {
|
|
269
|
+
const dbPath = findActiveDb();
|
|
270
|
+
if (!dbPath) {
|
|
271
|
+
const target = path.join(EXE_AI_DIR, DB_NAMES[0]);
|
|
272
|
+
const source2 = backupPath ?? getLatestBackup();
|
|
273
|
+
if (!source2 || !existsSync(source2)) return null;
|
|
274
|
+
await copyFile(source2, target);
|
|
275
|
+
return { restored: path.basename(source2), preRestoreBackup: null };
|
|
276
|
+
}
|
|
277
|
+
const source = backupPath ?? getLatestBackup();
|
|
278
|
+
if (!source || !existsSync(source)) return null;
|
|
279
|
+
if (path.resolve(source) === path.resolve(dbPath)) return null;
|
|
280
|
+
await quickCheckBackupSource(source);
|
|
281
|
+
const preRestoreBackup = await createBackup("pre-restore");
|
|
282
|
+
const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
|
|
283
|
+
const tmpDb = `${dbPath}.restore-${stamp}.tmp`;
|
|
284
|
+
const oldDb = `${dbPath}.pre-restore-active-${stamp}`;
|
|
285
|
+
await copyFile(source, tmpDb);
|
|
286
|
+
const walPath = source + "-wal";
|
|
287
|
+
const shmPath = source + "-shm";
|
|
288
|
+
const tmpWal = `${tmpDb}-wal`;
|
|
289
|
+
const tmpShm = `${tmpDb}-shm`;
|
|
290
|
+
if (existsSync(walPath)) {
|
|
291
|
+
try {
|
|
292
|
+
await copyFile(walPath, tmpWal);
|
|
293
|
+
} catch {
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (existsSync(shmPath)) {
|
|
297
|
+
try {
|
|
298
|
+
await copyFile(shmPath, tmpShm);
|
|
299
|
+
} catch {
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
try {
|
|
303
|
+
unlinkSync(dbPath + "-wal");
|
|
304
|
+
} catch {
|
|
305
|
+
}
|
|
306
|
+
try {
|
|
307
|
+
unlinkSync(dbPath + "-shm");
|
|
308
|
+
} catch {
|
|
309
|
+
}
|
|
310
|
+
await rename(dbPath, oldDb);
|
|
311
|
+
await rename(tmpDb, dbPath);
|
|
312
|
+
if (existsSync(tmpWal)) await rename(tmpWal, dbPath + "-wal");
|
|
313
|
+
if (existsSync(tmpShm)) await rename(tmpShm, dbPath + "-shm");
|
|
314
|
+
return { restored: path.basename(source), preRestoreBackup };
|
|
315
|
+
}
|
|
316
|
+
function getBackupDir() {
|
|
317
|
+
return BACKUP_DIR;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export {
|
|
321
|
+
findActiveDb,
|
|
322
|
+
createBackup,
|
|
323
|
+
createBackupAsync,
|
|
324
|
+
rotateBackups,
|
|
325
|
+
selectBackupsToDelete,
|
|
326
|
+
selectStaleTmpFiles,
|
|
327
|
+
cleanupStaleTmp,
|
|
328
|
+
hasEnoughDiskSpace,
|
|
329
|
+
rotateBackupsByReason,
|
|
330
|
+
enforceRetention,
|
|
331
|
+
listBackups,
|
|
332
|
+
hasBackupToday,
|
|
333
|
+
getLatestBackup,
|
|
334
|
+
restoreBackup,
|
|
335
|
+
getBackupDir
|
|
336
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {
|
|
2
|
+
sendMessage
|
|
3
|
+
} from "./chunk-DDWFHEPG.js";
|
|
4
|
+
import {
|
|
5
|
+
getActiveAgent
|
|
6
|
+
} from "./chunk-BU45UYTK.js";
|
|
7
|
+
|
|
8
|
+
// src/mcp/tools/send-message.ts
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
function registerSendMessage(server) {
|
|
11
|
+
server.registerTool(
|
|
12
|
+
"send_message",
|
|
13
|
+
{
|
|
14
|
+
title: "Send Message",
|
|
15
|
+
description: "Send a structured message to another agent. Messages are queued and delivered via intercom. NOTE: messages are fire-and-forget \u2014 do NOT use for actionable work dispatch. Use create_task instead to assign work to employees.",
|
|
16
|
+
inputSchema: {
|
|
17
|
+
target_agent: z.string().describe("Recipient agent name"),
|
|
18
|
+
content: z.string().describe("Message content"),
|
|
19
|
+
target_project: z.string().optional().describe("Project context (optional)"),
|
|
20
|
+
priority: z.enum(["normal", "urgent"]).default("normal").describe("Message priority (default: normal)"),
|
|
21
|
+
target_device: z.string().optional().describe("Target device ID for cross-machine delivery (default: local)")
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
async ({ target_agent, content, target_project, priority, target_device }) => {
|
|
25
|
+
const { agentId } = getActiveAgent();
|
|
26
|
+
const msg = await sendMessage({
|
|
27
|
+
fromAgent: agentId,
|
|
28
|
+
targetAgent: target_agent,
|
|
29
|
+
targetProject: target_project,
|
|
30
|
+
targetDevice: target_device,
|
|
31
|
+
content,
|
|
32
|
+
priority
|
|
33
|
+
});
|
|
34
|
+
const statusText = msg.status === "delivered" ? "delivered" : msg.status === "failed" ? `failed: ${msg.failureReason}` : "queued (pending delivery)";
|
|
35
|
+
return {
|
|
36
|
+
content: [
|
|
37
|
+
{
|
|
38
|
+
type: "text",
|
|
39
|
+
text: `Message sent to ${target_agent}: ${statusText}
|
|
40
|
+
ID: ${msg.id}`
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export {
|
|
49
|
+
registerSendMessage
|
|
50
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PLATFORM_PROCEDURES,
|
|
3
|
+
PLATFORM_PROCEDURE_TITLES
|
|
4
|
+
} from "./chunk-VUH67PT4.js";
|
|
5
|
+
import {
|
|
6
|
+
getClient
|
|
7
|
+
} from "./chunk-3X2ZT5FN.js";
|
|
8
|
+
|
|
9
|
+
// src/lib/global-procedures.ts
|
|
10
|
+
import { randomUUID } from "crypto";
|
|
11
|
+
var _customerCache = "";
|
|
12
|
+
var _cacheLoaded = false;
|
|
13
|
+
var _platformCache = PLATFORM_PROCEDURES.map((p) => `### ${p.title}
|
|
14
|
+
${p.content}`).join("\n\n");
|
|
15
|
+
async function loadGlobalProcedures() {
|
|
16
|
+
const client = getClient();
|
|
17
|
+
const result = await client.execute({
|
|
18
|
+
sql: "SELECT * FROM company_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
|
|
19
|
+
args: []
|
|
20
|
+
});
|
|
21
|
+
const allRows = result.rows;
|
|
22
|
+
const customerOnly = allRows.filter((p) => {
|
|
23
|
+
if (PLATFORM_PROCEDURE_TITLES.has(p.title)) return false;
|
|
24
|
+
const title = (p.title ?? "").trim();
|
|
25
|
+
const content = (p.content ?? "").trim();
|
|
26
|
+
if (!title || title === "(untitled)") return false;
|
|
27
|
+
if (!content) return false;
|
|
28
|
+
return true;
|
|
29
|
+
});
|
|
30
|
+
const values = customerOnly.filter((p) => p.kind === "value");
|
|
31
|
+
const procedures = customerOnly.filter((p) => p.kind !== "value");
|
|
32
|
+
const parts = [];
|
|
33
|
+
if (values.length > 0) {
|
|
34
|
+
parts.push("### Company Values\n" + values.map((v) => `- **${v.title}:** ${v.content}`).join("\n"));
|
|
35
|
+
}
|
|
36
|
+
if (procedures.length > 0) {
|
|
37
|
+
parts.push(procedures.map((p) => `### ${p.title}
|
|
38
|
+
${p.content}`).join("\n\n"));
|
|
39
|
+
}
|
|
40
|
+
_customerCache = parts.join("\n\n");
|
|
41
|
+
_cacheLoaded = true;
|
|
42
|
+
return customerOnly;
|
|
43
|
+
}
|
|
44
|
+
function getGlobalProceduresBlock() {
|
|
45
|
+
const sections = [];
|
|
46
|
+
if (_platformCache) sections.push(_platformCache);
|
|
47
|
+
if (_cacheLoaded && _customerCache) sections.push(_customerCache);
|
|
48
|
+
if (sections.length === 0) return "";
|
|
49
|
+
return `## Organization-Wide Procedures (MANDATORY \u2014 supersedes all other rules)
|
|
50
|
+
|
|
51
|
+
${sections.join("\n\n")}
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
async function storeGlobalProcedure(input) {
|
|
55
|
+
if (!input.title?.trim() || !input.content?.trim()) {
|
|
56
|
+
throw new Error("storeGlobalProcedure requires a non-empty title and content");
|
|
57
|
+
}
|
|
58
|
+
const id = randomUUID();
|
|
59
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
60
|
+
const client = getClient();
|
|
61
|
+
await client.execute({
|
|
62
|
+
sql: `INSERT INTO company_procedures (id, title, content, priority, domain, kind, active, created_at, updated_at)
|
|
63
|
+
VALUES (?, ?, ?, ?, ?, ?, 1, ?, ?)`,
|
|
64
|
+
args: [id, input.title, input.content, input.priority ?? "p0", input.domain ?? null, input.kind ?? "procedure", now, now]
|
|
65
|
+
});
|
|
66
|
+
await loadGlobalProcedures();
|
|
67
|
+
return id;
|
|
68
|
+
}
|
|
69
|
+
async function deactivateGlobalProcedure(id) {
|
|
70
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
71
|
+
const client = getClient();
|
|
72
|
+
const result = await client.execute({
|
|
73
|
+
sql: "UPDATE company_procedures SET active = 0, updated_at = ? WHERE id = ?",
|
|
74
|
+
args: [now, id]
|
|
75
|
+
});
|
|
76
|
+
await loadGlobalProcedures();
|
|
77
|
+
return result.rowsAffected > 0;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
loadGlobalProcedures,
|
|
82
|
+
getGlobalProceduresBlock,
|
|
83
|
+
storeGlobalProcedure,
|
|
84
|
+
deactivateGlobalProcedure
|
|
85
|
+
};
|