@askexenow/exe-os 0.9.365 → 0.9.368
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 +3 -1
- package/deploy/compose/.env.customer.example +6 -2
- package/deploy/compose/.env.example +8 -2
- package/deploy/compose/docker-compose.yml +21 -2
- package/deploy/compose/generate-env.ts +21 -1
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-MGF7J3HB.js → active-agent-6WNC756A.js} +3 -3
- package/dist/{active-agent-C6DPH43L.js → active-agent-RDTJGZHP.js} +3 -3
- package/dist/{agent-defs-generator-X7TVMPVB.js → agent-defs-generator-M5AUL3WM.js} +2 -2
- package/dist/agent-heartbeat-CQPGJIFF.js +13 -0
- package/dist/{agent-loop-E7RZCFDB.js → agent-loop-FOK2IRZQ.js} +1 -1
- package/dist/{agentic-ontology-CARDCG37.js → agentic-ontology-ZJBRYETW.js} +1 -1
- package/dist/{backfill-metadata-ANCJA6LA.js → backfill-metadata-Q4X23XLR.js} +5 -5
- package/dist/{backup-verify-F7BHVEF7.js → backup-verify-UKLX6IEK.js} +1 -1
- package/dist/behavior-injection-C3HEKSJY.js +60 -0
- package/dist/{behaviors-R2IE3PEN.js → behaviors-UCMAREU3.js} +8 -6
- package/dist/bin/agentic-ontology-backfill.js +6 -6
- package/dist/bin/agentic-reflection-backfill.js +7 -7
- package/dist/bin/agentic-semantic-label.js +6 -6
- package/dist/bin/backfill-conversations.js +5 -5
- package/dist/bin/backfill-responses.js +5 -5
- package/dist/bin/backfill-vectors.js +6 -6
- package/dist/bin/bulk-sync-postgres.js +10 -10
- package/dist/bin/cc-doctor.js +5 -5
- package/dist/bin/cleanup-stale-review-tasks.js +15 -14
- package/dist/bin/cli.js +20 -20
- package/dist/bin/deferred-daemon-restart.js +88 -83
- package/dist/bin/exe-agent-config.js +2 -2
- package/dist/bin/exe-agent.js +252 -14
- package/dist/bin/exe-assign.js +6 -6
- package/dist/bin/exe-boot.js +33 -31
- package/dist/bin/exe-call.js +4 -4
- package/dist/bin/exe-cloud.js +11 -11
- package/dist/bin/exe-config-dump.js +2 -2
- package/dist/bin/exe-dispatch.js +16 -15
- package/dist/bin/exe-doctor.js +6 -6
- package/dist/bin/exe-export-behaviors.js +10 -8
- package/dist/bin/exe-forget.js +7 -7
- package/dist/bin/exe-gateway.js +7 -7
- package/dist/bin/exe-healthcheck.js +5 -5
- package/dist/bin/exe-heartbeat.js +18 -17
- package/dist/bin/exe-kill.js +19 -18
- package/dist/bin/exe-launch-agent.js +25 -23
- package/dist/bin/exe-mcp.js +3 -3
- package/dist/bin/exe-memory-reads.js +5 -5
- package/dist/bin/exe-new-employee.js +8 -8
- package/dist/bin/exe-os-mcp-proxy.js +3 -3
- package/dist/bin/exe-pending-messages.js +16 -15
- package/dist/bin/exe-pending-notifications.js +15 -14
- package/dist/bin/exe-pending-reviews.js +15 -14
- package/dist/bin/exe-rename.js +4 -4
- package/dist/bin/exe-review.js +18 -17
- package/dist/bin/exe-search.js +6 -6
- package/dist/bin/exe-session-cleanup.js +20 -18
- package/dist/bin/exe-settings.js +10 -10
- package/dist/bin/exe-start-codex.js +81 -19
- package/dist/bin/exe-start-opencode.js +11 -9
- package/dist/bin/exe-status.js +17 -16
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +4 -4
- package/dist/bin/exe-verify-running-images.js +123 -4
- package/dist/bin/exe-watchdog.js +44 -3
- package/dist/bin/git-sweep.js +25 -15
- package/dist/bin/graph-backfill.js +7 -7
- package/dist/bin/graph-export.js +6 -6
- package/dist/bin/import-history.js +10 -10
- package/dist/bin/install.js +90 -85
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +4 -4
- package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
- package/dist/bin/postgres-agentic-semantic-backfill.js +4 -4
- package/dist/bin/reconcile-backlog.js +47 -6
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/scan-tasks.js +15 -14
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +5 -5
- package/dist/bin/stack-update.js +35 -6
- package/dist/bin/verify-stack.js +11 -1
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-X45BSVZY.js → boot-generation-7H7Y4KC2.js} +3 -3
- package/dist/{boot-review-sections-OBVRXXSF.js → boot-review-sections-4AGCECCP.js} +14 -13
- package/dist/build-manifest.json +910 -845
- package/dist/{capability-cards-57FURUMR.js → capability-cards-6KAC5D2Z.js} +2 -2
- package/dist/{capacity-monitor-QEL62JDO.js → capacity-monitor-J2Y4SFLA.js} +16 -15
- package/dist/{catchup-brief-PMXTCASA.js → catchup-brief-F2HKF2CU.js} +19 -18
- package/dist/{chunk-5CBGH6RA.js → chunk-2AS6FG6C.js} +3 -3
- package/dist/{chunk-TO6TB75E.js → chunk-2UBMXN4D.js} +2 -2
- package/dist/{chunk-J6I7X272.js → chunk-2UGU3V63.js} +1 -1
- package/dist/{chunk-45EQTS7B.js → chunk-34BMZTWV.js} +1 -1
- package/dist/{chunk-JYFYIGYK.js → chunk-4DGIOK6T.js} +1 -1
- package/dist/{chunk-T6S45OLV.js → chunk-4GVJIMMK.js} +12 -6
- package/dist/{chunk-IXEFO6HD.js → chunk-4L732DE5.js} +3 -3
- package/dist/{chunk-MXEIZUXG.js → chunk-4RRMZJLG.js} +1 -1
- package/dist/{chunk-3JNVB5LG.js → chunk-5IVLOOJR.js} +1 -1
- package/dist/chunk-5YKNEL3W.js +356 -0
- package/dist/{chunk-EMZHB767.js → chunk-6EXOW5ZA.js} +9 -9
- package/dist/{chunk-6Q263OZE.js → chunk-6P7DVFKA.js} +1 -1
- package/dist/{chunk-ZDUO6QBH.js → chunk-6UZ3DEQI.js} +1 -1
- package/dist/{chunk-DJK45U7B.js → chunk-72JZQ7EV.js} +1 -1
- package/dist/{chunk-22YQBVMO.js → chunk-72QUZX6J.js} +4 -4
- package/dist/{chunk-DYWGIPVP.js → chunk-AAL6CDMQ.js} +7 -7
- package/dist/{chunk-E6ORBQHP.js → chunk-AAMGHW5W.js} +1 -0
- package/dist/{chunk-EJ4522YM.js → chunk-AJGX4Z34.js} +1 -1
- package/dist/{chunk-M7EES2KM.js → chunk-BEPO36MW.js} +3 -3
- package/dist/{chunk-WR75WUEP.js → chunk-BFL3UB77.js} +1 -1
- package/dist/{chunk-NV6A5HDN.js → chunk-BFPQXPN3.js} +1 -1
- package/dist/{chunk-VGE6IHZB.js → chunk-BJKC6ZJU.js} +110 -86
- package/dist/{chunk-R7RM766N.js → chunk-BLNSUBP3.js} +3 -3
- package/dist/{chunk-52TIQJEQ.js → chunk-BNDHQGOY.js} +1 -1
- package/dist/{chunk-QYJANQWC.js → chunk-BPQWRR4H.js} +2 -2
- package/dist/{chunk-ANPE3TT3.js → chunk-BTGR55GX.js} +3 -3
- package/dist/chunk-BTSWFMEH.js +14 -0
- package/dist/{chunk-OPNROU5B.js → chunk-C4IJ5IS5.js} +1 -1
- package/dist/{chunk-BEHLIRRJ.js → chunk-C5FOA5GO.js} +14 -3
- package/dist/{chunk-EHHMNKOA.js → chunk-CSBD7QLZ.js} +1 -1
- package/dist/{chunk-EKVTRI3N.js → chunk-CU2OUUSV.js} +27 -6
- package/dist/{chunk-P47MPWNU.js → chunk-CXHRNESJ.js} +1 -1
- package/dist/{chunk-F2S3M5MB.js → chunk-DRMGPZSC.js} +2 -2
- package/dist/{chunk-KRUYQFSH.js → chunk-DYPKSVB7.js} +5 -5
- package/dist/{chunk-KSVLBATT.js → chunk-E5QQZDQN.js} +53 -0
- package/dist/{chunk-ODBRU6BF.js → chunk-EDB3LXBQ.js} +1542 -984
- package/dist/{chunk-IIZITKBV.js → chunk-EDRXCUEP.js} +4 -4
- package/dist/{chunk-4QKKLK3C.js → chunk-ELY5WBZX.js} +10 -10
- package/dist/{chunk-MPQXQ5IE.js → chunk-EZUSIF66.js} +1 -1
- package/dist/{chunk-DEFSN2FQ.js → chunk-FHYX64H3.js} +3 -3
- package/dist/{chunk-YMJOLEPE.js → chunk-FSALI4B7.js} +4 -4
- package/dist/{chunk-6GQYPJPG.js → chunk-FWKTZURC.js} +8 -8
- package/dist/{chunk-EWZYFG5Q.js → chunk-FWVPGXHD.js} +5 -5
- package/dist/{chunk-DWAQOEXL.js → chunk-GILYOIMP.js} +2 -2
- package/dist/{chunk-RZIKSE6N.js → chunk-GP3J3AOT.js} +4 -4
- package/dist/{chunk-LHOKWZKL.js → chunk-H6J7N3BZ.js} +1 -1
- package/dist/{chunk-EVPBYX2Z.js → chunk-HQSUXAB4.js} +1 -1
- package/dist/{chunk-IM2I7OOS.js → chunk-HTLJHSN4.js} +1 -1
- package/dist/{chunk-JUOZLXLH.js → chunk-HXV3DGL7.js} +1 -1
- package/dist/{chunk-OFGFRT5J.js → chunk-IEE6X6R2.js} +1 -1
- package/dist/{chunk-SP37DONS.js → chunk-IKRIUEIF.js} +1 -1
- package/dist/{chunk-RHX6MNWY.js → chunk-J44774XC.js} +1 -1
- package/dist/{chunk-7C4FUNVO.js → chunk-J77ZIMH5.js} +5 -5
- package/dist/{chunk-NO3M2AFM.js → chunk-JDPV7W2L.js} +1 -1
- package/dist/{chunk-FXPAUDCZ.js → chunk-KGPWS4KE.js} +1 -1
- package/dist/{chunk-L3TB7CC3.js → chunk-KM6XSFHP.js} +12 -2
- package/dist/{chunk-ZEKCHV43.js → chunk-KWQ7RHYD.js} +4 -4
- package/dist/{chunk-QFIVK3G5.js → chunk-KYVIV54Y.js} +1 -1
- package/dist/chunk-KZXMP6JG.js +319 -0
- package/dist/{chunk-AGQAGOQN.js → chunk-LJWCK2DR.js} +9 -9
- package/dist/{chunk-O2MEBF23.js → chunk-MCXYNYZI.js} +30 -2
- package/dist/{chunk-L2VZBPJJ.js → chunk-MWEIBVBS.js} +13 -1
- package/dist/{chunk-RVWALVDT.js → chunk-MXP27XTP.js} +2 -2
- package/dist/{chunk-DQ5KHWFD.js → chunk-N3CGSO3S.js} +1 -1
- package/dist/{chunk-ZNEBZCZR.js → chunk-NNXPIJRB.js} +1 -1
- package/dist/{chunk-MZJBUAC3.js → chunk-NWE3CFX7.js} +4 -4
- package/dist/{chunk-BRLS5OLZ.js → chunk-OBESOWFJ.js} +35 -4
- package/dist/{chunk-5KLQCGI5.js → chunk-OL3QP3AU.js} +171 -1
- package/dist/{chunk-ESTR7QUP.js → chunk-P3PAD6AA.js} +1 -1
- package/dist/{chunk-2FYIMTQE.js → chunk-PGF5I7EV.js} +2 -2
- package/dist/{agent-heartbeat-I5UPGXAU.js → chunk-PHUHIVD5.js} +4 -5
- package/dist/{chunk-C3UAQ3JG.js → chunk-PVWM2WMM.js} +1 -1
- package/dist/{chunk-EWCEUO65.js → chunk-QCSAYYL6.js} +1 -1
- package/dist/{chunk-SBAU735L.js → chunk-QE5KWKVU.js} +27 -6
- package/dist/{chunk-LZKYVMBY.js → chunk-QKZEUCTS.js} +2 -2
- package/dist/{chunk-POPRJKAY.js → chunk-QS6HI4B6.js} +6 -0
- package/dist/{chunk-JNVQGLPX.js → chunk-QT6CNCXO.js} +3 -3
- package/dist/{chunk-J4U5Z7VX.js → chunk-QZYYCPNL.js} +4 -4
- package/dist/{chunk-RD4E5G3B.js → chunk-RDIZSXXD.js} +1 -1
- package/dist/{chunk-2RQT7TED.js → chunk-RFWOXKVL.js} +55 -3
- package/dist/chunk-S2YTU74T.js +76 -0
- package/dist/{chunk-X6A2VWVJ.js → chunk-TP7BFVQP.js} +2 -2
- package/dist/{chunk-CKG6CVKI.js → chunk-TTJWPV4G.js} +1 -1
- package/dist/chunk-TX3Q2GIL.js +97 -0
- package/dist/{chunk-Q7BU5Q6I.js → chunk-UATT6BNO.js} +3 -3
- package/dist/{chunk-PPGPCWRC.js → chunk-UVM5ZXO2.js} +4 -4
- package/dist/{chunk-BATQKSLI.js → chunk-V7E37GE3.js} +2 -2
- package/dist/{chunk-U373MEF5.js → chunk-VD3CVNGB.js} +3 -3
- package/dist/{chunk-ZSZPMUNX.js → chunk-VIW62NN5.js} +126 -7
- package/dist/{chunk-EPNWEOOE.js → chunk-VTOO5UB3.js} +10 -10
- package/dist/chunk-W5MCOZTW.js +304 -0
- package/dist/{chunk-2ESB5SDP.js → chunk-WJOJWRN5.js} +139 -33
- package/dist/{chunk-CPILYY2K.js → chunk-X4MRVNR3.js} +1 -1
- package/dist/{chunk-EPDNWY5P.js → chunk-XBTQPQN7.js} +1 -1
- package/dist/{behavior-injection-XQ4B7DCF.js → chunk-XOTDAKJL.js} +24 -38
- package/dist/{chunk-ORNCMRIX.js → chunk-Y4AYNLXU.js} +31 -37
- package/dist/{chunk-WYLFDSIE.js → chunk-YGPJ7VSJ.js} +48 -10
- package/dist/{chunk-ZRKEUCUZ.js → chunk-ZR3VMM3X.js} +12 -10
- package/dist/{chunk-JITNFE4W.js → chunk-ZWONQU5S.js} +1 -1
- package/dist/{cleanup-graph-garbage-CAA625RJ.js → cleanup-graph-garbage-FBSQI33K.js} +8 -8
- package/dist/{cloud-sync-command-DBB7WRHL.js → cloud-sync-command-NHGVDTLM.js} +11 -3
- package/dist/{cloud-sync-db-init-V7IB23W5.js → cloud-sync-db-init-I75VOTXC.js} +1 -1
- package/dist/{cloud-sync-shutdown-2D3B73CJ.js → cloud-sync-shutdown-JGOFGGET.js} +2 -2
- package/dist/{cloud-sync-state-5DFKLWNB.js → cloud-sync-state-QF3TMMJ4.js} +3 -1
- package/dist/{co-activation-JVN7EBS6.js → co-activation-AE5L2SJV.js} +2 -2
- package/dist/{co-occurrence-526PTFGT.js → co-occurrence-O65D4SCN.js} +6 -6
- package/dist/codex-consolidation-PPXNBXCV.js +96 -0
- package/dist/{conversation-entity-extractor-JO56DB2E.js → conversation-entity-extractor-LFIDTD2O.js} +4 -4
- package/dist/{crdt-sync-LIJLZKFE.js → crdt-sync-NRWDBRSE.js} +1 -1
- package/dist/{crm-webhook-55F7Y6D2.js → crm-webhook-XOQGX6DV.js} +2 -2
- package/dist/{cto-delegation-gate-QIYV4KFO.js → cto-delegation-gate-ZGOAXQI2.js} +14 -13
- package/dist/{daemon-orchestration-Q3GJA2JJ.js → daemon-orchestration-ZMQWYYDT.js} +19 -18
- package/dist/dispatch-intent-journal-VV6HMZC4.js +17 -0
- package/dist/{doc-graph-extractor-P46R4QME.js → doc-graph-extractor-6C5JBKPP.js} +6 -6
- package/dist/{documents-7KFEREWO.js → documents-FKSQGSO4.js} +6 -6
- package/dist/{dreaming-JMUXBAPU.js → dreaming-IB3H6NDZ.js} +18 -17
- package/dist/{employee-boot-brief-HN63D2BY.js → employee-boot-brief-5YRTUEJH.js} +25 -21
- package/dist/{exe-drift-7J7GX7DP.js → exe-drift-CUWUYX3O.js} +3 -3
- package/dist/{exe-export-KJ7B2OBU.js → exe-export-XWENYJNM.js} +7 -7
- package/dist/{exe-import-HPZDWKGE.js → exe-import-OWOMRF2S.js} +7 -7
- package/dist/{exe-key-2PREP464.js → exe-key-P356FGK5.js} +88 -83
- package/dist/{exe-org-VEIISATF.js → exe-org-UKIVF3KE.js} +8 -8
- package/dist/{exe-snapshot-JXQFLUKA.js → exe-snapshot-AZI2WW5Y.js} +19 -18
- package/dist/{fast-db-init-SCXJXOYX.js → fast-db-init-FPAPF3GB.js} +1 -1
- package/dist/{founder-context-U2SZPLYV.js → founder-context-QTQ6V3B5.js} +2 -2
- package/dist/gateway/index.js +11 -11
- package/dist/{git-staleness-S4NDR7NX.js → git-staleness-6ACWLV5Q.js} +2 -2
- package/dist/{global-procedures-ZOFTOXIR.js → global-procedures-RXIKBVLZ.js} +3 -3
- package/dist/{graph-auto-extract-CLVTSUSB.js → graph-auto-extract-Q4A4QMOF.js} +6 -6
- package/dist/{graph-rag-LSJLWGXV.js → graph-rag-RLRQMY54.js} +4 -4
- package/dist/{hook-integrity-SGTKBL6W.js → hook-integrity-3X2JRLBM.js} +1 -1
- package/dist/{hook-prefetch-BDSLB6F4.js → hook-prefetch-DU44UZQP.js} +15 -14
- package/dist/hooks/bug-report-worker.js +19 -18
- package/dist/hooks/codex-stop-task-finalizer.js +20 -19
- package/dist/hooks/commit-complete.js +35 -19
- package/dist/hooks/error-recall.js +8 -8
- package/dist/hooks/exe-heartbeat-hook.js +4 -4
- package/dist/hooks/ingest-worker.js +2 -2
- package/dist/hooks/ingest.js +11 -11
- package/dist/hooks/instructions-loaded.js +5 -5
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +5 -5
- package/dist/hooks/post-compact.js +4 -4
- package/dist/hooks/post-tool-combined.js +12 -12
- package/dist/hooks/pre-compact.js +18 -17
- package/dist/hooks/pre-tool-use.js +86 -34
- package/dist/hooks/prompt-submit.js +36 -31
- package/dist/hooks/session-end.js +114 -100
- package/dist/hooks/session-start.js +16 -16
- package/dist/hooks/stop.js +83 -20
- package/dist/hooks/subagent-stop.js +19 -18
- package/dist/hooks/summary-worker.js +23 -22
- package/dist/index.js +27 -26
- package/dist/{installer-RC2JCKSE.js → installer-B7QYQE56.js} +8 -6
- package/dist/{installer-EA7T3PBD.js → installer-EXR25DDG.js} +6 -6
- package/dist/{installer-KCEM4RCG.js → installer-TOPA7673.js} +152 -8
- package/dist/{intercom-queue-6DZPHHQ2.js → intercom-queue-BZ4M3L4S.js} +14 -13
- package/dist/lib/cloud-sync.js +10 -10
- package/dist/lib/consolidation.js +8 -8
- package/dist/lib/database.js +2 -2
- package/dist/lib/db-backup.js +1 -1
- package/dist/lib/db-write-worker.js +3 -3
- package/dist/lib/db.js +2 -2
- package/dist/lib/delivery-truth.js +25 -0
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/employee-templates.js +4 -4
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon.js +185 -79
- package/dist/lib/hybrid-search.js +6 -6
- package/dist/lib/identity.js +2 -2
- package/dist/lib/license.js +2 -2
- package/dist/lib/messaging.js +15 -14
- package/dist/lib/registry-proxy.js +1 -1
- package/dist/lib/reminders.js +3 -3
- package/dist/lib/schedules.js +6 -6
- package/dist/lib/session-registry.js +4 -4
- package/dist/lib/skill-learning.js +7 -7
- package/dist/lib/status-brief.js +2 -1
- package/dist/lib/store.js +5 -5
- package/dist/lib/task-router.js +3 -3
- package/dist/lib/tasks.js +16 -15
- package/dist/lib/tmux-routing.js +14 -13
- package/dist/lib/token-spend.js +3 -3
- package/dist/{license-gate-HMSMUIAU.js → license-gate-YTIOLKVV.js} +3 -3
- package/dist/{license-sync-FBCMPC4J.js → license-sync-5VE5OSTV.js} +2 -2
- package/dist/mcp/register-tools.js +87 -82
- package/dist/mcp/server.js +90 -85
- package/dist/mcp/tools/complete-reminder.js +4 -4
- package/dist/mcp/tools/create-reminder.js +4 -4
- package/dist/mcp/tools/create-task.js +26 -23
- package/dist/mcp/tools/deactivate-behavior.js +8 -8
- package/dist/mcp/tools/list-reminders.js +4 -4
- package/dist/mcp/tools/list-tasks.js +18 -17
- package/dist/mcp/tools/send-message.js +17 -16
- package/dist/mcp/tools/update-task.js +17 -16
- package/dist/{mcp-http-config-YKJN52HG.js → mcp-http-config-XUNRIGQH.js} +3 -3
- package/dist/{mcp-session-identity-QLUVYWPR.js → mcp-session-identity-4UIG7KLK.js} +14 -13
- package/dist/{memory-cards-K2OSX4AW.js → memory-cards-R74YU4CO.js} +5 -5
- package/dist/{memory-graph-extractor-YLTSKLSY.js → memory-graph-extractor-3B4QJUXI.js} +7 -7
- package/dist/{memory-poisoning-defense-IPO4ADRL.js → memory-poisoning-defense-OAKFL5O2.js} +2 -2
- package/dist/{memory-pressure-watchdog-ZI3TH2OF.js → memory-pressure-watchdog-FFC2CHFJ.js} +15 -14
- package/dist/{memory-reflection-ZKVRU3NT.js → memory-reflection-5IJ6RE2J.js} +2 -2
- package/dist/{notification-ledger-4REL6M3T.js → notification-ledger-P5XBUYKO.js} +17 -15
- package/dist/{notifications-UXJUAP3C.js → notifications-LLCCHRYV.js} +14 -13
- package/dist/{orchestration-events-GMRGGBMN.js → orchestration-events-VBGCIQSS.js} +3 -3
- package/dist/{orchestrator-5TV75HDJ.js → orchestrator-EB3SCTAJ.js} +16 -15
- package/dist/{org-brief-session-7AZZEO3F.js → org-brief-session-GDCDKBFF.js} +6 -6
- package/dist/{org-consent-policy-XT6UZENB.js → org-consent-policy-HCD42NBN.js} +2 -2
- package/dist/{org-partner-runtime-WLZAZJIY.js → org-partner-runtime-TPVKFR6E.js} +6 -6
- package/dist/{org-row-visibility-A5XM4MVO.js → org-row-visibility-ZZLOPZLH.js} +1 -1
- package/dist/{pipeline-router-UEVXDUHR.js → pipeline-router-3JTL2KF6.js} +3 -3
- package/dist/{plan-limits-QEP32X4W.js → plan-limits-MTHRP4WY.js} +5 -5
- package/dist/{projection-worker-GMRC6SBH.js → projection-worker-FLASNERC.js} +2 -2
- package/dist/{prospective-memory-QLHSAPSG.js → prospective-memory-HI3WUY4U.js} +2 -2
- package/dist/{push-notifications-GKRPXOGI.js → push-notifications-DFSR6P7V.js} +15 -14
- package/dist/{reranker-GB4VEMUV.js → reranker-XHBKUDGG.js} +1 -1
- package/dist/{retrieval-health-QIBPBGN6.js → retrieval-health-NYKSDS6M.js} +1 -1
- package/dist/{review-polling-MU47NQ2N.js → review-polling-UAV6DZIZ.js} +15 -14
- package/dist/runtime/index.js +23 -22
- package/dist/{session-events-YMQ3VGBJ.js → session-events-YCYPLWPG.js} +15 -14
- package/dist/{session-kill-telemetry-VGPKE57M.js → session-kill-telemetry-UEJTHL65.js} +15 -14
- package/dist/{session-scope-P46KAHXQ.js → session-scope-LXDW7LJJ.js} +14 -13
- package/dist/{setup-wizard-BRNHSJ4U.js → setup-wizard-OVJQYUUL.js} +1 -1
- package/dist/{skill-refinement-NLYDSFEH.js → skill-refinement-EWRJID73.js} +3 -3
- package/dist/{stack-promote-NHFTNIM2.js → stack-promote-4IJM36OG.js} +5 -4
- package/dist/{stack-release-AQVKZUS7.js → stack-release-BAIRY65H.js} +5 -4
- package/dist/{stack-update-LLX5KT7G.js → stack-update-VDM5WXRS.js} +10 -3
- package/dist/stalled-dispatch-escalation-MHLYH2PT.js +80 -0
- package/dist/{steward-gate-JKHYFAHA.js → steward-gate-Y4N2XY3R.js} +3 -3
- package/dist/{subagent-brief-injection-VDVOHDOU.js → subagent-brief-injection-7A6JEVTP.js} +22 -20
- package/dist/{support-inbox-S6YO5YZU.js → support-inbox-LT4WJECQ.js} +4 -3
- package/dist/{task-enforcement-LXW45H5Z.js → task-enforcement-WOIZ5TLK.js} +15 -14
- package/dist/{task-request-inbox-UCSKDC3R.js → task-request-inbox-D65BPUKZ.js} +2 -2
- package/dist/{task-scope-GDLFE26E.js → task-scope-PQ67YRWP.js} +18 -16
- package/dist/{tasks-crud-W7VGWRUV.js → tasks-crud-TJNMUKKH.js} +14 -13
- package/dist/{tasks-notify-CT7NWCS4.js → tasks-notify-7UVC3VGI.js} +15 -14
- package/dist/{tasks-review-WCSKOUFW.js → tasks-review-WDWYISZ2.js} +14 -13
- package/dist/{telemetry-upload-FK5WKXVB.js → telemetry-upload-6LBGRJUE.js} +7 -7
- package/dist/{token-budget-GBNGSIU3.js → token-budget-XO5XW6DL.js} +3 -3
- package/dist/{tool-gates-3IC7DK4R.js → tool-gates-2OZY3GZM.js} +1 -1
- package/dist/{tool-gates-GXSYBVK4.js → tool-gates-7PLIOLAL.js} +1 -1
- package/dist/{tool-telemetry-VKMRS6MP.js → tool-telemetry-ZL6TTZWG.js} +1 -1
- package/dist/tui/App.js +23 -22
- package/dist/{tui-data-FTPV2XBQ.js → tui-data-UK7ZPKN4.js} +14 -13
- package/dist/{update-support-J6UWPUOC.js → update-support-BGL5KAZO.js} +12 -12
- package/dist/work-claims-XZL2DKQ3.js +53 -0
- package/dist/{work-state-heartbeat-4LDF6DSM.js → work-state-heartbeat-267YQ75U.js} +1 -1
- package/dist/{worker-gate-35VZINZG.js → worker-gate-RUM6MLIR.js} +1 -1
- package/dist/{workflow-engine-4DA6RSHI.js → workflow-engine-YQHGHKSJ.js} +2 -2
- package/dist/{worktree-H3YFJ3NU.js → worktree-3FO6EQ4G.js} +4 -4
- package/dist/{worktree-sweep-4EDLLQ2E.js → worktree-sweep-X7MUEEQS.js} +5 -5
- package/package.json +7 -2
- package/release-notes.json +93 -81
- /package/dist/{chunk-7Y6AQWVT.js → chunk-4AN2PWUK.js} +0 -0
- /package/dist/{chunk-7DMCAGSC.js → chunk-5U4UJGTW.js} +0 -0
- /package/dist/{chunk-3THNS2T7.js → chunk-EYIX6JU7.js} +0 -0
- /package/dist/{chunk-QYECRPGD.js → chunk-FDA45THL.js} +0 -0
- /package/dist/{chunk-MBBFL2SP.js → chunk-GIO4VU4J.js} +0 -0
- /package/dist/{chunk-LKYGSJ2E.js → chunk-I76LRCNA.js} +0 -0
- /package/dist/{chunk-UY6HRDB2.js → chunk-LBWEAQ6Z.js} +0 -0
- /package/dist/{chunk-VS4LPG66.js → chunk-MQ5RUHNZ.js} +0 -0
- /package/dist/{chunk-G2EAYH4U.js → chunk-PFCE4AXQ.js} +0 -0
- /package/dist/{chunk-3NBWARKC.js → chunk-SXAERZL2.js} +0 -0
- /package/dist/{chunk-BY7WWPRM.js → chunk-TKTQRSSD.js} +0 -0
- /package/dist/{chunk-JRPYLUXH.js → chunk-U2AZUMBZ.js} +0 -0
- /package/dist/{chunk-CMBF5WCL.js → chunk-W6FVADZS.js} +0 -0
- /package/dist/{core-memory-CMPPHJN5.js → core-memory-W5ZHHBRR.js} +0 -0
- /package/dist/{memory-isolation-ZB5S5HCO.js → memory-isolation-ZE7EDBO4.js} +0 -0
- /package/dist/{oauth-server-NP7KGF7N.js → oauth-server-3HG62YYJ.js} +0 -0
- /package/dist/{project-boot-LEZSK3W7.js → project-boot-3OAWKYLO.js} +0 -0
- /package/dist/{wiki-acl-5DKOWOIH.js → wiki-acl-FQV4E6M4.js} +0 -0
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
compareLiveArtifacts,
|
|
3
|
+
declaredArtifactsFromManifest,
|
|
4
|
+
parseDigest
|
|
5
|
+
} from "./chunk-W5MCOZTW.js";
|
|
6
|
+
import {
|
|
7
|
+
CANONICAL_SSO_COOKIE,
|
|
8
|
+
evaluateSsoCookieContract
|
|
9
|
+
} from "./chunk-TCTED52S.js";
|
|
1
10
|
import {
|
|
2
11
|
isMainModule
|
|
3
12
|
} from "./chunk-6Y4B3QF6.js";
|
|
@@ -24,6 +33,13 @@ var FRONTEND_URLS = {
|
|
|
24
33
|
"exe-monitor-hub": "http://127.0.0.1:8090"
|
|
25
34
|
};
|
|
26
35
|
var GOTRUE_TOKEN_URL = "http://127.0.0.1:9999/token?grant_type=password";
|
|
36
|
+
var SSO_GATED_URLS = {
|
|
37
|
+
"exe-erp": "http://127.0.0.1:8069/login",
|
|
38
|
+
"exe-wiki": "http://127.0.0.1:3001/",
|
|
39
|
+
"exe-crm": "http://127.0.0.1:3000/"
|
|
40
|
+
};
|
|
41
|
+
var SSO_COOKIE_CONTRACT_CHECK_NAME = "SSO auth cookie contract";
|
|
42
|
+
var LIVE_ARTIFACT_CHECK_NAME = "Live artifact matches signed manifest";
|
|
27
43
|
function parseComposeServiceNames(composeFile) {
|
|
28
44
|
const names = /* @__PURE__ */ new Set();
|
|
29
45
|
if (!existsSync(composeFile)) return names;
|
|
@@ -341,6 +357,150 @@ async function checkCrossServiceAuth(jwt, deployed) {
|
|
|
341
357
|
}
|
|
342
358
|
return { check, status: "pass", message: "JWT accepted by wiki + CRM" };
|
|
343
359
|
}
|
|
360
|
+
async function checkSsoCookieContract(deployed, urlOverrides) {
|
|
361
|
+
const check = SSO_COOKIE_CONTRACT_CHECK_NAME;
|
|
362
|
+
const urls = urlOverrides ?? filterToDeployed(SSO_GATED_URLS, deployed);
|
|
363
|
+
if (Object.keys(urls).length === 0) {
|
|
364
|
+
return { check, status: "skip", message: "No SSO-gated products deployed in this selection" };
|
|
365
|
+
}
|
|
366
|
+
const violations = [];
|
|
367
|
+
const reviews = [];
|
|
368
|
+
const unreachable = [];
|
|
369
|
+
for (const [service, url] of Object.entries(urls)) {
|
|
370
|
+
let html;
|
|
371
|
+
try {
|
|
372
|
+
const res = await httpGet(url, CHECK_TIMEOUT_MS);
|
|
373
|
+
html = res.body;
|
|
374
|
+
} catch (err) {
|
|
375
|
+
unreachable.push(`${service}: ${err instanceof Error ? err.message : String(err)}`);
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
const verdict = evaluateSsoCookieContract(service, url, html);
|
|
379
|
+
if (verdict.severity === "violation") violations.push(`${service} (${url}) ${verdict.detail}`);
|
|
380
|
+
else if (verdict.severity === "review") reviews.push(`${service} (${url})`);
|
|
381
|
+
}
|
|
382
|
+
if (violations.length > 0) {
|
|
383
|
+
return {
|
|
384
|
+
check,
|
|
385
|
+
status: "fail",
|
|
386
|
+
message: `${violations.length} product(s) serve a RETIRED SSO cookie name \u2014 every login bounces forever. Canonical cookie: \`${CANONICAL_SSO_COOKIE}\`. ${violations.join("; ")}`
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
if (unreachable.length > 0 || reviews.length > 0) {
|
|
390
|
+
const parts = [];
|
|
391
|
+
if (unreachable.length > 0) parts.push(`unreachable: ${unreachable.join("; ")}`);
|
|
392
|
+
if (reviews.length > 0) parts.push(`needs review: ${reviews.join(", ")}`);
|
|
393
|
+
return { check, status: "warn", message: parts.join(" | ") };
|
|
394
|
+
}
|
|
395
|
+
return {
|
|
396
|
+
check,
|
|
397
|
+
status: "pass",
|
|
398
|
+
message: `${Object.keys(urls).length} product(s) free of retired SSO cookie names`
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
async function checkLiveArtifactMatchesManifest(composeFile, manifestPath) {
|
|
402
|
+
const check = LIVE_ARTIFACT_CHECK_NAME;
|
|
403
|
+
const candidates = manifestPath ? [manifestPath] : ["/opt/exe-stack/stack-manifest.json", "deploy/stack-manifests/v0.9.json"];
|
|
404
|
+
let declared = [];
|
|
405
|
+
let source = "";
|
|
406
|
+
for (const candidate of candidates) {
|
|
407
|
+
if (!existsSync(candidate)) continue;
|
|
408
|
+
try {
|
|
409
|
+
declared = declaredArtifactsFromManifest(JSON.parse(readFileSync(candidate, "utf8")));
|
|
410
|
+
source = candidate;
|
|
411
|
+
break;
|
|
412
|
+
} catch {
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
if (declared.length === 0) {
|
|
416
|
+
return {
|
|
417
|
+
check,
|
|
418
|
+
status: "warn",
|
|
419
|
+
message: "no readable signed manifest found \u2014 live-vs-declared comparison did NOT run. This is an unknown, not a pass."
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
const names = [];
|
|
423
|
+
try {
|
|
424
|
+
const dir = path.dirname(composeFile);
|
|
425
|
+
const file = path.basename(composeFile);
|
|
426
|
+
const raw = execSync(`docker compose -f "${file}" ps --format json`, {
|
|
427
|
+
cwd: dir,
|
|
428
|
+
timeout: CHECK_TIMEOUT_MS,
|
|
429
|
+
encoding: "utf8",
|
|
430
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
431
|
+
});
|
|
432
|
+
for (const line of raw.trim().split("\n").filter(Boolean)) {
|
|
433
|
+
try {
|
|
434
|
+
const c = JSON.parse(line);
|
|
435
|
+
const name = c.Name || c.name;
|
|
436
|
+
if (name) names.push(name);
|
|
437
|
+
} catch {
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
} catch (err) {
|
|
441
|
+
return {
|
|
442
|
+
check,
|
|
443
|
+
status: "warn",
|
|
444
|
+
message: `could not enumerate containers: ${err instanceof Error ? err.message : String(err)} \u2014 comparison did NOT run`
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
if (names.length === 0) {
|
|
448
|
+
return { check, status: "warn", message: "no containers enumerated \u2014 comparison did NOT run" };
|
|
449
|
+
}
|
|
450
|
+
const inspect = (args) => {
|
|
451
|
+
try {
|
|
452
|
+
return execSync(`docker inspect ${args.map((a) => `"${a}"`).join(" ")}`, {
|
|
453
|
+
timeout: CHECK_TIMEOUT_MS,
|
|
454
|
+
encoding: "utf8",
|
|
455
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
456
|
+
}).trim();
|
|
457
|
+
} catch {
|
|
458
|
+
return "";
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
const observed = [];
|
|
462
|
+
for (const name of names) {
|
|
463
|
+
const configured = inspect([name, "--format", "{{ .Config.Image }}"]);
|
|
464
|
+
if (!configured) continue;
|
|
465
|
+
const imageId = inspect([name, "--format", "{{ .Image }}"]);
|
|
466
|
+
let ref = configured;
|
|
467
|
+
if (imageId) {
|
|
468
|
+
const digestsRaw = inspect([imageId, "--format", "{{ json .RepoDigests }}"]);
|
|
469
|
+
try {
|
|
470
|
+
const parsed = JSON.parse(digestsRaw || "[]");
|
|
471
|
+
if (Array.isArray(parsed) && parsed.length > 0) {
|
|
472
|
+
const repo = (configured.split("@")[0] ?? "").replace(/:[^/:]+$/, "");
|
|
473
|
+
const list = parsed.filter((x) => typeof x === "string");
|
|
474
|
+
ref = list.find((d) => d.startsWith(`${repo}@`)) ?? list[0] ?? configured;
|
|
475
|
+
}
|
|
476
|
+
} catch {
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
observed.push({ container: name, ref });
|
|
480
|
+
}
|
|
481
|
+
const byRef = /* @__PURE__ */ new Map();
|
|
482
|
+
for (const o of observed) {
|
|
483
|
+
const existing = byRef.get(o.ref);
|
|
484
|
+
if (existing) {
|
|
485
|
+
existing.containers.push(o.container);
|
|
486
|
+
continue;
|
|
487
|
+
}
|
|
488
|
+
byRef.set(o.ref, { containers: [o.container], ref: o.ref, digest: parseDigest(o.ref) });
|
|
489
|
+
}
|
|
490
|
+
const report = compareLiveArtifacts([...byRef.values()], declared, { source });
|
|
491
|
+
if (report.findings.length === 0) {
|
|
492
|
+
return {
|
|
493
|
+
check,
|
|
494
|
+
status: "pass",
|
|
495
|
+
message: `${report.counts.agrees} artifact(s) match the digests pinned by ${source}`
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
return {
|
|
499
|
+
check,
|
|
500
|
+
status: "fail",
|
|
501
|
+
message: `${report.findings.length} artifact(s) are not what ${source} pins: ` + report.findings.map((f) => `${f.service} [${f.verdict}]`).join(", ") + `. Running: ${report.findings.map((f) => `${f.service}=${f.running?.digest ?? f.running?.ref ?? "(nothing running)"}`).join(", ")}`
|
|
502
|
+
};
|
|
503
|
+
}
|
|
344
504
|
async function runVerifyStack(options) {
|
|
345
505
|
const composeFile = options?.composeFile ?? DEFAULT_COMPOSE;
|
|
346
506
|
const envFile = options?.envFile ?? DEFAULT_ENV;
|
|
@@ -371,6 +531,10 @@ async function runVerifyStack(options) {
|
|
|
371
531
|
addResult(await checkRawPipeline(env));
|
|
372
532
|
if (Date.now() > deadline) return summarize(results);
|
|
373
533
|
addResult(await checkCrossServiceAuth(goTrueResult.jwt, deployed));
|
|
534
|
+
if (Date.now() > deadline) return summarize(results);
|
|
535
|
+
addResult(await checkSsoCookieContract(deployed));
|
|
536
|
+
if (Date.now() > deadline) return summarize(results);
|
|
537
|
+
addResult(await checkLiveArtifactMatchesManifest(composeFile));
|
|
374
538
|
return summarize(results);
|
|
375
539
|
}
|
|
376
540
|
function summarize(results) {
|
|
@@ -398,7 +562,7 @@ function printUsage() {
|
|
|
398
562
|
console.log(`
|
|
399
563
|
Usage: exe-os verify-stack [options]
|
|
400
564
|
|
|
401
|
-
Post-deploy verification \u2014
|
|
565
|
+
Post-deploy verification \u2014 10 runtime checks after stack-update.
|
|
402
566
|
|
|
403
567
|
Options:
|
|
404
568
|
--compose <path> Path to docker-compose.yml (default: ${DEFAULT_COMPOSE})
|
|
@@ -414,6 +578,8 @@ Checks:
|
|
|
414
578
|
6. Monitor reports metrics
|
|
415
579
|
7. Raw pipeline alive (recent raw_events)
|
|
416
580
|
8. Cross-service auth (JWT \u2192 wiki + CRM)
|
|
581
|
+
9. SSO auth cookie contract (no retired cookie name in served HTML)
|
|
582
|
+
10. Live artifact matches the digest pinned by the signed manifest
|
|
417
583
|
`);
|
|
418
584
|
}
|
|
419
585
|
if (isMainModule(import.meta.url) && process.argv[1]?.includes("verify-stack")) {
|
|
@@ -437,6 +603,10 @@ if (isMainModule(import.meta.url) && process.argv[1]?.includes("verify-stack"))
|
|
|
437
603
|
}
|
|
438
604
|
|
|
439
605
|
export {
|
|
606
|
+
SSO_COOKIE_CONTRACT_CHECK_NAME,
|
|
607
|
+
LIVE_ARTIFACT_CHECK_NAME,
|
|
440
608
|
parseComposeServiceNames,
|
|
609
|
+
checkSsoCookieContract,
|
|
610
|
+
checkLiveArtifactMatchesManifest,
|
|
441
611
|
runVerifyStack
|
|
442
612
|
};
|
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
getClient,
|
|
4
4
|
isInitialized,
|
|
5
5
|
loadEmployees
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-OBESOWFJ.js";
|
|
7
7
|
import {
|
|
8
8
|
checkLicense,
|
|
9
9
|
isFeatureAllowed,
|
|
10
10
|
isPersonalFreeGrandfathered
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-6UZ3DEQI.js";
|
|
12
12
|
import {
|
|
13
13
|
PLAN_LIMITS
|
|
14
14
|
} from "./chunk-A7XLR3K7.js";
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import "./chunk-MLKGABMK.js";
|
|
2
|
-
|
|
3
1
|
// src/lib/agent-heartbeat.ts
|
|
4
2
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
5
3
|
import path from "path";
|
|
@@ -52,9 +50,10 @@ function getAgentLivenessReport() {
|
|
|
52
50
|
};
|
|
53
51
|
});
|
|
54
52
|
}
|
|
53
|
+
|
|
55
54
|
export {
|
|
56
|
-
classifyLiveness,
|
|
57
|
-
getAgentLivenessReport,
|
|
58
55
|
loadHeartbeats,
|
|
59
|
-
recordHeartbeat
|
|
56
|
+
recordHeartbeat,
|
|
57
|
+
classifyLiveness,
|
|
58
|
+
getAgentLivenessReport
|
|
60
59
|
};
|
|
@@ -2,20 +2,24 @@ import {
|
|
|
2
2
|
readWorkingMemory
|
|
3
3
|
} from "./chunk-HSFBNCNC.js";
|
|
4
4
|
import {
|
|
5
|
+
behaviorTruncationNotice
|
|
6
|
+
} from "./chunk-XOTDAKJL.js";
|
|
7
|
+
import {
|
|
8
|
+
countActiveBehaviors,
|
|
5
9
|
listBehaviors
|
|
6
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-MCXYNYZI.js";
|
|
7
11
|
import {
|
|
8
12
|
lightweightSearch
|
|
9
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-6EXOW5ZA.js";
|
|
10
14
|
import {
|
|
11
15
|
getCurrentSessionScope
|
|
12
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-Y4AYNLXU.js";
|
|
13
17
|
import {
|
|
14
18
|
getProjectName
|
|
15
19
|
} from "./chunk-W2IRQJ6R.js";
|
|
16
20
|
import {
|
|
17
21
|
getClient
|
|
18
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-OBESOWFJ.js";
|
|
19
23
|
|
|
20
24
|
// src/lib/session-summary.ts
|
|
21
25
|
var MAX_CHARS = 800;
|
|
@@ -262,9 +266,25 @@ function renderBehaviorLine(row) {
|
|
|
262
266
|
const scope = row.project_name ? ` (${row.project_name})` : "";
|
|
263
267
|
return `- ${clip(`${tag}${row.content}${scope}`, BEHAVIOR_LINE_CAP)}`;
|
|
264
268
|
}
|
|
269
|
+
function renderBehaviorSection(behaviors, counts) {
|
|
270
|
+
const lines = behaviors.map(renderBehaviorLine).join("\n");
|
|
271
|
+
const notice = behaviorTruncationNotice(behaviors, counts);
|
|
272
|
+
return notice ? `${lines}
|
|
273
|
+
${notice}` : lines;
|
|
274
|
+
}
|
|
265
275
|
async function activeBehaviorBrief(agentId, projectName) {
|
|
266
|
-
const
|
|
267
|
-
|
|
276
|
+
const safeCounts = async () => {
|
|
277
|
+
try {
|
|
278
|
+
return await countActiveBehaviors(agentId, projectName);
|
|
279
|
+
} catch {
|
|
280
|
+
return { total: 0, p0: 0 };
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
const [behaviors, counts] = await Promise.all([
|
|
284
|
+
listBehaviors(agentId, projectName, BEHAVIOR_LIMIT),
|
|
285
|
+
safeCounts()
|
|
286
|
+
]);
|
|
287
|
+
return renderBehaviorSection(behaviors.slice(0, BEHAVIOR_LIMIT), counts);
|
|
268
288
|
}
|
|
269
289
|
async function buildEmployeeBootBriefInner(input, degraded) {
|
|
270
290
|
const agentId = input.agentId.trim();
|
|
@@ -324,5 +344,6 @@ ${notice}`;
|
|
|
324
344
|
}
|
|
325
345
|
|
|
326
346
|
export {
|
|
347
|
+
renderBehaviorSection,
|
|
327
348
|
buildEmployeeBootBrief
|
|
328
349
|
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
storeBehavior
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MCXYNYZI.js";
|
|
4
4
|
import {
|
|
5
5
|
resolveAnthropicAuth
|
|
6
6
|
} from "./chunk-VGMACSEV.js";
|
|
7
7
|
import {
|
|
8
8
|
getClient
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-OBESOWFJ.js";
|
|
10
10
|
import {
|
|
11
11
|
loadConfig
|
|
12
12
|
} from "./chunk-QMSEL5YS.js";
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getBrandName
|
|
3
3
|
} from "./chunk-2CWS374F.js";
|
|
4
|
+
import {
|
|
5
|
+
buildDeployStalenessBanner,
|
|
6
|
+
readDeployStalenessAlert
|
|
7
|
+
} from "./chunk-TX3Q2GIL.js";
|
|
4
8
|
|
|
5
9
|
// src/lib/status-brief.ts
|
|
6
10
|
import pathMod from "path";
|
|
@@ -114,6 +118,8 @@ async function generateStatusBrief(employees, data, _activeAgentIds) {
|
|
|
114
118
|
sections.push([` EXE STATUS BRIEF \u2014 ${dateStr}${sessionTag}`]);
|
|
115
119
|
const degradedLines = buildDegradedBanner(data);
|
|
116
120
|
if (degradedLines.length > 0) sections.push(degradedLines);
|
|
121
|
+
const staleDeployLines = buildDeployStalenessBanner(readDeployStalenessAlert());
|
|
122
|
+
if (staleDeployLines.length > 0) sections.push(staleDeployLines);
|
|
117
123
|
const orchestrationLines = buildOrchestrationPhase(data, employees);
|
|
118
124
|
if (orchestrationLines.length > 0) sections.push(orchestrationLines);
|
|
119
125
|
sections.push(buildDispatchLadder(data));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
routeTask
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-TTJWPV4G.js";
|
|
4
4
|
import {
|
|
5
5
|
createTaskCore,
|
|
6
6
|
employeeSessionName,
|
|
@@ -9,11 +9,11 @@ import {
|
|
|
9
9
|
isEmployeeAlive,
|
|
10
10
|
sessionScopeFilter,
|
|
11
11
|
updateTaskStatus
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-Y4AYNLXU.js";
|
|
13
13
|
import {
|
|
14
14
|
DEFAULT_COORDINATOR_TEMPLATE_NAME,
|
|
15
15
|
getCoordinatorName
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-OBESOWFJ.js";
|
|
17
17
|
|
|
18
18
|
// src/runtime/orchestrator.ts
|
|
19
19
|
var STALE_THRESHOLD_MS = 2 * 60 * 60 * 1e3;
|
|
@@ -9,19 +9,19 @@ import {
|
|
|
9
9
|
compareSemver,
|
|
10
10
|
detectAutoupdaterVar
|
|
11
11
|
} from "./chunk-75H4R62K.js";
|
|
12
|
-
import {
|
|
13
|
-
checkSingleGotrueInstance
|
|
14
|
-
} from "./chunk-TCTED52S.js";
|
|
15
12
|
import {
|
|
16
13
|
readMcpHttpEvents,
|
|
17
14
|
summarizeMcpTransport
|
|
18
15
|
} from "./chunk-YYA5LXCT.js";
|
|
19
16
|
import {
|
|
20
17
|
mcpHttpPort
|
|
21
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-QCSAYYL6.js";
|
|
22
19
|
import {
|
|
23
20
|
inspectKeyCustodySync
|
|
24
21
|
} from "./chunk-HPXFKUGU.js";
|
|
22
|
+
import {
|
|
23
|
+
checkSingleGotrueInstance
|
|
24
|
+
} from "./chunk-TCTED52S.js";
|
|
25
25
|
import {
|
|
26
26
|
SYSTEMD_DAEMON_UNIT
|
|
27
27
|
} from "./chunk-QILQ5FCG.js";
|
|
@@ -1,6 +1,33 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assessVerificationArtifact,
|
|
3
|
+
isSubstantiveCommit,
|
|
4
|
+
measureCommitSubstance
|
|
5
|
+
} from "./chunk-KZXMP6JG.js";
|
|
1
6
|
import {
|
|
2
7
|
sessionScopeFilter
|
|
3
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-Y4AYNLXU.js";
|
|
9
|
+
|
|
10
|
+
// src/shared/task-completion-gate.ts
|
|
11
|
+
var COMPLETION_CLAIM_STATUSES = ["done", "needs_review", "closed"];
|
|
12
|
+
function isCompletionClaim(status) {
|
|
13
|
+
const normalized = typeof status === "string" ? status.trim() : "";
|
|
14
|
+
return COMPLETION_CLAIM_STATUSES.includes(normalized);
|
|
15
|
+
}
|
|
16
|
+
var ok = { ok: true, code: "ok", message: "verified" };
|
|
17
|
+
function assessAutomatedTaskCompletion(input) {
|
|
18
|
+
if (!isCompletionClaim(input.status)) return ok;
|
|
19
|
+
if (!isSubstantiveCommit(input.substance)) {
|
|
20
|
+
return {
|
|
21
|
+
ok: false,
|
|
22
|
+
code: "commit_not_substantive",
|
|
23
|
+
message: "the matched commit changes no executable production source (comment-only, whitespace-only, docs-only or test-only diffs are not work)"
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (input.verificationArtifact !== void 0 && input.verificationArtifact !== null) {
|
|
27
|
+
return assessVerificationArtifact(input.verificationArtifact, input.context ?? {});
|
|
28
|
+
}
|
|
29
|
+
return ok;
|
|
30
|
+
}
|
|
4
31
|
|
|
5
32
|
// src/lib/git-task-sweep.ts
|
|
6
33
|
import { execSync } from "child_process";
|
|
@@ -181,7 +208,17 @@ async function sweepTasks(projectName, options = {}) {
|
|
|
181
208
|
const commitLimit = options.commitLimit ?? DEFAULT_COMMIT_LIMIT;
|
|
182
209
|
const staleMinutes = options.staleMinutes ?? DEFAULT_STALE_MINUTES;
|
|
183
210
|
const dryRun = options.dryRun ?? false;
|
|
184
|
-
const result = { escalated: [], unchanged: 0, errors: [] };
|
|
211
|
+
const result = { escalated: [], rejected: [], unchanged: 0, errors: [] };
|
|
212
|
+
const substanceCache = /* @__PURE__ */ new Map();
|
|
213
|
+
const commitIsAdmissible = (hash) => {
|
|
214
|
+
if (!substanceCache.has(hash)) {
|
|
215
|
+
substanceCache.set(hash, measureCommitSubstance(hash, process.cwd()));
|
|
216
|
+
}
|
|
217
|
+
return assessAutomatedTaskCompletion({
|
|
218
|
+
status: "needs_review",
|
|
219
|
+
substance: substanceCache.get(hash) ?? null
|
|
220
|
+
}).ok;
|
|
221
|
+
};
|
|
185
222
|
const commits = getRecentCommits(commitLimit);
|
|
186
223
|
if (commits.length === 0) {
|
|
187
224
|
result.errors.push("No git commits found (not a git repo or empty history)");
|
|
@@ -236,9 +273,23 @@ async function sweepTasks(projectName, options = {}) {
|
|
|
236
273
|
result.unchanged++;
|
|
237
274
|
continue;
|
|
238
275
|
}
|
|
276
|
+
if (!commitIsAdmissible(match.commit.hash)) {
|
|
277
|
+
result.rejected.push({
|
|
278
|
+
taskId: task.id,
|
|
279
|
+
title: task.title,
|
|
280
|
+
matchedCommit: match.commit.hash,
|
|
281
|
+
score: match.score
|
|
282
|
+
});
|
|
283
|
+
result.unchanged++;
|
|
284
|
+
process.stderr.write(
|
|
285
|
+
`[git-sweep] Rejected task ${task.id} \u2192 commit ${match.commit.hash} (score: ${match.score.toFixed(2)}) \u2014 commit changes no executable production source
|
|
286
|
+
`
|
|
287
|
+
);
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
239
290
|
if (!dryRun) {
|
|
240
291
|
try {
|
|
241
|
-
const { updateTaskStatus } = await import("./tasks-crud-
|
|
292
|
+
const { updateTaskStatus } = await import("./tasks-crud-TJNMUKKH.js");
|
|
242
293
|
await updateTaskStatus({
|
|
243
294
|
taskId: task.id,
|
|
244
295
|
status: "needs_review",
|
|
@@ -266,6 +317,7 @@ async function sweepTasks(projectName, options = {}) {
|
|
|
266
317
|
}
|
|
267
318
|
|
|
268
319
|
export {
|
|
320
|
+
assessAutomatedTaskCompletion,
|
|
269
321
|
extractKeywords,
|
|
270
322
|
matchScore,
|
|
271
323
|
getRecentCommits,
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// src/lib/dispatch-intent-journal.ts
|
|
2
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, unlinkSync, writeFileSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { homedir } from "os";
|
|
5
|
+
var DISPATCH_JOURNAL_ORPHAN_AGE_MS = 6e4;
|
|
6
|
+
function dispatchJournalDir() {
|
|
7
|
+
const base = process.env.EXE_OS_DIR || process.env.EXE_MEM_DIR || join(homedir(), ".exe-os");
|
|
8
|
+
return join(base, "dispatch-journal");
|
|
9
|
+
}
|
|
10
|
+
function dispatchJournalSlug(title) {
|
|
11
|
+
const slug = title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 40);
|
|
12
|
+
return slug || "task";
|
|
13
|
+
}
|
|
14
|
+
function journalDispatchIntent(title, payload, caller) {
|
|
15
|
+
const dir = dispatchJournalDir();
|
|
16
|
+
mkdirSync(dir, { recursive: true });
|
|
17
|
+
const file = join(dir, `${Date.now()}-${dispatchJournalSlug(title)}.json`);
|
|
18
|
+
const entry = {
|
|
19
|
+
version: 1,
|
|
20
|
+
journaledAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
21
|
+
status: "pending",
|
|
22
|
+
payload,
|
|
23
|
+
caller
|
|
24
|
+
};
|
|
25
|
+
writeFileSync(file, JSON.stringify(entry, null, 2), "utf-8");
|
|
26
|
+
return file;
|
|
27
|
+
}
|
|
28
|
+
function updateDispatchJournalEntry(file, patch) {
|
|
29
|
+
const entry = JSON.parse(readFileSync(file, "utf-8"));
|
|
30
|
+
writeFileSync(file, JSON.stringify({ ...entry, ...patch }, null, 2), "utf-8");
|
|
31
|
+
}
|
|
32
|
+
function clearDispatchJournalEntry(file) {
|
|
33
|
+
try {
|
|
34
|
+
unlinkSync(file);
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function findOrphanedDispatchIntents(sessionScope, olderThanMs = DISPATCH_JOURNAL_ORPHAN_AGE_MS) {
|
|
39
|
+
const dir = dispatchJournalDir();
|
|
40
|
+
if (!existsSync(dir)) return [];
|
|
41
|
+
let names;
|
|
42
|
+
try {
|
|
43
|
+
names = readdirSync(dir);
|
|
44
|
+
} catch {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
const cutoff = Date.now() - olderThanMs;
|
|
48
|
+
const orphans = [];
|
|
49
|
+
for (const name of names) {
|
|
50
|
+
if (!name.endsWith(".json")) continue;
|
|
51
|
+
const file = join(dir, name);
|
|
52
|
+
try {
|
|
53
|
+
if (statSync(file).mtimeMs > cutoff) continue;
|
|
54
|
+
} catch {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
let entry = null;
|
|
58
|
+
try {
|
|
59
|
+
entry = JSON.parse(readFileSync(file, "utf-8"));
|
|
60
|
+
} catch {
|
|
61
|
+
}
|
|
62
|
+
const entryScope = entry?.caller?.sessionScope ?? null;
|
|
63
|
+
if (sessionScope && entryScope && entryScope !== sessionScope) continue;
|
|
64
|
+
orphans.push({ file, entry });
|
|
65
|
+
}
|
|
66
|
+
return orphans;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export {
|
|
70
|
+
DISPATCH_JOURNAL_ORPHAN_AGE_MS,
|
|
71
|
+
dispatchJournalDir,
|
|
72
|
+
journalDispatchIntent,
|
|
73
|
+
updateDispatchJournalEntry,
|
|
74
|
+
clearDispatchJournalEntry,
|
|
75
|
+
findOrphanedDispatchIntents
|
|
76
|
+
};
|