@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,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
buildSystemStateMemoryTypeExclusion
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ELY5WBZX.js";
|
|
4
4
|
import {
|
|
5
5
|
sessionScopeFilter
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-Y4AYNLXU.js";
|
|
7
7
|
import {
|
|
8
8
|
getClient,
|
|
9
9
|
getIdentity
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-OBESOWFJ.js";
|
|
11
11
|
import {
|
|
12
12
|
getEmotionalBaseline
|
|
13
13
|
} from "./chunk-NJFJWQNN.js";
|
|
@@ -646,7 +646,7 @@ var DreamingEngine = class {
|
|
|
646
646
|
}
|
|
647
647
|
let overdueProspective = [];
|
|
648
648
|
try {
|
|
649
|
-
const { getOverdueProspective, completeProspective } = await import("./prospective-memory-
|
|
649
|
+
const { getOverdueProspective, completeProspective } = await import("./prospective-memory-HI3WUY4U.js");
|
|
650
650
|
const overdue = await getOverdueProspective(agentId);
|
|
651
651
|
overdueProspective = overdue.map((o) => ({
|
|
652
652
|
id: o.id,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ingest
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VD3CVNGB.js";
|
|
4
4
|
import {
|
|
5
5
|
listWorkflowDefinitions,
|
|
6
6
|
runWorkflow,
|
|
7
7
|
startWorkflow
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-CXHRNESJ.js";
|
|
9
9
|
import {
|
|
10
10
|
initCRMBridge
|
|
11
11
|
} from "./chunk-ML4S5SHZ.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OBESOWFJ.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/pipeline-router.ts
|
|
6
6
|
import crypto from "crypto";
|
|
@@ -140,8 +140,8 @@ Agent response: ${agentResponse}` : ""
|
|
|
140
140
|
}
|
|
141
141
|
async function sinkEntityExtraction(msg, agentResponse, agentName) {
|
|
142
142
|
try {
|
|
143
|
-
const { extractFromConversation } = await import("./conversation-entity-extractor-
|
|
144
|
-
const { storeExtraction } = await import("./graph-rag-
|
|
143
|
+
const { extractFromConversation } = await import("./conversation-entity-extractor-LFIDTD2O.js");
|
|
144
|
+
const { storeExtraction } = await import("./graph-rag-RLRQMY54.js");
|
|
145
145
|
if ((msg.text?.length ?? 0) < 20) return false;
|
|
146
146
|
if (msg.isHistorical) return false;
|
|
147
147
|
const extraction = await extractFromConversation(msg, agentResponse, agentName);
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MultiAgentOrchestrator
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QT6CNCXO.js";
|
|
4
4
|
import {
|
|
5
5
|
createTokenBudgetMiddleware
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-2UGU3V63.js";
|
|
7
7
|
import {
|
|
8
8
|
createQuietRenderer,
|
|
9
9
|
createTerminalRenderer,
|
|
10
10
|
renderAgentEvents
|
|
11
11
|
} from "./chunk-YZFZDJWZ.js";
|
|
12
|
-
import {
|
|
13
|
-
checkDangerousPatterns,
|
|
14
|
-
hasCriticalPattern
|
|
15
|
-
} from "./chunk-CMCYL2JC.js";
|
|
16
12
|
import {
|
|
17
13
|
checkPathSafety,
|
|
18
14
|
checkReadPathSafety,
|
|
19
15
|
containsPathTraversal
|
|
20
16
|
} from "./chunk-NGVOA6ZQ.js";
|
|
17
|
+
import {
|
|
18
|
+
checkDangerousPatterns,
|
|
19
|
+
hasCriticalPattern
|
|
20
|
+
} from "./chunk-CMCYL2JC.js";
|
|
21
21
|
import {
|
|
22
22
|
ContextManager,
|
|
23
23
|
agentLoop,
|
|
@@ -209,7 +209,7 @@ function createExeOSHooks(config) {
|
|
|
209
209
|
);
|
|
210
210
|
}
|
|
211
211
|
try {
|
|
212
|
-
const { listBehaviors } = await import("./behaviors-
|
|
212
|
+
const { listBehaviors } = await import("./behaviors-UCMAREU3.js");
|
|
213
213
|
const behaviors = await listBehaviors(config.agentId, config.projectName, 12);
|
|
214
214
|
if (behaviors.length > 0) {
|
|
215
215
|
process.stderr.write(
|
|
@@ -330,7 +330,7 @@ function createExeOSHooks(config) {
|
|
|
330
330
|
async onSubagentStop(_reason) {
|
|
331
331
|
try {
|
|
332
332
|
const { getClient } = await import("./lib/database.js");
|
|
333
|
-
const { sessionScopeFilter } = await import("./task-scope-
|
|
333
|
+
const { sessionScopeFilter } = await import("./task-scope-PQ67YRWP.js");
|
|
334
334
|
const client = getClient();
|
|
335
335
|
const ehScope = sessionScopeFilter();
|
|
336
336
|
const tasks = await client.execute({
|
|
@@ -422,7 +422,7 @@ function createExeOSHooks(config) {
|
|
|
422
422
|
try {
|
|
423
423
|
const { writeMemory, flushBatch } = await import("./lib/store.js");
|
|
424
424
|
const { getClient } = await import("./lib/database.js");
|
|
425
|
-
const { sessionScopeFilter: cpScopeFilter } = await import("./task-scope-
|
|
425
|
+
const { sessionScopeFilter: cpScopeFilter } = await import("./task-scope-PQ67YRWP.js");
|
|
426
426
|
const client = getClient();
|
|
427
427
|
const cpScope = cpScopeFilter();
|
|
428
428
|
const tasks = await client.execute({
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
// src/lib/delivery-truth.ts
|
|
2
|
+
var DIGEST_RE = /@(sha256:[0-9a-f]{64})\b/i;
|
|
3
|
+
function parseDigest(ref) {
|
|
4
|
+
const m = DIGEST_RE.exec(ref ?? "");
|
|
5
|
+
return m?.[1] ? m[1].toLowerCase() : null;
|
|
6
|
+
}
|
|
7
|
+
function repositoryKey(ref) {
|
|
8
|
+
const withoutDigest = (ref ?? "").split("@")[0] ?? "";
|
|
9
|
+
const withoutTag = withoutDigest.replace(/:[^/:]+$/, "");
|
|
10
|
+
const segments = withoutTag.split("/").filter(Boolean);
|
|
11
|
+
return segments[segments.length - 1] ?? withoutTag;
|
|
12
|
+
}
|
|
13
|
+
function compareLiveArtifacts(running, declared, options) {
|
|
14
|
+
const declaredByDigest = /* @__PURE__ */ new Map();
|
|
15
|
+
const declaredByRepo = /* @__PURE__ */ new Map();
|
|
16
|
+
for (const d of declared) {
|
|
17
|
+
if (d.digest) declaredByDigest.set(d.digest.toLowerCase(), d);
|
|
18
|
+
declaredByRepo.set(repositoryKey(d.ref), d);
|
|
19
|
+
}
|
|
20
|
+
const entries = [];
|
|
21
|
+
const matchedDeclared = /* @__PURE__ */ new Set();
|
|
22
|
+
for (const r of running) {
|
|
23
|
+
const digest = r.digest ?? parseDigest(r.ref);
|
|
24
|
+
const repo = repositoryKey(r.ref);
|
|
25
|
+
const runningSide = { ref: r.ref, digest, containers: r.containers };
|
|
26
|
+
if (digest && declaredByDigest.has(digest)) {
|
|
27
|
+
const d = declaredByDigest.get(digest);
|
|
28
|
+
matchedDeclared.add(d.service);
|
|
29
|
+
entries.push({
|
|
30
|
+
service: d.service,
|
|
31
|
+
verdict: "agrees",
|
|
32
|
+
channel: d.channel,
|
|
33
|
+
running: runningSide,
|
|
34
|
+
declared: { ref: d.ref, digest: d.digest },
|
|
35
|
+
detail: `running digest is the digest the signed manifest pins`
|
|
36
|
+
});
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const byRepo = declaredByRepo.get(repo);
|
|
40
|
+
if (byRepo) {
|
|
41
|
+
matchedDeclared.add(byRepo.service);
|
|
42
|
+
if (!digest) {
|
|
43
|
+
entries.push({
|
|
44
|
+
service: byRepo.service,
|
|
45
|
+
verdict: "unknown-provenance",
|
|
46
|
+
channel: byRepo.channel,
|
|
47
|
+
running: runningSide,
|
|
48
|
+
declared: { ref: byRepo.ref, digest: byRepo.digest },
|
|
49
|
+
detail: `running ref "${r.ref}" carries no resolvable digest, so what is running cannot be traced to any published artifact \u2014 it cannot be shown to match or to differ from the manifest pin`
|
|
50
|
+
});
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
entries.push({
|
|
54
|
+
service: byRepo.service,
|
|
55
|
+
verdict: "disagrees",
|
|
56
|
+
channel: byRepo.channel,
|
|
57
|
+
running: runningSide,
|
|
58
|
+
declared: { ref: byRepo.ref, digest: byRepo.digest },
|
|
59
|
+
detail: `running ${digest} but the signed manifest pins ${byRepo.digest ?? "(no digest)"} \u2014 production is not the artifact we signed`
|
|
60
|
+
});
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (!digest) {
|
|
64
|
+
entries.push({
|
|
65
|
+
service: repo,
|
|
66
|
+
verdict: "unknown-provenance",
|
|
67
|
+
channel: "signed-manifest",
|
|
68
|
+
running: runningSide,
|
|
69
|
+
detail: `running ref "${r.ref}" carries no resolvable digest and matches no declared repository \u2014 provenance unknown`
|
|
70
|
+
});
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
entries.push({
|
|
74
|
+
service: repo,
|
|
75
|
+
verdict: "undeclared",
|
|
76
|
+
channel: "signed-manifest",
|
|
77
|
+
running: runningSide,
|
|
78
|
+
detail: `running ${digest} under repository "${repo}", which the signed manifest does not declare at all \u2014 this artifact is outside the release contract`
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (options?.reportNotRunning) {
|
|
82
|
+
for (const d of declared) {
|
|
83
|
+
if (matchedDeclared.has(d.service)) continue;
|
|
84
|
+
entries.push({
|
|
85
|
+
service: d.service,
|
|
86
|
+
verdict: "not-running",
|
|
87
|
+
channel: d.channel,
|
|
88
|
+
declared: { ref: d.ref, digest: d.digest },
|
|
89
|
+
detail: `declared and pinned, but no running artifact in the inspected inventory carries this digest or repository`
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const counts = {
|
|
94
|
+
agrees: 0,
|
|
95
|
+
disagrees: 0,
|
|
96
|
+
undeclared: 0,
|
|
97
|
+
"unknown-provenance": 0,
|
|
98
|
+
"not-running": 0
|
|
99
|
+
};
|
|
100
|
+
for (const e of entries) counts[e.verdict]++;
|
|
101
|
+
return {
|
|
102
|
+
entries,
|
|
103
|
+
findings: entries.filter((e) => e.verdict !== "agrees"),
|
|
104
|
+
counts,
|
|
105
|
+
inventory: {
|
|
106
|
+
runningArtifacts: running.length,
|
|
107
|
+
declaredArtifacts: declared.length,
|
|
108
|
+
source: options?.source ?? "unspecified"
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function declaredArtifactsFromManifest(manifest, options) {
|
|
113
|
+
const m = manifest;
|
|
114
|
+
if (!m || typeof m !== "object" || !m.stacks) {
|
|
115
|
+
throw new Error("manifest has no `stacks` object");
|
|
116
|
+
}
|
|
117
|
+
const version = options?.stackVersion ?? m.latest;
|
|
118
|
+
if (!version) throw new Error("manifest has no `latest` and no stack version was given");
|
|
119
|
+
const stack = m.stacks[version];
|
|
120
|
+
if (!stack?.services) throw new Error(`manifest stack "${version}" is missing or has no services`);
|
|
121
|
+
const out = [];
|
|
122
|
+
for (const [service, svc] of Object.entries(stack.services)) {
|
|
123
|
+
const ref = typeof svc?.image === "string" ? svc.image : "";
|
|
124
|
+
if (!ref) continue;
|
|
125
|
+
out.push({ service, ref, digest: parseDigest(ref), channel: "signed-manifest" });
|
|
126
|
+
}
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
function evaluateDeliveryChannels(input) {
|
|
130
|
+
const { detected, registry, npmFiles } = input;
|
|
131
|
+
const normalizedFiles = npmFiles.map((f) => f.replace(/^\.\//, "").replace(/\/+$/, ""));
|
|
132
|
+
const covered = (p) => {
|
|
133
|
+
const path = p.replace(/^\.\//, "").replace(/\/+$/, "");
|
|
134
|
+
return normalizedFiles.some((f) => f === path || path.startsWith(`${f}/`));
|
|
135
|
+
};
|
|
136
|
+
const out = [];
|
|
137
|
+
for (const d of detected) {
|
|
138
|
+
const channel = registry[d.path] ?? null;
|
|
139
|
+
if (!channel) {
|
|
140
|
+
out.push({
|
|
141
|
+
path: d.path,
|
|
142
|
+
channel: null,
|
|
143
|
+
verdict: "unclassified",
|
|
144
|
+
detail: `${d.path} is deployable (${d.evidence}) but declares no delivery channel. Nothing can say whether a change here reaches a customer.`
|
|
145
|
+
});
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (channel === "no-release-path") {
|
|
149
|
+
out.push({
|
|
150
|
+
path: d.path,
|
|
151
|
+
channel,
|
|
152
|
+
verdict: "no-release-path",
|
|
153
|
+
detail: `${d.path} has NO delivery path. Merging here delivers nothing to anyone.`
|
|
154
|
+
});
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (channel === "not-shipped") {
|
|
158
|
+
out.push({
|
|
159
|
+
path: d.path,
|
|
160
|
+
channel,
|
|
161
|
+
verdict: "not-shipped",
|
|
162
|
+
detail: `${d.path} ships nowhere itself. A change here reaches a customer only once it is vendored into a consuming artifact AND that artifact is rebuilt.`
|
|
163
|
+
});
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (channel === "npm" && !covered(d.path)) {
|
|
167
|
+
out.push({
|
|
168
|
+
path: d.path,
|
|
169
|
+
channel,
|
|
170
|
+
verdict: "undelivered",
|
|
171
|
+
detail: `${d.path} declares the npm channel but is not covered by package.json \`files\`, so it is in the git tag and ABSENT from the published tarball. Tag ancestry is not proof of delivery.`
|
|
172
|
+
});
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
out.push({
|
|
176
|
+
path: d.path,
|
|
177
|
+
channel,
|
|
178
|
+
verdict: "delivered",
|
|
179
|
+
detail: `${d.path} ships via ${channel}`
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
return out;
|
|
183
|
+
}
|
|
184
|
+
var GATE_COOKIE_RE = /\bexe_[a-z0-9_]*token[a-z0-9_]*\b/gi;
|
|
185
|
+
function extractGateCookieNames(html) {
|
|
186
|
+
const found = /* @__PURE__ */ new Set();
|
|
187
|
+
for (const m of (html ?? "").matchAll(GATE_COOKIE_RE)) found.add(m[0].toLowerCase());
|
|
188
|
+
return [...found].sort();
|
|
189
|
+
}
|
|
190
|
+
function evaluateAnonymousGate(input) {
|
|
191
|
+
const { service, url, html, setterNames } = input;
|
|
192
|
+
const gateCookies = extractGateCookieNames(html);
|
|
193
|
+
if (gateCookies.length === 0) {
|
|
194
|
+
return {
|
|
195
|
+
service,
|
|
196
|
+
url,
|
|
197
|
+
status: "no-client-gate",
|
|
198
|
+
gateCookies,
|
|
199
|
+
detail: `no SSO-shaped cookie name in the served document \u2014 this product does not gate client-side (it may bridge server-side, which is correct)`
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
const setters = new Set(setterNames.map((s) => s.toLowerCase()));
|
|
203
|
+
if (setters.size === 0) {
|
|
204
|
+
return {
|
|
205
|
+
service,
|
|
206
|
+
url,
|
|
207
|
+
status: "inconclusive",
|
|
208
|
+
gateCookies,
|
|
209
|
+
detail: `the auth origin exposed no cookie name, so there is nothing to compare against. The probe cannot answer the question \u2014 fix the probe or the auth surface. This is NOT a pass.`
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const unsatisfiable = gateCookies.filter((c) => !setters.has(c));
|
|
213
|
+
if (unsatisfiable.length === gateCookies.length) {
|
|
214
|
+
return {
|
|
215
|
+
service,
|
|
216
|
+
url,
|
|
217
|
+
status: "unsatisfiable",
|
|
218
|
+
gateCookies,
|
|
219
|
+
detail: `gates on ${unsatisfiable.join(", ")}, which NO origin in the live auth flow sets (auth hands out: ${[...setters].sort().join(", ")}). Every visitor bounces between this product and auth forever. The served page answers HTTP 200 with zero redirects because the loop is client-side, so a status-code check sees a healthy service.`
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
service,
|
|
224
|
+
url,
|
|
225
|
+
status: "satisfiable",
|
|
226
|
+
gateCookies,
|
|
227
|
+
detail: `gates on ${gateCookies.join(", ")}; the live auth flow sets a matching name`
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
var ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
231
|
+
var DEPARTMENT_RE = /^(the\s+)?(team|eng|engineering|ops|devops|sre|infra|platform|everyone|tbd|unknown|n\/?a)$/i;
|
|
232
|
+
function applyLivenessAcks(input) {
|
|
233
|
+
const { findingKeys, acks, now } = input;
|
|
234
|
+
const present = new Set(findingKeys);
|
|
235
|
+
const evaluations = [];
|
|
236
|
+
const suppressed = /* @__PURE__ */ new Set();
|
|
237
|
+
for (const ack of acks) {
|
|
238
|
+
const missing = [];
|
|
239
|
+
if (!ack?.key) missing.push("key");
|
|
240
|
+
const owner = (ack?.owner ?? "").trim();
|
|
241
|
+
if (owner.length < 2) missing.push("owner");
|
|
242
|
+
else if (DEPARTMENT_RE.test(owner)) missing.push("owner (a person, not a team)");
|
|
243
|
+
if (!ack?.bug) missing.push("bug");
|
|
244
|
+
if (!ack?.expires || !ISO_DATE_RE.test(ack.expires)) missing.push("expires (YYYY-MM-DD)");
|
|
245
|
+
if (missing.length > 0) {
|
|
246
|
+
evaluations.push({
|
|
247
|
+
ack,
|
|
248
|
+
state: "invalid",
|
|
249
|
+
detail: `ack for "${ack?.key ?? "(no key)"}" is missing ${missing.join(", ")} \u2014 it suppresses nothing. An ack needs a person who defends it and a tracked fix, or it is just a mute.`
|
|
250
|
+
});
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
const expiry = /* @__PURE__ */ new Date(`${ack.expires}T23:59:59Z`);
|
|
254
|
+
if (Number.isNaN(expiry.getTime()) || expiry.getTime() < now.getTime()) {
|
|
255
|
+
evaluations.push({
|
|
256
|
+
ack,
|
|
257
|
+
state: "expired",
|
|
258
|
+
detail: `ack for "${ack.key}" expired on ${ack.expires} (owner: ${ack.owner}, bug: ${ack.bug}). The finding is failing again, and the lapsed ack is itself a failure. Fix it or re-ack with a new date and a reason.`
|
|
259
|
+
});
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (!present.has(ack.key)) {
|
|
263
|
+
evaluations.push({
|
|
264
|
+
ack,
|
|
265
|
+
state: "stale",
|
|
266
|
+
detail: `ack for "${ack.key}" (owner: ${ack.owner}) suppresses a finding that is no longer present. Delete it \u2014 a suppression list that only grows becomes a permanent allow-list.`
|
|
267
|
+
});
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
suppressed.add(ack.key);
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
failing: findingKeys.filter((k) => !suppressed.has(k)),
|
|
274
|
+
acknowledged: [...suppressed],
|
|
275
|
+
ackProblems: evaluations
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
function findingKey(f) {
|
|
279
|
+
return `${f.service}:${f.verdict}`;
|
|
280
|
+
}
|
|
281
|
+
function deliveryStateOf(report) {
|
|
282
|
+
return report.entries.map((e) => ({
|
|
283
|
+
service: e.service,
|
|
284
|
+
channel: e.channel,
|
|
285
|
+
delivered: e.verdict === "agrees" ? true : e.verdict === "unknown-provenance" ? null : false,
|
|
286
|
+
liveIdentity: e.running?.digest ?? e.running?.ref ?? null,
|
|
287
|
+
declaredIdentity: e.declared?.digest ?? e.declared?.ref ?? null,
|
|
288
|
+
verdict: e.verdict,
|
|
289
|
+
detail: e.detail
|
|
290
|
+
}));
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export {
|
|
294
|
+
parseDigest,
|
|
295
|
+
repositoryKey,
|
|
296
|
+
compareLiveArtifacts,
|
|
297
|
+
declaredArtifactsFromManifest,
|
|
298
|
+
evaluateDeliveryChannels,
|
|
299
|
+
extractGateCookieNames,
|
|
300
|
+
evaluateAnonymousGate,
|
|
301
|
+
applyLivenessAcks,
|
|
302
|
+
findingKey,
|
|
303
|
+
deliveryStateOf
|
|
304
|
+
};
|