@askexenow/exe-os 0.9.312 → 0.9.313
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.askexe-control-plane.example +1 -1
- package/deploy/compose/.env.customer.example +11 -7
- package/deploy/compose/.env.default +4 -4
- package/deploy/compose/.env.example +7 -7
- package/deploy/compose/docker-compose.yml +43 -19
- package/deploy/compose/gateway.json +2 -2
- package/deploy/compose/init-db.sql +6 -20
- package/deploy/compose/setup.sh +74 -132
- package/deploy/compose/status.sh +5 -0
- package/deploy/stack-manifests/v0.9.json +21 -0
- package/dist/{active-agent-ORX47ZKW.js → active-agent-EWF2HJ3W.js} +6 -6
- package/dist/{active-agent-S5T2YMOR.js → active-agent-FFN5ARMC.js} +6 -6
- package/dist/{agentic-ontology-6KBAXLSJ.js → agentic-ontology-AAUATKUS.js} +1 -1
- package/dist/{backfill-metadata-FV7GX6AS.js → backfill-metadata-FBYFDOTH.js} +7 -7
- package/dist/{background-jobs-A2LV36UX.js → background-jobs-2QZ5IQKE.js} +5 -3
- package/dist/{behaviors-47CPEKJ7.js → behaviors-PQ77IPJR.js} +8 -8
- package/dist/bin/age-ontology-load.js +3 -3
- 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 +10 -10
- package/dist/bin/backfill-responses.js +10 -10
- package/dist/bin/backfill-vectors.js +13 -13
- package/dist/bin/bulk-sync-postgres.js +16 -16
- package/dist/bin/cc-doctor.js +9 -9
- package/dist/bin/cleanup-stale-review-tasks.js +15 -15
- package/dist/bin/cli.js +21 -21
- package/dist/bin/deferred-daemon-restart.js +1 -1
- package/dist/bin/exe-agent-config.js +6 -6
- package/dist/bin/exe-agent.js +14 -14
- package/dist/bin/exe-assign.js +12 -12
- package/dist/bin/exe-boot.js +78 -57
- package/dist/bin/exe-call.js +7 -7
- package/dist/bin/exe-cloud.js +17 -17
- package/dist/bin/exe-config-dump.js +7 -7
- package/dist/bin/exe-dispatch.js +15 -15
- package/dist/bin/exe-doctor.js +11 -2
- package/dist/bin/exe-export-behaviors.js +10 -10
- package/dist/bin/exe-forget.js +9 -9
- package/dist/bin/exe-gateway.js +10 -10
- package/dist/bin/exe-healthcheck.js +9 -9
- package/dist/bin/exe-heartbeat.js +15 -15
- package/dist/bin/exe-kill.js +18 -18
- package/dist/bin/exe-launch-agent.js +30 -28
- package/dist/bin/exe-new-employee.js +36 -15
- package/dist/bin/exe-pending-messages.js +16 -16
- package/dist/bin/exe-pending-notifications.js +15 -15
- package/dist/bin/exe-pending-reviews.js +15 -15
- package/dist/bin/exe-preflight.js +1 -1
- package/dist/bin/exe-rename.js +19 -29
- package/dist/bin/exe-review.js +17 -17
- package/dist/bin/exe-search.js +8 -8
- package/dist/bin/exe-session-cleanup.js +41 -20
- package/dist/bin/exe-settings.js +18 -18
- package/dist/bin/exe-start-codex.js +15 -15
- package/dist/bin/exe-start-opencode.js +11 -11
- package/dist/bin/exe-status.js +16 -16
- package/dist/bin/exe-support.js +5 -5
- package/dist/bin/exe-team.js +6 -6
- package/dist/bin/exe-watchdog.js +32 -3
- package/dist/bin/git-sweep.js +16 -16
- 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-launchd.js +2 -2
- package/dist/bin/install.js +15 -15
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +7 -7
- package/dist/bin/postgres-agentic-reflection-backfill.js +5 -5
- package/dist/bin/postgres-agentic-semantic-backfill.js +4 -4
- package/dist/bin/pre-build-guard.js +12 -1
- package/dist/bin/scan-tasks.js +15 -15
- package/dist/bin/setup.js +3 -3
- package/dist/bin/shard-migrate.js +8 -8
- package/dist/bin/stack-update.js +8 -8
- package/dist/bin/verify-stack.js +3 -1
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{branding-SC4BOPUY.js → branding-EDUC7TUP.js} +2 -2
- package/dist/{browser-session-store-DV5TDXXD.js → browser-session-store-CXQMOSEC.js} +1 -1
- package/dist/{capability-cards-WQVY7WSS.js → capability-cards-2U3XWCDP.js} +5 -5
- package/dist/{capacity-monitor-BUKYPSWR.js → capacity-monitor-ZRLW7TVL.js} +16 -16
- package/dist/{catchup-brief-X5IVQAOH.js → catchup-brief-FSBZVYPL.js} +18 -18
- package/dist/{chunk-PMEOSD6S.js → chunk-24BUDF3J.js} +9 -6
- package/dist/{chunk-2NVEKSSP.js → chunk-2FULKRDO.js} +56 -38
- package/dist/{chunk-QB5JOGPK.js → chunk-2PI6JBJL.js} +5 -4
- package/dist/{chunk-MTIJ2NXY.js → chunk-2PWRUIKZ.js} +1 -1
- package/dist/{chunk-NIZQ3CIS.js → chunk-3AMGSCRH.js} +1 -1
- package/dist/{chunk-7ODTYODO.js → chunk-3LGID56M.js} +10 -7
- package/dist/{chunk-GSY6HL3T.js → chunk-4JI54RHR.js} +5 -5
- package/dist/{chunk-ISILDO7P.js → chunk-4THK7IA4.js} +1 -1
- package/dist/{chunk-IRIPGGGL.js → chunk-4UHQYBMQ.js} +1 -1
- package/dist/{chunk-HQODUV3G.js → chunk-552IGUBB.js} +2 -2
- package/dist/{chunk-IRHNV4GY.js → chunk-5KLQCGI5.js} +72 -18
- package/dist/{chunk-SOT23KWW.js → chunk-63UEWYM3.js} +4 -4
- package/dist/{chunk-QE7UVQDP.js → chunk-6PR2RAKM.js} +1 -1
- package/dist/{chunk-ZZXADKAP.js → chunk-6SPUK67A.js} +2 -2
- package/dist/{chunk-RVXWGPD3.js → chunk-75TM3APG.js} +29 -6
- package/dist/{chunk-IZPO6IOZ.js → chunk-7QSXARI3.js} +1 -1
- package/dist/{chunk-A2YZG4AD.js → chunk-AIUXE3ZJ.js} +6 -6
- package/dist/{chunk-U63BZI2B.js → chunk-AJERMFD6.js} +3 -3
- package/dist/{chunk-BUOMSIXH.js → chunk-BMNX3YWX.js} +2 -2
- package/dist/{chunk-YUBTHJVV.js → chunk-BRSMAFBN.js} +1 -1
- package/dist/{chunk-JZW5AOWI.js → chunk-BSPALHIR.js} +2 -2
- package/dist/{chunk-VDYUKTNS.js → chunk-CLAYNAXC.js} +4 -5
- package/dist/{chunk-J3QZPDNH.js → chunk-CNQ25C4C.js} +1 -1
- package/dist/{chunk-GWPICNSO.js → chunk-CSTL7BMK.js} +49 -4
- package/dist/{chunk-5DPE7B7K.js → chunk-CTYHSVHP.js} +1 -1
- package/dist/{chunk-EM4EYF3P.js → chunk-CVTWQZOR.js} +13 -5
- package/dist/{chunk-JNARUXDC.js → chunk-CW3FPWUW.js} +2 -2
- package/dist/{chunk-V42BSVX6.js → chunk-CWACO2D4.js} +51 -4
- package/dist/{chunk-RPBTYQKJ.js → chunk-CWUCD7C7.js} +1 -1
- package/dist/{chunk-DFUCFLZH.js → chunk-D4EMVYI7.js} +2 -2
- package/dist/{chunk-W2J2RF5N.js → chunk-DIHMGQGV.js} +3 -3
- package/dist/{chunk-YB7U4WTY.js → chunk-DJ4RG3RK.js} +2 -2
- package/dist/{chunk-KSMITUGY.js → chunk-DR7QPGX4.js} +3 -3
- package/dist/{chunk-QNXM2HXW.js → chunk-ELFFRVNL.js} +1 -1
- package/dist/{chunk-QEGXNJGR.js → chunk-EV2SMRLF.js} +4 -4
- package/dist/{chunk-VFSYVQX4.js → chunk-F3QMXKKJ.js} +8 -2
- package/dist/{chunk-NCC3F6GM.js → chunk-F5XPKUPK.js} +2 -2
- package/dist/{chunk-43R2GILO.js → chunk-FIBL4JRZ.js} +2 -2
- package/dist/{chunk-B2J3BBJC.js → chunk-FQH4R6UG.js} +2 -2
- package/dist/{chunk-AC6DKMVS.js → chunk-FSAKWKWU.js} +1 -1
- package/dist/{chunk-GL5NU6IK.js → chunk-FXS5OFGH.js} +1 -1
- package/dist/{chunk-K7KBAJQL.js → chunk-GHJRLETI.js} +10 -10
- package/dist/{chunk-VQRTO7IS.js → chunk-H73TUI4Y.js} +9 -2
- package/dist/{chunk-IIHE3FNC.js → chunk-HSXWUZOD.js} +3 -3
- package/dist/{chunk-JV225JBX.js → chunk-I6RHLHVW.js} +2 -2
- package/dist/{chunk-S6HVQF27.js → chunk-IEDCQRGG.js} +88 -4
- package/dist/{chunk-4Q5VNQTV.js → chunk-IFSOVXGN.js} +3 -3
- package/dist/{chunk-JMHKK7A5.js → chunk-ITVMRPCQ.js} +1 -1
- package/dist/{chunk-VT6P7FV4.js → chunk-IU44MPY3.js} +1 -1
- package/dist/{chunk-6OD2RVIA.js → chunk-IXTDBQYU.js} +273 -397
- package/dist/{chunk-2NGPZCWX.js → chunk-JB7QUK3D.js} +3 -3
- package/dist/{chunk-VT2B5BHM.js → chunk-JBSCL2XT.js} +2 -1
- package/dist/{chunk-MPX3TRMQ.js → chunk-JD5S5AAV.js} +1 -1
- package/dist/{chunk-XYG722JW.js → chunk-JIJKUZIO.js} +3 -3
- package/dist/{chunk-KMIAYKIH.js → chunk-K5C6LC2G.js} +159 -39
- package/dist/{chunk-DAOHCXM2.js → chunk-KH6BCYLC.js} +1 -1
- package/dist/{chunk-4L4R6AQJ.js → chunk-KMI4TUTW.js} +1 -1
- package/dist/{chunk-PHFPIUWU.js → chunk-KWOAM7TA.js} +3 -0
- package/dist/{chunk-RZJ6DXVE.js → chunk-L6QI2NNG.js} +1 -1
- package/dist/{chunk-HED6D5KR.js → chunk-MMNMQNLD.js} +43 -29
- package/dist/{chunk-KAVUTP5G.js → chunk-N3CRJ2VW.js} +3 -3
- package/dist/{chunk-OBJXZII2.js → chunk-N7LBAQGK.js} +3 -3
- package/dist/{chunk-LMX7UKGX.js → chunk-OUAGTQC4.js} +17 -11
- package/dist/{chunk-WZBUKC5N.js → chunk-OUJI2ZTY.js} +2 -2
- package/dist/{chunk-YUGLOZOR.js → chunk-OXTZEKVA.js} +1 -1
- package/dist/{chunk-OR3TAZL3.js → chunk-P4ULFI2N.js} +1 -1
- package/dist/{chunk-6LNSZADA.js → chunk-PVC4RNHQ.js} +50 -11
- package/dist/{chunk-FM7XZDZI.js → chunk-R2WP3XIN.js} +1 -1
- package/dist/{chunk-IBDPPBFK.js → chunk-R5IPZ5ZC.js} +1 -1
- package/dist/{chunk-7WDIGRSO.js → chunk-R5TZ2FC3.js} +1 -1
- package/dist/{chunk-2UVN2NBN.js → chunk-RICNNGYH.js} +3 -3
- package/dist/{chunk-WBJXJ2R4.js → chunk-RLBVY5FE.js} +17 -14
- package/dist/{chunk-XXJRZ75E.js → chunk-RV634O2W.js} +5 -2
- package/dist/{chunk-3KH6GXXX.js → chunk-RYPFOZQH.js} +2 -2
- package/dist/{chunk-DNFU56ZS.js → chunk-SB7W6XI4.js} +1 -1
- package/dist/{chunk-PPXQE7AS.js → chunk-SE6MLUOK.js} +33 -34
- package/dist/{chunk-65DBIEM2.js → chunk-SHIICYJW.js} +7 -1
- package/dist/{chunk-KPVVTHPK.js → chunk-SRMNWAHN.js} +15 -10
- package/dist/chunk-T2DJR7ND.js +367 -0
- package/dist/{chunk-Z6H6Y4BS.js → chunk-TA22MGGN.js} +1 -1
- package/dist/{chunk-ZOVHXTGC.js → chunk-TN7SC2ZQ.js} +1 -1
- package/dist/{chunk-XV5HRIXG.js → chunk-TRPGNCVB.js} +8 -8
- package/dist/{chunk-4BANMHJ5.js → chunk-UDZP2SHJ.js} +3 -3
- package/dist/{chunk-GMZMBLHT.js → chunk-UM6WUSQ7.js} +2 -2
- package/dist/{chunk-2EJ636HI.js → chunk-UST3MKK7.js} +1 -1
- package/dist/{chunk-RQ7OVXUZ.js → chunk-V2CZVZUO.js} +2 -2
- package/dist/{chunk-4RJJ5FJ2.js → chunk-V4UKBUUA.js} +1 -1
- package/dist/{chunk-EOS7VPVT.js → chunk-VA2MDALR.js} +8 -8
- package/dist/{chunk-SCYWCWKY.js → chunk-VG4ZH2Z3.js} +24 -10
- package/dist/{chunk-255DIG4B.js → chunk-VHLI6CTD.js} +1 -1
- package/dist/{chunk-DFIOOK5R.js → chunk-WCES22KG.js} +4 -3
- package/dist/{chunk-5A6KTWQL.js → chunk-WOTKNUKK.js} +126 -2
- package/dist/{chunk-62UZWGFX.js → chunk-WZZBGGSD.js} +63 -2
- package/dist/{chunk-ELXR65AN.js → chunk-X2FHTDIU.js} +6 -3
- package/dist/{chunk-V4BW5HFQ.js → chunk-X5I5QRC2.js} +3 -3
- package/dist/{chunk-X4AFBL4N.js → chunk-XCORXJ3M.js} +1 -1
- package/dist/{chunk-66JPZELX.js → chunk-Y5CNGG4F.js} +24 -16
- package/dist/{chunk-SPOXL7HF.js → chunk-YEWNIBNA.js} +9 -9
- package/dist/{chunk-WJ2PZGRV.js → chunk-ZAA344BL.js} +29 -2
- package/dist/{chunk-TN2YCFQE.js → chunk-ZGLJ2VD7.js} +5 -5
- package/dist/{co-activation-WN25AJOC.js → co-activation-RH46OQ3N.js} +5 -5
- package/dist/{co-occurrence-YP2Q3OEA.js → co-occurrence-MJWERUWY.js} +5 -5
- package/dist/{code-context-index-ZWONKBKX.js → code-context-index-WFUBYGQT.js} +6 -6
- package/dist/{content-extractor-EYRVGD6O.js → content-extractor-RHITF2KM.js} +1 -1
- package/dist/{conversation-wiki-populator-XFUC7S5P.js → conversation-wiki-populator-SK233TL4.js} +1 -1
- package/dist/{crdt-sync-ZFIFL2QM.js → crdt-sync-4R7SXTNB.js} +1 -1
- package/dist/{crm-webhook-DGPHULOO.js → crm-webhook-YDXX5FDK.js} +2 -2
- package/dist/{cto-delegation-gate-OF2A3TSS.js → cto-delegation-gate-ZJHLPK4Y.js} +14 -14
- package/dist/{daemon-auth-N6P2MZAV.js → daemon-auth-5FCYVQIZ.js} +3 -3
- package/dist/{daemon-orchestration-G4RRTPP7.js → daemon-orchestration-NBU5RZ2O.js} +18 -18
- package/dist/{daemon-ready-signal-3L2MJT7C.js → daemon-ready-signal-KXLL6ZFL.js} +1 -1
- package/dist/{db-backup-EORG4LBO.js → db-backup-BTL2FBBL.js} +9 -3
- package/dist/{db-restore-events-3R7G4FP4.js → db-restore-events-3A57GMLW.js} +2 -2
- package/dist/{doc-graph-extractor-APZS3DFD.js → doc-graph-extractor-ADYRG7DB.js} +5 -5
- package/dist/documents-VWPZTDFA.js +56 -0
- package/dist/{dreaming-Q4E3WBGY.js → dreaming-76WKGTL6.js} +15 -15
- package/dist/embeddings-config-FANLORDH.js +21 -0
- package/dist/{exe-drift-CI5R6GUT.js → exe-drift-T3IO2SPX.js} +6 -6
- package/dist/{exe-export-HQIQASIT.js → exe-export-6YEHSJMP.js} +9 -9
- package/dist/{exe-import-ULZK56WC.js → exe-import-3NERK63O.js} +9 -9
- package/dist/{exe-key-ILNSBGRN.js → exe-key-RCMBMLSQ.js} +8 -8
- package/dist/{exe-org-WQWQZRLR.js → exe-org-KCOOLUTW.js} +3 -3
- package/dist/{exe-snapshot-RUZTWZOF.js → exe-snapshot-JIY7MNRI.js} +18 -18
- package/dist/{fast-db-init-KNJRL7T3.js → fast-db-init-PVJ72264.js} +1 -1
- package/dist/{founder-context-QCTMEK66.js → founder-context-A4VUEKDH.js} +4 -4
- package/dist/gateway/index.js +17 -17
- package/dist/{git-staleness-KIA5YI4H.js → git-staleness-IOAHAGBI.js} +5 -5
- package/dist/{git-task-sweep-WH6QE7HL.js → git-task-sweep-IGM5RILF.js} +17 -15
- package/dist/{global-procedures-SYZZCGDS.js → global-procedures-VZL2X4RK.js} +6 -6
- package/dist/{graph-auto-extract-J2TIWZEE.js → graph-auto-extract-TIXRGBC5.js} +5 -5
- package/dist/{hook-integrity-I6PWJQER.js → hook-integrity-XNPNCMAS.js} +1 -1
- package/dist/hooks/bug-report-worker.js +47 -17
- package/dist/hooks/codex-stop-task-finalizer.js +47 -17
- package/dist/hooks/commit-complete.js +18 -18
- package/dist/hooks/error-recall.js +11 -11
- package/dist/hooks/exe-heartbeat-hook.js +7 -7
- package/dist/hooks/ingest-worker.js +39 -9
- package/dist/hooks/ingest.js +17 -17
- package/dist/hooks/instructions-loaded.js +8 -8
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +8 -8
- package/dist/hooks/post-compact.js +17 -17
- package/dist/hooks/post-tool-combined.js +60 -7
- package/dist/hooks/pre-compact.js +23 -23
- package/dist/hooks/pre-tool-use.js +64 -34
- package/dist/hooks/prompt-submit.js +40 -32
- package/dist/hooks/session-end.js +29 -29
- package/dist/hooks/session-start.js +17 -17
- package/dist/hooks/stop.js +24 -24
- package/dist/hooks/subagent-stop.js +17 -17
- package/dist/hooks/summary-worker.js +55 -25
- package/dist/index.js +27 -27
- package/dist/{installer-PSDYMGN7.js → installer-D7D5O4KL.js} +10 -10
- package/dist/{installer-3NB3IBHF.js → installer-EQP2EMNZ.js} +10 -10
- package/dist/{installer-IIJFCTMH.js → installer-IWRYH55Z.js} +10 -10
- package/dist/{key-backup-status-FNSN3NXH.js → key-backup-status-ZNGDSPLT.js} +2 -2
- package/dist/lib/agent-config.js +3 -3
- package/dist/lib/cloud-sync.js +16 -16
- package/dist/lib/config.js +2 -2
- package/dist/lib/consolidation.js +8 -8
- package/dist/lib/database.js +7 -5
- package/dist/lib/db-daemon-client.js +6 -6
- package/dist/lib/db.js +7 -5
- package/dist/lib/device-registry.js +3 -3
- package/dist/lib/embed-worker.js +2 -2
- package/dist/lib/embedder.js +6 -6
- package/dist/lib/employee-templates.js +7 -7
- package/dist/lib/employees.js +5 -5
- package/dist/lib/exe-daemon-client.js +5 -5
- package/dist/lib/exe-daemon.js +449 -89
- package/dist/lib/hybrid-search.js +8 -8
- package/dist/lib/identity.js +5 -5
- package/dist/lib/license.js +4 -4
- package/dist/lib/messaging.js +15 -15
- package/dist/lib/post-tool-memory.js +2 -2
- package/dist/lib/reminders.js +6 -6
- package/dist/lib/schedules.js +8 -8
- package/dist/lib/session-registry.js +9 -7
- package/dist/lib/session-wrappers.js +1 -1
- package/dist/lib/skill-learning.js +9 -9
- package/dist/lib/store.js +7 -7
- package/dist/lib/task-router.js +6 -6
- package/dist/lib/tasks.js +16 -16
- package/dist/lib/tmux-routing.js +14 -14
- package/dist/lib/token-spend.js +6 -6
- package/dist/{license-gate-7SDHCJUO.js → license-gate-PZOP7S2S.js} +5 -5
- package/dist/mcp/register-tools.js +73 -72
- package/dist/mcp/server.js +74 -73
- package/dist/mcp/tools/complete-reminder.js +7 -7
- package/dist/mcp/tools/create-reminder.js +7 -7
- package/dist/mcp/tools/create-task.js +18 -18
- package/dist/mcp/tools/deactivate-behavior.js +10 -10
- package/dist/mcp/tools/list-reminders.js +7 -7
- package/dist/mcp/tools/list-tasks.js +18 -18
- package/dist/mcp/tools/send-message.js +17 -17
- package/dist/mcp/tools/update-task.js +17 -17
- package/dist/{mcp-http-config-QSOVFXHW.js → mcp-http-config-23DHJAU4.js} +7 -7
- package/dist/{mcp-port-config-AWWRZA22.js → mcp-port-config-FFAMMLLE.js} +2 -1
- package/dist/{memory-cards-II67WFL2.js → memory-cards-CNLMHSZC.js} +5 -5
- package/dist/{memory-graph-extractor-PM4Q2KJG.js → memory-graph-extractor-HIXP2BQS.js} +6 -6
- package/dist/{memory-poisoning-defense-ECXSX7HK.js → memory-poisoning-defense-YL53IBBF.js} +5 -5
- package/dist/{memory-queue-VAE6WMSS.js → memory-queue-3Q5P43AM.js} +3 -3
- package/dist/memory-queue-client-YP2QKX6J.js +16 -0
- package/dist/{memory-reflection-PXF6YFDU.js → memory-reflection-VHQRUZWK.js} +5 -5
- package/dist/{notifications-UP7WQGG4.js → notifications-Q5NEAP6K.js} +14 -14
- package/dist/{orchestration-events-PZLLPCKY.js → orchestration-events-7SNWRJYE.js} +6 -6
- package/dist/{orchestration-phase-SJOXDB7X.js → orchestration-phase-U45T4VG3.js} +3 -3
- package/dist/{orchestrator-PUT45J4O.js → orchestrator-XWLKNWUG.js} +16 -16
- package/dist/{pipeline-router-5CRWKESM.js → pipeline-router-5IBJBH7P.js} +6 -6
- package/dist/{plan-limits-SH2NDFNX.js → plan-limits-PBEZVHRQ.js} +8 -8
- package/dist/{preferences-YWBTKW3M.js → preferences-TYTGDXQZ.js} +2 -2
- package/dist/{project-boot-2TCPDZ4S.js → project-boot-OHEGJD2L.js} +2 -2
- package/dist/{projection-worker-HWY37MNC.js → projection-worker-HELRBNDR.js} +5 -5
- package/dist/{prospective-memory-FQSVMCGG.js → prospective-memory-N55XRGJP.js} +5 -5
- package/dist/{push-notifications-DK6XA5B3.js → push-notifications-PAFNP3EC.js} +3 -3
- package/dist/{reranker-AALRMGMM.js → reranker-MNJSTOPR.js} +3 -3
- package/dist/{retrieval-health-PNWJSJNG.js → retrieval-health-W4HNR3WX.js} +1 -1
- package/dist/{review-polling-65JZUE3T.js → review-polling-SRYZU2PI.js} +15 -15
- package/dist/runtime/index.js +22 -22
- package/dist/{session-events-EJ3OSAA6.js → session-events-L4DK5J6J.js} +15 -15
- package/dist/{session-kill-telemetry-3HGM7SNQ.js → session-kill-telemetry-U2YHKHCB.js} +15 -15
- package/dist/{session-scope-JGDYAMJO.js → session-scope-JTPHECAU.js} +14 -14
- package/dist/{setup-wizard-44LMFM2C.js → setup-wizard-IP5R66LR.js} +3 -3
- package/dist/{shard-manager-KUCJPLC6.js → shard-manager-RASGFMGS.js} +3 -3
- package/dist/{skill-refinement-DUOO6B7V.js → skill-refinement-VTYL4OMJ.js} +5 -5
- package/dist/{stack-release-XYMKU7NT.js → stack-release-TOCCJQOF.js} +244 -45
- package/dist/{stack-update-TUBZTY7Z.js → stack-update-MRNVHUZZ.js} +11 -5
- package/dist/{steward-gate-6NWRDLX2.js → steward-gate-JEVUDTBI.js} +6 -6
- package/dist/{task-enforcement-UOULTGFB.js → task-enforcement-VFSAAZUN.js} +14 -14
- package/dist/{task-scope-P5STKYAC.js → task-scope-P4VLIQNP.js} +14 -14
- package/dist/{tasks-crud-24HMTULR.js → tasks-crud-SC3ERIUR.js} +14 -14
- package/dist/{tasks-notify-LAIU7UUI.js → tasks-notify-WJYBUCIB.js} +15 -15
- package/dist/{tasks-review-AFJAU2DY.js → tasks-review-XPVPHCGD.js} +14 -14
- package/dist/{telemetry-upload-DWFGC2XJ.js → telemetry-upload-4QEYQROW.js} +10 -10
- package/dist/{token-budget-4RFZKWGH.js → token-budget-UBOP3HVE.js} +6 -6
- package/dist/{tool-capability-index-ZEXBWKUZ.js → tool-capability-index-SHYCBE2Z.js} +1 -1
- package/dist/{tool-telemetry-BS5JXM5M.js → tool-telemetry-CDNPES5B.js} +1 -1
- package/dist/tui/App.js +27 -27
- package/dist/{tui-data-UNO5B7PU.js → tui-data-HVYY7GRK.js} +14 -14
- package/dist/{worker-gate-C6CTTYMD.js → worker-gate-KQTODSUQ.js} +3 -3
- package/dist/{workflow-engine-4W2KYCDV.js → workflow-engine-OP2DQISD.js} +2 -2
- package/dist/{working-memory-FXHQCJJE.js → working-memory-PY4AG577.js} +22 -2
- package/dist/{worktree-2CXY6NEB.js → worktree-Z2G4CP4Z.js} +7 -7
- package/dist/{worktree-sweep-K3CJFSUL.js → worktree-sweep-LWSCAZW6.js} +8 -8
- package/package.json +2 -2
- package/release-notes.json +56 -113
- package/stack.release.json +7 -7
- package/dist/memory-queue-client-HLURQEV6.js +0 -16
- /package/dist/{chunk-J3SR5MGG.js → chunk-GIS4GBZE.js} +0 -0
- /package/dist/{chunk-AE74NOE6.js → chunk-NAPBIDGH.js} +0 -0
- /package/dist/{chunk-I3DPCSDG.js → chunk-OJS2H5HR.js} +0 -0
- /package/dist/{chunk-K4BKJJ4F.js → chunk-PCRRDXGL.js} +0 -0
- /package/dist/{chunk-MQCTK6EF.js → chunk-RRYJTPVW.js} +0 -0
- /package/dist/{chunk-2NS3QRMJ.js → chunk-ZIVUMDHA.js} +0 -0
- /package/dist/{core-memory-OC5ITKKV.js → core-memory-4JWCAGJI.js} +0 -0
- /package/dist/{entity-boost-NF3LE6OJ.js → entity-boost-AU342QRK.js} +0 -0
- /package/dist/{message-queue-client-4VDU6BZY.js → message-queue-client-IXYLJJVJ.js} +0 -0
- /package/dist/{oauth-server-EWUL7DMD.js → oauth-server-F4QWESK2.js} +0 -0
- /package/dist/{webhook-pipe-DHIGZHPW.js → webhook-pipe-S4CWK6H5.js} +0 -0
- /package/dist/{wiki-acl-CONNF6ES.js → wiki-acl-6GZHUA44.js} +0 -0
- /package/dist/{wiki-client-N6PT5P7W.js → wiki-client-CIJXRMKL.js} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadPreferences
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CLAYNAXC.js";
|
|
4
4
|
import {
|
|
5
5
|
buildClaudeHttpMcpEntry
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BSPALHIR.js";
|
|
7
7
|
import {
|
|
8
8
|
EXE_HOOKS,
|
|
9
9
|
isLegacyHomeDirHookCommand,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
} from "./chunk-L3TB7CC3.js";
|
|
12
12
|
import {
|
|
13
13
|
ensureAllAgentSymlinks
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-3AMGSCRH.js";
|
|
15
15
|
import {
|
|
16
16
|
MCP_LEGACY_KEY,
|
|
17
17
|
MCP_PRIMARY_KEY
|
|
@@ -40,7 +40,8 @@ function extractSemanticText(toolName, toolInput, toolResponse) {
|
|
|
40
40
|
extracted = extractDefault(toolName, toolInput, toolResponse);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
|
|
43
|
+
const sanitized = redactSecrets(extracted).text;
|
|
44
|
+
return sanitized.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])/g, "\uFFFD").replace(/(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, "\uFFFD");
|
|
44
45
|
}
|
|
45
46
|
function findContainingChunk(filePath, snippet) {
|
|
46
47
|
try {
|
|
@@ -3,15 +3,15 @@ import {
|
|
|
3
3
|
getClient,
|
|
4
4
|
isInitialized,
|
|
5
5
|
loadEmployees
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-VG4ZH2Z3.js";
|
|
7
7
|
import {
|
|
8
8
|
PLAN_LIMITS,
|
|
9
9
|
checkLicense,
|
|
10
10
|
isFeatureAllowed
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-I6RHLHVW.js";
|
|
12
12
|
import {
|
|
13
13
|
EXE_AI_DIR
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-WCES22KG.js";
|
|
15
15
|
|
|
16
16
|
// src/lib/plan-limits.ts
|
|
17
17
|
import { readFileSync, existsSync } from "fs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadLicense
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-I6RHLHVW.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/stack-update.ts
|
|
6
6
|
import { execFileSync, spawnSync } from "child_process";
|
|
@@ -93,6 +93,37 @@ function parseComposeDependsOn(composeRaw) {
|
|
|
93
93
|
}
|
|
94
94
|
return deps;
|
|
95
95
|
}
|
|
96
|
+
function parseComposeServiceNames(composeRaw) {
|
|
97
|
+
const names = /* @__PURE__ */ new Set();
|
|
98
|
+
for (const line of composeRaw.split(/\r?\n/)) {
|
|
99
|
+
if (!line.trim() || line.trim().startsWith("#")) continue;
|
|
100
|
+
const indent = line.length - line.trimStart().length;
|
|
101
|
+
const trimmed = line.trim();
|
|
102
|
+
if (indent === 2 && /^[a-zA-Z0-9_-]+:\s*$/.test(trimmed)) {
|
|
103
|
+
names.add(trimmed.replace(/:.*$/, ""));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return names;
|
|
107
|
+
}
|
|
108
|
+
function isUsableTunnelToken(value) {
|
|
109
|
+
const v = (value ?? "").trim();
|
|
110
|
+
if (v === "") return false;
|
|
111
|
+
if (/CHANGEME/i.test(v)) return false;
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
function isCloudflaredTunnelMisconfigured(composeFile, envFile) {
|
|
115
|
+
if (!existsSync(composeFile)) return false;
|
|
116
|
+
const composeRaw = readFileSync(composeFile, "utf8");
|
|
117
|
+
if (!parseComposeServiceNames(composeRaw).has("cloudflared")) return false;
|
|
118
|
+
const token = existsSync(envFile) ? parseEnv(readFileSync(envFile, "utf8")).get("CLOUDFLARE_TUNNEL_TOKEN") : void 0;
|
|
119
|
+
if (isUsableTunnelToken(token)) return false;
|
|
120
|
+
const configYml = path.join(path.dirname(composeFile), "cloudflared", "config.yml");
|
|
121
|
+
if (existsSync(configYml)) {
|
|
122
|
+
const cfg = readFileSync(configYml, "utf8");
|
|
123
|
+
if (/\btunnel\s*:/i.test(cfg) || /credentials[-_]file\s*:/i.test(cfg)) return false;
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
96
127
|
function resolveTransitiveDeps(selected, depsMap) {
|
|
97
128
|
const resolved = new Set(selected);
|
|
98
129
|
const queue = [...selected];
|
|
@@ -287,10 +318,9 @@ async function rollbackStackUpdate(options) {
|
|
|
287
318
|
const rollbackEnvRaw = readFileSync(rollbackEnv, "utf8");
|
|
288
319
|
if (scopedServiceNames.length > 0 && lockData?.services) {
|
|
289
320
|
const rollbackEnvMap = parseEnv(rollbackEnvRaw);
|
|
290
|
-
const scopedUpdates = Object.fromEntries(
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
}));
|
|
321
|
+
const scopedUpdates = Object.fromEntries(
|
|
322
|
+
scopedServiceNames.map((serviceName) => lockData.services[serviceName].env).filter((key) => Boolean(key)).map((key) => [key, rollbackEnvMap.get(key) ?? ""])
|
|
323
|
+
);
|
|
294
324
|
console.log(`[stack-update] Restoring env keys for service ${scopedServiceNames.join(", ")} from ${rollbackEnv}`);
|
|
295
325
|
writeSecretFile(options.envFile, patchEnv(readFileSync(options.envFile, "utf8"), scopedUpdates));
|
|
296
326
|
} else {
|
|
@@ -442,7 +472,7 @@ function buildInitialServiceStatus(plan, envRaw, now, activeServices) {
|
|
|
442
472
|
service: serviceName,
|
|
443
473
|
image: service.image,
|
|
444
474
|
env: service.env,
|
|
445
|
-
before: env.get(service.env),
|
|
475
|
+
before: service.env ? env.get(service.env) : void 0,
|
|
446
476
|
after: service.image,
|
|
447
477
|
status: activeServices && !activeServices.has(serviceName) ? "skipped" : "pending",
|
|
448
478
|
error: activeServices && !activeServices.has(serviceName) ? "not selected for this service-scoped update" : void 0,
|
|
@@ -468,6 +498,11 @@ function incompleteServicesFromLock(lockFile) {
|
|
|
468
498
|
const serviceStatus = lock?.serviceStatus ?? {};
|
|
469
499
|
return Object.entries(serviceStatus).filter(([, status]) => status.status !== "completed" && status.status !== "skipped").map(([service]) => service);
|
|
470
500
|
}
|
|
501
|
+
function sanitizeImageRef(image) {
|
|
502
|
+
let ref = image.trim().replace(/^['"]|['"]$/g, "");
|
|
503
|
+
ref = ref.replace(/:([^:@/]+):(v\d)/, ":$2");
|
|
504
|
+
return ref;
|
|
505
|
+
}
|
|
471
506
|
function parseStackManifest(raw, publicKey) {
|
|
472
507
|
const parsedRaw = JSON.parse(raw);
|
|
473
508
|
const parsed = isSignedEnvelope(parsedRaw) ? { ...parsedRaw.manifest, signature: parsedRaw.signature } : parsedRaw;
|
|
@@ -482,9 +517,10 @@ function parseStackManifest(raw, publicKey) {
|
|
|
482
517
|
throw new Error(`Invalid stack manifest: release ${version} has no services`);
|
|
483
518
|
}
|
|
484
519
|
for (const [serviceName, service] of Object.entries(release.services)) {
|
|
485
|
-
if (!service.image
|
|
486
|
-
throw new Error(`Invalid stack manifest: ${version}.${serviceName} requires image
|
|
520
|
+
if (!service.image) {
|
|
521
|
+
throw new Error(`Invalid stack manifest: ${version}.${serviceName} requires image`);
|
|
487
522
|
}
|
|
523
|
+
service.image = sanitizeImageRef(service.image);
|
|
488
524
|
}
|
|
489
525
|
}
|
|
490
526
|
return parsed;
|
|
@@ -629,6 +665,7 @@ function createStackUpdatePlan(manifest, envRaw, targetVersion, serviceNames, se
|
|
|
629
665
|
const env = parseEnv(envRaw);
|
|
630
666
|
const changes = [];
|
|
631
667
|
for (const [serviceName, service] of Object.entries(release.services)) {
|
|
668
|
+
if (!service.env) continue;
|
|
632
669
|
const before = env.get(service.env);
|
|
633
670
|
if (before !== service.image) {
|
|
634
671
|
changes.push({ key: service.env, before, after: service.image, service: serviceName });
|
|
@@ -684,6 +721,39 @@ function classifyAskExeImage(image, label, strictDigest) {
|
|
|
684
721
|
}
|
|
685
722
|
return null;
|
|
686
723
|
}
|
|
724
|
+
function classifyManifestImage(image, label, strictDigest, serviceCategory) {
|
|
725
|
+
const trimmed = image.trim().replace(/^['"]|['"]$/g, "");
|
|
726
|
+
if (!trimmed) return { kind: "manifest-image", message: `${label} is empty`, severity: "error" };
|
|
727
|
+
if (trimmed.includes("${")) return null;
|
|
728
|
+
if (trimmed.startsWith("ghcr.io/askexe/") || trimmed.startsWith("update.askexe.com/askexe/")) {
|
|
729
|
+
return classifyAskExeImage(trimmed, label, strictDigest);
|
|
730
|
+
}
|
|
731
|
+
if (OFFICIAL_COMPOSE_IMAGE.test(trimmed)) {
|
|
732
|
+
if (isMutableTag(imageTag(trimmed)) && !IMAGE_DIGEST.test(trimmed)) {
|
|
733
|
+
return {
|
|
734
|
+
kind: "manifest-image",
|
|
735
|
+
message: `${label} uses a mutable tag (${trimmed}); pin a version tag or @sha256: digest for the infra image`,
|
|
736
|
+
severity: strictDigest ? "error" : "warn"
|
|
737
|
+
};
|
|
738
|
+
}
|
|
739
|
+
return null;
|
|
740
|
+
}
|
|
741
|
+
if (serviceCategory === "infra") {
|
|
742
|
+
if (isMutableTag(imageTag(trimmed)) && !IMAGE_DIGEST.test(trimmed)) {
|
|
743
|
+
return {
|
|
744
|
+
kind: "manifest-image",
|
|
745
|
+
message: `${label} uses a mutable tag (${trimmed}); pin a version tag or @sha256: digest for the infra image`,
|
|
746
|
+
severity: "warn"
|
|
747
|
+
};
|
|
748
|
+
}
|
|
749
|
+
return null;
|
|
750
|
+
}
|
|
751
|
+
return {
|
|
752
|
+
kind: "manifest-image",
|
|
753
|
+
message: `${label} uses unsupported image ${trimmed}; AskExe app images must come from ghcr.io/askexe or update.askexe.com/askexe, and third-party infra must be a recognised official image`,
|
|
754
|
+
severity: "error"
|
|
755
|
+
};
|
|
756
|
+
}
|
|
687
757
|
function validateComposeImageLiteral(image, label, strictDigest = false) {
|
|
688
758
|
const trimmed = image.trim().replace(/^['"]|['"]$/g, "");
|
|
689
759
|
if (!trimmed) return { kind: "compose-image", message: `${label} is empty`, severity: "error" };
|
|
@@ -724,11 +794,11 @@ function collectProductionDeployGateIssues(plan, envRaw, composeRaw, options = {
|
|
|
724
794
|
const issues = [];
|
|
725
795
|
const env = parseEnv(envRaw);
|
|
726
796
|
for (const [serviceName, service] of Object.entries(plan.release.services)) {
|
|
727
|
-
const manifestIssue =
|
|
797
|
+
const manifestIssue = classifyManifestImage(service.image, `manifest ${plan.targetVersion}.${serviceName}.image`, strictDigest, service.category);
|
|
728
798
|
if (manifestIssue) issues.push({ ...manifestIssue, kind: "manifest-image" });
|
|
729
|
-
const envImage = env.get(service.env);
|
|
799
|
+
const envImage = service.env ? env.get(service.env) : void 0;
|
|
730
800
|
if (envImage) {
|
|
731
|
-
const envIssue =
|
|
801
|
+
const envIssue = classifyManifestImage(envImage, `env ${service.env}`, strictDigest, service.category);
|
|
732
802
|
if (envIssue) issues.push({ ...envIssue, kind: "env-image" });
|
|
733
803
|
}
|
|
734
804
|
}
|
|
@@ -761,38 +831,59 @@ function collectImageAvailabilityIssues(plan) {
|
|
|
761
831
|
const image = service.image;
|
|
762
832
|
if (checked.has(image)) continue;
|
|
763
833
|
checked.add(image);
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
issues.push({
|
|
772
|
-
kind: "image-not-pullable",
|
|
773
|
-
message: `${serviceName} image ${image} not found on registry. ${stderr.slice(0, 200)}`
|
|
774
|
-
});
|
|
775
|
-
continue;
|
|
776
|
-
}
|
|
777
|
-
const output = result.stdout?.toString() ?? "";
|
|
834
|
+
const isProxyImage = image.startsWith("update.askexe.com/");
|
|
835
|
+
const maxAttempts = isProxyImage ? 3 : 1;
|
|
836
|
+
const baseDelayMs = 2e3;
|
|
837
|
+
let lastStderr = "";
|
|
838
|
+
let inspected = false;
|
|
839
|
+
let inspectOutput = "";
|
|
840
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
778
841
|
try {
|
|
779
|
-
const
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
const platform = m.platform;
|
|
783
|
-
return platform?.architecture === "amd64" && platform?.os === "linux";
|
|
842
|
+
const result = spawnSync("docker", ["manifest", "inspect", image, "--verbose"], {
|
|
843
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
844
|
+
timeout: 3e4
|
|
784
845
|
});
|
|
785
|
-
if (
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
846
|
+
if (result.status === 0) {
|
|
847
|
+
inspected = true;
|
|
848
|
+
inspectOutput = result.stdout?.toString() ?? "";
|
|
849
|
+
break;
|
|
850
|
+
}
|
|
851
|
+
lastStderr = result.stderr?.toString().trim() ?? "";
|
|
852
|
+
if (attempt < maxAttempts) {
|
|
853
|
+
const delayMs = baseDelayMs * Math.pow(2, attempt - 1);
|
|
854
|
+
console.log(
|
|
855
|
+
`[stack-update] Image ${image} not yet available on proxy (attempt ${attempt}/${maxAttempts}), retrying in ${delayMs / 1e3}s\u2026 (bug d11c9809)`
|
|
856
|
+
);
|
|
857
|
+
spawnSync("sleep", [String(delayMs / 1e3)], { stdio: "ignore" });
|
|
794
858
|
}
|
|
795
859
|
} catch {
|
|
860
|
+
inspected = true;
|
|
861
|
+
break;
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
if (!inspected) {
|
|
865
|
+
issues.push({
|
|
866
|
+
kind: "image-not-pullable",
|
|
867
|
+
message: `${serviceName} image ${image} not found on registry after ${maxAttempts} attempt(s). ${lastStderr.slice(0, 200)}`
|
|
868
|
+
});
|
|
869
|
+
continue;
|
|
870
|
+
}
|
|
871
|
+
try {
|
|
872
|
+
const parsed = JSON.parse(inspectOutput);
|
|
873
|
+
const manifests = Array.isArray(parsed) ? parsed : [parsed];
|
|
874
|
+
const hasAmd64 = manifests.some((m) => {
|
|
875
|
+
const platform = m.platform;
|
|
876
|
+
return platform?.architecture === "amd64" && platform?.os === "linux";
|
|
877
|
+
});
|
|
878
|
+
if (!hasAmd64 && manifests.length > 0 && manifests[0]?.platform) {
|
|
879
|
+
const platforms = manifests.map((m) => {
|
|
880
|
+
const p = m.platform;
|
|
881
|
+
return `${p?.os ?? "?"}/${p?.architecture ?? "?"}`;
|
|
882
|
+
}).join(", ");
|
|
883
|
+
issues.push({
|
|
884
|
+
kind: "platform-mismatch",
|
|
885
|
+
message: `${serviceName} image ${image} has no linux/amd64 manifest (available: ${platforms}). Rebuild with: docker buildx build --platform linux/amd64 --push`
|
|
886
|
+
});
|
|
796
887
|
}
|
|
797
888
|
} catch {
|
|
798
889
|
}
|
|
@@ -1249,6 +1340,10 @@ function bootstrapStackHost(options) {
|
|
|
1249
1340
|
envHadPlaceholders,
|
|
1250
1341
|
envRemainingPlaceholders,
|
|
1251
1342
|
licensePresent: !!(options.licenseKey || process.env.EXE_LICENSE_KEY || loadLicense()),
|
|
1343
|
+
// bug 820c6473: evaluated AFTER hydration (which deliberately skips the
|
|
1344
|
+
// tunnel token) so a missing/placeholder CLOUDFLARE_TUNNEL_TOKEN with the
|
|
1345
|
+
// cloudflared service present is caught as a hard blocker downstream.
|
|
1346
|
+
cloudflaredTunnelMisconfigured: isCloudflaredTunnelMisconfigured(options.composeFile, options.envFile),
|
|
1252
1347
|
createdFiles,
|
|
1253
1348
|
actions
|
|
1254
1349
|
};
|
|
@@ -1262,6 +1357,11 @@ function assertHostReadyForApply(report) {
|
|
|
1262
1357
|
if (!report.licensePresent) blockers.push("Exe OS license key is missing. Run `exe-os setup`, `exe-os --activate <key>`, or pass --license-key.");
|
|
1263
1358
|
const hardPlaceholders = report.envRemainingPlaceholders.filter((p) => !/WHATSAPP|API_ROUTER|MONITOR_AGENT|MONITOR_HUB_ADMIN|CLOUDFLARE_TUNNEL_TOKEN/.test(p));
|
|
1264
1359
|
if (hardPlaceholders.length > 0) blockers.push(`Required .env placeholders remain: ${hardPlaceholders.join(", ")}`);
|
|
1360
|
+
if (report.cloudflaredTunnelMisconfigured) {
|
|
1361
|
+
blockers.push(
|
|
1362
|
+
"Cloudflare tunnel is required (cloudflared service is in docker-compose) but CLOUDFLARE_TUNNEL_TOKEN is missing/empty/placeholder. Create a tunnel in the Cloudflare dashboard, copy the token, and set CLOUDFLARE_TUNNEL_TOKEN in .env (or use advanced config-file mode: leave the token empty and populate cloudflared/config.yml)."
|
|
1363
|
+
);
|
|
1364
|
+
}
|
|
1265
1365
|
if (blockers.length > 0) throw new Error(`Stack host is not ready:
|
|
1266
1366
|
- ${blockers.join("\n- ")}`);
|
|
1267
1367
|
}
|
|
@@ -1863,6 +1963,23 @@ ${lines.join("\n")}`
|
|
|
1863
1963
|
(options.dockerLogin ?? defaultDockerLogin)(creds);
|
|
1864
1964
|
registryForLogout = creds.registry;
|
|
1865
1965
|
}
|
|
1966
|
+
const runImageAvailabilityCheck = !options.skipImageAvailabilityCheck && !options.exec;
|
|
1967
|
+
if (runImageAvailabilityCheck) {
|
|
1968
|
+
const availabilityIssues = collectImageAvailabilityIssues(plan);
|
|
1969
|
+
if (availabilityIssues.length > 0) {
|
|
1970
|
+
const details = availabilityIssues.map((i) => `- [${i.kind}] ${i.message}`).join("\n");
|
|
1971
|
+
if (options.breakGlassReason?.trim()) {
|
|
1972
|
+
console.warn(`[stack-update] BREAK-GLASS: proceeding past image availability issues:
|
|
1973
|
+
${details}`);
|
|
1974
|
+
} else {
|
|
1975
|
+
throw new Error(
|
|
1976
|
+
`Pre-deploy image availability check failed \u2014 aborting before any container swap.
|
|
1977
|
+
${details}
|
|
1978
|
+
Push the missing image(s) to the registry, or re-run with --break-glass <reason> to override.`
|
|
1979
|
+
);
|
|
1980
|
+
}
|
|
1981
|
+
}
|
|
1982
|
+
}
|
|
1866
1983
|
const imagesToPull = manifestImagesForPull(plan.release);
|
|
1867
1984
|
const allServiceNames = Object.keys(plan.release.services);
|
|
1868
1985
|
const progress = new ProgressReporter(allServiceNames);
|
|
@@ -2601,6 +2718,9 @@ export {
|
|
|
2601
2718
|
loadServiceSelection,
|
|
2602
2719
|
saveServiceSelection,
|
|
2603
2720
|
parseComposeDependsOn,
|
|
2721
|
+
parseComposeServiceNames,
|
|
2722
|
+
isUsableTunnelToken,
|
|
2723
|
+
isCloudflaredTunnelMisconfigured,
|
|
2604
2724
|
resolveTransitiveDeps,
|
|
2605
2725
|
filterServicesBySelection,
|
|
2606
2726
|
buildDefaultServiceSelection,
|
|
@@ -54,8 +54,11 @@ function resolveHookSearchEnabled(env, config, sentinelPath = EMBEDDINGS_SENTINE
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
export {
|
|
57
|
+
EXE_AI_DIR,
|
|
57
58
|
EMBEDDINGS_SENTINEL_PATH,
|
|
59
|
+
parseEmbeddingsEnv,
|
|
58
60
|
readSentinel,
|
|
61
|
+
deriveFromLegacyConfig,
|
|
59
62
|
resolveEmbeddingsEnabled,
|
|
60
63
|
setEmbeddingsEnabled,
|
|
61
64
|
resolveHookSearchEnabled
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
ensureWorktree,
|
|
3
3
|
getGitRoot,
|
|
4
4
|
isWorktreeDirty
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-L6QI2NNG.js";
|
|
6
6
|
import {
|
|
7
7
|
buildTaskResult,
|
|
8
8
|
serializeMessage
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
} from "./chunk-E23LNUWJ.js";
|
|
17
17
|
import {
|
|
18
18
|
registerSession
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-ZAA344BL.js";
|
|
20
20
|
import {
|
|
21
21
|
listTmuxSessions
|
|
22
22
|
} from "./chunk-SSTLTIF3.js";
|
|
@@ -25,18 +25,18 @@ import {
|
|
|
25
25
|
} from "./chunk-KOO3J5PV.js";
|
|
26
26
|
import {
|
|
27
27
|
recordOrchestrationEventBestEffort
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-P4ULFI2N.js";
|
|
29
29
|
import {
|
|
30
30
|
getAgentRuntime,
|
|
31
31
|
normalizeCcModelName
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-2PI6JBJL.js";
|
|
33
33
|
import {
|
|
34
34
|
RUNTIME_TABLE
|
|
35
35
|
} from "./chunk-NGP6LSV2.js";
|
|
36
36
|
import {
|
|
37
37
|
PlanLimitError,
|
|
38
38
|
assertEmployeeLimitSync
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-JIJKUZIO.js";
|
|
40
40
|
import {
|
|
41
41
|
getSessionKey
|
|
42
42
|
} from "./chunk-CVYC6DUW.js";
|
|
@@ -51,7 +51,7 @@ import {
|
|
|
51
51
|
} from "./chunk-MP2AFCGL.js";
|
|
52
52
|
import {
|
|
53
53
|
ensureAgentSymlink
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-3AMGSCRH.js";
|
|
55
55
|
import {
|
|
56
56
|
expandDualPrefixTools
|
|
57
57
|
} from "./chunk-HYZV25LY.js";
|
|
@@ -62,18 +62,19 @@ import {
|
|
|
62
62
|
getEmployee,
|
|
63
63
|
isCoordinatorName,
|
|
64
64
|
loadEmployees,
|
|
65
|
-
loadEmployeesSync
|
|
66
|
-
|
|
65
|
+
loadEmployeesSync,
|
|
66
|
+
offloadReadIfMain
|
|
67
|
+
} from "./chunk-VG4ZH2Z3.js";
|
|
67
68
|
import {
|
|
68
69
|
loadDeviceId
|
|
69
|
-
} from "./chunk-
|
|
70
|
+
} from "./chunk-I6RHLHVW.js";
|
|
70
71
|
import {
|
|
71
72
|
EXE_AI_DIR
|
|
72
|
-
} from "./chunk-
|
|
73
|
+
} from "./chunk-WCES22KG.js";
|
|
73
74
|
import {
|
|
74
75
|
atomicWriteJsonSync,
|
|
75
76
|
atomicWriteSync
|
|
76
|
-
} from "./chunk-
|
|
77
|
+
} from "./chunk-SHIICYJW.js";
|
|
77
78
|
|
|
78
79
|
// src/lib/tmux-routing.ts
|
|
79
80
|
import { execFile, execFileSync as execFileSync2 } from "child_process";
|
|
@@ -673,7 +674,7 @@ async function createTaskCore(input) {
|
|
|
673
674
|
if (isCoordinatorSession) {
|
|
674
675
|
earlySessionScope = resolved;
|
|
675
676
|
} else {
|
|
676
|
-
const { getSessionProject } = await import("./session-scope-
|
|
677
|
+
const { getSessionProject } = await import("./session-scope-JTPHECAU.js");
|
|
677
678
|
const sessionProject = getSessionProject(resolved);
|
|
678
679
|
if (sessionProject && sessionProject !== input.projectName) {
|
|
679
680
|
scopeMismatchWarning = `session/project mismatch: session "${resolved}" owns "${sessionProject}" but task targets "${input.projectName}". Routed to default scope.`;
|
|
@@ -922,7 +923,7 @@ async function queryTaskRows(opts) {
|
|
|
922
923
|
}
|
|
923
924
|
if (opts.founderId !== null) {
|
|
924
925
|
try {
|
|
925
|
-
const { founderScopeFilter } = await import("./founder-context-
|
|
926
|
+
const { founderScopeFilter } = await import("./founder-context-A4VUEKDH.js");
|
|
926
927
|
const founderFilter = founderScopeFilter(opts.founderId);
|
|
927
928
|
const cleaned = founderFilter.sql.replace(/^\s*AND\s+/, "");
|
|
928
929
|
conditions.push(cleaned);
|
|
@@ -940,10 +941,12 @@ async function queryTaskRows(opts) {
|
|
|
940
941
|
const cols = opts.columns ?? "*";
|
|
941
942
|
const order = opts.orderBy ?? "priority ASC, created_at DESC";
|
|
942
943
|
const limit = opts.limit ?? 100;
|
|
943
|
-
const result = await
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
944
|
+
const result = await offloadReadIfMain(
|
|
945
|
+
client,
|
|
946
|
+
`SELECT ${cols} FROM tasks ${where} ORDER BY ${order} LIMIT ?`,
|
|
947
|
+
[...args, limit],
|
|
948
|
+
true
|
|
949
|
+
);
|
|
947
950
|
return result.rows;
|
|
948
951
|
}
|
|
949
952
|
function getProjectNameSafe() {
|
|
@@ -1104,9 +1107,10 @@ async function updateTaskStatus(input) {
|
|
|
1104
1107
|
if (input.status === "done") {
|
|
1105
1108
|
input.status = "needs_review";
|
|
1106
1109
|
}
|
|
1107
|
-
const isReviewTransition =
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
+
const isReviewTransition = input.status === "needs_review" && previousStatus !== "needs_review" && (previousStatus === "open" || previousStatus === "in_progress");
|
|
1111
|
+
const effectiveReviewer = row.reviewer ? String(row.reviewer) : row.assigned_by ? String(row.assigned_by) : "";
|
|
1112
|
+
if (isReviewTransition && effectiveReviewer) {
|
|
1113
|
+
const reviewer = effectiveReviewer;
|
|
1110
1114
|
try {
|
|
1111
1115
|
const { sendIntercom: sendIntercom2, employeeSessionName: employeeSessionName2, resolveExeSession: resolveExeSession2, isExeSession: isExeSession2 } = await import("./lib/tmux-routing.js");
|
|
1112
1116
|
const exeSession = row.session_scope ? String(row.session_scope) : resolveExeSession2();
|
|
@@ -1154,7 +1158,7 @@ async function updateTaskStatus(input) {
|
|
|
1154
1158
|
} catch {
|
|
1155
1159
|
}
|
|
1156
1160
|
try {
|
|
1157
|
-
const { writeNotification: writeNotification2 } = await import("./notifications-
|
|
1161
|
+
const { writeNotification: writeNotification2 } = await import("./notifications-Q5NEAP6K.js");
|
|
1158
1162
|
await writeNotification2({
|
|
1159
1163
|
agentId: reviewer,
|
|
1160
1164
|
agentRole: isCoordinatorName(reviewer) ? "COO" : "manager",
|
|
@@ -1574,7 +1578,7 @@ ${input.result ?? ""}`;
|
|
|
1574
1578
|
}
|
|
1575
1579
|
if (shouldWriteCompletionMemory && input.result) {
|
|
1576
1580
|
try {
|
|
1577
|
-
const { writeMemoryViaDaemon } = await import("./memory-queue-client-
|
|
1581
|
+
const { writeMemoryViaDaemon } = await import("./memory-queue-client-YP2QKX6J.js");
|
|
1578
1582
|
await writeMemoryViaDaemon({
|
|
1579
1583
|
raw_text: input.result,
|
|
1580
1584
|
agent_id: String(row.assigned_to),
|
|
@@ -1677,7 +1681,7 @@ ${input.result ?? ""}`;
|
|
|
1677
1681
|
}
|
|
1678
1682
|
if (input.status === "done" || input.status === "needs_review") {
|
|
1679
1683
|
try {
|
|
1680
|
-
const { incrementSkillSuccess } = await import("./skill-refinement-
|
|
1684
|
+
const { incrementSkillSuccess } = await import("./skill-refinement-VTYL4OMJ.js");
|
|
1681
1685
|
await incrementSkillSuccess(
|
|
1682
1686
|
String(row.assigned_to),
|
|
1683
1687
|
row.project_name ? String(row.project_name) : null
|
|
@@ -2836,7 +2840,7 @@ function formatIntercomPrompt(reason = "nudge") {
|
|
|
2836
2840
|
case "completion":
|
|
2837
2841
|
return "An employee completed work. Run task(action='list', status='needs_review') to review it.";
|
|
2838
2842
|
case "message":
|
|
2839
|
-
return "
|
|
2843
|
+
return "Check your inbox for new messages. Run message(action='read') to check, and message(action='acknowledge') after reading. Only check task(action='list') if a message references work.";
|
|
2840
2844
|
case "notification":
|
|
2841
2845
|
return "You have pending notifications. Run task(action='list', status='needs_review') and task(action='list', status='open') to check actionable work.";
|
|
2842
2846
|
case "signal":
|
|
@@ -3014,6 +3018,7 @@ function isRootSession(name) {
|
|
|
3014
3018
|
}
|
|
3015
3019
|
var VALID_SESSION_NAME = /^[a-z]+\d*-[a-zA-Z0-9_]+$/;
|
|
3016
3020
|
function employeeSessionName(employee, exeSession, instance) {
|
|
3021
|
+
employee = employee.toLowerCase();
|
|
3017
3022
|
if (!isRootSession(exeSession)) {
|
|
3018
3023
|
const root = extractRootExe(exeSession);
|
|
3019
3024
|
if (root) {
|
|
@@ -3315,7 +3320,7 @@ async function verifyPaneAtCapacity(sessionName) {
|
|
|
3315
3320
|
reason: `capture-pane failed: ${err instanceof Error ? err.message : String(err)}`
|
|
3316
3321
|
};
|
|
3317
3322
|
}
|
|
3318
|
-
const { isAtCapacity } = await import("./capacity-monitor-
|
|
3323
|
+
const { isAtCapacity } = await import("./capacity-monitor-ZRLW7TVL.js");
|
|
3319
3324
|
if (!isAtCapacity(pane)) {
|
|
3320
3325
|
return {
|
|
3321
3326
|
atCapacity: false,
|
|
@@ -3780,6 +3785,7 @@ async function ensureWorktreeAsync(projectDir, employeeName, instance) {
|
|
|
3780
3785
|
}
|
|
3781
3786
|
}
|
|
3782
3787
|
function ensureEmployee(employeeName, exeSession, projectDir, opts) {
|
|
3788
|
+
employeeName = employeeName.toLowerCase();
|
|
3783
3789
|
if (isCoordinatorName(employeeName)) {
|
|
3784
3790
|
return { status: "failed", sessionName: "", error: "The coordinator is not a dispatchable employee" };
|
|
3785
3791
|
}
|
|
@@ -3874,7 +3880,7 @@ function ensureEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
3874
3880
|
return { status: "failed", sessionName, error: "intercom delivery failed" };
|
|
3875
3881
|
}
|
|
3876
3882
|
const spawnOpts = { ...opts, instance: effectiveInstance };
|
|
3877
|
-
if (!spawnOpts.cwd
|
|
3883
|
+
if (!spawnOpts.cwd) {
|
|
3878
3884
|
const COORDINATOR_ROLES = /* @__PURE__ */ new Set(["COO", "CTO", "CMO"]);
|
|
3879
3885
|
try {
|
|
3880
3886
|
const roster = loadEmployeesSync();
|
|
@@ -3965,13 +3971,21 @@ async function ensureEmployeeAsync(employeeName, exeSession, projectDir, opts) {
|
|
|
3965
3971
|
const wtPath = await ensureWorktreeAsync(projectDir, employeeName, asyncOpts.instance);
|
|
3966
3972
|
if (wtPath) asyncOpts.cwd = wtPath;
|
|
3967
3973
|
}
|
|
3968
|
-
} catch {
|
|
3974
|
+
} catch (err) {
|
|
3975
|
+
process.stderr.write(
|
|
3976
|
+
`[ensureEmployeeAsync] worktree setup failed for ${employeeName}: ${err instanceof Error ? err.message : String(err)}
|
|
3977
|
+
`
|
|
3978
|
+
);
|
|
3969
3979
|
}
|
|
3970
3980
|
}
|
|
3971
3981
|
try {
|
|
3972
3982
|
const sessionName = employeeSessionName(employeeName, exeSession, asyncOpts.instance);
|
|
3973
3983
|
await exportBehaviorsAsync(employeeName, path7.basename(asyncOpts.cwd ?? projectDir), sessionName);
|
|
3974
|
-
} catch {
|
|
3984
|
+
} catch (err) {
|
|
3985
|
+
process.stderr.write(
|
|
3986
|
+
`[ensureEmployeeAsync] behavior export failed for ${employeeName}: ${err instanceof Error ? err.message : String(err)}
|
|
3987
|
+
`
|
|
3988
|
+
);
|
|
3975
3989
|
}
|
|
3976
3990
|
const result = ensureEmployee(employeeName, exeSession, projectDir, asyncOpts);
|
|
3977
3991
|
if (asyncOpts.spawnLockHeld && result.status === "failed" && result.sessionName) {
|
|
@@ -4075,7 +4089,7 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
4075
4089
|
);
|
|
4076
4090
|
const isCodeRole = emp != null && !COORDINATOR_ROLES.has(emp.role);
|
|
4077
4091
|
if (isCodeRole) {
|
|
4078
|
-
const reason = opts?.cwd != null ? "preset_cwd" :
|
|
4092
|
+
const reason = opts?.cwd != null ? "preset_cwd" : "git_timeout";
|
|
4079
4093
|
process.stderr.write(
|
|
4080
4094
|
`[tmux-routing] WORKTREE BYPASSED: code-role ${employeeName} (role=${emp.role}) spawning in MAIN checkout ${spawnCwd} (reason=${reason}) \u2014 commits will land on main
|
|
4081
4095
|
`
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
storeBehavior
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-24BUDF3J.js";
|
|
4
4
|
import {
|
|
5
5
|
getClient
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-VG4ZH2Z3.js";
|
|
7
7
|
import {
|
|
8
8
|
loadConfig
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-WCES22KG.js";
|
|
10
10
|
|
|
11
11
|
// src/lib/skill-learning.ts
|
|
12
12
|
import crypto from "crypto";
|
|
@@ -3,16 +3,16 @@ import {
|
|
|
3
3
|
} from "./chunk-VUH67PT4.js";
|
|
4
4
|
import {
|
|
5
5
|
isGhostBehaviorRow
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-24BUDF3J.js";
|
|
7
7
|
import {
|
|
8
8
|
getClient,
|
|
9
9
|
getIdentity,
|
|
10
10
|
listIdentities,
|
|
11
11
|
updateIdentity
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-VG4ZH2Z3.js";
|
|
13
13
|
import {
|
|
14
14
|
atomicWriteJsonSync
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-SHIICYJW.js";
|
|
16
16
|
|
|
17
17
|
// src/lib/orchestration-package.ts
|
|
18
18
|
import { randomUUID } from "crypto";
|