@askexenow/exe-os 0.9.238 → 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 +165 -9
- package/dist/{active-agent-X3GALNAR.js → active-agent-KO4ZWDXE.js} +4 -4
- package/dist/{active-agent-6WX7GZBH.js → active-agent-KP2O52HA.js} +4 -4
- package/dist/{agentic-ontology-NBU3FHEX.js → agentic-ontology-DXE5J6I5.js} +1 -1
- package/dist/{backfill-metadata-NG2L5GUP.js → backfill-metadata-DFTIGPXP.js} +7 -7
- package/dist/{background-jobs-RWL46VRD.js → background-jobs-CRXY7T4Y.js} +2 -2
- package/dist/{behaviors-DH7XFONJ.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-KAKNWAA4.js → capacity-monitor-4CSBC7AP.js} +14 -14
- package/dist/{catchup-brief-ZB2OR45O.js → catchup-brief-LF5Z6Q6E.js} +17 -17
- package/dist/{chunk-NQU2RTCP.js → chunk-222SI7QC.js} +14 -14
- package/dist/{chunk-JZMVLAZ2.js → chunk-2WBBVEIB.js} +1 -1
- package/dist/{chunk-Q4MZN62R.js → chunk-3V53HH5T.js} +4 -4
- package/dist/{chunk-ES5JM6V2.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-MPG2FFQS.js → chunk-5JIG2FP2.js} +1 -1
- package/dist/{chunk-UWQ3XCDG.js → chunk-5WK7X5CF.js} +2 -2
- package/dist/{chunk-NS7FW3NG.js → chunk-6JAGJN77.js} +2 -2
- package/dist/{chunk-NCJNGQUZ.js → chunk-73UE2PHT.js} +1 -1
- package/dist/{chunk-JL3K5OTS.js → chunk-7IZWLMTP.js} +1 -1
- package/dist/{chunk-FQJWTRCB.js → chunk-A4K2ZT6N.js} +4 -4
- package/dist/{chunk-EAIZLNLP.js → chunk-AHXEU5XB.js} +1 -1
- package/dist/{chunk-NNEYTOUS.js → chunk-AWRL5FGM.js} +19 -78
- package/dist/{chunk-JBMZS5WO.js → chunk-BSPOEYAO.js} +1 -1
- package/dist/{chunk-M5TK7JET.js → chunk-CBDPEJOR.js} +5 -5
- package/dist/{chunk-2LYJTK47.js → chunk-CEJO7244.js} +2 -2
- package/dist/{chunk-JLHSEBNQ.js → chunk-CPXGLSIL.js} +3 -3
- package/dist/{chunk-WQXJIMBO.js → chunk-CWITU7DW.js} +2 -2
- package/dist/{chunk-T3ASODFG.js → chunk-DGBGIXCC.js} +4 -4
- package/dist/{chunk-U3XMIHPD.js → chunk-DLZYAYVM.js} +60 -14
- package/dist/{chunk-XCGJPZ6H.js → chunk-DR5BGWFR.js} +2 -2
- package/dist/{chunk-BZWKTFEB.js → chunk-ENVRFBTB.js} +2 -2
- package/dist/{chunk-KRLR26L2.js → chunk-F3GM6OOP.js} +4 -4
- package/dist/{chunk-ENWFSMOS.js → chunk-F7JLZXHC.js} +60 -26
- package/dist/{chunk-COMWI7SO.js → chunk-FFLILAG6.js} +1 -1
- package/dist/{chunk-NJS4GRIR.js → chunk-GHEWRYMY.js} +18 -2
- package/dist/{chunk-7PVUUC3O.js → chunk-GHT4REOS.js} +5 -5
- package/dist/{chunk-YDG343II.js → chunk-HANG6NLF.js} +4 -6
- package/dist/{chunk-2O5GJFYQ.js → chunk-HCBMPZDT.js} +1 -1
- package/dist/chunk-HOGTZLVU.js +244 -0
- package/dist/{chunk-LXP6VRFH.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-IAPFFVYR.js → chunk-IZVKWBIP.js} +1 -1
- package/dist/{chunk-HFYCKIVJ.js → chunk-J7V7LPPX.js} +2 -2
- package/dist/{chunk-YUQ7GGAL.js → chunk-JLKUVK5J.js} +1 -1
- package/dist/{chunk-WQCSGDRG.js → chunk-JLNXKG3K.js} +1 -1
- package/dist/{chunk-ZZBOV6WA.js → chunk-K2BDE2B5.js} +4 -4
- package/dist/{chunk-KDJRFJDL.js → chunk-K333WOW4.js} +30 -2
- package/dist/{chunk-LUCHTCME.js → chunk-KEZXW3RP.js} +1 -1
- package/dist/{chunk-GXU3XRI5.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-UISUGXJU.js → chunk-LAOB5BKV.js} +2 -2
- package/dist/{chunk-2VXHPSIJ.js → chunk-LQSFP2BV.js} +1 -1
- package/dist/{chunk-AYBC6AYP.js → chunk-LSFHEMVI.js} +9 -9
- package/dist/{chunk-IQNT6KAE.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-VK5IBXXT.js → chunk-NBY6R37W.js} +61 -232
- package/dist/{chunk-RXGTA6YQ.js → chunk-NEYQAEYU.js} +7 -7
- package/dist/{chunk-MBHZDXGN.js → chunk-NL35XNLI.js} +1 -1
- package/dist/{chunk-IDCJNL7C.js → chunk-NLGMHPEN.js} +1 -1
- package/dist/{chunk-N4IJWOIS.js → chunk-NRVV4Y5V.js} +4 -4
- package/dist/{chunk-PQBANSH6.js → chunk-NVZR7T4E.js} +1 -1
- package/dist/{chunk-BJOU5MBY.js → chunk-NWBHL5PI.js} +1 -1
- package/dist/{chunk-VEU6LVBR.js → chunk-OEMX65EA.js} +1 -1
- package/dist/{chunk-JHFXCYZP.js → chunk-ONAQAL3O.js} +1 -1
- package/dist/{chunk-NBV23TC4.js → chunk-OWQ3CCYJ.js} +12 -13
- package/dist/{chunk-4HMKJDPB.js → chunk-PI6V23GF.js} +5 -4
- package/dist/{chunk-CJEVAKKC.js → chunk-Q2OAQPWY.js} +1 -1
- package/dist/{chunk-C7BVANSU.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-YUS7IS3I.js → chunk-QUNKPR6Y.js} +5 -5
- package/dist/{chunk-3NYRIK73.js → chunk-QUZVAHO7.js} +2 -2
- package/dist/{chunk-VHKL4S4T.js → chunk-RRHSONV5.js} +2 -2
- package/dist/{chunk-HUVSY6NF.js → chunk-RYDHEWYY.js} +2 -2
- package/dist/{chunk-QQFZID36.js → chunk-U7WOVXBB.js} +2 -2
- package/dist/chunk-UIRWDGMB.js +230 -0
- package/dist/{chunk-3JVO6X4W.js → chunk-V2GZMY6O.js} +1 -1
- package/dist/{chunk-JBUHOWIV.js → chunk-VHALWCUO.js} +1 -1
- package/dist/{chunk-7LIXU3TB.js → chunk-VQAP35DA.js} +20 -18
- package/dist/{chunk-5KDROSDV.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-BTPXNV5W.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-YENDNLAD.js → chunk-YMZHTTOQ.js} +1 -1
- package/dist/{chunk-EPLBVWIM.js → chunk-YRVW57UW.js} +139 -125
- package/dist/{chunk-BRFH5X7G.js → chunk-Z7VDUS6L.js} +1 -1
- package/dist/{chunk-G67R75DG.js → chunk-ZKFPHJIJ.js} +1 -1
- package/dist/{chunk-RM6PJ34R.js → chunk-ZVXJSQOR.js} +1 -1
- package/dist/{co-activation-OCQPRJ2I.js → co-activation-L6I2LSJO.js} +3 -3
- package/dist/{co-occurrence-S62AC2BR.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-VS254UOH.js → crdt-sync-R6YROKDH.js} +1 -1
- package/dist/{crm-webhook-CST5WBNY.js → crm-webhook-WK3PYJJK.js} +2 -2
- package/dist/{cto-delegation-gate-2PY563OA.js → cto-delegation-gate-5JZORQIT.js} +12 -12
- package/dist/{daemon-auth-2IZACWSG.js → daemon-auth-2HEOL6VG.js} +2 -2
- package/dist/{daemon-orchestration-P34RDHTM.js → daemon-orchestration-BJ3T5MMF.js} +16 -15
- package/dist/{db-backup-JEHRFLYW.js → db-backup-EWS52P2W.js} +2 -2
- package/dist/{dreaming-UF4LPNLV.js → dreaming-BOSBDRI3.js} +13 -13
- package/dist/{entity-boost-T5IYWWDZ.js → entity-boost-6ZVX7DFB.js} +26 -2
- package/dist/{exe-drift-DOWP33NY.js → exe-drift-WRE6RADZ.js} +4 -4
- package/dist/{exe-export-QCB5UOXQ.js → exe-export-7N5PBCMK.js} +8 -8
- package/dist/{exe-import-JHFIXRB5.js → exe-import-YOOE7S3H.js} +8 -8
- package/dist/{exe-key-ZVKBTZVI.js → exe-key-GXJSTCX2.js} +4 -4
- package/dist/{exe-org-3FNET2J7.js → exe-org-42YMQL75.js} +2 -2
- package/dist/{exe-snapshot-LBM3LL3I.js → exe-snapshot-ODUCFW7G.js} +18 -18
- package/dist/{fast-db-init-PTUUO2IO.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-5SFBUMPC.js → git-staleness-BJDTCDPC.js} +3 -3
- package/dist/{git-task-sweep-XMK5IQXK.js → git-task-sweep-L3U3T5HM.js} +13 -13
- package/dist/{global-procedures-W4U257TI.js → global-procedures-HCHEHKY2.js} +4 -4
- package/dist/{graph-auto-extract-5ZD4AUSB.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-2HULECDJ.js → installer-AWMUCRN4.js} +7 -7
- package/dist/{installer-BCOJG2SE.js → installer-HB3NH6FG.js} +9 -9
- package/dist/{installer-N5XZAFE4.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 +5 -5
- 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 +109 -75
- 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-RTXPLRH5.js → mcp-http-config-XIJR5P2Z.js} +4 -4
- package/dist/{memory-cards-3FBGRV6J.js → memory-cards-H4BJJ5OK.js} +3 -3
- package/dist/{memory-graph-extractor-5D3FU5N5.js → memory-graph-extractor-SDGM3GVR.js} +4 -4
- package/dist/{memory-poisoning-defense-P6GL2RMF.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-5CVV2M3G.js → memory-reflection-GGB5K35L.js} +3 -3
- package/dist/{notifications-NV54INLG.js → notifications-P3XQZDTH.js} +12 -12
- package/dist/{orchestration-events-TEYCD6GO.js → orchestration-events-25WEKUKH.js} +4 -4
- package/dist/{orchestration-phase-SGA7PJ5G.js → orchestration-phase-C26XVKLZ.js} +2 -2
- package/dist/{orchestrator-JCNHGP6M.js → orchestrator-VIXTY4E4.js} +14 -14
- package/dist/{pipeline-router-IX635D3U.js → pipeline-router-S5PE5U6B.js} +4 -4
- package/dist/{plan-limits-H65VL6LC.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-JMGAPKH6.js → projection-worker-GG2W5OM3.js} +3 -3
- package/dist/{push-notifications-E2XXEWJZ.js → push-notifications-AMHVR6DF.js} +2 -2
- package/dist/{reranker-T4A2M7K2.js → reranker-UCPLQZE2.js} +2 -2
- package/dist/{review-polling-SAQ24T6L.js → review-polling-P2MWEXLR.js} +13 -13
- package/dist/runtime/index.js +15 -15
- package/dist/{session-events-JNUK47KH.js → session-events-5CD66R6U.js} +13 -13
- package/dist/{session-kill-telemetry-GLCDARKV.js → session-kill-telemetry-7FBHTEDN.js} +4 -4
- package/dist/{session-scope-UR7OFFOB.js → session-scope-VMIPAZU7.js} +12 -12
- package/dist/{setup-wizard-GQYG36KS.js → setup-wizard-BNR47URR.js} +3 -3
- package/dist/{shard-manager-G6MHCO7X.js → shard-manager-VGA2TYHM.js} +2 -2
- package/dist/{skill-refinement-WWWFGTUS.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-TAD7GEVL.js → steward-gate-L7DJMF4C.js} +4 -4
- package/dist/{task-enforcement-2LI5KWFE.js → task-enforcement-XQL77PZH.js} +52 -12
- package/dist/{task-scope-AYK6BVC7.js → task-scope-R3XKBIHL.js} +12 -12
- package/dist/{tasks-crud-OD75EH2G.js → tasks-crud-DQOG2NPG.js} +12 -12
- package/dist/tasks-notify-4EQYG52H.js +37 -0
- package/dist/{tasks-review-CC2EGWBL.js → tasks-review-XPFJ4DSJ.js} +12 -12
- package/dist/{telemetry-upload-H6BU6QF7.js → telemetry-upload-OT5B5HUY.js} +7 -7
- package/dist/{token-budget-6TK55BBU.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-E7NWXX5R.js → tool-telemetry-QIF5BCLF.js} +1 -1
- package/dist/tui/App.js +26 -26
- package/dist/{tui-data-ROOXTJQ5.js → tui-data-UEV2QOR3.js} +108 -12
- package/dist/{whatsapp-config-W63RQ3AU.js → whatsapp-config-GOSELKTE.js} +7 -0
- package/dist/{worker-gate-MOQZ2D34.js → worker-gate-PRCKA23W.js} +2 -2
- package/dist/{workflow-engine-4MQJI5F2.js → workflow-engine-7X6LLH3M.js} +2 -2
- package/dist/{worktree-K2GDO4QX.js → worktree-RICSCT2S.js} +5 -5
- package/package.json +1 -1
- package/release-notes.json +144 -304
- package/stack.release.json +4 -3
- package/dist/preflight-EAH2MI76.js +0 -287
- /package/dist/{chunk-P2JDWX67.js → chunk-AQBEG33D.js} +0 -0
- /package/dist/{chunk-A4TPCHMA.js → chunk-B7JGEDVE.js} +0 -0
- /package/dist/{chunk-RX2KGETT.js → chunk-JXI4XUTV.js} +0 -0
- /package/dist/{chunk-SNYDRHV3.js → chunk-U3DUFHOT.js} +0 -0
- /package/dist/{chunk-YGJTKLGM.js → chunk-VBPC7IC7.js} +0 -0
- /package/dist/{chunk-HTUJBTBM.js → chunk-VUS6WXQ3.js} +0 -0
- /package/dist/{chunk-HFF6YG7R.js → chunk-XAYRZHLV.js} +0 -0
- /package/dist/{core-memory-67AVQ3Z7.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-AR7RIMRY.js → wiki-acl-MFLSS6DE.js} +0 -0
- /package/dist/{wiki-client-MAFYBXCQ.js → wiki-client-GBPR45BQ.js} +0 -0
package/dist/bin/stack-update.js
CHANGED
|
@@ -10,9 +10,19 @@ import {
|
|
|
10
10
|
loadStackManifest,
|
|
11
11
|
patchEnv,
|
|
12
12
|
runStackUpdate
|
|
13
|
-
} from "../chunk-
|
|
14
|
-
import
|
|
15
|
-
|
|
13
|
+
} from "../chunk-ITZVPCBQ.js";
|
|
14
|
+
import {
|
|
15
|
+
runVerifyStack
|
|
16
|
+
} from "../chunk-IRHNV4GY.js";
|
|
17
|
+
import {
|
|
18
|
+
preDeployBackup
|
|
19
|
+
} from "../chunk-5DMAMQNU.js";
|
|
20
|
+
import {
|
|
21
|
+
logResult,
|
|
22
|
+
runHealthGate
|
|
23
|
+
} from "../chunk-UIRWDGMB.js";
|
|
24
|
+
import "../chunk-MOZ2YQ54.js";
|
|
25
|
+
import "../chunk-VXIMSRTO.js";
|
|
16
26
|
import "../chunk-LYH5HE24.js";
|
|
17
27
|
import {
|
|
18
28
|
isMainModule
|
|
@@ -20,10 +30,304 @@ import {
|
|
|
20
30
|
import "../chunk-MLKGABMK.js";
|
|
21
31
|
|
|
22
32
|
// src/bin/stack-update.ts
|
|
23
|
-
import { readFileSync } from "fs";
|
|
33
|
+
import { readFileSync as readFileSync2 } from "fs";
|
|
34
|
+
import { spawnSync as spawnSync2 } from "child_process";
|
|
35
|
+
import path2 from "path";
|
|
36
|
+
import { existsSync as existsSync2 } from "fs";
|
|
37
|
+
|
|
38
|
+
// src/bin/preflight.ts
|
|
39
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
24
40
|
import { spawnSync } from "child_process";
|
|
25
41
|
import path from "path";
|
|
26
|
-
|
|
42
|
+
var REQUIRED_ENV_VARS = [
|
|
43
|
+
"POSTGRES_USER",
|
|
44
|
+
"POSTGRES_PASSWORD",
|
|
45
|
+
"POSTGRES_DB",
|
|
46
|
+
"GOTRUE_JWT_SECRET",
|
|
47
|
+
"EXE_LICENSE_KEY",
|
|
48
|
+
"EXED_MCP_TOKEN",
|
|
49
|
+
"EXE_GATEWAY_AUTH_TOKEN",
|
|
50
|
+
"EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN",
|
|
51
|
+
"WIKI_AUTH_TOKEN",
|
|
52
|
+
"WIKI_JWT_SECRET",
|
|
53
|
+
"WIKI_SIG_KEY",
|
|
54
|
+
"WIKI_SIG_SALT",
|
|
55
|
+
"REDIS_PASSWORD",
|
|
56
|
+
"CLICKHOUSE_PASSWORD",
|
|
57
|
+
"CRM_APP_SECRET"
|
|
58
|
+
];
|
|
59
|
+
var CONDITIONAL_ENV_VARS = [
|
|
60
|
+
{
|
|
61
|
+
key: "ANTHROPIC_API_KEY",
|
|
62
|
+
condition: (env) => env.get("BYOK_ENABLED") === "true",
|
|
63
|
+
reason: "BYOK_ENABLED=true requires ANTHROPIC_API_KEY"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
key: "API_ROUTER_URL",
|
|
67
|
+
condition: (env) => env.get("BYOK_ENABLED") !== "true",
|
|
68
|
+
reason: "API Router mode (BYOK_ENABLED!=true) requires API_ROUTER_URL"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
key: "API_ROUTER_KEY",
|
|
72
|
+
condition: (env) => env.get("BYOK_ENABLED") !== "true",
|
|
73
|
+
reason: "API Router mode (BYOK_ENABLED!=true) requires API_ROUTER_KEY"
|
|
74
|
+
}
|
|
75
|
+
];
|
|
76
|
+
var VOLUME_REQUIREMENTS = [
|
|
77
|
+
{ service: "exe-db", description: "PostgreSQL data" },
|
|
78
|
+
{ service: "redis", description: "Redis AOF/RDB" },
|
|
79
|
+
{ service: "exe-gateway", description: "Baileys WhatsApp auth state" },
|
|
80
|
+
{ service: "exe-wiki", description: "Wiki document storage" },
|
|
81
|
+
{ service: "exe-os", description: "Daemon state + memories DB" },
|
|
82
|
+
{ service: "exe-monitor-hub", description: "PocketBase monitoring data" }
|
|
83
|
+
];
|
|
84
|
+
function parseEnvFile(content) {
|
|
85
|
+
const env = /* @__PURE__ */ new Map();
|
|
86
|
+
for (const line of content.split("\n")) {
|
|
87
|
+
const trimmed = line.trim();
|
|
88
|
+
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
89
|
+
const eqIdx = trimmed.indexOf("=");
|
|
90
|
+
if (eqIdx < 0) continue;
|
|
91
|
+
const key = trimmed.slice(0, eqIdx);
|
|
92
|
+
let value = trimmed.slice(eqIdx + 1);
|
|
93
|
+
if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
|
|
94
|
+
value = value.slice(1, -1);
|
|
95
|
+
}
|
|
96
|
+
env.set(key, value);
|
|
97
|
+
}
|
|
98
|
+
return env;
|
|
99
|
+
}
|
|
100
|
+
function checkImageIdentity(image) {
|
|
101
|
+
if (!image) return { check: "image_identity", status: "skip", message: "No --image specified, skipping" };
|
|
102
|
+
try {
|
|
103
|
+
const pull = spawnSync("docker", ["pull", image], { encoding: "utf8", timeout: 12e4 });
|
|
104
|
+
if (pull.status !== 0) {
|
|
105
|
+
return { check: "image_identity", status: "fail", message: `Failed to pull ${image}: ${pull.stderr?.slice(0, 200)}` };
|
|
106
|
+
}
|
|
107
|
+
const inspect = spawnSync("docker", [
|
|
108
|
+
"run",
|
|
109
|
+
"--rm",
|
|
110
|
+
"--entrypoint",
|
|
111
|
+
"cat",
|
|
112
|
+
image,
|
|
113
|
+
"/app/package.json"
|
|
114
|
+
], { encoding: "utf8", timeout: 3e4 });
|
|
115
|
+
if (inspect.status !== 0) {
|
|
116
|
+
return { check: "image_identity", status: "warn", message: "Could not read package.json from image (non-Node image?)" };
|
|
117
|
+
}
|
|
118
|
+
const pkg = JSON.parse(inspect.stdout);
|
|
119
|
+
const expectedRepo = image.includes("exe-gateway") ? "exe-gateway" : image.includes("exe-wiki") ? "exe-wiki" : image.includes("exe-crm") ? "exe-crm" : image.includes("exe-os") ? "exe-os" : null;
|
|
120
|
+
if (expectedRepo && !pkg.name?.includes(expectedRepo)) {
|
|
121
|
+
return {
|
|
122
|
+
check: "image_identity",
|
|
123
|
+
status: "fail",
|
|
124
|
+
message: `Image identity mismatch: expected ${expectedRepo} but package.json name is "${pkg.name}"`
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return { check: "image_identity", status: "pass", message: `Image identity verified: ${pkg.name}@${pkg.version}` };
|
|
128
|
+
} catch (e) {
|
|
129
|
+
return { check: "image_identity", status: "fail", message: `Image identity check failed: ${e instanceof Error ? e.message : String(e)}` };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function checkVolumePreservation(composeContent) {
|
|
133
|
+
const missing = [];
|
|
134
|
+
for (const req of VOLUME_REQUIREMENTS) {
|
|
135
|
+
const serviceRegex = new RegExp(`^\\s+${req.service}:`, "m");
|
|
136
|
+
if (!serviceRegex.test(composeContent)) continue;
|
|
137
|
+
const lines = composeContent.split("\n");
|
|
138
|
+
let serviceBlock = "";
|
|
139
|
+
let inService = false;
|
|
140
|
+
let serviceIndent = -1;
|
|
141
|
+
for (const line of lines) {
|
|
142
|
+
if (!inService) {
|
|
143
|
+
const headerMatch = line.match(new RegExp(`^(\\s+)${req.service}:\\s*`));
|
|
144
|
+
if (headerMatch) {
|
|
145
|
+
inService = true;
|
|
146
|
+
serviceIndent = headerMatch[1].length;
|
|
147
|
+
serviceBlock += line + "\n";
|
|
148
|
+
}
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (line.trim() === "" || line.trim().startsWith("#")) {
|
|
152
|
+
serviceBlock += line + "\n";
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const currentIndent = line.match(/^(\s*)/)?.[1]?.length ?? 0;
|
|
156
|
+
if (currentIndent <= serviceIndent) {
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
serviceBlock += line + "\n";
|
|
160
|
+
}
|
|
161
|
+
if (serviceBlock && !serviceBlock.includes("volumes:")) {
|
|
162
|
+
missing.push(`${req.service} (${req.description})`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (missing.length > 0) {
|
|
166
|
+
return {
|
|
167
|
+
check: "volume_preservation",
|
|
168
|
+
status: "fail",
|
|
169
|
+
message: `Stateful services without volume mounts: ${missing.join(", ")}`
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return { check: "volume_preservation", status: "pass", message: "All stateful services have volume mounts" };
|
|
173
|
+
}
|
|
174
|
+
function checkEnvContract(envContent) {
|
|
175
|
+
const env = parseEnvFile(envContent);
|
|
176
|
+
const issues = [];
|
|
177
|
+
for (const key of REQUIRED_ENV_VARS) {
|
|
178
|
+
const val = env.get(key);
|
|
179
|
+
if (!val || val === "CHANGEME" || val === "") {
|
|
180
|
+
issues.push(key);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
for (const cond of CONDITIONAL_ENV_VARS) {
|
|
184
|
+
if (cond.condition(env)) {
|
|
185
|
+
const val = env.get(cond.key);
|
|
186
|
+
if (!val || val === "CHANGEME" || val === "") {
|
|
187
|
+
issues.push(`${cond.key} (${cond.reason})`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (issues.length > 0) {
|
|
192
|
+
return {
|
|
193
|
+
check: "env_contract",
|
|
194
|
+
status: "fail",
|
|
195
|
+
message: `Missing or placeholder env vars: ${issues.join(", ")}`
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
return { check: "env_contract", status: "pass", message: `All ${REQUIRED_ENV_VARS.length} required env vars present` };
|
|
199
|
+
}
|
|
200
|
+
function checkSmoke(composeFile, envFile) {
|
|
201
|
+
const ps = spawnSync("docker", [
|
|
202
|
+
"compose",
|
|
203
|
+
"--file",
|
|
204
|
+
composeFile,
|
|
205
|
+
"--env-file",
|
|
206
|
+
envFile,
|
|
207
|
+
"ps",
|
|
208
|
+
"--format",
|
|
209
|
+
"json"
|
|
210
|
+
], { encoding: "utf8", timeout: 15e3, stdio: ["pipe", "pipe", "pipe"] });
|
|
211
|
+
if (ps.status !== 0) {
|
|
212
|
+
return { check: "smoke_test", status: "skip", message: "Docker compose not available or stack not running" };
|
|
213
|
+
}
|
|
214
|
+
const lines = ps.stdout.trim().split("\n").filter(Boolean);
|
|
215
|
+
if (lines.length === 0) {
|
|
216
|
+
return { check: "smoke_test", status: "skip", message: "No containers running \u2014 fresh deploy" };
|
|
217
|
+
}
|
|
218
|
+
const unhealthy = [];
|
|
219
|
+
for (const line of lines) {
|
|
220
|
+
try {
|
|
221
|
+
const container = JSON.parse(line);
|
|
222
|
+
if (container.State !== "running") {
|
|
223
|
+
unhealthy.push(`${container.Name} (${container.State})`);
|
|
224
|
+
} else if (container.Health && container.Health !== "healthy" && container.Health !== "") {
|
|
225
|
+
unhealthy.push(`${container.Name} (${container.Health})`);
|
|
226
|
+
}
|
|
227
|
+
} catch {
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (unhealthy.length > 0) {
|
|
231
|
+
return { check: "smoke_test", status: "warn", message: `Unhealthy containers: ${unhealthy.join(", ")}` };
|
|
232
|
+
}
|
|
233
|
+
return { check: "smoke_test", status: "pass", message: `${lines.length} containers running and healthy` };
|
|
234
|
+
}
|
|
235
|
+
function checkRollbackSnapshot(composeFile, envFile, stackDir) {
|
|
236
|
+
const rollbackFile = path.join(stackDir, ".rollback.json");
|
|
237
|
+
try {
|
|
238
|
+
const envContent = readFileSync(envFile, "utf8");
|
|
239
|
+
const env = parseEnvFile(envContent);
|
|
240
|
+
const imageTags = {};
|
|
241
|
+
for (const [key, val] of env) {
|
|
242
|
+
if (key.endsWith("_IMAGE_TAG") || key.endsWith("_IMAGE")) {
|
|
243
|
+
imageTags[key] = val;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const snapshot = {
|
|
247
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
248
|
+
images: imageTags,
|
|
249
|
+
envFile,
|
|
250
|
+
composeFile
|
|
251
|
+
};
|
|
252
|
+
writeFileSync(rollbackFile, JSON.stringify(snapshot, null, 2) + "\n", { mode: 384 });
|
|
253
|
+
return {
|
|
254
|
+
check: "rollback_snapshot",
|
|
255
|
+
status: "pass",
|
|
256
|
+
message: `Rollback snapshot saved: ${Object.keys(imageTags).length} image tags \u2192 ${rollbackFile}`
|
|
257
|
+
};
|
|
258
|
+
} catch (e) {
|
|
259
|
+
return {
|
|
260
|
+
check: "rollback_snapshot",
|
|
261
|
+
status: "warn",
|
|
262
|
+
message: `Could not save rollback snapshot: ${e instanceof Error ? e.message : String(e)}`
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
function runPreflight(options) {
|
|
267
|
+
const results = [];
|
|
268
|
+
const stackDir = path.dirname(options.envFile);
|
|
269
|
+
results.push(checkImageIdentity(options.image));
|
|
270
|
+
if (existsSync(options.composeFile)) {
|
|
271
|
+
const composeContent = readFileSync(options.composeFile, "utf8");
|
|
272
|
+
results.push(checkVolumePreservation(composeContent));
|
|
273
|
+
} else {
|
|
274
|
+
results.push({ check: "volume_preservation", status: "skip", message: "Compose file not found" });
|
|
275
|
+
}
|
|
276
|
+
if (existsSync(options.envFile)) {
|
|
277
|
+
const envContent = readFileSync(options.envFile, "utf8");
|
|
278
|
+
results.push(checkEnvContract(envContent));
|
|
279
|
+
} else {
|
|
280
|
+
results.push({ check: "env_contract", status: "fail", message: ".env file not found" });
|
|
281
|
+
}
|
|
282
|
+
results.push(checkSmoke(options.composeFile, options.envFile));
|
|
283
|
+
results.push(checkRollbackSnapshot(options.composeFile, options.envFile, stackDir));
|
|
284
|
+
const passed = results.every((r) => r.status === "pass" || r.status === "skip" || r.status === "warn");
|
|
285
|
+
return {
|
|
286
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
287
|
+
results,
|
|
288
|
+
passed
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
function printReport(report) {
|
|
292
|
+
console.log("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557");
|
|
293
|
+
console.log("\u2551 exe-os preflight report \u2551");
|
|
294
|
+
console.log("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n");
|
|
295
|
+
const icons = { pass: "\u2705", fail: "\u274C", warn: "\u26A0\uFE0F ", skip: "\u23ED\uFE0F " };
|
|
296
|
+
for (const r of report.results) {
|
|
297
|
+
console.log(` ${icons[r.status]} ${r.check}: ${r.message}`);
|
|
298
|
+
}
|
|
299
|
+
console.log("");
|
|
300
|
+
if (report.passed) {
|
|
301
|
+
console.log(" \u2705 PREFLIGHT PASSED \u2014 safe to deploy\n");
|
|
302
|
+
} else {
|
|
303
|
+
console.log(" \u274C PREFLIGHT BLOCKED \u2014 fix issues before deploying\n");
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (process.argv[1]?.endsWith("preflight.ts") || process.argv[1]?.endsWith("preflight.js")) {
|
|
307
|
+
const args = process.argv.slice(2);
|
|
308
|
+
const getArg = (flag) => {
|
|
309
|
+
const idx = args.indexOf(flag);
|
|
310
|
+
return idx >= 0 && idx + 1 < args.length ? args[idx + 1] : void 0;
|
|
311
|
+
};
|
|
312
|
+
const composeFile = getArg("--compose") ?? "/opt/exe-stack/docker-compose.yml";
|
|
313
|
+
const envFile = getArg("--env") ?? "/opt/exe-stack/.env";
|
|
314
|
+
const image = getArg("--image");
|
|
315
|
+
const report = runPreflight({ composeFile, envFile, image });
|
|
316
|
+
printReport(report);
|
|
317
|
+
process.exit(report.passed ? 0 : 1);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// src/bin/stack-update.ts
|
|
321
|
+
function withRuntimeHooks(opts) {
|
|
322
|
+
return {
|
|
323
|
+
...opts,
|
|
324
|
+
preflight: runPreflight,
|
|
325
|
+
preDeployBackup,
|
|
326
|
+
healthGate: runHealthGate,
|
|
327
|
+
logHealthGateResult: logResult,
|
|
328
|
+
verifyStack: runVerifyStack
|
|
329
|
+
};
|
|
330
|
+
}
|
|
27
331
|
function parseArgs(args) {
|
|
28
332
|
const defaults = defaultStackPaths();
|
|
29
333
|
const opts = {
|
|
@@ -57,8 +361,8 @@ function parseArgs(args) {
|
|
|
57
361
|
else if (arg === "--env-file" || arg === "--stack-env-file") opts.envFile = next();
|
|
58
362
|
else if (arg.startsWith("--env-file=") || arg.startsWith("--stack-env-file=")) opts.envFile = arg.split("=").slice(1).join("=");
|
|
59
363
|
else if (arg === "--lock-file") opts.lockFile = next();
|
|
60
|
-
else if (arg === "--public-key") opts.manifestPublicKey =
|
|
61
|
-
else if (arg.startsWith("--public-key=")) opts.manifestPublicKey =
|
|
364
|
+
else if (arg === "--public-key") opts.manifestPublicKey = readFileSync2(next(), "utf8");
|
|
365
|
+
else if (arg.startsWith("--public-key=")) opts.manifestPublicKey = readFileSync2(arg.split("=").slice(1).join("="), "utf8");
|
|
62
366
|
else if (arg === "--auth-token") opts.manifestAuthToken = next();
|
|
63
367
|
else if (arg.startsWith("--auth-token=")) opts.manifestAuthToken = arg.split("=").slice(1).join("=");
|
|
64
368
|
else if (arg === "--auth-token-env") opts.manifestAuthToken = process.env[next()] ?? "";
|
|
@@ -139,9 +443,9 @@ Options:
|
|
|
139
443
|
`);
|
|
140
444
|
}
|
|
141
445
|
function readInstalledVersion(lockFile) {
|
|
142
|
-
if (!
|
|
446
|
+
if (!existsSync2(lockFile)) return void 0;
|
|
143
447
|
try {
|
|
144
|
-
const parsed = JSON.parse(
|
|
448
|
+
const parsed = JSON.parse(readFileSync2(lockFile, "utf8"));
|
|
145
449
|
return parsed.stackVersion;
|
|
146
450
|
} catch {
|
|
147
451
|
return void 0;
|
|
@@ -184,7 +488,7 @@ function printChanges(changes, composeFile, envFile) {
|
|
|
184
488
|
}
|
|
185
489
|
function areCliContainersRunning(composeFile, envFile) {
|
|
186
490
|
try {
|
|
187
|
-
const result =
|
|
491
|
+
const result = spawnSync2("docker", ["compose", "--file", composeFile, "--env-file", envFile, "ps", "-q"], {
|
|
188
492
|
stdio: ["pipe", "pipe", "pipe"],
|
|
189
493
|
timeout: 15e3
|
|
190
494
|
});
|
|
@@ -195,7 +499,7 @@ function areCliContainersRunning(composeFile, envFile) {
|
|
|
195
499
|
}
|
|
196
500
|
function getContainerHealth(composeFile, envFile) {
|
|
197
501
|
try {
|
|
198
|
-
const result =
|
|
502
|
+
const result = spawnSync2(
|
|
199
503
|
"docker",
|
|
200
504
|
["compose", "--file", composeFile, "--env-file", envFile, "ps", "--format", "json"],
|
|
201
505
|
{ stdio: ["pipe", "pipe", "pipe"], timeout: 15e3 }
|
|
@@ -262,9 +566,9 @@ async function main(args = process.argv.slice(2)) {
|
|
|
262
566
|
const opts = parseArgs(args);
|
|
263
567
|
let usingPackagedCheckTemplates = false;
|
|
264
568
|
if (opts.check && !opts.noBootstrap && !existsForCli(opts.composeFile) && !existsForCli(opts.envFile)) {
|
|
265
|
-
const packageRoot =
|
|
266
|
-
opts.composeFile =
|
|
267
|
-
opts.envFile =
|
|
569
|
+
const packageRoot = path2.resolve(new URL("../..", import.meta.url).pathname);
|
|
570
|
+
opts.composeFile = path2.join(packageRoot, "deploy", "compose", "docker-compose.yml");
|
|
571
|
+
opts.envFile = path2.join(packageRoot, "deploy", "compose", ".env.customer.example");
|
|
268
572
|
opts.noBootstrap = true;
|
|
269
573
|
usingPackagedCheckTemplates = true;
|
|
270
574
|
}
|
|
@@ -273,7 +577,7 @@ async function main(args = process.argv.slice(2)) {
|
|
|
273
577
|
console.error("Refusing to rollback without --yes.");
|
|
274
578
|
process.exit(2);
|
|
275
579
|
}
|
|
276
|
-
const result2 = await runStackUpdate(opts);
|
|
580
|
+
const result2 = await runStackUpdate(withRuntimeHooks(opts));
|
|
277
581
|
console.log(`\u2705 Stack rollback attempted using backup: ${result2.backupEnvFile ?? "latest backup"}`);
|
|
278
582
|
return;
|
|
279
583
|
}
|
|
@@ -284,14 +588,14 @@ async function main(args = process.argv.slice(2)) {
|
|
|
284
588
|
if (!opts.check && !opts.dryRun) assertHostReadyForApply(hostReport);
|
|
285
589
|
}
|
|
286
590
|
const manifest = await loadStackManifest(opts.manifestRef, void 0, opts.manifestPublicKey, opts.manifestAuthToken);
|
|
287
|
-
const envRaw =
|
|
288
|
-
const lockFile = opts.lockFile ??
|
|
591
|
+
const envRaw = readFileSync2(opts.envFile, "utf8");
|
|
592
|
+
const lockFile = opts.lockFile ?? path2.join(path2.dirname(opts.envFile), ".exe-stack-lock.json");
|
|
289
593
|
const installedVersion = readInstalledVersion(lockFile);
|
|
290
594
|
const effectiveTarget = opts.targetVersion ?? installedVersion;
|
|
291
595
|
const plan = createStackUpdatePlan(manifest, envRaw, effectiveTarget);
|
|
292
596
|
assertDeploymentScopeAllowed(plan, opts.deploymentPersona);
|
|
293
597
|
const plannedEnvRaw = patchEnv(envRaw, Object.fromEntries(plan.changes.map((c) => [c.key, c.after])));
|
|
294
|
-
assertProductionDeployGate(plan, plannedEnvRaw,
|
|
598
|
+
assertProductionDeployGate(plan, plannedEnvRaw, readFileSync2(opts.composeFile, "utf8"), {
|
|
295
599
|
breakGlassReason: opts.breakGlassReason,
|
|
296
600
|
breakGlassAuditFile: opts.breakGlassAuditFile,
|
|
297
601
|
envFile: opts.envFile
|
|
@@ -347,7 +651,7 @@ async function main(args = process.argv.slice(2)) {
|
|
|
347
651
|
console.error("\nRefusing to update without --yes. Re-run with --yes after reviewing the plan.");
|
|
348
652
|
process.exit(2);
|
|
349
653
|
}
|
|
350
|
-
const result = await runStackUpdate(opts);
|
|
654
|
+
const result = await runStackUpdate(withRuntimeHooks(opts));
|
|
351
655
|
console.log(`
|
|
352
656
|
\u2705 Stack ${result.status}: ${result.targetVersion}`);
|
|
353
657
|
if (result.backupEnvFile) console.log(`Backup env: ${result.backupEnvFile}`);
|
|
@@ -355,7 +659,7 @@ async function main(args = process.argv.slice(2)) {
|
|
|
355
659
|
}
|
|
356
660
|
function existsForCli(filePath) {
|
|
357
661
|
try {
|
|
358
|
-
|
|
662
|
+
readFileSync2(filePath);
|
|
359
663
|
return true;
|
|
360
664
|
} catch {
|
|
361
665
|
return false;
|