@askexenow/exe-os 0.9.367 → 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-V3CUDNED.js → active-agent-6WNC756A.js} +3 -3
- package/dist/{active-agent-R6Q7UEUD.js → active-agent-RDTJGZHP.js} +3 -3
- package/dist/{agent-defs-generator-MLPRGY75.js → agent-defs-generator-M5AUL3WM.js} +2 -2
- package/dist/{agentic-ontology-5FMQWGDZ.js → agentic-ontology-ZJBRYETW.js} +1 -1
- package/dist/{backfill-metadata-YXUMCKRV.js → backfill-metadata-Q4X23XLR.js} +5 -5
- package/dist/{backup-verify-GYHKAX7K.js → backup-verify-UKLX6IEK.js} +1 -1
- package/dist/behavior-injection-C3HEKSJY.js +60 -0
- package/dist/{behaviors-O6HKTSOF.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 +4 -4
- package/dist/bin/cleanup-stale-review-tasks.js +14 -14
- package/dist/bin/cli.js +20 -20
- package/dist/bin/deferred-daemon-restart.js +83 -81
- package/dist/bin/exe-agent-config.js +2 -2
- package/dist/bin/exe-agent.js +11 -11
- package/dist/bin/exe-assign.js +6 -6
- package/dist/bin/exe-boot.js +30 -30
- 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 +15 -15
- package/dist/bin/exe-doctor.js +5 -5
- 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 +4 -4
- package/dist/bin/exe-heartbeat.js +17 -17
- package/dist/bin/exe-kill.js +18 -18
- package/dist/bin/exe-launch-agent.js +24 -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 +15 -15
- package/dist/bin/exe-pending-notifications.js +14 -14
- package/dist/bin/exe-pending-reviews.js +14 -14
- package/dist/bin/exe-rename.js +4 -4
- package/dist/bin/exe-review.js +17 -17
- package/dist/bin/exe-search.js +6 -6
- package/dist/bin/exe-session-cleanup.js +19 -18
- package/dist/bin/exe-settings.js +10 -10
- package/dist/bin/exe-start-codex.js +73 -19
- package/dist/bin/exe-start-opencode.js +11 -9
- package/dist/bin/exe-status.js +16 -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 +16 -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 +85 -83
- 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 +14 -14
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +5 -5
- package/dist/bin/stack-update.js +6 -5
- package/dist/bin/verify-stack.js +6 -1
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-EZ2Y74IG.js → boot-generation-7H7Y4KC2.js} +3 -3
- package/dist/{boot-review-sections-7CNQTAYR.js → boot-review-sections-4AGCECCP.js} +13 -13
- package/dist/build-manifest.json +808 -773
- package/dist/{capability-cards-ZTFMK4VJ.js → capability-cards-6KAC5D2Z.js} +2 -2
- package/dist/{capacity-monitor-B2XU4YHP.js → capacity-monitor-J2Y4SFLA.js} +15 -15
- package/dist/{catchup-brief-3BEOL7EV.js → catchup-brief-F2HKF2CU.js} +18 -18
- package/dist/{chunk-PR3AHVFW.js → chunk-2AS6FG6C.js} +3 -3
- package/dist/{chunk-WCDIDSLR.js → chunk-2UBMXN4D.js} +2 -2
- package/dist/{chunk-267QB6VB.js → chunk-2UGU3V63.js} +1 -1
- package/dist/{chunk-PQ6NRLKL.js → chunk-34BMZTWV.js} +1 -1
- package/dist/{chunk-XA4EU3CW.js → chunk-4DGIOK6T.js} +1 -1
- package/dist/{chunk-JJRZE2LD.js → chunk-4GVJIMMK.js} +12 -6
- package/dist/{chunk-2IZH6W73.js → chunk-4L732DE5.js} +3 -3
- package/dist/{chunk-ZSHLY5BS.js → chunk-4RRMZJLG.js} +1 -1
- package/dist/{chunk-MQ3N4KZY.js → chunk-5IVLOOJR.js} +1 -1
- package/dist/{chunk-PFR6EOUY.js → chunk-5YKNEL3W.js} +2 -2
- package/dist/{chunk-AE3PYLLS.js → chunk-6EXOW5ZA.js} +9 -9
- package/dist/{chunk-CTPG4KYZ.js → chunk-6P7DVFKA.js} +1 -1
- package/dist/{chunk-F3PIHVVY.js → chunk-6UZ3DEQI.js} +1 -1
- package/dist/{chunk-URHJDUWO.js → chunk-72JZQ7EV.js} +1 -1
- package/dist/{chunk-66BFQOWR.js → chunk-72QUZX6J.js} +4 -4
- package/dist/{chunk-JOKKIFRN.js → chunk-AAL6CDMQ.js} +7 -7
- package/dist/{chunk-FSIAGX55.js → chunk-AJGX4Z34.js} +1 -1
- package/dist/{chunk-OADOH45L.js → chunk-BEPO36MW.js} +3 -3
- package/dist/{chunk-UI3K73LD.js → chunk-BFL3UB77.js} +1 -1
- package/dist/{chunk-KDD26FUY.js → chunk-BFPQXPN3.js} +1 -1
- package/dist/{chunk-7W5LCREK.js → chunk-BJKC6ZJU.js} +40 -84
- package/dist/{chunk-OPS7KUFV.js → chunk-BLNSUBP3.js} +3 -3
- package/dist/{chunk-5CH6XKVC.js → chunk-BNDHQGOY.js} +1 -1
- package/dist/{chunk-Z5Z3MYUW.js → chunk-BPQWRR4H.js} +2 -2
- package/dist/{chunk-YA4PM3MV.js → chunk-BTGR55GX.js} +3 -3
- package/dist/{chunk-WYVBWDFY.js → chunk-C4IJ5IS5.js} +1 -1
- package/dist/{chunk-XVRQZCTS.js → chunk-C5FOA5GO.js} +14 -3
- package/dist/{chunk-XKFMNAJ7.js → chunk-CSBD7QLZ.js} +1 -1
- package/dist/{chunk-BY3V5CLX.js → chunk-CU2OUUSV.js} +25 -5
- package/dist/{chunk-Y4JVM3SI.js → chunk-CXHRNESJ.js} +1 -1
- package/dist/{chunk-SFKIZYKK.js → chunk-DRMGPZSC.js} +2 -2
- package/dist/{chunk-PFOJX6CR.js → chunk-DYPKSVB7.js} +5 -5
- package/dist/{chunk-PS4NA7PM.js → chunk-EDB3LXBQ.js} +268 -166
- package/dist/{chunk-TCR7NBHD.js → chunk-EDRXCUEP.js} +4 -4
- package/dist/{chunk-BQYQES2Z.js → chunk-ELY5WBZX.js} +10 -10
- package/dist/{chunk-ALYI3P5D.js → chunk-EZUSIF66.js} +1 -1
- package/dist/{chunk-CYNL3ZFD.js → chunk-FHYX64H3.js} +3 -3
- package/dist/{chunk-PWCZFIQH.js → chunk-FSALI4B7.js} +4 -4
- package/dist/{chunk-4DJDC4Y2.js → chunk-FWKTZURC.js} +4 -4
- package/dist/{chunk-53LCVVX5.js → chunk-FWVPGXHD.js} +5 -5
- package/dist/{chunk-O3F5P6Z5.js → chunk-GILYOIMP.js} +2 -2
- package/dist/{chunk-NPND34FS.js → chunk-GP3J3AOT.js} +4 -4
- package/dist/{chunk-6NJURKRG.js → chunk-H6J7N3BZ.js} +1 -1
- package/dist/{chunk-WSLFGJBA.js → chunk-HQSUXAB4.js} +1 -1
- package/dist/{chunk-XTEKGO44.js → chunk-HTLJHSN4.js} +1 -1
- package/dist/{chunk-AEVE654G.js → chunk-HXV3DGL7.js} +1 -1
- package/dist/{chunk-LW5WRSDD.js → chunk-IEE6X6R2.js} +1 -1
- package/dist/{chunk-V3ISR2QT.js → chunk-IKRIUEIF.js} +1 -1
- package/dist/{chunk-52CFP2AV.js → chunk-J44774XC.js} +1 -1
- package/dist/{chunk-TJSTWACD.js → chunk-J77ZIMH5.js} +5 -5
- package/dist/{chunk-Y7OK5PJE.js → chunk-JDPV7W2L.js} +1 -1
- package/dist/{chunk-7W6FDHHY.js → chunk-KGPWS4KE.js} +1 -1
- package/dist/{chunk-XAMLDTRA.js → chunk-KWQ7RHYD.js} +4 -4
- package/dist/{chunk-IIVFXD6P.js → chunk-KYVIV54Y.js} +1 -1
- package/dist/chunk-KZXMP6JG.js +319 -0
- package/dist/{chunk-ZZ3JQM5I.js → chunk-LJWCK2DR.js} +9 -9
- package/dist/{chunk-WBKIU6UJ.js → chunk-MCXYNYZI.js} +30 -2
- package/dist/{chunk-L2VZBPJJ.js → chunk-MWEIBVBS.js} +13 -1
- package/dist/{chunk-GUOMZ3JM.js → chunk-MXP27XTP.js} +2 -2
- package/dist/{chunk-EDZ5URGR.js → chunk-N3CGSO3S.js} +1 -1
- package/dist/{chunk-QWDZNQXA.js → chunk-NNXPIJRB.js} +1 -1
- package/dist/{chunk-OISZ2I4X.js → chunk-NWE3CFX7.js} +4 -4
- package/dist/{chunk-HSBKV5LB.js → chunk-OBESOWFJ.js} +3 -3
- package/dist/{chunk-XKZD5FGK.js → chunk-OL3QP3AU.js} +116 -1
- package/dist/{chunk-6MCUXRIP.js → chunk-P3PAD6AA.js} +1 -1
- package/dist/{chunk-N3JLNMPF.js → chunk-PGF5I7EV.js} +2 -2
- package/dist/{chunk-CX4MVEM3.js → chunk-PVWM2WMM.js} +1 -1
- package/dist/{chunk-JFOZHVNO.js → chunk-QCSAYYL6.js} +1 -1
- package/dist/{chunk-J6VQ7HYV.js → chunk-QE5KWKVU.js} +27 -6
- package/dist/{chunk-4WOOCTON.js → chunk-QKZEUCTS.js} +2 -2
- package/dist/{chunk-P5XER5QY.js → chunk-QT6CNCXO.js} +3 -3
- package/dist/{chunk-P76VYS6V.js → chunk-QZYYCPNL.js} +1 -1
- package/dist/{chunk-DTTISDTI.js → chunk-RDIZSXXD.js} +1 -1
- package/dist/{chunk-R4AROSYI.js → chunk-RFWOXKVL.js} +10 -179
- package/dist/chunk-S2YTU74T.js +76 -0
- package/dist/{chunk-K2OFS57E.js → chunk-TP7BFVQP.js} +2 -2
- package/dist/{chunk-LIZ3QQGK.js → chunk-TTJWPV4G.js} +1 -1
- package/dist/{chunk-XUGOVOID.js → chunk-UATT6BNO.js} +3 -3
- package/dist/{chunk-ALKYXAMB.js → chunk-UVM5ZXO2.js} +4 -4
- package/dist/{chunk-R3H3WW7H.js → chunk-V7E37GE3.js} +2 -2
- package/dist/{chunk-XSXZVKJ7.js → chunk-VD3CVNGB.js} +3 -3
- package/dist/{chunk-CKKLSY7B.js → chunk-VIW62NN5.js} +1 -1
- package/dist/{chunk-VY3QUSWS.js → chunk-VTOO5UB3.js} +9 -9
- package/dist/chunk-W5MCOZTW.js +304 -0
- package/dist/{chunk-TZFOWWPM.js → chunk-WJOJWRN5.js} +139 -33
- package/dist/{chunk-PS6VPW64.js → chunk-X4MRVNR3.js} +1 -1
- package/dist/{chunk-YYLVHUYZ.js → chunk-XBTQPQN7.js} +1 -1
- package/dist/{behavior-injection-7VGYY2KO.js → chunk-XOTDAKJL.js} +24 -38
- package/dist/{chunk-QX33D4CH.js → chunk-Y4AYNLXU.js} +25 -25
- package/dist/{chunk-BTMX2D4X.js → chunk-YGPJ7VSJ.js} +48 -10
- package/dist/{chunk-DXCTHNEF.js → chunk-ZR3VMM3X.js} +9 -9
- package/dist/{chunk-MLPPG2OG.js → chunk-ZWONQU5S.js} +1 -1
- package/dist/{cleanup-graph-garbage-XDIX3HLN.js → cleanup-graph-garbage-FBSQI33K.js} +8 -8
- package/dist/{cloud-sync-command-VPYE4FIH.js → cloud-sync-command-NHGVDTLM.js} +11 -3
- package/dist/{cloud-sync-db-init-NSDBTFGI.js → cloud-sync-db-init-I75VOTXC.js} +1 -1
- package/dist/{cloud-sync-shutdown-6OUYTG4T.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-EAAKGGZH.js → co-activation-AE5L2SJV.js} +2 -2
- package/dist/{co-occurrence-OFVF55RX.js → co-occurrence-O65D4SCN.js} +6 -6
- package/dist/{conversation-entity-extractor-ZR5GFKAI.js → conversation-entity-extractor-LFIDTD2O.js} +4 -4
- package/dist/{crdt-sync-FGH4SBFW.js → crdt-sync-NRWDBRSE.js} +1 -1
- package/dist/{crm-webhook-PJATR2DC.js → crm-webhook-XOQGX6DV.js} +2 -2
- package/dist/{cto-delegation-gate-PO4LSSQ4.js → cto-delegation-gate-ZGOAXQI2.js} +13 -13
- package/dist/{daemon-orchestration-IJFZFQUX.js → daemon-orchestration-ZMQWYYDT.js} +18 -18
- package/dist/dispatch-intent-journal-VV6HMZC4.js +17 -0
- package/dist/{doc-graph-extractor-CAYUAM5A.js → doc-graph-extractor-6C5JBKPP.js} +6 -6
- package/dist/{documents-W2G477QE.js → documents-FKSQGSO4.js} +6 -6
- package/dist/{dreaming-FVXSIIWV.js → dreaming-IB3H6NDZ.js} +17 -17
- package/dist/{employee-boot-brief-OYMSHFHA.js → employee-boot-brief-5YRTUEJH.js} +24 -21
- package/dist/{exe-drift-67RGJOBX.js → exe-drift-CUWUYX3O.js} +3 -3
- package/dist/{exe-export-SGYX6XZG.js → exe-export-XWENYJNM.js} +7 -7
- package/dist/{exe-import-UABVA5N3.js → exe-import-OWOMRF2S.js} +7 -7
- package/dist/{exe-key-XNYDCVFE.js → exe-key-P356FGK5.js} +83 -81
- package/dist/{exe-org-XJVSU5HN.js → exe-org-UKIVF3KE.js} +8 -8
- package/dist/{exe-snapshot-YXOGYZUX.js → exe-snapshot-AZI2WW5Y.js} +18 -18
- package/dist/{fast-db-init-GDFJY5UH.js → fast-db-init-FPAPF3GB.js} +1 -1
- package/dist/{founder-context-KUXSNXKS.js → founder-context-QTQ6V3B5.js} +2 -2
- package/dist/gateway/index.js +11 -11
- package/dist/{git-staleness-NN6RWNLW.js → git-staleness-6ACWLV5Q.js} +2 -2
- package/dist/{global-procedures-XDNA3TNA.js → global-procedures-RXIKBVLZ.js} +3 -3
- package/dist/{graph-auto-extract-KTOR45V4.js → graph-auto-extract-Q4A4QMOF.js} +6 -6
- package/dist/{graph-rag-L5NV5YWD.js → graph-rag-RLRQMY54.js} +4 -4
- package/dist/{hook-integrity-X3YAVGUW.js → hook-integrity-3X2JRLBM.js} +1 -1
- package/dist/{hook-prefetch-WE4MIXBM.js → hook-prefetch-DU44UZQP.js} +14 -14
- package/dist/hooks/bug-report-worker.js +18 -18
- package/dist/hooks/codex-stop-task-finalizer.js +19 -19
- package/dist/hooks/commit-complete.js +20 -18
- 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 +11 -11
- package/dist/hooks/pre-compact.js +17 -17
- package/dist/hooks/pre-tool-use.js +44 -37
- package/dist/hooks/prompt-submit.js +35 -31
- package/dist/hooks/session-end.js +21 -21
- package/dist/hooks/session-start.js +16 -16
- package/dist/hooks/stop.js +20 -20
- package/dist/hooks/subagent-stop.js +18 -18
- package/dist/hooks/summary-worker.js +22 -22
- package/dist/index.js +25 -25
- package/dist/{installer-EAAYEEEF.js → installer-B7QYQE56.js} +7 -5
- package/dist/{installer-UDRMFY75.js → installer-EXR25DDG.js} +5 -5
- package/dist/{installer-EPQAOI6M.js → installer-TOPA7673.js} +5 -5
- package/dist/{intercom-queue-IBOAVT2I.js → intercom-queue-BZ4M3L4S.js} +13 -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 +181 -76
- 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 +14 -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/store.js +5 -5
- package/dist/lib/task-router.js +3 -3
- package/dist/lib/tasks.js +15 -15
- package/dist/lib/tmux-routing.js +13 -13
- package/dist/lib/token-spend.js +3 -3
- package/dist/{license-gate-3TTWJABL.js → license-gate-YTIOLKVV.js} +3 -3
- package/dist/{license-sync-ZC6TPKVV.js → license-sync-5VE5OSTV.js} +2 -2
- package/dist/mcp/register-tools.js +82 -80
- package/dist/mcp/server.js +85 -83
- 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 +25 -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 +17 -17
- package/dist/mcp/tools/send-message.js +16 -16
- package/dist/mcp/tools/update-task.js +16 -16
- package/dist/{mcp-http-config-ROF5EPEF.js → mcp-http-config-XUNRIGQH.js} +3 -3
- package/dist/{mcp-session-identity-ERU6FEUB.js → mcp-session-identity-4UIG7KLK.js} +13 -13
- package/dist/{memory-cards-3QTXI2SG.js → memory-cards-R74YU4CO.js} +5 -5
- package/dist/{memory-graph-extractor-7GAILMYG.js → memory-graph-extractor-3B4QJUXI.js} +7 -7
- package/dist/{memory-poisoning-defense-TPXSRJTQ.js → memory-poisoning-defense-OAKFL5O2.js} +2 -2
- package/dist/{memory-pressure-watchdog-ZSOP6T2F.js → memory-pressure-watchdog-FFC2CHFJ.js} +14 -14
- package/dist/{memory-reflection-3AI4JBV2.js → memory-reflection-5IJ6RE2J.js} +2 -2
- package/dist/{notification-ledger-ZU7ZFJJX.js → notification-ledger-P5XBUYKO.js} +14 -14
- package/dist/{notifications-S4GU22GF.js → notifications-LLCCHRYV.js} +13 -13
- package/dist/{orchestration-events-HVG56HJ5.js → orchestration-events-VBGCIQSS.js} +3 -3
- package/dist/{orchestrator-UW3Q3WYG.js → orchestrator-EB3SCTAJ.js} +15 -15
- package/dist/{org-brief-session-G36TJBN4.js → org-brief-session-GDCDKBFF.js} +6 -6
- package/dist/{org-consent-policy-RMYVMM3X.js → org-consent-policy-HCD42NBN.js} +2 -2
- package/dist/{org-partner-runtime-KXMGEYFW.js → org-partner-runtime-TPVKFR6E.js} +6 -6
- package/dist/{org-row-visibility-UI5PGN76.js → org-row-visibility-ZZLOPZLH.js} +1 -1
- package/dist/{pipeline-router-IODWXDDI.js → pipeline-router-3JTL2KF6.js} +3 -3
- package/dist/{plan-limits-XMAQVEJZ.js → plan-limits-MTHRP4WY.js} +5 -5
- package/dist/{projection-worker-6LZUCI3B.js → projection-worker-FLASNERC.js} +2 -2
- package/dist/{prospective-memory-G5VK5GCD.js → prospective-memory-HI3WUY4U.js} +2 -2
- package/dist/{push-notifications-S2RYRXLF.js → push-notifications-DFSR6P7V.js} +14 -14
- package/dist/{reranker-EHQTAA3L.js → reranker-XHBKUDGG.js} +1 -1
- package/dist/{retrieval-health-WZ4ICGNF.js → retrieval-health-NYKSDS6M.js} +1 -1
- package/dist/{review-polling-MAWLRDSP.js → review-polling-UAV6DZIZ.js} +14 -14
- package/dist/runtime/index.js +21 -21
- package/dist/{session-events-BRUIZ5E4.js → session-events-YCYPLWPG.js} +14 -14
- package/dist/{session-kill-telemetry-PTZLHT33.js → session-kill-telemetry-UEJTHL65.js} +14 -14
- package/dist/{session-scope-G4RVJJGR.js → session-scope-LXDW7LJJ.js} +13 -13
- package/dist/{setup-wizard-WFEUB63Z.js → setup-wizard-OVJQYUUL.js} +1 -1
- package/dist/{skill-refinement-2OYPH7WD.js → skill-refinement-EWRJID73.js} +3 -3
- package/dist/{stack-promote-DLYYQXQI.js → stack-promote-4IJM36OG.js} +4 -4
- package/dist/{stack-release-OPWARLXI.js → stack-release-BAIRY65H.js} +4 -4
- package/dist/{stack-update-SJ43IEQE.js → stack-update-VDM5WXRS.js} +3 -3
- package/dist/stalled-dispatch-escalation-MHLYH2PT.js +80 -0
- package/dist/{steward-gate-V7PBGVFK.js → steward-gate-Y4N2XY3R.js} +3 -3
- package/dist/{subagent-brief-injection-BLCRI2AJ.js → subagent-brief-injection-7A6JEVTP.js} +21 -20
- package/dist/{support-inbox-6HOQYFD2.js → support-inbox-LT4WJECQ.js} +4 -3
- package/dist/{task-enforcement-EF6O2V26.js → task-enforcement-WOIZ5TLK.js} +14 -14
- package/dist/{task-request-inbox-OB2KIJWO.js → task-request-inbox-D65BPUKZ.js} +2 -2
- package/dist/{task-scope-74JBTKJN.js → task-scope-PQ67YRWP.js} +13 -13
- package/dist/{tasks-crud-ZU6RZDEZ.js → tasks-crud-TJNMUKKH.js} +13 -13
- package/dist/{tasks-notify-767DRYAA.js → tasks-notify-7UVC3VGI.js} +14 -14
- package/dist/{tasks-review-4F6PZZ3B.js → tasks-review-WDWYISZ2.js} +13 -13
- package/dist/{telemetry-upload-2JM6KIAB.js → telemetry-upload-6LBGRJUE.js} +7 -7
- package/dist/{token-budget-NH2RD4YX.js → token-budget-XO5XW6DL.js} +3 -3
- package/dist/{tool-telemetry-CHCBD4OQ.js → tool-telemetry-ZL6TTZWG.js} +1 -1
- package/dist/tui/App.js +21 -21
- package/dist/{tui-data-244GF3BI.js → tui-data-UK7ZPKN4.js} +13 -13
- package/dist/{update-support-P2LO3DAB.js → update-support-BGL5KAZO.js} +12 -12
- package/dist/{work-claims-4QOE7DT2.js → work-claims-XZL2DKQ3.js} +3 -3
- package/dist/{work-state-heartbeat-GX3VWWWK.js → work-state-heartbeat-267YQ75U.js} +1 -1
- package/dist/{worker-gate-62PZATOV.js → worker-gate-RUM6MLIR.js} +1 -1
- package/dist/{workflow-engine-7YIRU62F.js → workflow-engine-YQHGHKSJ.js} +2 -2
- package/dist/{worktree-3TUKIZWY.js → worktree-3FO6EQ4G.js} +4 -4
- package/dist/{worktree-sweep-MYQHUXDE.js → worktree-sweep-X7MUEEQS.js} +5 -5
- package/package.json +2 -1
- package/release-notes.json +29 -23
- /package/dist/{chunk-25EN7XXN.js → chunk-4AN2PWUK.js} +0 -0
- /package/dist/{chunk-WM7Y5ZV2.js → chunk-5U4UJGTW.js} +0 -0
- /package/dist/{chunk-62U63R3E.js → chunk-EYIX6JU7.js} +0 -0
- /package/dist/{chunk-JLYHJJHU.js → chunk-FDA45THL.js} +0 -0
- /package/dist/{chunk-JZBZI36P.js → chunk-GIO4VU4J.js} +0 -0
- /package/dist/{chunk-BTFDA3UJ.js → chunk-I76LRCNA.js} +0 -0
- /package/dist/{chunk-YNPOELAN.js → chunk-LBWEAQ6Z.js} +0 -0
- /package/dist/{chunk-65ZSFW3O.js → chunk-MQ5RUHNZ.js} +0 -0
- /package/dist/{chunk-XM7HJ5SS.js → chunk-PFCE4AXQ.js} +0 -0
- /package/dist/{chunk-FLP2BQOA.js → chunk-SXAERZL2.js} +0 -0
- /package/dist/{chunk-OUIEDJFO.js → chunk-TKTQRSSD.js} +0 -0
- /package/dist/{chunk-DAXFAXLN.js → chunk-U2AZUMBZ.js} +0 -0
- /package/dist/{chunk-GTOMDMJL.js → chunk-W6FVADZS.js} +0 -0
- /package/dist/{core-memory-EARETDZ6.js → core-memory-W5ZHHBRR.js} +0 -0
- /package/dist/{memory-isolation-XASOGA7G.js → memory-isolation-ZE7EDBO4.js} +0 -0
- /package/dist/{oauth-server-C3BXAKAW.js → oauth-server-3HG62YYJ.js} +0 -0
- /package/dist/{project-boot-LCFBQ6NB.js → project-boot-3OAWKYLO.js} +0 -0
- /package/dist/{wiki-acl-XQH4UBP2.js → wiki-acl-FQV4E6M4.js} +0 -0
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
compareLiveArtifacts,
|
|
3
|
+
declaredArtifactsFromManifest,
|
|
4
|
+
parseDigest
|
|
5
|
+
} from "./chunk-W5MCOZTW.js";
|
|
1
6
|
import {
|
|
2
7
|
CANONICAL_SSO_COOKIE,
|
|
3
8
|
evaluateSsoCookieContract
|
|
@@ -34,6 +39,7 @@ var SSO_GATED_URLS = {
|
|
|
34
39
|
"exe-crm": "http://127.0.0.1:3000/"
|
|
35
40
|
};
|
|
36
41
|
var SSO_COOKIE_CONTRACT_CHECK_NAME = "SSO auth cookie contract";
|
|
42
|
+
var LIVE_ARTIFACT_CHECK_NAME = "Live artifact matches signed manifest";
|
|
37
43
|
function parseComposeServiceNames(composeFile) {
|
|
38
44
|
const names = /* @__PURE__ */ new Set();
|
|
39
45
|
if (!existsSync(composeFile)) return names;
|
|
@@ -392,6 +398,109 @@ async function checkSsoCookieContract(deployed, urlOverrides) {
|
|
|
392
398
|
message: `${Object.keys(urls).length} product(s) free of retired SSO cookie names`
|
|
393
399
|
};
|
|
394
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
|
+
}
|
|
395
504
|
async function runVerifyStack(options) {
|
|
396
505
|
const composeFile = options?.composeFile ?? DEFAULT_COMPOSE;
|
|
397
506
|
const envFile = options?.envFile ?? DEFAULT_ENV;
|
|
@@ -424,6 +533,8 @@ async function runVerifyStack(options) {
|
|
|
424
533
|
addResult(await checkCrossServiceAuth(goTrueResult.jwt, deployed));
|
|
425
534
|
if (Date.now() > deadline) return summarize(results);
|
|
426
535
|
addResult(await checkSsoCookieContract(deployed));
|
|
536
|
+
if (Date.now() > deadline) return summarize(results);
|
|
537
|
+
addResult(await checkLiveArtifactMatchesManifest(composeFile));
|
|
427
538
|
return summarize(results);
|
|
428
539
|
}
|
|
429
540
|
function summarize(results) {
|
|
@@ -451,7 +562,7 @@ function printUsage() {
|
|
|
451
562
|
console.log(`
|
|
452
563
|
Usage: exe-os verify-stack [options]
|
|
453
564
|
|
|
454
|
-
Post-deploy verification \u2014
|
|
565
|
+
Post-deploy verification \u2014 10 runtime checks after stack-update.
|
|
455
566
|
|
|
456
567
|
Options:
|
|
457
568
|
--compose <path> Path to docker-compose.yml (default: ${DEFAULT_COMPOSE})
|
|
@@ -467,6 +578,8 @@ Checks:
|
|
|
467
578
|
6. Monitor reports metrics
|
|
468
579
|
7. Raw pipeline alive (recent raw_events)
|
|
469
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
|
|
470
583
|
`);
|
|
471
584
|
}
|
|
472
585
|
if (isMainModule(import.meta.url) && process.argv[1]?.includes("verify-stack")) {
|
|
@@ -491,7 +604,9 @@ if (isMainModule(import.meta.url) && process.argv[1]?.includes("verify-stack"))
|
|
|
491
604
|
|
|
492
605
|
export {
|
|
493
606
|
SSO_COOKIE_CONTRACT_CHECK_NAME,
|
|
607
|
+
LIVE_ARTIFACT_CHECK_NAME,
|
|
494
608
|
parseComposeServiceNames,
|
|
495
609
|
checkSsoCookieContract,
|
|
610
|
+
checkLiveArtifactMatchesManifest,
|
|
496
611
|
runVerifyStack
|
|
497
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";
|
|
@@ -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,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;
|
|
@@ -1,179 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assessVerificationArtifact,
|
|
3
|
+
isSubstantiveCommit,
|
|
4
|
+
measureCommitSubstance
|
|
5
|
+
} from "./chunk-KZXMP6JG.js";
|
|
1
6
|
import {
|
|
2
7
|
sessionScopeFilter
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
|
|
5
|
-
// src/lib/verification-evidence.ts
|
|
6
|
-
import { execFileSync } from "child_process";
|
|
7
|
-
var TEST_PATH = /(?:^|\/)(?:tests?|__tests__|__mocks__|e2e|fixtures)\//i;
|
|
8
|
-
var TEST_FILE = /\.(?:test|spec)\.[cm]?[jt]sx?$/i;
|
|
9
|
-
var NON_SOURCE_FILE = /\.(?:md|mdx|txt|rst|adoc|snap|lock)$/i;
|
|
10
|
-
var COMMENT_LINE = /^(?:\/\/|\/\*|\*\/|\*(?!\/)|#|--|<!--|-->)/;
|
|
11
|
-
function isTestPath(path) {
|
|
12
|
-
return TEST_PATH.test(path) || TEST_FILE.test(path);
|
|
13
|
-
}
|
|
14
|
-
function isNonSourcePath(path) {
|
|
15
|
-
return NON_SOURCE_FILE.test(path);
|
|
16
|
-
}
|
|
17
|
-
function isCommentOrBlank(line) {
|
|
18
|
-
const trimmed = line.trim();
|
|
19
|
-
if (!trimmed) return true;
|
|
20
|
-
return COMMENT_LINE.test(trimmed);
|
|
21
|
-
}
|
|
22
|
-
function measureUnifiedDiff(diff) {
|
|
23
|
-
let added = 0;
|
|
24
|
-
let deleted = 0;
|
|
25
|
-
let substantiveAdded = 0;
|
|
26
|
-
const sourceFiles = /* @__PURE__ */ new Set();
|
|
27
|
-
let currentPath = "";
|
|
28
|
-
let currentIsSource = false;
|
|
29
|
-
for (const line of diff.split(/\r?\n/)) {
|
|
30
|
-
if (line.startsWith("+++ ")) {
|
|
31
|
-
const path = line.slice(4).replace(/^b\//, "").trim();
|
|
32
|
-
currentPath = path === "/dev/null" ? "" : path;
|
|
33
|
-
currentIsSource = Boolean(currentPath) && !isTestPath(currentPath) && !isNonSourcePath(currentPath);
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
if (line.startsWith("--- ") || line.startsWith("diff ") || line.startsWith("index ") || line.startsWith("@@")) {
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
if (line.startsWith("+")) {
|
|
40
|
-
added += 1;
|
|
41
|
-
if (currentIsSource) {
|
|
42
|
-
const content = line.slice(1);
|
|
43
|
-
if (!isCommentOrBlank(content)) {
|
|
44
|
-
substantiveAdded += 1;
|
|
45
|
-
sourceFiles.add(currentPath);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
} else if (line.startsWith("-")) {
|
|
49
|
-
deleted += 1;
|
|
50
|
-
if (currentIsSource) {
|
|
51
|
-
const content = line.slice(1);
|
|
52
|
-
if (!isCommentOrBlank(content)) sourceFiles.add(currentPath);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return {
|
|
57
|
-
added,
|
|
58
|
-
deleted,
|
|
59
|
-
substantive_added: substantiveAdded,
|
|
60
|
-
source_files: sourceFiles.size
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
function measureCommitSubstance(sha, cwd) {
|
|
64
|
-
if (!/^[0-9a-f]{7,64}$/i.test(sha)) return null;
|
|
65
|
-
try {
|
|
66
|
-
const diff = execFileSync(
|
|
67
|
-
"git",
|
|
68
|
-
["show", "--format=", "--unified=0", "--no-color", sha],
|
|
69
|
-
{ cwd, encoding: "utf8", timeout: 15e3, maxBuffer: 32 * 1024 * 1024 }
|
|
70
|
-
);
|
|
71
|
-
return measureUnifiedDiff(diff);
|
|
72
|
-
} catch {
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// src/shared/verification-artifact.ts
|
|
78
|
-
var ok = { ok: true, code: "ok", message: "verified" };
|
|
79
|
-
function deny(code, message) {
|
|
80
|
-
return { ok: false, code, message };
|
|
81
|
-
}
|
|
82
|
-
var HEX_SHA = /^[0-9a-f]{7,64}$/i;
|
|
83
|
-
var MIN_OBSERVATION_CHARS = 40;
|
|
84
|
-
function isRecord(value) {
|
|
85
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
86
|
-
}
|
|
87
|
-
function str(value) {
|
|
88
|
-
return typeof value === "string" ? value.trim() : "";
|
|
89
|
-
}
|
|
90
|
-
function num(value) {
|
|
91
|
-
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
92
|
-
}
|
|
93
|
-
function isSubstantiveCommit(substance) {
|
|
94
|
-
if (!isRecord(substance)) return false;
|
|
95
|
-
const added = num(substance.added);
|
|
96
|
-
const deleted = num(substance.deleted);
|
|
97
|
-
const substantive = num(substance.substantive_added);
|
|
98
|
-
const sourceFiles = num(substance.source_files);
|
|
99
|
-
if (added === null || deleted === null || substantive === null || sourceFiles === null) return false;
|
|
100
|
-
if (added < 0 || deleted < 0 || substantive < 0 || sourceFiles < 0) return false;
|
|
101
|
-
if (substantive > added) return false;
|
|
102
|
-
if (sourceFiles < 1) return false;
|
|
103
|
-
if (substantive < 1 && deleted < 1) return false;
|
|
104
|
-
return true;
|
|
105
|
-
}
|
|
106
|
-
function assessVerificationArtifact(raw, context = {}) {
|
|
107
|
-
if (raw === void 0 || raw === null || raw === "") {
|
|
108
|
-
return deny("artifact_missing", "closing requires a verification artifact showing the defect is absent");
|
|
109
|
-
}
|
|
110
|
-
let artifact = raw;
|
|
111
|
-
if (typeof raw === "string") {
|
|
112
|
-
try {
|
|
113
|
-
artifact = JSON.parse(raw);
|
|
114
|
-
} catch {
|
|
115
|
-
return deny("artifact_malformed", "verification artifact must be valid JSON");
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (!isRecord(artifact)) {
|
|
119
|
-
return deny("artifact_malformed", "verification artifact must be an object");
|
|
120
|
-
}
|
|
121
|
-
const kind = str(artifact.kind);
|
|
122
|
-
if (kind !== "regression_test" && kind !== "manual") {
|
|
123
|
-
return deny("artifact_unknown_kind", "verification artifact kind must be regression_test or manual");
|
|
124
|
-
}
|
|
125
|
-
if (!isSubstantiveCommit(artifact.substance)) {
|
|
126
|
-
return deny(
|
|
127
|
-
"commit_not_substantive",
|
|
128
|
-
"the fix commit changes no executable production source (comment-only, whitespace-only, or test-only diffs are not fixes)"
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
if (kind === "regression_test") {
|
|
132
|
-
const testId = str(artifact.test_id);
|
|
133
|
-
const fixCommit = str(artifact.fix_commit);
|
|
134
|
-
const parentCommit = str(artifact.parent_commit);
|
|
135
|
-
if (!testId || !HEX_SHA.test(fixCommit) || !HEX_SHA.test(parentCommit)) {
|
|
136
|
-
return deny("artifact_malformed", "regression_test requires test_id, fix_commit and parent_commit");
|
|
137
|
-
}
|
|
138
|
-
if (fixCommit.toLowerCase() === parentCommit.toLowerCase()) {
|
|
139
|
-
return deny("parent_equals_fix", "parent_commit must be the commit BEFORE the fix");
|
|
140
|
-
}
|
|
141
|
-
if (str(artifact.parent_result) !== "fail") {
|
|
142
|
-
return deny(
|
|
143
|
-
"test_did_not_fail_at_parent",
|
|
144
|
-
"the named test must FAIL at the parent commit \u2014 a test that already passed does not detect the defect"
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
if (str(artifact.fix_result) !== "pass") {
|
|
148
|
-
return deny("test_did_not_pass_at_fix", "the named test must PASS at the fix commit");
|
|
149
|
-
}
|
|
150
|
-
return ok;
|
|
151
|
-
}
|
|
152
|
-
const verifier = str(artifact.verifier);
|
|
153
|
-
if (!verifier) {
|
|
154
|
-
return deny("manual_verifier_missing", "manual verification requires a named verifier");
|
|
155
|
-
}
|
|
156
|
-
const authors = (context.authorIdentities ?? []).map((a) => str(a).toLowerCase()).filter(Boolean);
|
|
157
|
-
if (authors.includes(verifier.toLowerCase())) {
|
|
158
|
-
return deny(
|
|
159
|
-
"manual_verifier_is_author",
|
|
160
|
-
"manual verification must be attested by someone other than the bug's author or assignee"
|
|
161
|
-
);
|
|
162
|
-
}
|
|
163
|
-
if (!str(artifact.method)) {
|
|
164
|
-
return deny("artifact_malformed", "manual verification requires a method");
|
|
165
|
-
}
|
|
166
|
-
if (str(artifact.observation).length < MIN_OBSERVATION_CHARS) {
|
|
167
|
-
return deny(
|
|
168
|
-
"manual_observation_too_thin",
|
|
169
|
-
"manual verification requires an observation describing the defect's absence"
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
if (!HEX_SHA.test(str(artifact.fix_commit))) {
|
|
173
|
-
return deny("artifact_malformed", "manual verification requires a fix_commit");
|
|
174
|
-
}
|
|
175
|
-
return ok;
|
|
176
|
-
}
|
|
8
|
+
} from "./chunk-Y4AYNLXU.js";
|
|
177
9
|
|
|
178
10
|
// src/shared/task-completion-gate.ts
|
|
179
11
|
var COMPLETION_CLAIM_STATUSES = ["done", "needs_review", "closed"];
|
|
@@ -181,9 +13,9 @@ function isCompletionClaim(status) {
|
|
|
181
13
|
const normalized = typeof status === "string" ? status.trim() : "";
|
|
182
14
|
return COMPLETION_CLAIM_STATUSES.includes(normalized);
|
|
183
15
|
}
|
|
184
|
-
var
|
|
16
|
+
var ok = { ok: true, code: "ok", message: "verified" };
|
|
185
17
|
function assessAutomatedTaskCompletion(input) {
|
|
186
|
-
if (!isCompletionClaim(input.status)) return
|
|
18
|
+
if (!isCompletionClaim(input.status)) return ok;
|
|
187
19
|
if (!isSubstantiveCommit(input.substance)) {
|
|
188
20
|
return {
|
|
189
21
|
ok: false,
|
|
@@ -194,7 +26,7 @@ function assessAutomatedTaskCompletion(input) {
|
|
|
194
26
|
if (input.verificationArtifact !== void 0 && input.verificationArtifact !== null) {
|
|
195
27
|
return assessVerificationArtifact(input.verificationArtifact, input.context ?? {});
|
|
196
28
|
}
|
|
197
|
-
return
|
|
29
|
+
return ok;
|
|
198
30
|
}
|
|
199
31
|
|
|
200
32
|
// src/lib/git-task-sweep.ts
|
|
@@ -457,7 +289,7 @@ async function sweepTasks(projectName, options = {}) {
|
|
|
457
289
|
}
|
|
458
290
|
if (!dryRun) {
|
|
459
291
|
try {
|
|
460
|
-
const { updateTaskStatus } = await import("./tasks-crud-
|
|
292
|
+
const { updateTaskStatus } = await import("./tasks-crud-TJNMUKKH.js");
|
|
461
293
|
await updateTaskStatus({
|
|
462
294
|
taskId: task.id,
|
|
463
295
|
status: "needs_review",
|
|
@@ -485,7 +317,6 @@ async function sweepTasks(projectName, options = {}) {
|
|
|
485
317
|
}
|
|
486
318
|
|
|
487
319
|
export {
|
|
488
|
-
measureCommitSubstance,
|
|
489
320
|
assessAutomatedTaskCompletion,
|
|
490
321
|
extractKeywords,
|
|
491
322
|
matchScore,
|
|
@@ -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
|
+
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
extractMemoryGraph
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-BEPO36MW.js";
|
|
4
4
|
import {
|
|
5
5
|
flushBatch,
|
|
6
6
|
writeMemory
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ELY5WBZX.js";
|
|
8
8
|
import {
|
|
9
9
|
extractKeywords
|
|
10
10
|
} from "./chunk-CHCA3ZM2.js";
|
|
11
11
|
import {
|
|
12
12
|
getActiveAgent
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-NNXPIJRB.js";
|
|
14
14
|
|
|
15
15
|
// src/mcp/tools/import-conversations.ts
|
|
16
16
|
import { z } from "zod";
|