@askexenow/exe-os 0.9.239 → 0.9.243
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 +12 -0
- package/deploy/compose/.env.example +13 -1
- package/deploy/compose/cloudflared/config.yml.example +23 -4
- package/deploy/compose/docker-compose.yml +27 -7
- package/deploy/compose/generate-env.ts +49 -1
- package/deploy/compose/init-db.sql +10 -2
- package/deploy/stack-manifests/v0.9.json +113 -9
- package/dist/{active-agent-7MIVNARP.js → active-agent-KO4ZWDXE.js} +4 -4
- package/dist/{active-agent-55C5Y3XL.js → active-agent-KP2O52HA.js} +4 -4
- package/dist/{agentic-ontology-NCAQIQQI.js → agentic-ontology-DXE5J6I5.js} +1 -1
- package/dist/{backfill-metadata-3JP7EZ2U.js → backfill-metadata-DFTIGPXP.js} +7 -7
- package/dist/{background-jobs-RWL46VRD.js → background-jobs-CRXY7T4Y.js} +2 -2
- package/dist/{behaviors-6BGALYGW.js → behaviors-BL3QCHBT.js} +4 -4
- package/dist/bin/age-ontology-load.js +2 -2
- package/dist/bin/agentic-ontology-backfill.js +9 -9
- package/dist/bin/agentic-reflection-backfill.js +10 -10
- package/dist/bin/agentic-semantic-label.js +9 -9
- package/dist/bin/backfill-conversations.js +9 -9
- package/dist/bin/backfill-responses.js +9 -9
- package/dist/bin/backfill-vectors.js +11 -11
- package/dist/bin/bulk-sync-postgres.js +10 -10
- package/dist/bin/cc-doctor.js +3 -3
- package/dist/bin/cleanup-stale-review-tasks.js +13 -13
- package/dist/bin/cli.js +27 -22
- package/dist/bin/exe-agent-config.js +4 -4
- package/dist/bin/exe-agent.js +8 -8
- package/dist/bin/exe-assign.js +11 -11
- package/dist/bin/exe-boot.js +22 -22
- package/dist/bin/exe-call.js +5 -5
- package/dist/bin/exe-cloud.js +8 -8
- package/dist/bin/exe-dispatch.js +13 -13
- package/dist/bin/exe-doctor.js +1 -1
- package/dist/bin/exe-export-behaviors.js +10 -10
- package/dist/bin/exe-forget.js +9 -9
- package/dist/bin/exe-gateway.js +8 -8
- package/dist/bin/exe-healthcheck.js +3 -3
- package/dist/bin/exe-heartbeat.js +13 -13
- package/dist/bin/exe-kill.js +18 -18
- package/dist/bin/exe-launch-agent.js +22 -22
- package/dist/bin/exe-new-employee.js +8 -8
- package/dist/bin/exe-pending-messages.js +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 +17 -17
- package/dist/bin/exe-search.js +8 -8
- package/dist/bin/exe-session-cleanup.js +20 -20
- package/dist/bin/exe-settings.js +7 -7
- package/dist/bin/exe-start-codex.js +14 -14
- package/dist/bin/exe-start-opencode.js +11 -11
- 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 +13 -13
- package/dist/bin/graph-backfill.js +8 -8
- package/dist/bin/graph-export.js +8 -8
- 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 +3 -3
- package/dist/bin/shard-migrate.js +8 -8
- package/dist/bin/stack-update.js +324 -20
- package/dist/bin/verify-stack.js +3 -383
- package/dist/bin/vps-backup.js +8 -160
- package/dist/bin/vps-health-gate.js +10 -220
- package/dist/{branding-I7YYX4FM.js → branding-XWMO5EDR.js} +1 -1
- package/dist/{capacity-monitor-IFCZKRPG.js → capacity-monitor-4CSBC7AP.js} +14 -14
- package/dist/{catchup-brief-PIDRWXOW.js → catchup-brief-LF5Z6Q6E.js} +17 -17
- package/dist/{chunk-FGJUGDNM.js → chunk-222SI7QC.js} +14 -14
- package/dist/{chunk-JZMVLAZ2.js → chunk-2WBBVEIB.js} +1 -1
- package/dist/{chunk-JDOE33C2.js → chunk-3V53HH5T.js} +4 -4
- package/dist/{chunk-2KZSKURT.js → chunk-57SULZJ2.js} +3 -3
- package/dist/{chunk-QI4IXJN7.js → chunk-5CHYEKMH.js} +7 -4
- package/dist/chunk-5DMAMQNU.js +168 -0
- package/dist/{chunk-PLQAFB3Z.js → chunk-5JIG2FP2.js} +1 -1
- package/dist/{chunk-UWQ3XCDG.js → chunk-5WK7X5CF.js} +2 -2
- package/dist/{chunk-DDPAQ4LT.js → chunk-6JAGJN77.js} +2 -2
- package/dist/{chunk-7F37NMKB.js → chunk-73UE2PHT.js} +1 -1
- package/dist/{chunk-JL3K5OTS.js → chunk-7IZWLMTP.js} +1 -1
- package/dist/{chunk-ELRRL2NC.js → chunk-A4K2ZT6N.js} +4 -4
- package/dist/{chunk-GWYADLIW.js → chunk-AHXEU5XB.js} +1 -1
- package/dist/{chunk-WSHMBME6.js → chunk-AWRL5FGM.js} +19 -78
- package/dist/{chunk-OMPCFLWA.js → chunk-BSPOEYAO.js} +1 -1
- package/dist/{chunk-DHVC4RN7.js → chunk-CBDPEJOR.js} +5 -5
- package/dist/{chunk-2H55BIV2.js → chunk-CEJO7244.js} +2 -2
- package/dist/{chunk-FKWZVO2T.js → chunk-CPXGLSIL.js} +3 -3
- package/dist/{chunk-HX5G4AS4.js → chunk-CWITU7DW.js} +2 -2
- package/dist/{chunk-5GG7MTRJ.js → chunk-DGBGIXCC.js} +4 -4
- package/dist/{chunk-IQXPMK46.js → chunk-DLZYAYVM.js} +60 -14
- package/dist/{chunk-PPYWQV2M.js → chunk-DR5BGWFR.js} +2 -2
- package/dist/{chunk-BZWKTFEB.js → chunk-ENVRFBTB.js} +2 -2
- package/dist/{chunk-DUVO2PUJ.js → chunk-F3GM6OOP.js} +4 -4
- package/dist/{chunk-HNLPLLE6.js → chunk-F7JLZXHC.js} +60 -26
- package/dist/{chunk-AL4DRC5H.js → chunk-FFLILAG6.js} +1 -1
- package/dist/{chunk-BZNI4OK5.js → chunk-GHEWRYMY.js} +18 -2
- package/dist/{chunk-C7SFJO5F.js → chunk-GHT4REOS.js} +5 -5
- package/dist/{chunk-FBWUJEXS.js → chunk-HANG6NLF.js} +4 -6
- package/dist/{chunk-5NJ4A4ZA.js → chunk-HCBMPZDT.js} +1 -1
- package/dist/chunk-HOGTZLVU.js +244 -0
- package/dist/{chunk-IQSCZDBQ.js → chunk-I5PIBL56.js} +3 -3
- package/dist/chunk-IRHNV4GY.js +388 -0
- package/dist/{chunk-F4TCKCKK.js → chunk-ITZVPCBQ.js} +33 -12
- package/dist/{chunk-4HROS3GJ.js → chunk-IZVKWBIP.js} +1 -1
- package/dist/{chunk-DKI5BTBC.js → chunk-J7V7LPPX.js} +2 -2
- package/dist/{chunk-TOZ5NN5V.js → chunk-JLKUVK5J.js} +1 -1
- package/dist/{chunk-4SC65UBG.js → chunk-JLNXKG3K.js} +1 -1
- package/dist/{chunk-KVSQOG3W.js → chunk-K2BDE2B5.js} +4 -4
- package/dist/{chunk-KDJRFJDL.js → chunk-K333WOW4.js} +30 -2
- package/dist/{chunk-6LBCUA2A.js → chunk-KEZXW3RP.js} +1 -1
- package/dist/{chunk-W7G3GY4I.js → chunk-KLQI7QY4.js} +3 -3
- package/dist/{chunk-UODVZGBQ.js → chunk-KN7LPTIB.js} +1 -1
- package/dist/{chunk-ESKBZN4Q.js → chunk-L4WRH3DL.js} +1 -1
- package/dist/{chunk-VFQKKMKE.js → chunk-LAOB5BKV.js} +2 -2
- package/dist/{chunk-MAN5LZQ4.js → chunk-LQSFP2BV.js} +1 -1
- package/dist/{chunk-EJ7LOTV2.js → chunk-LSFHEMVI.js} +9 -9
- package/dist/{chunk-RA2RO27E.js → chunk-MCESA5UW.js} +2 -2
- package/dist/{chunk-UPMHG7ET.js → chunk-MEIHREPM.js} +1 -1
- package/dist/{chunk-D5C56WO3.js → chunk-MOZ2YQ54.js} +1 -1
- package/dist/{chunk-CLGB3FGL.js → chunk-MPX3TRMQ.js} +2 -2
- package/dist/{chunk-5R75ODPS.js → chunk-NBY6R37W.js} +61 -232
- package/dist/{chunk-RWFGXC35.js → chunk-NEYQAEYU.js} +7 -7
- package/dist/{chunk-MBHZDXGN.js → chunk-NL35XNLI.js} +1 -1
- package/dist/{chunk-TPQVLYSV.js → chunk-NLGMHPEN.js} +1 -1
- package/dist/{chunk-5LMH4YHG.js → chunk-NRVV4Y5V.js} +4 -4
- package/dist/{chunk-GN5VHPPR.js → chunk-NVZR7T4E.js} +1 -1
- package/dist/{chunk-Y2L7RMGH.js → chunk-NWBHL5PI.js} +1 -1
- package/dist/{chunk-YPYDLW75.js → chunk-OEMX65EA.js} +1 -1
- package/dist/{chunk-UAFUGPKO.js → chunk-ONAQAL3O.js} +1 -1
- package/dist/{chunk-AVM7XZE4.js → chunk-OWQ3CCYJ.js} +7 -6
- package/dist/{chunk-K525WLL7.js → chunk-PI6V23GF.js} +5 -4
- package/dist/{chunk-AURM7FOT.js → chunk-Q2OAQPWY.js} +1 -1
- package/dist/{chunk-FB5VRO5S.js → chunk-QLDWASTX.js} +28 -32
- package/dist/{chunk-EPWDTS2Q.js → chunk-QMTGMCWB.js} +1 -1
- package/dist/{chunk-VI2FJY2M.js → chunk-QP4FHME2.js} +2 -2
- package/dist/{chunk-NJWK6J4N.js → chunk-QUNKPR6Y.js} +5 -5
- package/dist/{chunk-O6DAF2TY.js → chunk-QUZVAHO7.js} +2 -2
- package/dist/{chunk-VHKL4S4T.js → chunk-RRHSONV5.js} +2 -2
- package/dist/{chunk-GPF6X6HE.js → chunk-RYDHEWYY.js} +2 -2
- package/dist/{chunk-C2YS2AA6.js → chunk-U7WOVXBB.js} +2 -2
- package/dist/chunk-UIRWDGMB.js +230 -0
- package/dist/{chunk-FE45RXGC.js → chunk-V2GZMY6O.js} +1 -1
- package/dist/{chunk-PATCHPNY.js → chunk-VHALWCUO.js} +1 -1
- package/dist/{chunk-HLZSC5WK.js → chunk-VQAP35DA.js} +20 -18
- package/dist/{chunk-452XB7OZ.js → chunk-VRIMTCX2.js} +1 -1
- package/dist/{chunk-SUNYJ6YE.js → chunk-VT2B5BHM.js} +1 -1
- package/dist/{chunk-UZIJDYDA.js → chunk-VWVJVQDH.js} +2 -2
- package/dist/{chunk-TRZ5KA2R.js → chunk-VXIMSRTO.js} +2 -2
- package/dist/{chunk-DAZIV4QZ.js → chunk-WCXZF42W.js} +1 -1
- package/dist/{chunk-6OJJF4WP.js → chunk-XJUUWHVN.js} +1 -1
- package/dist/{chunk-F7LU65PQ.js → chunk-Y25OJWOQ.js} +14 -2
- package/dist/{chunk-2ORPA23Y.js → chunk-YMXXD2GW.js} +36 -8
- package/dist/{chunk-5WLMF6PL.js → chunk-YMZHTTOQ.js} +1 -1
- package/dist/{chunk-7DIDOQCX.js → chunk-YRVW57UW.js} +139 -125
- package/dist/{chunk-BRFH5X7G.js → chunk-Z7VDUS6L.js} +1 -1
- package/dist/{chunk-YFE6W75D.js → chunk-ZKFPHJIJ.js} +1 -1
- package/dist/{chunk-5WUTKDH6.js → chunk-ZVXJSQOR.js} +1 -1
- package/dist/{co-activation-VB4CJQZB.js → co-activation-L6I2LSJO.js} +3 -3
- package/dist/{co-occurrence-XZQJJIBM.js → co-occurrence-QARWYUAY.js} +3 -3
- package/dist/{code-context-index-FCQOPUEA.js → code-context-index-UIYQRDHD.js} +4 -4
- package/dist/{content-extractor-SPSH5X33.js → content-extractor-EYRVGD6O.js} +2 -2
- package/dist/{conversation-wiki-populator-YU35LNRK.js → conversation-wiki-populator-L7O6F3BB.js} +1 -1
- package/dist/{crdt-sync-KXETGV45.js → crdt-sync-R6YROKDH.js} +1 -1
- package/dist/{crm-webhook-JMOAHTJ6.js → crm-webhook-WK3PYJJK.js} +2 -2
- package/dist/{cto-delegation-gate-IJ3KQIKF.js → cto-delegation-gate-5JZORQIT.js} +12 -12
- package/dist/{daemon-auth-2IZACWSG.js → daemon-auth-2HEOL6VG.js} +2 -2
- package/dist/{daemon-orchestration-ZCY4GEI3.js → daemon-orchestration-BJ3T5MMF.js} +16 -15
- package/dist/{db-backup-HLX5OLIV.js → db-backup-EWS52P2W.js} +2 -2
- package/dist/{dreaming-2CJML3TU.js → dreaming-BOSBDRI3.js} +13 -13
- package/dist/{entity-boost-T5IYWWDZ.js → entity-boost-6ZVX7DFB.js} +26 -2
- package/dist/{exe-drift-P5OIRNSH.js → exe-drift-WRE6RADZ.js} +4 -4
- package/dist/{exe-export-QQL2H322.js → exe-export-7N5PBCMK.js} +8 -8
- package/dist/{exe-import-V4RJCUEP.js → exe-import-YOOE7S3H.js} +8 -8
- package/dist/{exe-key-MENJGDD7.js → exe-key-GXJSTCX2.js} +4 -4
- package/dist/{exe-org-3FNET2J7.js → exe-org-42YMQL75.js} +2 -2
- package/dist/{exe-snapshot-YRARQE7F.js → exe-snapshot-ODUCFW7G.js} +18 -18
- package/dist/{fast-db-init-HIJWWKAO.js → fast-db-init-YSR7RMVZ.js} +1 -1
- package/dist/{founder-context-BQ5NBDUV.js → founder-context-Q2HUCZX4.js} +2 -2
- package/dist/gateway/index.js +9 -9
- package/dist/{gateway-client-YGSA5QMC.js → gateway-client-4QXHKN5C.js} +1 -1
- package/dist/{git-staleness-IHTKCUMN.js → git-staleness-BJDTCDPC.js} +3 -3
- package/dist/{git-task-sweep-5ZPNQS7Y.js → git-task-sweep-L3U3T5HM.js} +13 -13
- package/dist/{global-procedures-XHDIZRJU.js → global-procedures-HCHEHKY2.js} +4 -4
- package/dist/{graph-auto-extract-5TPT67GP.js → graph-auto-extract-FP5C76LS.js} +3 -3
- package/dist/{hook-integrity-SB53Y7UK.js → hook-integrity-2OU3T6UC.js} +1 -1
- package/dist/hooks/bug-report-worker.js +15 -14
- package/dist/hooks/codex-stop-task-finalizer.js +15 -14
- package/dist/hooks/commit-complete.js +16 -16
- package/dist/hooks/error-recall.js +10 -10
- package/dist/hooks/exe-heartbeat-hook.js +5 -5
- package/dist/hooks/ingest-worker.js +8 -8
- 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 +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 +28 -25
- package/dist/hooks/prompt-submit.js +62 -31
- package/dist/hooks/session-end.js +26 -26
- package/dist/hooks/session-start.js +39 -15
- package/dist/hooks/stop.js +22 -22
- package/dist/hooks/subagent-stop.js +15 -15
- package/dist/hooks/summary-worker.js +32 -27
- package/dist/index.js +21 -21
- package/dist/{installer-AMZM4MLS.js → installer-AWMUCRN4.js} +7 -7
- package/dist/{installer-KT5FW4CN.js → installer-HB3NH6FG.js} +9 -9
- package/dist/{installer-HW74W3IT.js → installer-RU6EVOBL.js} +6 -6
- package/dist/{intercom-queue-RNM6EPGA.js → intercom-queue-A6UJEFIF.js} +1 -1
- package/dist/{key-backup-status-OZ2CXUDW.js → key-backup-status-4YKCV4ZV.js} +1 -1
- package/dist/lib/agent-config.js +2 -2
- package/dist/lib/cloud-sync.js +10 -8
- package/dist/lib/config.js +1 -1
- 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/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 +105 -74
- package/dist/lib/hybrid-search.js +8 -8
- package/dist/lib/identity.js +3 -3
- package/dist/lib/keychain.js +1 -1
- package/dist/lib/license.js +2 -2
- package/dist/lib/messaging.js +13 -13
- package/dist/lib/post-tool-memory.js +3 -3
- package/dist/lib/reminders.js +4 -4
- package/dist/lib/schedules.js +8 -8
- package/dist/lib/session-registry.js +5 -5
- package/dist/lib/skill-learning.js +5 -5
- package/dist/lib/store.js +7 -7
- package/dist/lib/task-router.js +4 -4
- package/dist/lib/tasks.js +14 -13
- package/dist/lib/tmux-routing.js +12 -12
- package/dist/lib/token-spend.js +4 -4
- package/dist/lib/ws-client.js +1 -1
- package/dist/{license-gate-XJDIL6OZ.js → license-gate-6JQQFBHS.js} +3 -3
- package/dist/mcp/register-tools.js +68 -67
- package/dist/mcp/server.js +70 -69
- 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 -15
- package/dist/mcp/tools/deactivate-behavior.js +6 -6
- package/dist/mcp/tools/list-reminders.js +5 -5
- package/dist/mcp/tools/list-tasks.js +16 -15
- package/dist/mcp/tools/send-message.js +15 -15
- package/dist/mcp/tools/update-task.js +15 -14
- package/dist/{mcp-http-config-BXX3RZPR.js → mcp-http-config-XIJR5P2Z.js} +4 -4
- package/dist/{memory-cards-KRTP5GFM.js → memory-cards-H4BJJ5OK.js} +3 -3
- package/dist/{memory-graph-extractor-G532PUHC.js → memory-graph-extractor-SDGM3GVR.js} +4 -4
- package/dist/{memory-poisoning-defense-HJM3FQA3.js → memory-poisoning-defense-UVU67DGJ.js} +3 -3
- package/dist/{memory-queue-FTNBWLS4.js → memory-queue-FNT5WHXP.js} +2 -2
- package/dist/{memory-queue-client-DHSHEIHQ.js → memory-queue-client-JZCFYTWQ.js} +5 -5
- package/dist/{memory-reflection-RANRFUQL.js → memory-reflection-GGB5K35L.js} +3 -3
- package/dist/{notifications-4P2PVEOT.js → notifications-P3XQZDTH.js} +12 -12
- package/dist/{orchestration-events-IYTASMSN.js → orchestration-events-25WEKUKH.js} +4 -4
- package/dist/{orchestration-phase-SGA7PJ5G.js → orchestration-phase-C26XVKLZ.js} +2 -2
- package/dist/{orchestrator-VKVHZ4MV.js → orchestrator-VIXTY4E4.js} +14 -14
- package/dist/{pipeline-router-E4L5BDXN.js → pipeline-router-S5PE5U6B.js} +4 -4
- package/dist/{plan-limits-5O5QG55H.js → plan-limits-DGIVM42H.js} +5 -5
- package/dist/{prediction-log-OMWHW7FL.js → prediction-log-DOEOHDHS.js} +1 -1
- package/dist/{project-boot-WMI6CWRX.js → project-boot-4ZL2W7DN.js} +12 -2
- package/dist/{projection-worker-54KRNQSO.js → projection-worker-GG2W5OM3.js} +3 -3
- package/dist/{push-notifications-E2XXEWJZ.js → push-notifications-AMHVR6DF.js} +2 -2
- package/dist/{reranker-4NTUFNYT.js → reranker-UCPLQZE2.js} +2 -2
- package/dist/{review-polling-BFRJDLUA.js → review-polling-P2MWEXLR.js} +13 -13
- package/dist/runtime/index.js +15 -15
- package/dist/{session-events-KCZCWGE4.js → session-events-5CD66R6U.js} +13 -13
- package/dist/{session-kill-telemetry-TMNIDYWY.js → session-kill-telemetry-7FBHTEDN.js} +4 -4
- package/dist/{session-scope-DRZBQ32Y.js → session-scope-VMIPAZU7.js} +12 -12
- package/dist/{setup-wizard-TQKGDAHO.js → setup-wizard-BNR47URR.js} +3 -3
- package/dist/{shard-manager-G6MHCO7X.js → shard-manager-VGA2TYHM.js} +2 -2
- package/dist/{skill-refinement-Z5SWD3AM.js → skill-refinement-NRG4WWRW.js} +3 -3
- package/dist/stack-release-PFZI22WC.js +521 -0
- package/dist/{stack-update-NO5MNARG.js → stack-update-JIWJGGLX.js} +3 -3
- package/dist/{steward-gate-7DWYS5AT.js → steward-gate-L7DJMF4C.js} +4 -4
- package/dist/{task-enforcement-2VL5J6JJ.js → task-enforcement-XQL77PZH.js} +52 -12
- package/dist/{task-scope-YHALISIB.js → task-scope-R3XKBIHL.js} +12 -12
- package/dist/{tasks-crud-JXZEBZFR.js → tasks-crud-DQOG2NPG.js} +12 -12
- package/dist/tasks-notify-4EQYG52H.js +37 -0
- package/dist/{tasks-review-PGPYJQF5.js → tasks-review-XPFJ4DSJ.js} +12 -12
- package/dist/{telemetry-upload-H7OJNBIF.js → telemetry-upload-OT5B5HUY.js} +7 -7
- package/dist/{token-budget-JJ7JQIA2.js → token-budget-D2LQKCAV.js} +3 -3
- package/dist/{tool-capability-index-WIV4K3FB.js → tool-capability-index-FAJ5ZHDF.js} +1 -1
- package/dist/{tool-telemetry-W4LFCHFT.js → tool-telemetry-QIF5BCLF.js} +1 -1
- package/dist/tui/App.js +26 -26
- package/dist/{tui-data-72U6N2DC.js → tui-data-UEV2QOR3.js} +108 -12
- package/dist/{whatsapp-config-W63RQ3AU.js → whatsapp-config-GOSELKTE.js} +7 -0
- package/dist/{worker-gate-SCSN6IHI.js → worker-gate-PRCKA23W.js} +2 -2
- package/dist/{workflow-engine-OICYBE4F.js → workflow-engine-7X6LLH3M.js} +2 -2
- package/dist/{worktree-JXN4RCWC.js → worktree-RICSCT2S.js} +5 -5
- package/package.json +1 -1
- package/release-notes.json +137 -297
- package/stack.release.json +4 -3
- package/dist/preflight-EAH2MI76.js +0 -287
- /package/dist/{chunk-H42LEGLB.js → chunk-AQBEG33D.js} +0 -0
- /package/dist/{chunk-AU5426YP.js → chunk-B7JGEDVE.js} +0 -0
- /package/dist/{chunk-YFDDTHNM.js → chunk-JXI4XUTV.js} +0 -0
- /package/dist/{chunk-SNYDRHV3.js → chunk-U3DUFHOT.js} +0 -0
- /package/dist/{chunk-N2XUH2HQ.js → chunk-VBPC7IC7.js} +0 -0
- /package/dist/{chunk-HTUJBTBM.js → chunk-VUS6WXQ3.js} +0 -0
- /package/dist/{chunk-NOLIN2YI.js → chunk-XAYRZHLV.js} +0 -0
- /package/dist/{core-memory-VOBGGB2Q.js → core-memory-4KAIKQRQ.js} +0 -0
- /package/dist/{message-queue-client-KAJN6TIJ.js → message-queue-client-S6W5VMJV.js} +0 -0
- /package/dist/{oauth-server-QEXRSXEP.js → oauth-server-2ESBZB7F.js} +0 -0
- /package/dist/{webhook-pipe-LY4XEDL7.js → webhook-pipe-ZRUVOG5H.js} +0 -0
- /package/dist/{wiki-acl-M3OR547L.js → wiki-acl-MFLSS6DE.js} +0 -0
- /package/dist/{wiki-client-MAFYBXCQ.js → wiki-client-GBPR45BQ.js} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isCrdtSyncEnabled
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JXI4XUTV.js";
|
|
4
4
|
import {
|
|
5
5
|
decryptSyncBlob,
|
|
6
6
|
encryptSyncBlob,
|
|
@@ -12,13 +12,13 @@ import {
|
|
|
12
12
|
loadEmployees,
|
|
13
13
|
registerBinSymlinks,
|
|
14
14
|
saveEmployees
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-CEJO7244.js";
|
|
16
16
|
import {
|
|
17
17
|
loadDeviceId
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-MOZ2YQ54.js";
|
|
19
19
|
import {
|
|
20
20
|
EXE_AI_DIR
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-VXIMSRTO.js";
|
|
22
22
|
import {
|
|
23
23
|
atomicWriteJsonSync,
|
|
24
24
|
atomicWriteSync,
|
|
@@ -70,6 +70,21 @@ var FETCH_TIMEOUT_MS = 3e4;
|
|
|
70
70
|
var PUSH_BATCH_SIZE = 5e3;
|
|
71
71
|
var ROSTER_LOCK_PATH = path.join(EXE_AI_DIR, "roster-merge.lock");
|
|
72
72
|
var LOCK_STALE_MS = 3e4;
|
|
73
|
+
var _daemonCrdtSkipLogged = false;
|
|
74
|
+
function shouldUseCrdtMergeForCloudSync() {
|
|
75
|
+
if (!isCrdtSyncEnabled()) return false;
|
|
76
|
+
if (process.env.EXE_IS_DAEMON === "1" && process.env.EXE_DAEMON_CRDT_SYNC !== "1") {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
function logDaemonCrdtSkipOnce() {
|
|
82
|
+
if (_daemonCrdtSkipLogged) return;
|
|
83
|
+
_daemonCrdtSkipLogged = true;
|
|
84
|
+
process.stderr.write(
|
|
85
|
+
"[cloud-sync] CRDT merge disabled inside daemon; using bounded SQL upsert path. Set EXE_DAEMON_CRDT_SYNC=1 only for diagnostics.\n"
|
|
86
|
+
);
|
|
87
|
+
}
|
|
73
88
|
var SYNC_COOLDOWN_MS = 1e4;
|
|
74
89
|
var _lastSyncPushVersion = -1;
|
|
75
90
|
var _lastSyncPushTimestamp = 0;
|
|
@@ -505,8 +520,8 @@ async function cloudSync(config) {
|
|
|
505
520
|
const pullResult = await cloudPull(lastPullVersion, config);
|
|
506
521
|
let pulled = 0;
|
|
507
522
|
if (pullResult.records.length > 0) {
|
|
508
|
-
if (
|
|
509
|
-
const { initCrdtDoc, importExistingMemories, readAllMemories } = await import("./crdt-sync-
|
|
523
|
+
if (shouldUseCrdtMergeForCloudSync()) {
|
|
524
|
+
const { initCrdtDoc, importExistingMemories, readAllMemories } = await import("./crdt-sync-R6YROKDH.js");
|
|
510
525
|
initCrdtDoc();
|
|
511
526
|
importExistingMemories(
|
|
512
527
|
pullResult.records.map((rec) => ({
|
|
@@ -571,6 +586,9 @@ async function cloudSync(config) {
|
|
|
571
586
|
if (stmts.length > 0) await client.batch(stmts, "write");
|
|
572
587
|
pulled = pullResult.records.length;
|
|
573
588
|
} else {
|
|
589
|
+
if (process.env.EXE_IS_DAEMON === "1" && isCrdtSyncEnabled()) {
|
|
590
|
+
logDaemonCrdtSkipOnce();
|
|
591
|
+
}
|
|
574
592
|
try {
|
|
575
593
|
const incomingIds = pullResult.records.map((r) => sqlSafe(r.id));
|
|
576
594
|
if (incomingIds.length > 0) {
|
|
@@ -935,7 +953,7 @@ async function cloudSync(config) {
|
|
|
935
953
|
}
|
|
936
954
|
const totalMemories = await countRows("SELECT COUNT(*) as cnt FROM memories WHERE status = 'active' OR status IS NULL");
|
|
937
955
|
try {
|
|
938
|
-
const { getLatestBackup } = await import("./db-backup-
|
|
956
|
+
const { getLatestBackup } = await import("./db-backup-EWS52P2W.js");
|
|
939
957
|
const latestBackup = getLatestBackup();
|
|
940
958
|
if (latestBackup) {
|
|
941
959
|
const backupSize = statSync(latestBackup).size;
|
|
@@ -1577,34 +1595,11 @@ async function cloudPullTasks(config) {
|
|
|
1577
1595
|
if (!remoteTasks || remoteTasks.length === 0) return { pulled: 0 };
|
|
1578
1596
|
const client = getClient();
|
|
1579
1597
|
const stmts = remoteTasks.map((t) => ({
|
|
1580
|
-
sql: `INSERT INTO tasks
|
|
1598
|
+
sql: `INSERT OR IGNORE INTO tasks
|
|
1581
1599
|
(id, title, assigned_to, assigned_by, project_name, priority, status, task_file, created_at, updated_at,
|
|
1582
1600
|
blocked_by, parent_task_id, budget_tokens, budget_fallback_model, tokens_used, tokens_warned_at,
|
|
1583
1601
|
reviewer, context, complexity, session_scope, spawn_runtime, spawn_model, result)
|
|
1584
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1585
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
1586
|
-
title = excluded.title,
|
|
1587
|
-
assigned_to = excluded.assigned_to,
|
|
1588
|
-
assigned_by = excluded.assigned_by,
|
|
1589
|
-
project_name = excluded.project_name,
|
|
1590
|
-
priority = excluded.priority,
|
|
1591
|
-
status = excluded.status,
|
|
1592
|
-
task_file = excluded.task_file,
|
|
1593
|
-
updated_at = excluded.updated_at,
|
|
1594
|
-
blocked_by = excluded.blocked_by,
|
|
1595
|
-
parent_task_id = excluded.parent_task_id,
|
|
1596
|
-
budget_tokens = excluded.budget_tokens,
|
|
1597
|
-
budget_fallback_model = excluded.budget_fallback_model,
|
|
1598
|
-
tokens_used = excluded.tokens_used,
|
|
1599
|
-
tokens_warned_at = excluded.tokens_warned_at,
|
|
1600
|
-
reviewer = excluded.reviewer,
|
|
1601
|
-
context = excluded.context,
|
|
1602
|
-
complexity = excluded.complexity,
|
|
1603
|
-
session_scope = excluded.session_scope,
|
|
1604
|
-
spawn_runtime = excluded.spawn_runtime,
|
|
1605
|
-
spawn_model = excluded.spawn_model,
|
|
1606
|
-
result = excluded.result
|
|
1607
|
-
WHERE COALESCE(excluded.updated_at, '') > COALESCE(tasks.updated_at, '')`,
|
|
1602
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
1608
1603
|
args: [
|
|
1609
1604
|
sqlSafe(t.id),
|
|
1610
1605
|
sqlSafe(t.title),
|
|
@@ -2045,6 +2040,7 @@ async function cloudPullCoreMemory(config) {
|
|
|
2045
2040
|
}
|
|
2046
2041
|
|
|
2047
2042
|
export {
|
|
2043
|
+
shouldUseCrdtMergeForCloudSync,
|
|
2048
2044
|
loadPgClient,
|
|
2049
2045
|
disposeCloudSync,
|
|
2050
2046
|
pushToPostgres,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadLicense,
|
|
3
3
|
readCachedLicenseToken
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-MOZ2YQ54.js";
|
|
5
5
|
import {
|
|
6
6
|
EXE_AI_DIR,
|
|
7
7
|
loadConfig
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-VXIMSRTO.js";
|
|
9
9
|
|
|
10
10
|
// src/bin/exe-support.ts
|
|
11
11
|
import { mkdirSync, readFileSync, unlinkSync, writeFileSync } from "fs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MultiAgentOrchestrator
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CPXGLSIL.js";
|
|
4
4
|
import {
|
|
5
5
|
createQuietRenderer,
|
|
6
6
|
createTerminalRenderer,
|
|
@@ -206,7 +206,7 @@ function createExeOSHooks(config) {
|
|
|
206
206
|
);
|
|
207
207
|
}
|
|
208
208
|
try {
|
|
209
|
-
const { listBehaviors } = await import("./behaviors-
|
|
209
|
+
const { listBehaviors } = await import("./behaviors-BL3QCHBT.js");
|
|
210
210
|
const behaviors = await listBehaviors(config.agentId, config.projectName, 12);
|
|
211
211
|
if (behaviors.length > 0) {
|
|
212
212
|
process.stderr.write(
|
|
@@ -244,7 +244,7 @@ function createExeOSHooks(config) {
|
|
|
244
244
|
const ALLOWED_RE = /^(Bash|Edit|Write|Read|Glob|Grep|Agent|mcp__.*)$/;
|
|
245
245
|
if (!ALLOWED_RE.test(toolName)) return;
|
|
246
246
|
try {
|
|
247
|
-
const { extractSemanticText } = await import("./content-extractor-
|
|
247
|
+
const { extractSemanticText } = await import("./content-extractor-EYRVGD6O.js");
|
|
248
248
|
const { writeMemory } = await import("./lib/store.js");
|
|
249
249
|
const toolInput = block.input ?? {};
|
|
250
250
|
const toolResponse = result.isError ? { error: result.content } : { output: result.content };
|
|
@@ -327,7 +327,7 @@ function createExeOSHooks(config) {
|
|
|
327
327
|
async onSubagentStop(_reason) {
|
|
328
328
|
try {
|
|
329
329
|
const { getClient } = await import("./lib/database.js");
|
|
330
|
-
const { sessionScopeFilter } = await import("./task-scope-
|
|
330
|
+
const { sessionScopeFilter } = await import("./task-scope-R3XKBIHL.js");
|
|
331
331
|
const client = getClient();
|
|
332
332
|
const ehScope = sessionScopeFilter();
|
|
333
333
|
const tasks = await client.execute({
|
|
@@ -419,7 +419,7 @@ function createExeOSHooks(config) {
|
|
|
419
419
|
try {
|
|
420
420
|
const { writeMemory, flushBatch } = await import("./lib/store.js");
|
|
421
421
|
const { getClient } = await import("./lib/database.js");
|
|
422
|
-
const { sessionScopeFilter: cpScopeFilter } = await import("./task-scope-
|
|
422
|
+
const { sessionScopeFilter: cpScopeFilter } = await import("./task-scope-R3XKBIHL.js");
|
|
423
423
|
const client = getClient();
|
|
424
424
|
const cpScope = cpScopeFilter();
|
|
425
425
|
const tasks = await client.execute({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CEJO7244.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/memory-graph-extractor.ts
|
|
6
6
|
function entityId(type, name) {
|
|
@@ -247,7 +247,7 @@ async function upsertMemoryGraph(result, memoryId) {
|
|
|
247
247
|
});
|
|
248
248
|
}
|
|
249
249
|
try {
|
|
250
|
-
const { createCoOccurrenceEdges } = await import("./co-occurrence-
|
|
250
|
+
const { createCoOccurrenceEdges } = await import("./co-occurrence-QARWYUAY.js");
|
|
251
251
|
await createCoOccurrenceEdges(result.entities, memoryId);
|
|
252
252
|
} catch {
|
|
253
253
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ensureDaemonToken,
|
|
3
3
|
readDaemonToken
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-7IZWLMTP.js";
|
|
5
5
|
import {
|
|
6
6
|
requestRestart
|
|
7
7
|
} from "./chunk-PWMMIGVQ.js";
|
|
8
8
|
import {
|
|
9
9
|
EXE_AI_DIR
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-VXIMSRTO.js";
|
|
11
11
|
|
|
12
12
|
// src/lib/exe-daemon-client.ts
|
|
13
13
|
import net from "net";
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
import {
|
|
20
20
|
createCRMWebhookHandler,
|
|
21
21
|
parseTwentyWebhook
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-LQSFP2BV.js";
|
|
23
23
|
import {
|
|
24
24
|
OllamaProvider
|
|
25
25
|
} from "./chunk-FWFFZGSC.js";
|
|
@@ -49,7 +49,7 @@ import {
|
|
|
49
49
|
retryWithBackoff,
|
|
50
50
|
routeMessage,
|
|
51
51
|
validateGatewayConfig
|
|
52
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-NRVV4Y5V.js";
|
|
53
53
|
import {
|
|
54
54
|
getAccountByName,
|
|
55
55
|
getAccountByPhoneNumberId,
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// src/bin/vps-health-gate.ts
|
|
2
|
+
import { spawnSync } from "child_process";
|
|
3
|
+
import { appendFileSync, existsSync, mkdirSync, readdirSync } from "fs";
|
|
4
|
+
import http from "http";
|
|
5
|
+
import path from "path";
|
|
6
|
+
var DEPLOY_LOG = "/opt/exe-stack/deploy-log.jsonl";
|
|
7
|
+
var BACKUP_DIR = "/opt/exe-stack/backups";
|
|
8
|
+
async function checkCRM() {
|
|
9
|
+
const start = Date.now();
|
|
10
|
+
try {
|
|
11
|
+
const status = await httpGet("http://localhost:3000/api");
|
|
12
|
+
return {
|
|
13
|
+
check: "crm",
|
|
14
|
+
status: status >= 200 && status < 400 ? "pass" : "fail",
|
|
15
|
+
message: status >= 200 && status < 400 ? `CRM healthy (HTTP ${status})` : `CRM unhealthy (HTTP ${status})`,
|
|
16
|
+
durationMs: Date.now() - start
|
|
17
|
+
};
|
|
18
|
+
} catch (err) {
|
|
19
|
+
return {
|
|
20
|
+
check: "crm",
|
|
21
|
+
status: "fail",
|
|
22
|
+
message: `CRM unreachable: ${err instanceof Error ? err.message : err}`,
|
|
23
|
+
durationMs: Date.now() - start
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function checkGateway() {
|
|
28
|
+
const start = Date.now();
|
|
29
|
+
try {
|
|
30
|
+
const status = await httpGet("http://localhost:3100/health");
|
|
31
|
+
return {
|
|
32
|
+
check: "gateway",
|
|
33
|
+
status: status >= 200 && status < 300 ? "pass" : "fail",
|
|
34
|
+
message: status >= 200 && status < 300 ? `Gateway healthy (HTTP ${status})` : `Gateway unhealthy (HTTP ${status})`,
|
|
35
|
+
durationMs: Date.now() - start
|
|
36
|
+
};
|
|
37
|
+
} catch (err) {
|
|
38
|
+
return {
|
|
39
|
+
check: "gateway",
|
|
40
|
+
status: "fail",
|
|
41
|
+
message: `Gateway unreachable: ${err instanceof Error ? err.message : err}`,
|
|
42
|
+
durationMs: Date.now() - start
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function checkPostgres() {
|
|
47
|
+
const start = Date.now();
|
|
48
|
+
const databaseUrl = process.env.DATABASE_URL || "postgres://exe@localhost:5432/exedb";
|
|
49
|
+
const result = spawnSync("psql", [databaseUrl, "-c", "SELECT 1"], {
|
|
50
|
+
encoding: "utf8",
|
|
51
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
52
|
+
timeout: 1e4
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
check: "postgres",
|
|
56
|
+
status: result.status === 0 ? "pass" : "fail",
|
|
57
|
+
message: result.status === 0 ? "Postgres responding" : `Postgres failed: ${result.stderr?.trim() || `exit ${result.status}`}`,
|
|
58
|
+
durationMs: Date.now() - start
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function checkRawEvents() {
|
|
62
|
+
const start = Date.now();
|
|
63
|
+
const databaseUrl = process.env.DATABASE_URL || "postgres://exe@localhost:5432/exedb";
|
|
64
|
+
const result = spawnSync(
|
|
65
|
+
"psql",
|
|
66
|
+
[databaseUrl, "-t", "-c", "SELECT count(*) FROM raw.raw_events"],
|
|
67
|
+
{
|
|
68
|
+
encoding: "utf8",
|
|
69
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
70
|
+
timeout: 1e4
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
if (result.status !== 0) {
|
|
74
|
+
return {
|
|
75
|
+
check: "raw_events",
|
|
76
|
+
status: "fail",
|
|
77
|
+
message: `raw.raw_events query failed: ${result.stderr?.trim() || `exit ${result.status}`}`,
|
|
78
|
+
durationMs: Date.now() - start
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const count = parseInt(result.stdout?.trim() || "0", 10);
|
|
82
|
+
return {
|
|
83
|
+
check: "raw_events",
|
|
84
|
+
status: count > 0 ? "pass" : "fail",
|
|
85
|
+
message: count > 0 ? `raw.raw_events has ${count} rows` : "raw.raw_events is empty",
|
|
86
|
+
durationMs: Date.now() - start
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async function checkGoTrue() {
|
|
90
|
+
const start = Date.now();
|
|
91
|
+
try {
|
|
92
|
+
const status = await httpGet("http://localhost:9999/health");
|
|
93
|
+
return {
|
|
94
|
+
check: "gotrue",
|
|
95
|
+
status: status >= 200 && status < 300 ? "pass" : "fail",
|
|
96
|
+
message: status >= 200 && status < 300 ? `GoTrue healthy (HTTP ${status})` : `GoTrue unhealthy (HTTP ${status})`,
|
|
97
|
+
durationMs: Date.now() - start
|
|
98
|
+
};
|
|
99
|
+
} catch (err) {
|
|
100
|
+
return {
|
|
101
|
+
check: "gotrue",
|
|
102
|
+
status: "fail",
|
|
103
|
+
message: `GoTrue unreachable: ${err instanceof Error ? err.message : err}`,
|
|
104
|
+
durationMs: Date.now() - start
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function runHealthGate() {
|
|
109
|
+
console.log("[health-gate] Running post-deploy health checks...\n");
|
|
110
|
+
const results = [];
|
|
111
|
+
results.push(checkPostgres());
|
|
112
|
+
results.push(checkRawEvents());
|
|
113
|
+
results.push(await checkCRM());
|
|
114
|
+
results.push(await checkGateway());
|
|
115
|
+
results.push(await checkGoTrue());
|
|
116
|
+
const passed = results.every((r) => r.status === "pass");
|
|
117
|
+
for (const r of results) {
|
|
118
|
+
const icon = r.status === "pass" ? "\u2713" : "\u2717";
|
|
119
|
+
const color = r.status === "pass" ? "\x1B[32m" : "\x1B[31m";
|
|
120
|
+
console.log(` ${color}${icon}\x1B[0m ${r.check.padEnd(12)} ${r.message} (${r.durationMs}ms)`);
|
|
121
|
+
}
|
|
122
|
+
console.log("");
|
|
123
|
+
const result = {
|
|
124
|
+
passed,
|
|
125
|
+
results,
|
|
126
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
127
|
+
};
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
function logResult(result) {
|
|
131
|
+
mkdirSync(path.dirname(DEPLOY_LOG), { recursive: true });
|
|
132
|
+
const line = JSON.stringify({
|
|
133
|
+
...result,
|
|
134
|
+
type: "health_gate"
|
|
135
|
+
}) + "\n";
|
|
136
|
+
try {
|
|
137
|
+
appendFileSync(DEPLOY_LOG, line);
|
|
138
|
+
console.log(`[health-gate] Result logged to ${DEPLOY_LOG}`);
|
|
139
|
+
} catch (err) {
|
|
140
|
+
console.warn(`[health-gate] Failed to write deploy log: ${err instanceof Error ? err.message : err}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function restorePreDeployBackup() {
|
|
144
|
+
if (!existsSync(BACKUP_DIR)) return false;
|
|
145
|
+
const backups = readdirSync(BACKUP_DIR).filter((f) => f.startsWith("pg-pre-deploy-") && f.endsWith(".dump")).sort().reverse();
|
|
146
|
+
if (backups.length === 0) {
|
|
147
|
+
console.warn("[health-gate] No pre-deploy backup found to restore");
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
const latest = backups[0];
|
|
151
|
+
const filepath = path.join(BACKUP_DIR, latest);
|
|
152
|
+
const databaseUrl = process.env.DATABASE_URL || "postgres://exe@localhost:5432/exedb";
|
|
153
|
+
console.log(`[health-gate] Restoring pre-deploy backup: ${latest}`);
|
|
154
|
+
const result = spawnSync("pg_restore", ["-d", databaseUrl, "--clean", "--if-exists", filepath], {
|
|
155
|
+
encoding: "utf8",
|
|
156
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
157
|
+
timeout: 3e5
|
|
158
|
+
});
|
|
159
|
+
if (result.status !== 0) {
|
|
160
|
+
console.error(`[health-gate] pg_restore failed: ${result.stderr?.trim() || `exit ${result.status}`}`);
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
console.log("[health-gate] \u2713 Pre-deploy backup restored");
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
function httpGet(url) {
|
|
167
|
+
return new Promise((resolve, reject) => {
|
|
168
|
+
const req = http.request(url, { method: "GET", timeout: 1e4 }, (res) => {
|
|
169
|
+
res.resume();
|
|
170
|
+
resolve(res.statusCode ?? 0);
|
|
171
|
+
});
|
|
172
|
+
req.on("timeout", () => req.destroy(new Error("timeout")));
|
|
173
|
+
req.on("error", reject);
|
|
174
|
+
req.end();
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
async function main(args) {
|
|
178
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
179
|
+
console.log(`
|
|
180
|
+
exe-os vps-health-gate \u2014 Post-deploy health checks
|
|
181
|
+
|
|
182
|
+
Runs 5 checks: Postgres, raw_events, CRM, Gateway, GoTrue.
|
|
183
|
+
If any check fails, triggers rollback and exits with code 1.
|
|
184
|
+
|
|
185
|
+
Usage:
|
|
186
|
+
exe-os vps-health-gate Run health gate
|
|
187
|
+
exe-os vps-health-gate --check-only Run checks without rollback on failure
|
|
188
|
+
`);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const checkOnly = args.includes("--check-only");
|
|
192
|
+
const result = await runHealthGate();
|
|
193
|
+
logResult(result);
|
|
194
|
+
if (result.passed) {
|
|
195
|
+
console.log("[health-gate] \u2713 All checks passed \u2014 deploy is healthy");
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const failed = result.results.filter((r) => r.status === "fail");
|
|
199
|
+
console.error(`[health-gate] \u2717 ${failed.length} check(s) failed`);
|
|
200
|
+
if (checkOnly) {
|
|
201
|
+
process.exitCode = 1;
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
console.log("[health-gate] Starting rollback...");
|
|
205
|
+
restorePreDeployBackup();
|
|
206
|
+
try {
|
|
207
|
+
const { rollbackStackUpdate, defaultStackPaths } = await import("./stack-update-JIWJGGLX.js");
|
|
208
|
+
const paths = defaultStackPaths();
|
|
209
|
+
await rollbackStackUpdate({
|
|
210
|
+
manifestRef: paths.manifestRef,
|
|
211
|
+
composeFile: paths.composeFile,
|
|
212
|
+
envFile: paths.envFile
|
|
213
|
+
});
|
|
214
|
+
console.log("[health-gate] \u2713 Stack rolled back to previous version");
|
|
215
|
+
} catch (err) {
|
|
216
|
+
console.error(`[health-gate] Stack rollback failed: ${err instanceof Error ? err.message : err}`);
|
|
217
|
+
}
|
|
218
|
+
process.exitCode = 1;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export {
|
|
222
|
+
checkCRM,
|
|
223
|
+
checkGateway,
|
|
224
|
+
checkPostgres,
|
|
225
|
+
checkRawEvents,
|
|
226
|
+
checkGoTrue,
|
|
227
|
+
runHealthGate,
|
|
228
|
+
logResult,
|
|
229
|
+
main
|
|
230
|
+
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
recordSessionKill
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VRIMTCX2.js";
|
|
4
4
|
import {
|
|
5
5
|
updateTask
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-NBY6R37W.js";
|
|
7
7
|
import {
|
|
8
8
|
ensureEmployee,
|
|
9
9
|
extractRootExe,
|
|
@@ -14,13 +14,13 @@ import {
|
|
|
14
14
|
sessionScopeFilter,
|
|
15
15
|
strictSessionScopeFilter,
|
|
16
16
|
writeNotification
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-F7JLZXHC.js";
|
|
18
18
|
import {
|
|
19
19
|
queueIntercom
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-5CHYEKMH.js";
|
|
21
21
|
import {
|
|
22
22
|
listSessions
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-GHEWRYMY.js";
|
|
24
24
|
import {
|
|
25
25
|
getTransport
|
|
26
26
|
} from "./chunk-MVW62NIZ.js";
|
|
@@ -30,18 +30,18 @@ import {
|
|
|
30
30
|
} from "./chunk-CX6GL3ZJ.js";
|
|
31
31
|
import {
|
|
32
32
|
recordOrchestrationEventBestEffort
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-HCBMPZDT.js";
|
|
34
34
|
import {
|
|
35
35
|
getAgentRuntime
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-XJUUWHVN.js";
|
|
37
37
|
import {
|
|
38
38
|
baseAgentName,
|
|
39
39
|
isCoordinatorName,
|
|
40
40
|
shouldAutoInstance
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-CEJO7244.js";
|
|
42
42
|
import {
|
|
43
43
|
loadConfigSync
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-VXIMSRTO.js";
|
|
45
45
|
|
|
46
46
|
// src/lib/daemon-orchestration.ts
|
|
47
47
|
import { execSync } from "child_process";
|
|
@@ -473,7 +473,7 @@ function createReviewNudgeRealDeps(_getClient) {
|
|
|
473
473
|
return Number(rows[0]?.cnt ?? 0);
|
|
474
474
|
},
|
|
475
475
|
sendNudge: (sessionName) => {
|
|
476
|
-
queueIntercom(sessionName, "review nudge: pending reviews");
|
|
476
|
+
queueIntercom(sessionName, "review nudge: pending reviews", "completion");
|
|
477
477
|
},
|
|
478
478
|
persistState: saveNudgeState
|
|
479
479
|
};
|
|
@@ -666,7 +666,8 @@ function shouldAutoWake(input) {
|
|
|
666
666
|
return true;
|
|
667
667
|
}
|
|
668
668
|
async function pollOrphanedTasks(deps, nowMs = Date.now()) {
|
|
669
|
-
const
|
|
669
|
+
const checkGate = deps.checkGate ?? checkAutoWakeGates;
|
|
670
|
+
const globalGate = checkGate("__global__", nowMs);
|
|
670
671
|
if (globalGate) {
|
|
671
672
|
process.stderr.write(`[auto-wake] GLOBAL GATE BLOCKED: ${globalGate} \u2014 skipping all spawns
|
|
672
673
|
`);
|
|
@@ -762,7 +763,7 @@ async function pollOrphanedTasks(deps, nowMs = Date.now()) {
|
|
|
762
763
|
}
|
|
763
764
|
continue;
|
|
764
765
|
}
|
|
765
|
-
const agentGate =
|
|
766
|
+
const agentGate = checkGate(key, nowMs);
|
|
766
767
|
if (agentGate) {
|
|
767
768
|
process.stderr.write(`[auto-wake] AGENT GATE BLOCKED: ${agentId} \u2014 ${agentGate}
|
|
768
769
|
`);
|
|
@@ -874,7 +875,7 @@ async function releaseStuckTasks(deps, nowMs = Date.now()) {
|
|
|
874
875
|
}
|
|
875
876
|
if (deps.notifyOrphan) {
|
|
876
877
|
try {
|
|
877
|
-
await deps.notifyOrphan(t.taskId, t.agentId);
|
|
878
|
+
await deps.notifyOrphan(t.taskId, t.agentId, t.sessionScope);
|
|
878
879
|
} catch {
|
|
879
880
|
}
|
|
880
881
|
}
|
|
@@ -887,7 +888,7 @@ async function releaseStuckTasks(deps, nowMs = Date.now()) {
|
|
|
887
888
|
);
|
|
888
889
|
if (deps.notifyOrphan) {
|
|
889
890
|
try {
|
|
890
|
-
await deps.notifyOrphan(t.taskId, t.agentId);
|
|
891
|
+
await deps.notifyOrphan(t.taskId, t.agentId, t.sessionScope);
|
|
891
892
|
} catch {
|
|
892
893
|
}
|
|
893
894
|
}
|
|
@@ -937,13 +938,14 @@ function createStuckTaskRealDeps(getClient) {
|
|
|
937
938
|
const agentPart = sessionName.split("-")[0];
|
|
938
939
|
return baseAgentName(agentPart);
|
|
939
940
|
},
|
|
940
|
-
notifyOrphan: async (taskId, agentId) => {
|
|
941
|
+
notifyOrphan: async (taskId, agentId, sessionScope) => {
|
|
941
942
|
await writeNotification({
|
|
942
943
|
agentId,
|
|
943
944
|
agentRole: "employee",
|
|
944
945
|
event: "orphan_task",
|
|
945
946
|
project: "",
|
|
946
|
-
summary: `Agent "${agentId}" session died \u2014 task ${taskId.slice(0, 8)} needs review (auto-closed: session ended without completion)
|
|
947
|
+
summary: `Agent "${agentId}" session died \u2014 task ${taskId.slice(0, 8)} needs review (auto-closed: session ended without completion)`,
|
|
948
|
+
sessionScope: sessionScope ?? void 0
|
|
947
949
|
});
|
|
948
950
|
}
|
|
949
951
|
};
|
|
@@ -1655,7 +1657,7 @@ async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
|
|
|
1655
1657
|
}
|
|
1656
1658
|
async function createWorktreeReaperRealDeps() {
|
|
1657
1659
|
const { getPaneCwdAsync } = await import("./lib/tmux-status.js");
|
|
1658
|
-
const { getGitRoot, isWorktreeDirty: isDirty } = await import("./worktree-
|
|
1660
|
+
const { getGitRoot, isWorktreeDirty: isDirty } = await import("./worktree-RICSCT2S.js");
|
|
1659
1661
|
const { statSync: statSync2 } = await import("fs");
|
|
1660
1662
|
const { basename } = await import("path");
|
|
1661
1663
|
const { promisify } = await import("util");
|
|
@@ -1796,7 +1798,7 @@ async function gcStaleCheckpoints() {
|
|
|
1796
1798
|
}
|
|
1797
1799
|
async function pollTaskGroupBarriers() {
|
|
1798
1800
|
try {
|
|
1799
|
-
const { checkAndFireBarriers } = await import("./tasks-crud-
|
|
1801
|
+
const { checkAndFireBarriers } = await import("./tasks-crud-DQOG2NPG.js");
|
|
1800
1802
|
const firedGroupIds = await checkAndFireBarriers();
|
|
1801
1803
|
if (firedGroupIds.length === 0) return 0;
|
|
1802
1804
|
const { getClient } = await import("./lib/database.js");
|
|
@@ -7,10 +7,10 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
connectEmbedDaemon,
|
|
9
9
|
embedBatchViaClient
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-RRHSONV5.js";
|
|
11
11
|
import {
|
|
12
12
|
EXE_AI_DIR
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-VXIMSRTO.js";
|
|
14
14
|
|
|
15
15
|
// src/lib/code-context-index.ts
|
|
16
16
|
import crypto from "crypto";
|