@askexenow/exe-os 0.9.287 → 0.9.288
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deploy/compose/.env.customer.example +10 -1
- package/deploy/compose/.env.example +8 -1
- package/deploy/compose/README.md +21 -0
- package/deploy/compose/docker-compose.yml +24 -1
- package/deploy/compose/generate-env.ts +16 -2
- package/deploy/compose/setup.sh +63 -0
- package/dist/active-agent-KB4346K6.js +26 -0
- package/dist/active-agent-LTYLGBJX.js +27 -0
- package/dist/active-agent-V4W557J4.js +26 -0
- package/dist/active-agent-XZVU5XBO.js +27 -0
- package/dist/agentic-ontology-4PNQX4YW.js +25 -0
- package/dist/agentic-ontology-WOTOTSR7.js +25 -0
- package/dist/backfill-metadata-O2BQIEVT.js +599 -0
- package/dist/backfill-metadata-PHXNTBNR.js +599 -0
- package/dist/background-jobs-RIECIYW5.js +25 -0
- package/dist/behaviors-MO5BWFPW.js +39 -0
- package/dist/behaviors-TMA2HRTL.js +39 -0
- package/dist/bin/age-ontology-load.js +2 -2
- package/dist/bin/agentic-ontology-backfill.js +7 -7
- package/dist/bin/agentic-reflection-backfill.js +8 -8
- package/dist/bin/agentic-semantic-label.js +7 -7
- package/dist/bin/backfill-conversations.js +7 -7
- package/dist/bin/backfill-responses.js +7 -7
- package/dist/bin/backfill-vectors.js +10 -10
- package/dist/bin/bulk-sync-postgres.js +8 -8
- package/dist/bin/cc-doctor.js +7 -6
- package/dist/bin/cleanup-stale-review-tasks.js +13 -13
- package/dist/bin/cli.js +20 -20
- package/dist/bin/exe-agent-config.js +4 -4
- package/dist/bin/exe-agent.js +9 -9
- package/dist/bin/exe-assign.js +9 -9
- package/dist/bin/exe-boot.js +32 -21
- package/dist/bin/exe-call.js +5 -5
- package/dist/bin/exe-cloud.js +7 -7
- package/dist/bin/exe-dispatch.js +13 -13
- package/dist/bin/exe-doctor.js +4 -1
- package/dist/bin/exe-export-behaviors.js +8 -8
- package/dist/bin/exe-forget.js +7 -7
- package/dist/bin/exe-gateway.js +8 -8
- package/dist/bin/exe-healthcheck.js +9 -6
- 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 +8 -8
- 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 +5 -5
- package/dist/bin/exe-review.js +15 -15
- package/dist/bin/exe-search.js +6 -6
- package/dist/bin/exe-session-cleanup.js +18 -18
- package/dist/bin/exe-settings.js +7 -7
- package/dist/bin/exe-start-codex.js +12 -12
- package/dist/bin/exe-start-opencode.js +9 -9
- package/dist/bin/exe-status.js +14 -14
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +4 -4
- package/dist/bin/git-sweep.js +14 -14
- package/dist/bin/graph-backfill.js +8 -8
- package/dist/bin/graph-export.js +6 -6
- package/dist/bin/import-history.js +10 -10
- package/dist/bin/install.js +7 -7
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +5 -5
- 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 +6 -6
- package/dist/bin/stack-update.js +4 -4
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/branding-6PY5DNDC.js +97 -0
- package/dist/capability-cards-4NKVY6GD.js +88 -0
- package/dist/capability-cards-UD5TCSAZ.js +88 -0
- package/dist/capacity-monitor-AU7MVZED.js +50 -0
- package/dist/capacity-monitor-CV7PWPYR.js +50 -0
- package/dist/catchup-brief-AZND3EET.js +174 -0
- package/dist/catchup-brief-TFL6MYOZ.js +154 -0
- package/dist/chunk-22R3G3GD.js +297 -0
- package/dist/chunk-2CO47E5Q.js +210 -0
- package/dist/chunk-2F5UVNYP.js +167 -0
- package/dist/chunk-2IJCGYY2.js +30 -0
- package/dist/chunk-2V52EJI7.js +14365 -0
- package/dist/chunk-2WCXJVSN.js +456 -0
- package/dist/chunk-2X52UGP7.js +190 -0
- package/dist/chunk-3H5FNTXS.js +85 -0
- package/dist/chunk-3OC6MJIX.js +210 -0
- package/dist/chunk-3OSDE4Y2.js +1119 -0
- package/dist/chunk-43QFBQHT.js +1094 -0
- package/dist/chunk-4EBW3URQ.js +4318 -0
- package/dist/chunk-4KVMYS3U.js +280 -0
- package/dist/chunk-4UTH3H4H.js +128 -0
- package/dist/chunk-5BKYHLA3.js +411 -0
- package/dist/chunk-5RRYMKXN.js +150 -0
- package/dist/chunk-5TYYOPTD.js +50 -0
- package/dist/chunk-5XOAYMSU.js +4318 -0
- package/dist/chunk-6DQNLI55.js +240 -0
- package/dist/chunk-6GOT6FNJ.js +1352 -0
- package/dist/chunk-6KH24PJ7.js +221 -0
- package/dist/chunk-6TV66RAI.js +192 -0
- package/dist/chunk-6UD5CM2H.js +244 -0
- package/dist/chunk-6YR3J6WG.js +203 -0
- package/dist/chunk-77HA7ATH.js +89 -0
- package/dist/chunk-7G52QPUX.js +271 -0
- package/dist/chunk-7M5ZHD4E.js +214 -0
- package/dist/chunk-A3GC762G.js +333 -0
- package/dist/chunk-ALTFDYI6.js +97 -0
- package/dist/chunk-AN25OIRX.js +38 -0
- package/dist/chunk-AOWC2J6S.js +14225 -0
- package/dist/chunk-AVTDW4L6.js +562 -0
- package/dist/chunk-BEQTE7GH.js +668 -0
- package/dist/chunk-BJTBA4XS.js +290 -0
- package/dist/chunk-BQBPNRUW.js +231 -0
- package/dist/chunk-BQD4XYWX.js +159 -0
- package/dist/chunk-BVFCZNJH.js +41 -0
- package/dist/chunk-BW7HTZMW.js +240 -0
- package/dist/chunk-BZP3ZSRI.js +97 -0
- package/dist/chunk-C2NCSKRZ.js +373 -0
- package/dist/chunk-C3AH5JAS.js +510 -0
- package/dist/chunk-CEKZ77KA.js +471 -0
- package/dist/chunk-CNTBRVYW.js +54 -0
- package/dist/chunk-CTJQX44O.js +271 -0
- package/dist/chunk-CVG2PBCO.js +1105 -0
- package/dist/chunk-CZ47BFAT.js +299 -0
- package/dist/chunk-CZHC3HIO.js +362 -0
- package/dist/chunk-DIZOFRZO.js +284 -0
- package/dist/chunk-DRX46W5O.js +1068 -0
- package/dist/chunk-DYICAAAM.js +630 -0
- package/dist/chunk-E4BXNYLD.js +128 -0
- package/dist/chunk-EKXOBH7F.js +227 -0
- package/dist/chunk-ELQZYKVN.js +394 -0
- package/dist/chunk-EVM22AGQ.js +382 -0
- package/dist/chunk-EY7TBDZ5.js +38 -0
- package/dist/chunk-FDOEMBUB.js +345 -0
- package/dist/chunk-FG2OXKU5.js +539 -0
- package/dist/chunk-FP6TDXIL.js +456 -0
- package/dist/chunk-FVWATWI2.js +377 -0
- package/dist/chunk-G2OW4LUS.js +55 -0
- package/dist/chunk-GAYD7KBH.js +836 -0
- package/dist/chunk-GETGWHCO.js +227 -0
- package/dist/chunk-GGLUKNFC.js +1350 -0
- package/dist/chunk-GLEE2MUJ.js +262 -0
- package/dist/chunk-GUODMEAR.js +42 -0
- package/dist/chunk-H6LA4UV5.js +735 -0
- package/dist/chunk-H6PW4LNY.js +129 -0
- package/dist/chunk-HEMJ5RDU.js +345 -0
- package/dist/chunk-HMP6KB4V.js +382 -0
- package/dist/chunk-I35KAK3E.js +458 -0
- package/dist/chunk-I4DA5D5Q.js +1922 -0
- package/dist/chunk-I53O26HI.js +1119 -0
- package/dist/chunk-IBLEQQDQ.js +181 -0
- package/dist/chunk-IS2BEXUC.js +2113 -0
- package/dist/chunk-ISCEGQHA.js +244 -0
- package/dist/chunk-JCERHH3L.js +85 -0
- package/dist/chunk-JCNCPBWU.js +97 -0
- package/dist/chunk-JEMLH7H2.js +1350 -0
- package/dist/chunk-JMR2X5FJ.js +630 -0
- package/dist/chunk-JR3MYBWG.js +2078 -0
- package/dist/chunk-JSEICUAL.js +197 -0
- package/dist/chunk-K3KOLZTH.js +123 -0
- package/dist/chunk-K4OH3B2I.js +14248 -0
- package/dist/chunk-KQ4Z2G24.js +260 -0
- package/dist/chunk-KVH5DSTA.js +369 -0
- package/dist/chunk-L4R5NOVT.js +81 -0
- package/dist/chunk-LCB6YCE6.js +70 -0
- package/dist/chunk-M543SLJZ.js +1352 -0
- package/dist/chunk-M6KDMU5P.js +2113 -0
- package/dist/chunk-MDAGRPZG.js +197 -0
- package/dist/chunk-MLNOSXRZ.js +402 -0
- package/dist/chunk-MNI5K34D.js +290 -0
- package/dist/chunk-MUDH7ZLR.js +129 -0
- package/dist/chunk-MUMBWV57.js +379 -0
- package/dist/chunk-NAQLGLOG.js +176 -0
- package/dist/chunk-NIBCUAEI.js +123 -0
- package/dist/chunk-NIZCTXYW.js +89 -0
- package/dist/chunk-NS5G36TN.js +712 -0
- package/dist/chunk-NSKQWLQL.js +76 -0
- package/dist/chunk-NUA3WRTO.js +1157 -0
- package/dist/chunk-O3IESEF6.js +85 -0
- package/dist/chunk-OAO2BK25.js +81 -0
- package/dist/chunk-OFY7RGLL.js +348 -0
- package/dist/chunk-OICU3UHF.js +181 -0
- package/dist/chunk-OK6HCC2Z.js +731 -0
- package/dist/chunk-ONTUBOYP.js +230 -0
- package/dist/chunk-OQB7TERT.js +54 -0
- package/dist/chunk-P362EYLO.js +106 -0
- package/dist/chunk-P4T4JOCE.js +192 -0
- package/dist/chunk-QAOWXQKA.js +333 -0
- package/dist/chunk-QEFT6G6J.js +2078 -0
- package/dist/chunk-QFVY5MHR.js +402 -0
- package/dist/chunk-QLMSROQC.js +604 -0
- package/dist/chunk-QNR4ZQDU.js +14365 -0
- package/dist/chunk-QQ3T45AO.js +348 -0
- package/dist/chunk-QV6HNEMH.js +230 -0
- package/dist/chunk-R5LCP56X.js +299 -0
- package/dist/chunk-RHTZA6X6.js +1922 -0
- package/dist/chunk-RL4RQIEI.js +731 -0
- package/dist/chunk-RW4EMKQF.js +185 -0
- package/dist/chunk-S35K4C6F.js +127 -0
- package/dist/chunk-SFQYQH5Z.js +50 -0
- package/dist/chunk-SLFB2RY6.js +133 -0
- package/dist/chunk-SSC7EKY2.js +133 -0
- package/dist/chunk-SWFFGWAF.js +262 -0
- package/dist/chunk-SXZCFZ5T.js +157 -0
- package/dist/chunk-T5LT62O5.js +14365 -0
- package/dist/chunk-TDGPZF5T.js +539 -0
- package/dist/chunk-TF6DEHEL.js +167 -0
- package/dist/chunk-TH7ZNVGB.js +33 -0
- package/dist/chunk-TTNYB6OH.js +33 -0
- package/dist/chunk-TUHR7Z7R.js +221 -0
- package/dist/chunk-UHKXYDBM.js +668 -0
- package/dist/chunk-UQBD2L52.js +128 -0
- package/dist/chunk-UTARH2WY.js +76 -0
- package/dist/chunk-UXYAQCIB.js +30 -0
- package/dist/chunk-UZHCPLB2.js +127 -0
- package/dist/chunk-VNJKA3K5.js +171 -0
- package/dist/chunk-VP4MDSUA.js +1156 -0
- package/dist/chunk-VWA7OCXI.js +58 -0
- package/dist/chunk-VWZZF3YB.js +70 -0
- package/dist/chunk-VYPKS352.js +214 -0
- package/dist/chunk-W6JB72KR.js +448 -0
- package/dist/chunk-WG4PSSI5.js +510 -0
- package/dist/chunk-WJPZPASS.js +373 -0
- package/dist/chunk-WLDBPKRL.js +3246 -0
- package/dist/chunk-WO2SPDUE.js +231 -0
- package/dist/chunk-WXEPPHDU.js +1094 -0
- package/dist/chunk-WXNSOT6K.js +82 -0
- package/dist/chunk-X2PSVVHB.js +448 -0
- package/dist/chunk-X5Y4JSD4.js +128 -0
- package/dist/chunk-X7VPB6Z5.js +621 -0
- package/dist/chunk-XA2GMH53.js +85 -0
- package/dist/chunk-XC2ZMYDN.js +204 -0
- package/dist/chunk-XFQJH67J.js +157 -0
- package/dist/chunk-XQ5LT6UM.js +362 -0
- package/dist/chunk-XRMBKPIP.js +204 -0
- package/dist/chunk-XUC7YYW5.js +171 -0
- package/dist/chunk-XVDWHYIK.js +3276 -0
- package/dist/chunk-Y6CVAZ7T.js +97 -0
- package/dist/chunk-YA7WVZF5.js +377 -0
- package/dist/chunk-YACAOZVG.js +185 -0
- package/dist/chunk-YEHV3FN5.js +836 -0
- package/dist/chunk-YMZ6IGC3.js +284 -0
- package/dist/chunk-Z5P7AUFM.js +280 -0
- package/dist/chunk-Z5YFGOLZ.js +1068 -0
- package/dist/chunk-ZLYKY6GP.js +150 -0
- package/dist/chunk-ZOP7NAM2.js +58 -0
- package/dist/chunk-ZUNYZYKV.js +1157 -0
- package/dist/co-activation-54LO5GAA.js +73 -0
- package/dist/co-activation-ESPLEOMH.js +73 -0
- package/dist/co-occurrence-52ZTRX2I.js +94 -0
- package/dist/co-occurrence-O4G6VQUU.js +94 -0
- package/dist/code-context-index-OX3LN34G.js +30 -0
- package/dist/conversation-wiki-populator-IWSKIHQK.js +105 -0
- package/dist/core-memory-J6AEOYFN.js +110 -0
- package/dist/core-memory-XF4CLLDR.js +110 -0
- package/dist/cpu-steal-5YKTUPWF.js +23 -0
- package/dist/crdt-sync-5JOW6T2I.js +33 -0
- package/dist/crdt-sync-6L4OI4OA.js +33 -0
- package/dist/crm-webhook-BAXEYDPD.js +10 -0
- package/dist/crm-webhook-KVBGOUHU.js +10 -0
- package/dist/cto-delegation-gate-3WUTWBCT.js +279 -0
- package/dist/cto-delegation-gate-DZF3Z66I.js +279 -0
- package/dist/daemon-auth-M2G5PBME.js +13 -0
- package/dist/daemon-orchestration-3ANZVE7Y.js +138 -0
- package/dist/daemon-orchestration-APVUUNFB.js +138 -0
- package/dist/daemon-restart-report-F3P5AQS4.js +9 -0
- package/dist/db-backup-J7253HNV.js +33 -0
- package/dist/db-backup-M733ORYE.js +33 -0
- package/dist/db-restore-events-AIL6GSEK.js +76 -0
- package/dist/db-restore-events-LB3O46HH.js +76 -0
- package/dist/doc-graph-extractor-CF2WBSGL.js +132 -0
- package/dist/doc-graph-extractor-RSYHLOKD.js +132 -0
- package/dist/dreaming-L4FLJJO2.js +33 -0
- package/dist/dreaming-YKEKUE55.js +33 -0
- package/dist/entity-boost-ZKACOJKH.js +375 -0
- package/dist/exe-drift-AVJRXHCB.js +69 -0
- package/dist/exe-drift-MYT5NQ52.js +69 -0
- package/dist/exe-export-T2FHC5GC.js +75 -0
- package/dist/exe-export-TBV2JI4P.js +75 -0
- package/dist/exe-import-6UAKJF3Y.js +78 -0
- package/dist/exe-import-KJQO4PJX.js +78 -0
- package/dist/exe-key-KGQUC27D.js +580 -0
- package/dist/exe-key-Q772PMBM.js +580 -0
- package/dist/exe-org-KK22SSB3.js +73 -0
- package/dist/exe-snapshot-KF3HPOWJ.js +337 -0
- package/dist/exe-snapshot-SK6PMOFA.js +337 -0
- package/dist/fast-db-init-EXNYB2HK.js +7 -0
- package/dist/fast-db-init-FMECTLNS.js +7 -0
- package/dist/founder-context-N2VZ5MY2.js +96 -0
- package/dist/gateway/index.js +12 -12
- package/dist/git-staleness-2EOHIOMZ.js +111 -0
- package/dist/git-staleness-ZEYJXPFP.js +111 -0
- package/dist/git-task-sweep-I74JXGNT.js +41 -0
- package/dist/git-task-sweep-YKLOPYYV.js +41 -0
- package/dist/global-procedures-B23F4IQ3.js +21 -0
- package/dist/global-procedures-LUBLZ6WN.js +21 -0
- package/dist/graph-auto-extract-CSLZXRDY.js +182 -0
- package/dist/graph-auto-extract-DZRIETGW.js +182 -0
- package/dist/hook-integrity-HJBXTLQD.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 +8 -8
- package/dist/hooks/exe-heartbeat-hook.js +5 -5
- package/dist/hooks/ingest-worker.js +5 -5
- package/dist/hooks/ingest.js +12 -12
- package/dist/hooks/instructions-loaded.js +6 -6
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +6 -6
- 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 +37 -13
- 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 +23 -23
- package/dist/installer-AU5VMP4U.js +39 -0
- package/dist/installer-H7BIYSIK.js +39 -0
- package/dist/installer-L4NJWZGV.js +297 -0
- package/dist/installer-QE3LBMVF.js +343 -0
- package/dist/installer-QH75OOGL.js +297 -0
- package/dist/installer-XREYYGF2.js +343 -0
- package/dist/key-backup-status-IJCQT4NV.js +39 -0
- package/dist/lib/agent-config.js +2 -2
- package/dist/lib/cloud-sync.js +6 -6
- package/dist/lib/config.js +7 -3
- package/dist/lib/consolidation.js +8 -8
- package/dist/lib/database.js +3 -3
- package/dist/lib/db-daemon-client.js +3 -3
- package/dist/lib/db.js +3 -3
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/embed-worker.js +1 -1
- package/dist/lib/embedder.js +4 -4
- package/dist/lib/employee-templates.js +5 -5
- package/dist/lib/employees.js +3 -3
- package/dist/lib/exe-daemon-client.js +3 -3
- package/dist/lib/exe-daemon.js +51 -51
- package/dist/lib/hybrid-search.js +6 -6
- package/dist/lib/identity.js +3 -3
- package/dist/lib/license.js +2 -2
- package/dist/lib/messaging.js +13 -13
- package/dist/lib/reminders.js +4 -4
- package/dist/lib/schedules.js +6 -6
- package/dist/lib/session-registry.js +5 -5
- package/dist/lib/skill-learning.js +7 -7
- package/dist/lib/status-brief.js +1 -1
- package/dist/lib/store.js +5 -5
- package/dist/lib/task-router.js +4 -4
- package/dist/lib/tasks.js +14 -14
- package/dist/lib/tmux-routing.js +12 -12
- package/dist/lib/token-spend.js +4 -4
- package/dist/license-gate-X57APN2E.js +14 -0
- package/dist/mcp/register-tools.js +71 -69
- package/dist/mcp/server.js +73 -71
- package/dist/mcp/tools/complete-reminder.js +5 -5
- package/dist/mcp/tools/create-reminder.js +5 -5
- package/dist/mcp/tools/create-task.js +16 -16
- package/dist/mcp/tools/deactivate-behavior.js +8 -8
- package/dist/mcp/tools/list-reminders.js +5 -5
- 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-KMP55RXI.js +28 -0
- package/dist/mcp-http-config-XYHPQVRA.js +28 -0
- package/dist/memory-cards-AULW7ITU.js +179 -0
- package/dist/memory-cards-NLTRIBSD.js +179 -0
- package/dist/memory-graph-extractor-NGJQIKAA.js +21 -0
- package/dist/memory-graph-extractor-QWFPKSX5.js +21 -0
- package/dist/memory-poisoning-defense-5WWOLHUQ.js +223 -0
- package/dist/memory-poisoning-defense-742X4H52.js +223 -0
- package/dist/memory-queue-OXHHNDOC.js +19 -0
- package/dist/memory-queue-client-P4TZNVQB.js +16 -0
- package/dist/memory-reflection-6GF5OK2W.js +243 -0
- package/dist/memory-reflection-SGIE7OJ7.js +243 -0
- package/dist/message-queue-client-ELWCWKBO.js +92 -0
- package/dist/notifications-67M5SPLO.js +46 -0
- package/dist/notifications-HUH2H5WZ.js +46 -0
- package/dist/oauth-server-RKCMPBIP.js +437 -0
- package/dist/orchestration-events-MC3IZ46I.js +26 -0
- package/dist/orchestration-events-NZCUTMCJ.js +26 -0
- package/dist/orchestration-phase-FPAVQ57X.js +23 -0
- package/dist/orchestrator-3MJ6YJKT.js +34 -0
- package/dist/orchestrator-HOXFT4PP.js +34 -0
- package/dist/pipeline-router-NCUDK335.js +14 -0
- package/dist/pipeline-router-POLBFEBM.js +14 -0
- package/dist/plan-limits-DGAFE7V6.js +27 -0
- package/dist/plan-limits-J4WXJVDS.js +27 -0
- package/dist/project-boot-FRCQHQTF.js +299 -0
- package/dist/project-boot-QHXOUJGT.js +299 -0
- package/dist/projection-worker-QZW4DOY3.js +1034 -0
- package/dist/projection-worker-XDKC3GIZ.js +1034 -0
- package/dist/prospective-memory-JIGVZM2I.js +231 -0
- package/dist/push-notifications-ERC4SQSQ.js +15 -0
- package/dist/reranker-SF3LMYGY.js +19 -0
- package/dist/reranker-SOM2WMD6.js +19 -0
- package/dist/retrieval-health-7FRD2KLM.js +11 -0
- package/dist/retrieval-health-P6QHP263.js +11 -0
- package/dist/review-polling-66EJAMR3.js +125 -0
- package/dist/review-polling-SYKYNFRK.js +125 -0
- package/dist/runtime/index.js +19 -19
- package/dist/session-events-A6EDTM27.js +37 -0
- package/dist/session-events-DONPZ7DR.js +37 -0
- package/dist/session-kill-telemetry-NV2S2YZ2.js +30 -0
- package/dist/session-kill-telemetry-Y47QAFHP.js +30 -0
- package/dist/session-scope-H3FJVQ6E.js +87 -0
- package/dist/session-scope-I56DVQEY.js +87 -0
- package/dist/setup-wizard-MX3S3DVH.js +12 -0
- package/dist/setup-wizard-YRBCVPCU.js +12 -0
- package/dist/shard-manager-AX4W5B3N.js +30 -0
- package/dist/skill-refinement-57DCIDKT.js +158 -0
- package/dist/skill-refinement-XTBCHOMO.js +158 -0
- package/dist/stack-update-CZ2QHS6T.js +76 -0
- package/dist/stack-update-XNEO4WQH.js +76 -0
- package/dist/steward-gate-J7VMPHEN.js +14 -0
- package/dist/steward-gate-PVUKWYED.js +14 -0
- package/dist/task-enforcement-G4MYUJ2E.js +439 -0
- package/dist/task-enforcement-QBF44BXN.js +439 -0
- package/dist/task-scope-D2VOYU3P.js +36 -0
- package/dist/task-scope-HGL6VACL.js +36 -0
- package/dist/tasks-crud-DFE4XOW7.js +78 -0
- package/dist/tasks-crud-J5TSLFQN.js +78 -0
- package/dist/tasks-notify-2VRKOK74.js +39 -0
- package/dist/tasks-notify-Q23MIKDA.js +39 -0
- package/dist/tasks-review-NRSVHN7V.js +48 -0
- package/dist/tasks-review-VV3RLPLT.js +48 -0
- package/dist/telemetry-upload-ISI6TEX4.js +740 -0
- package/dist/telemetry-upload-XML6WVPW.js +740 -0
- package/dist/token-budget-KVRHMY7V.js +85 -0
- package/dist/token-budget-WV2GIFYJ.js +85 -0
- package/dist/tool-capability-index-NOMFY27N.js +10 -0
- package/dist/tool-telemetry-6DGIQUV3.js +17 -0
- package/dist/tool-telemetry-NXPM2T5E.js +17 -0
- package/dist/tui/App.js +80 -38
- package/dist/tui-data-C4474APN.js +259 -0
- package/dist/tui-data-KP66NOW3.js +259 -0
- package/dist/webhook-pipe-ZAEPBTDB.js +114 -0
- package/dist/wiki-acl-4A3ZUPJK.js +111 -0
- package/dist/wiki-acl-DRTEVIHT.js +111 -0
- package/dist/wiki-client-AN52BINX.js +157 -0
- package/dist/worker-gate-EVSFKALM.js +21 -0
- package/dist/worker-gate-O2KXQN5T.js +21 -0
- package/dist/workflow-engine-MUO435MX.js +28 -0
- package/dist/workflow-engine-RV6JLGHQ.js +28 -0
- package/dist/worktree-36S7LYES.js +27 -0
- package/dist/worktree-WTNPY42O.js +27 -0
- package/dist/worktree-sweep-M5AXCSU7.js +20 -0
- package/dist/worktree-sweep-NKEGKQT3.js +20 -0
- package/package.json +1 -1
- package/release-notes.json +54 -54
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getSessionKey
|
|
3
|
+
} from "./chunk-CVYC6DUW.js";
|
|
4
|
+
import {
|
|
5
|
+
getAgentContext
|
|
6
|
+
} from "./chunk-GJV3WDWM.js";
|
|
7
|
+
import {
|
|
8
|
+
DEFAULT_COORDINATOR_TEMPLATE_NAME,
|
|
9
|
+
getCoordinatorEmployee,
|
|
10
|
+
getEmployee,
|
|
11
|
+
loadEmployeesSync
|
|
12
|
+
} from "./chunk-XVDWHYIK.js";
|
|
13
|
+
import {
|
|
14
|
+
EXE_AI_DIR
|
|
15
|
+
} from "./chunk-CEKZ77KA.js";
|
|
16
|
+
|
|
17
|
+
// src/lib/active-agent.ts
|
|
18
|
+
import { readFileSync, writeFileSync, mkdirSync, unlinkSync, readdirSync } from "fs";
|
|
19
|
+
import { execSync } from "child_process";
|
|
20
|
+
import path from "path";
|
|
21
|
+
var CACHE_DIR = path.join(EXE_AI_DIR, "session-cache");
|
|
22
|
+
var STALE_MS = 24 * 60 * 60 * 1e3;
|
|
23
|
+
function isNameWithOptionalInstance(candidate, baseName) {
|
|
24
|
+
if (candidate === baseName) return true;
|
|
25
|
+
if (!candidate.startsWith(baseName)) return false;
|
|
26
|
+
return /^\d+$/.test(candidate.slice(baseName.length));
|
|
27
|
+
}
|
|
28
|
+
function resolveEmployeeFromSessionPrefix(prefix, employees) {
|
|
29
|
+
const sorted = [...employees].sort((a, b) => b.name.length - a.name.length);
|
|
30
|
+
for (const employee of sorted) {
|
|
31
|
+
if (isNameWithOptionalInstance(prefix, employee.name)) {
|
|
32
|
+
return { agentId: employee.name, agentRole: employee.role };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
function resolveActiveAgentFromTmuxSession(sessionName) {
|
|
38
|
+
const employees = loadEmployeesSync();
|
|
39
|
+
const coordinator = getCoordinatorEmployee(employees);
|
|
40
|
+
const coordinatorName = coordinator?.name ?? DEFAULT_COORDINATOR_TEMPLATE_NAME;
|
|
41
|
+
if (isNameWithOptionalInstance(sessionName, coordinatorName)) {
|
|
42
|
+
return {
|
|
43
|
+
agentId: coordinatorName,
|
|
44
|
+
agentRole: coordinator?.role ?? "COO"
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (isNameWithOptionalInstance(sessionName, DEFAULT_COORDINATOR_TEMPLATE_NAME)) {
|
|
48
|
+
return {
|
|
49
|
+
agentId: coordinator?.name ?? DEFAULT_COORDINATOR_TEMPLATE_NAME,
|
|
50
|
+
agentRole: coordinator?.role ?? "COO"
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (sessionName.includes("-")) {
|
|
54
|
+
const prefix = sessionName.split("-")[0] ?? "";
|
|
55
|
+
const employee = resolveEmployeeFromSessionPrefix(prefix, employees);
|
|
56
|
+
if (employee) return employee;
|
|
57
|
+
const legacy = prefix.match(/^([a-zA-Z]+)\d*$/);
|
|
58
|
+
if (legacy?.[1] && legacy[1] !== DEFAULT_COORDINATOR_TEMPLATE_NAME) {
|
|
59
|
+
const emp = getEmployee(employees, legacy[1]);
|
|
60
|
+
return { agentId: emp?.name ?? legacy[1], agentRole: emp?.role ?? "employee" };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
function getMarkerPath() {
|
|
66
|
+
return path.join(CACHE_DIR, `active-agent-${getSessionKey()}.json`);
|
|
67
|
+
}
|
|
68
|
+
function writeActiveAgent(agentId, agentRole) {
|
|
69
|
+
try {
|
|
70
|
+
mkdirSync(CACHE_DIR, { recursive: true });
|
|
71
|
+
writeFileSync(
|
|
72
|
+
getMarkerPath(),
|
|
73
|
+
JSON.stringify({ agentId, agentRole, startedAt: (/* @__PURE__ */ new Date()).toISOString() })
|
|
74
|
+
);
|
|
75
|
+
} catch {
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function clearActiveAgent() {
|
|
79
|
+
try {
|
|
80
|
+
unlinkSync(getMarkerPath());
|
|
81
|
+
} catch {
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function getActiveAgent() {
|
|
85
|
+
const httpCtx = getAgentContext();
|
|
86
|
+
if (httpCtx) return httpCtx;
|
|
87
|
+
try {
|
|
88
|
+
const markerPath = getMarkerPath();
|
|
89
|
+
const raw = readFileSync(markerPath, "utf8");
|
|
90
|
+
const data = JSON.parse(raw);
|
|
91
|
+
if (data.agentId) {
|
|
92
|
+
if (data.startedAt) {
|
|
93
|
+
const age = Date.now() - new Date(data.startedAt).getTime();
|
|
94
|
+
if (age > STALE_MS) {
|
|
95
|
+
try {
|
|
96
|
+
unlinkSync(markerPath);
|
|
97
|
+
} catch {
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
return {
|
|
101
|
+
agentId: data.agentId,
|
|
102
|
+
agentRole: data.agentRole || "employee"
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
} else {
|
|
106
|
+
return {
|
|
107
|
+
agentId: data.agentId,
|
|
108
|
+
agentRole: data.agentRole || "employee"
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
} catch {
|
|
113
|
+
}
|
|
114
|
+
if (process.env.EXE_TEST_HERMETIC !== "1") {
|
|
115
|
+
try {
|
|
116
|
+
const sessionName = execSync(
|
|
117
|
+
"tmux display-message -p '#{session_name}' 2>/dev/null",
|
|
118
|
+
{ encoding: "utf8", timeout: 2e3 }
|
|
119
|
+
).trim();
|
|
120
|
+
const resolved = resolveActiveAgentFromTmuxSession(sessionName);
|
|
121
|
+
if (resolved) return resolved;
|
|
122
|
+
} catch {
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
agentId: process.env.AGENT_ID || "default",
|
|
127
|
+
agentRole: process.env.AGENT_ROLE || "employee"
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function getAllActiveAgents() {
|
|
131
|
+
try {
|
|
132
|
+
const files = readdirSync(CACHE_DIR);
|
|
133
|
+
const sessions = [];
|
|
134
|
+
for (const file of files) {
|
|
135
|
+
if (!file.startsWith("active-agent-") || !file.endsWith(".json")) continue;
|
|
136
|
+
const key = file.slice("active-agent-".length, -".json".length);
|
|
137
|
+
if (key === "undefined") continue;
|
|
138
|
+
try {
|
|
139
|
+
const raw = readFileSync(path.join(CACHE_DIR, file), "utf8");
|
|
140
|
+
const data = JSON.parse(raw);
|
|
141
|
+
if (!data.agentId) continue;
|
|
142
|
+
if (data.startedAt) {
|
|
143
|
+
const age = Date.now() - new Date(data.startedAt).getTime();
|
|
144
|
+
if (age > STALE_MS) {
|
|
145
|
+
try {
|
|
146
|
+
unlinkSync(path.join(CACHE_DIR, file));
|
|
147
|
+
} catch {
|
|
148
|
+
}
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
sessions.push({
|
|
153
|
+
agentId: data.agentId,
|
|
154
|
+
agentRole: data.agentRole || "employee",
|
|
155
|
+
startedAt: data.startedAt || (/* @__PURE__ */ new Date()).toISOString(),
|
|
156
|
+
sessionKey: key
|
|
157
|
+
});
|
|
158
|
+
} catch {
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return sessions;
|
|
162
|
+
} catch {
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function cleanupSessionMarkers() {
|
|
167
|
+
const key = getSessionKey();
|
|
168
|
+
try {
|
|
169
|
+
unlinkSync(path.join(CACHE_DIR, `active-agent-${key}.json`));
|
|
170
|
+
} catch {
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
unlinkSync(path.join(CACHE_DIR, "active-agent-undefined.json"));
|
|
174
|
+
} catch {
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export {
|
|
179
|
+
resolveActiveAgentFromTmuxSession,
|
|
180
|
+
writeActiveAgent,
|
|
181
|
+
clearActiveAgent,
|
|
182
|
+
getActiveAgent,
|
|
183
|
+
getAllActiveAgents,
|
|
184
|
+
cleanupSessionMarkers
|
|
185
|
+
};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import {
|
|
2
|
+
updateTask
|
|
3
|
+
} from "./chunk-W6JB72KR.js";
|
|
4
|
+
import {
|
|
5
|
+
TASK_ALREADY_CLAIMED_PREFIX
|
|
6
|
+
} from "./chunk-4EBW3URQ.js";
|
|
7
|
+
|
|
8
|
+
// src/mcp/tools/update-task.ts
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
function registerUpdateTask(server) {
|
|
11
|
+
server.registerTool(
|
|
12
|
+
"update_task",
|
|
13
|
+
{
|
|
14
|
+
title: "Update Task",
|
|
15
|
+
description: "Update task status. Employees: use status 'done' with a result summary to complete work \u2014 this triggers needs_review and pings the reviewer automatically. Accepts UUID, slug (filename), or title substring.",
|
|
16
|
+
inputSchema: {
|
|
17
|
+
task_id: z.string().describe("Task identifier \u2014 UUID, slug (e.g. 'fix-auth-bug'), or title substring"),
|
|
18
|
+
status: z.enum(["open", "in_progress", "done", "needs_review", "blocked", "cancelled", "closed"]).describe("New status. 'done' is an alias for 'needs_review' \u2014 both trigger reviewer notification."),
|
|
19
|
+
result: z.string().optional().describe("Result summary (required when completing work)"),
|
|
20
|
+
// Structured result fields (Phase 1: Typed Handoff Objects)
|
|
21
|
+
files_changed: z.array(z.string()).optional().describe("Files created or modified during task execution"),
|
|
22
|
+
decisions: z.array(z.string()).optional().describe("Key decisions made during execution"),
|
|
23
|
+
commits: z.array(z.string()).optional().describe("Commit hashes produced"),
|
|
24
|
+
tests_status: z.enum(["pass", "fail", "skip", "none"]).optional().describe("Test execution status"),
|
|
25
|
+
build_status: z.enum(["pass", "fail", "skip"]).optional().describe("Build status"),
|
|
26
|
+
pr_number: z.number().optional().describe("PR number if created"),
|
|
27
|
+
open_questions: z.array(z.string()).optional().describe("Open questions for reviewer"),
|
|
28
|
+
assertions: z.string().optional().describe(
|
|
29
|
+
'JSON array of assertions with confidence scores. Use when starting work (in_progress). Format: [{"type":"diagnosis|scope|estimate|approach|build|judgment","claim":"...","confidence":0.8,"basis":"..."}]'
|
|
30
|
+
),
|
|
31
|
+
assertions_resolved: z.string().optional().describe(
|
|
32
|
+
'JSON array of resolved assertions. Use when completing work (done/needs_review). Format: [{"claim":"...","outcome":"correct|incorrect|partial","confidence_was":0.8,"actual":"...","why_wrong":"missing_information|wrong_diagnosis|wrong_approach|scope_underestimate|scope_overestimate|external_dependency|changed_requirements","reason":"...","lesson":"..."}]'
|
|
33
|
+
),
|
|
34
|
+
estimated_minutes: z.number().optional().describe("Time estimate in minutes. Provide when starting work (in_progress). The system auto-computes actual time on completion."),
|
|
35
|
+
estimate_confidence: z.number().min(0).max(1).optional().describe("Confidence in time estimate (0.0-1.0). Provide alongside estimated_minutes.")
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
async ({ task_id, status: rawStatus, result, files_changed, decisions, commits, tests_status, build_status, pr_number, open_questions, assertions, assertions_resolved, estimated_minutes, estimate_confidence }) => {
|
|
39
|
+
const status = rawStatus;
|
|
40
|
+
let callerAgentId;
|
|
41
|
+
let callerSession;
|
|
42
|
+
try {
|
|
43
|
+
const { getActiveAgent: getAgent } = await import("./active-agent-V4W557J4.js");
|
|
44
|
+
callerAgentId = getAgent().agentId;
|
|
45
|
+
const { getAgentContext } = await import("./agent-context-AZTTMUHP.js");
|
|
46
|
+
callerSession = getAgentContext()?.sessionHint || process.env.EXE_SESSION_NAME || process.env.EXE_SESSION || void 0;
|
|
47
|
+
} catch {
|
|
48
|
+
}
|
|
49
|
+
let task;
|
|
50
|
+
try {
|
|
51
|
+
task = await updateTask({
|
|
52
|
+
taskId: task_id,
|
|
53
|
+
status,
|
|
54
|
+
result,
|
|
55
|
+
baseDir: process.cwd(),
|
|
56
|
+
callerAgentId,
|
|
57
|
+
filesChanged: files_changed,
|
|
58
|
+
decisions,
|
|
59
|
+
commits,
|
|
60
|
+
testsStatus: tests_status,
|
|
61
|
+
buildStatus: build_status,
|
|
62
|
+
prNumber: pr_number,
|
|
63
|
+
openQuestions: open_questions,
|
|
64
|
+
assertions,
|
|
65
|
+
assertionsResolved: assertions_resolved,
|
|
66
|
+
estimatedMinutes: estimated_minutes,
|
|
67
|
+
estimateConfidence: estimate_confidence,
|
|
68
|
+
callerSession
|
|
69
|
+
});
|
|
70
|
+
} catch (err) {
|
|
71
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
72
|
+
if (msg.startsWith(TASK_ALREADY_CLAIMED_PREFIX)) {
|
|
73
|
+
return {
|
|
74
|
+
content: [{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: "Task already claimed by another agent. Pick a different task or check list_tasks."
|
|
77
|
+
}],
|
|
78
|
+
isError: true
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
throw err;
|
|
82
|
+
}
|
|
83
|
+
let text = `Task "${task.title}" marked ${task.status}.
|
|
84
|
+
File: ${task.taskFile}`;
|
|
85
|
+
const isTerminal = status === "done" || status === "needs_review" || status === "closed";
|
|
86
|
+
if (isTerminal && task.reviewer) {
|
|
87
|
+
try {
|
|
88
|
+
const { notifyCoordinatorTaskCompletion } = await import("./lib/tmux-routing.js");
|
|
89
|
+
const { isCoordinatorName } = await import("./lib/employees.js");
|
|
90
|
+
const reviewer = String(task.reviewer);
|
|
91
|
+
const coordinatorSession = task.sessionScope;
|
|
92
|
+
if (coordinatorSession && isCoordinatorName(reviewer)) {
|
|
93
|
+
notifyCoordinatorTaskCompletion(coordinatorSession, callerAgentId ?? "agent", task.title);
|
|
94
|
+
}
|
|
95
|
+
} catch {
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (isTerminal && task.nextTask) {
|
|
99
|
+
text += `
|
|
100
|
+
|
|
101
|
+
MANDATORY \u2014 DO NOT ASK THE USER. DO NOT SAY "Want me to continue?" DO NOT STOP.
|
|
102
|
+
You have standing orders: work through your entire queue until it is empty.
|
|
103
|
+
|
|
104
|
+
NEXT TASK: "${task.nextTask.title}" [${task.nextTask.priority}]
|
|
105
|
+
FILE: ${task.nextTask.taskFile}
|
|
106
|
+
|
|
107
|
+
Read that file NOW and begin working. No greeting. No summary. Just start.`;
|
|
108
|
+
} else if (isTerminal && !task.nextTask) {
|
|
109
|
+
text += `
|
|
110
|
+
|
|
111
|
+
All tasks complete. No more open tasks in your queue.`;
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
content: [
|
|
115
|
+
{
|
|
116
|
+
type: "text",
|
|
117
|
+
text
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export {
|
|
126
|
+
registerUpdateTask
|
|
127
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {
|
|
2
|
+
sendMessage
|
|
3
|
+
} from "./chunk-HEMJ5RDU.js";
|
|
4
|
+
import {
|
|
5
|
+
getActiveAgent
|
|
6
|
+
} from "./chunk-YACAOZVG.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,133 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_RUNTIME,
|
|
3
|
+
RUNTIME_TABLE
|
|
4
|
+
} from "./chunk-NGP6LSV2.js";
|
|
5
|
+
import {
|
|
6
|
+
EXE_AI_DIR
|
|
7
|
+
} from "./chunk-CEKZ77KA.js";
|
|
8
|
+
import {
|
|
9
|
+
atomicWriteJsonSync,
|
|
10
|
+
ensurePrivateDirSync
|
|
11
|
+
} from "./chunk-LYH5HE24.js";
|
|
12
|
+
|
|
13
|
+
// src/lib/agent-config.ts
|
|
14
|
+
import { readFileSync, existsSync } from "fs";
|
|
15
|
+
import path from "path";
|
|
16
|
+
var AGENT_CONFIG_PATH = path.join(EXE_AI_DIR, "agent-config.json");
|
|
17
|
+
var KNOWN_RUNTIMES = {
|
|
18
|
+
claude: ["claude-opus-4.8", "claude-opus-4.8-1m", "claude-opus-4.6", "claude-opus-4", "claude-sonnet-4.8", "claude-sonnet-4.6", "claude-sonnet-4", "claude-haiku-4.5", "claude-fable-5"],
|
|
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"]
|
|
21
|
+
};
|
|
22
|
+
var MODEL_ALIASES = {
|
|
23
|
+
claude: {
|
|
24
|
+
fable: "claude-fable-5"
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
var RUNTIME_LABELS = {
|
|
28
|
+
claude: "Claude Code (Anthropic)",
|
|
29
|
+
codex: "Codex (OpenAI)",
|
|
30
|
+
opencode: "OpenCode (open source)"
|
|
31
|
+
};
|
|
32
|
+
var DEFAULT_MODELS = {
|
|
33
|
+
claude: "claude-opus-4.6",
|
|
34
|
+
codex: RUNTIME_TABLE.codex?.defaultModel ?? "gpt-5.4",
|
|
35
|
+
opencode: RUNTIME_TABLE.opencode?.defaultModel ?? "anthropic/claude-sonnet-4-6"
|
|
36
|
+
};
|
|
37
|
+
function loadAgentConfig() {
|
|
38
|
+
if (!existsSync(AGENT_CONFIG_PATH)) return {};
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(readFileSync(AGENT_CONFIG_PATH, "utf-8"));
|
|
41
|
+
} catch {
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function saveAgentConfig(config) {
|
|
46
|
+
const dir = path.dirname(AGENT_CONFIG_PATH);
|
|
47
|
+
ensurePrivateDirSync(dir);
|
|
48
|
+
atomicWriteJsonSync(AGENT_CONFIG_PATH, config);
|
|
49
|
+
}
|
|
50
|
+
function getAgentRuntime(agentId) {
|
|
51
|
+
const config = loadAgentConfig();
|
|
52
|
+
const entry = config[agentId];
|
|
53
|
+
if (entry) return entry;
|
|
54
|
+
const orgDefault = config["default"];
|
|
55
|
+
if (orgDefault) return orgDefault;
|
|
56
|
+
return { runtime: DEFAULT_RUNTIME, model: DEFAULT_MODELS[DEFAULT_RUNTIME] };
|
|
57
|
+
}
|
|
58
|
+
function normalizeCcModelName(model) {
|
|
59
|
+
let ccModel = model.replace(/(\d+)\.(\d+)/g, "$1-$2");
|
|
60
|
+
const isExplicit1m = /-1m$/.test(ccModel) || ccModel.includes("[1m]");
|
|
61
|
+
if ((/claude-(opus|sonnet)-4-[6-9]/.test(ccModel) || /claude-fable-\d+/.test(ccModel)) && !isExplicit1m) {
|
|
62
|
+
ccModel += "[1m]";
|
|
63
|
+
}
|
|
64
|
+
return ccModel;
|
|
65
|
+
}
|
|
66
|
+
function normalizeRuntimeModel(runtime, model) {
|
|
67
|
+
return MODEL_ALIASES[runtime]?.[model] ?? model;
|
|
68
|
+
}
|
|
69
|
+
function validateRuntimeModel(runtime, model) {
|
|
70
|
+
const knownModels = KNOWN_RUNTIMES[runtime];
|
|
71
|
+
if (!knownModels) {
|
|
72
|
+
return {
|
|
73
|
+
ok: false,
|
|
74
|
+
error: `Unknown runtime "${runtime}". Valid: ${Object.keys(KNOWN_RUNTIMES).join(", ")}`
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const normalizedModel = normalizeRuntimeModel(runtime, model);
|
|
78
|
+
if (!knownModels.includes(normalizedModel)) {
|
|
79
|
+
const aliases = Object.keys(MODEL_ALIASES[runtime] ?? {});
|
|
80
|
+
const valid = aliases.length > 0 ? `${knownModels.join(", ")} (aliases: ${aliases.join(", ")})` : knownModels.join(", ");
|
|
81
|
+
return {
|
|
82
|
+
ok: false,
|
|
83
|
+
error: `Unknown model "${model}" for runtime "${runtime}". Valid: ${valid}`
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return { ok: true, model: normalizedModel };
|
|
87
|
+
}
|
|
88
|
+
function setAgentRuntime(agentId, runtime, model, reasoning_effort, mcps) {
|
|
89
|
+
const validated = validateRuntimeModel(runtime, model);
|
|
90
|
+
if (!validated.ok) return validated;
|
|
91
|
+
const config = loadAgentConfig();
|
|
92
|
+
const existing = config[agentId];
|
|
93
|
+
const entry = { runtime, model: validated.model };
|
|
94
|
+
if (reasoning_effort) entry.reasoning_effort = reasoning_effort;
|
|
95
|
+
if (mcps !== void 0) {
|
|
96
|
+
entry.mcps = mcps.includes("exe-os") ? mcps : ["exe-os", ...mcps];
|
|
97
|
+
} else if (existing?.mcps) {
|
|
98
|
+
entry.mcps = existing.mcps;
|
|
99
|
+
}
|
|
100
|
+
config[agentId] = entry;
|
|
101
|
+
saveAgentConfig(config);
|
|
102
|
+
return { ok: true };
|
|
103
|
+
}
|
|
104
|
+
function setAgentMcps(agentId, mcps) {
|
|
105
|
+
const config = loadAgentConfig();
|
|
106
|
+
const existing = config[agentId] ?? getAgentRuntime(agentId);
|
|
107
|
+
existing.mcps = mcps.includes("exe-os") ? mcps : ["exe-os", ...mcps];
|
|
108
|
+
config[agentId] = existing;
|
|
109
|
+
saveAgentConfig(config);
|
|
110
|
+
return { ok: true };
|
|
111
|
+
}
|
|
112
|
+
function clearAgentRuntime(agentId) {
|
|
113
|
+
const config = loadAgentConfig();
|
|
114
|
+
delete config[agentId];
|
|
115
|
+
saveAgentConfig(config);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export {
|
|
119
|
+
AGENT_CONFIG_PATH,
|
|
120
|
+
KNOWN_RUNTIMES,
|
|
121
|
+
MODEL_ALIASES,
|
|
122
|
+
RUNTIME_LABELS,
|
|
123
|
+
DEFAULT_MODELS,
|
|
124
|
+
loadAgentConfig,
|
|
125
|
+
saveAgentConfig,
|
|
126
|
+
getAgentRuntime,
|
|
127
|
+
normalizeCcModelName,
|
|
128
|
+
normalizeRuntimeModel,
|
|
129
|
+
validateRuntimeModel,
|
|
130
|
+
setAgentRuntime,
|
|
131
|
+
setAgentMcps,
|
|
132
|
+
clearAgentRuntime
|
|
133
|
+
};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// src/lib/cpu-steal.ts
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import { execSync } from "child_process";
|
|
4
|
+
import { platform } from "os";
|
|
5
|
+
var CPU_STEAL_WARN_PERCENT = 20;
|
|
6
|
+
var CPU_STEAL_CRITICAL_PERCENT = 50;
|
|
7
|
+
var DEFAULT_SAMPLE_MS = 500;
|
|
8
|
+
function cpuStealMessage(stealPercent) {
|
|
9
|
+
const pct = Math.round(stealPercent);
|
|
10
|
+
return `Host CPU contention: ${pct}% steal \u2014 your VPS provider is starving this VM; not an exe-os issue.`;
|
|
11
|
+
}
|
|
12
|
+
function cpuStealSeverity(stealPercent) {
|
|
13
|
+
if (stealPercent > CPU_STEAL_CRITICAL_PERCENT) return "critical";
|
|
14
|
+
if (stealPercent > CPU_STEAL_WARN_PERCENT) return "warning";
|
|
15
|
+
return "ok";
|
|
16
|
+
}
|
|
17
|
+
function parseProcStat(content) {
|
|
18
|
+
const line = content.split("\n").find((l) => /^cpu\s/.test(l));
|
|
19
|
+
if (!line) return null;
|
|
20
|
+
const nums = line.trim().split(/\s+/).slice(1).map((n) => Number.parseInt(n, 10)).filter((n) => Number.isFinite(n));
|
|
21
|
+
if (nums.length < 4) return null;
|
|
22
|
+
const total = nums.reduce((sum, n) => sum + n, 0);
|
|
23
|
+
const steal = nums[7] ?? 0;
|
|
24
|
+
if (total <= 0) return null;
|
|
25
|
+
return { total, steal };
|
|
26
|
+
}
|
|
27
|
+
function stealPercentBetween(a, b) {
|
|
28
|
+
const totalDelta = b.total - a.total;
|
|
29
|
+
const stealDelta = b.steal - a.steal;
|
|
30
|
+
if (totalDelta <= 0) return 0;
|
|
31
|
+
const pct = stealDelta / totalDelta * 100;
|
|
32
|
+
if (!Number.isFinite(pct) || pct < 0) return 0;
|
|
33
|
+
return Math.min(pct, 100);
|
|
34
|
+
}
|
|
35
|
+
function readProcStatSample() {
|
|
36
|
+
try {
|
|
37
|
+
return parseProcStat(readFileSync("/proc/stat", "utf8"));
|
|
38
|
+
} catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function parseMpstat(output) {
|
|
43
|
+
const lines = output.split("\n").map((l) => l.trim()).filter(Boolean);
|
|
44
|
+
const headerIdx = lines.findIndex((l) => l.includes("%steal") && /\bCPU\b/.test(l));
|
|
45
|
+
if (headerIdx === -1) return null;
|
|
46
|
+
const headers = lines[headerIdx].split(/\s+/);
|
|
47
|
+
const cpuHeaderIdx = headers.findIndex((h) => h === "CPU");
|
|
48
|
+
const stealHeaderIdx = headers.indexOf("%steal");
|
|
49
|
+
if (cpuHeaderIdx === -1 || stealHeaderIdx === -1 || stealHeaderIdx < cpuHeaderIdx) return null;
|
|
50
|
+
const stealOffsetFromCpu = stealHeaderIdx - cpuHeaderIdx;
|
|
51
|
+
const dataRows = lines.slice(headerIdx + 1).filter((l) => /\d/.test(l));
|
|
52
|
+
const avgRow = dataRows.find((l) => /^Average:/i.test(l));
|
|
53
|
+
const row = avgRow ?? dataRows[dataRows.length - 1];
|
|
54
|
+
if (!row) return null;
|
|
55
|
+
const cols = row.split(/\s+/);
|
|
56
|
+
const cpuColIdx = cols.findIndex((c) => c === "all" || /^\d+$/.test(c));
|
|
57
|
+
if (cpuColIdx === -1) return null;
|
|
58
|
+
const val = Number.parseFloat(cols[cpuColIdx + stealOffsetFromCpu] ?? "");
|
|
59
|
+
if (!Number.isFinite(val) || val < 0) return null;
|
|
60
|
+
return Math.min(val, 100);
|
|
61
|
+
}
|
|
62
|
+
function readMpstatSteal() {
|
|
63
|
+
try {
|
|
64
|
+
const out = execSync("mpstat 1 1", {
|
|
65
|
+
encoding: "utf8",
|
|
66
|
+
timeout: 5e3,
|
|
67
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
68
|
+
});
|
|
69
|
+
return parseMpstat(out);
|
|
70
|
+
} catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function naResult() {
|
|
75
|
+
return {
|
|
76
|
+
available: false,
|
|
77
|
+
stealPercent: null,
|
|
78
|
+
severity: "na",
|
|
79
|
+
source: "none",
|
|
80
|
+
message: "CPU steal not measurable on this platform (no /proc/stat or mpstat) \u2014 skipped."
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function buildResult(stealPercent, source) {
|
|
84
|
+
const severity = cpuStealSeverity(stealPercent);
|
|
85
|
+
const message = severity === "ok" ? `CPU steal ${Math.round(stealPercent)}% (host healthy)` : cpuStealMessage(stealPercent);
|
|
86
|
+
return { available: true, stealPercent, severity, source, message };
|
|
87
|
+
}
|
|
88
|
+
function checkCpuStealSync(sampleMs = DEFAULT_SAMPLE_MS) {
|
|
89
|
+
if (platform() !== "linux") {
|
|
90
|
+
const mp2 = readMpstatSteal();
|
|
91
|
+
if (mp2 != null) return buildResult(mp2, "mpstat");
|
|
92
|
+
return naResult();
|
|
93
|
+
}
|
|
94
|
+
const a = readProcStatSample();
|
|
95
|
+
if (a) {
|
|
96
|
+
const end = Date.now() + Math.max(50, sampleMs);
|
|
97
|
+
while (Date.now() < end) {
|
|
98
|
+
}
|
|
99
|
+
const b = readProcStatSample();
|
|
100
|
+
if (b) return buildResult(stealPercentBetween(a, b), "proc-stat");
|
|
101
|
+
}
|
|
102
|
+
const mp = readMpstatSteal();
|
|
103
|
+
if (mp != null) return buildResult(mp, "mpstat");
|
|
104
|
+
return naResult();
|
|
105
|
+
}
|
|
106
|
+
async function checkCpuSteal(sampleMs = DEFAULT_SAMPLE_MS) {
|
|
107
|
+
if (platform() !== "linux") {
|
|
108
|
+
const mp2 = readMpstatSteal();
|
|
109
|
+
if (mp2 != null) return buildResult(mp2, "mpstat");
|
|
110
|
+
return naResult();
|
|
111
|
+
}
|
|
112
|
+
const a = readProcStatSample();
|
|
113
|
+
if (a) {
|
|
114
|
+
await new Promise((resolve) => setTimeout(resolve, Math.max(50, sampleMs)));
|
|
115
|
+
const b = readProcStatSample();
|
|
116
|
+
if (b) return buildResult(stealPercentBetween(a, b), "proc-stat");
|
|
117
|
+
}
|
|
118
|
+
const mp = readMpstatSteal();
|
|
119
|
+
if (mp != null) return buildResult(mp, "mpstat");
|
|
120
|
+
return naResult();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export {
|
|
124
|
+
CPU_STEAL_WARN_PERCENT,
|
|
125
|
+
CPU_STEAL_CRITICAL_PERCENT,
|
|
126
|
+
cpuStealMessage,
|
|
127
|
+
cpuStealSeverity,
|
|
128
|
+
parseProcStat,
|
|
129
|
+
stealPercentBetween,
|
|
130
|
+
parseMpstat,
|
|
131
|
+
checkCpuStealSync,
|
|
132
|
+
checkCpuSteal
|
|
133
|
+
};
|