@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
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
// src/lib/verification-evidence.ts
|
|
2
|
+
import { execFileSync } from "child_process";
|
|
3
|
+
|
|
4
|
+
// src/shared/verification-artifact.ts
|
|
5
|
+
var ok = { ok: true, code: "ok", message: "verified" };
|
|
6
|
+
function deny(code, message) {
|
|
7
|
+
return { ok: false, code, message };
|
|
8
|
+
}
|
|
9
|
+
var HEX_SHA = /^[0-9a-f]{7,64}$/i;
|
|
10
|
+
var MIN_OBSERVATION_CHARS = 40;
|
|
11
|
+
function isRecord(value) {
|
|
12
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
13
|
+
}
|
|
14
|
+
function str(value) {
|
|
15
|
+
return typeof value === "string" ? value.trim() : "";
|
|
16
|
+
}
|
|
17
|
+
function num(value) {
|
|
18
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
19
|
+
}
|
|
20
|
+
function isSubstantiveCommit(substance) {
|
|
21
|
+
if (!isRecord(substance)) return false;
|
|
22
|
+
const added = num(substance.added);
|
|
23
|
+
const deleted = num(substance.deleted);
|
|
24
|
+
const substantive = num(substance.substantive_added);
|
|
25
|
+
const sourceFiles = num(substance.source_files);
|
|
26
|
+
if (added === null || deleted === null || substantive === null || sourceFiles === null) return false;
|
|
27
|
+
if (added < 0 || deleted < 0 || substantive < 0 || sourceFiles < 0) return false;
|
|
28
|
+
if (substantive > added) return false;
|
|
29
|
+
if (sourceFiles < 1) return false;
|
|
30
|
+
if (substantive < 1 && deleted < 1) return false;
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
function assessVerificationArtifact(raw, context = {}) {
|
|
34
|
+
if (raw === void 0 || raw === null || raw === "") {
|
|
35
|
+
return deny("artifact_missing", "closing requires a verification artifact showing the defect is absent");
|
|
36
|
+
}
|
|
37
|
+
let artifact = raw;
|
|
38
|
+
if (typeof raw === "string") {
|
|
39
|
+
try {
|
|
40
|
+
artifact = JSON.parse(raw);
|
|
41
|
+
} catch {
|
|
42
|
+
return deny("artifact_malformed", "verification artifact must be valid JSON");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (!isRecord(artifact)) {
|
|
46
|
+
return deny("artifact_malformed", "verification artifact must be an object");
|
|
47
|
+
}
|
|
48
|
+
const kind = str(artifact.kind);
|
|
49
|
+
if (kind !== "regression_test" && kind !== "manual") {
|
|
50
|
+
return deny("artifact_unknown_kind", "verification artifact kind must be regression_test or manual");
|
|
51
|
+
}
|
|
52
|
+
if (!isSubstantiveCommit(artifact.substance)) {
|
|
53
|
+
return deny(
|
|
54
|
+
"commit_not_substantive",
|
|
55
|
+
"the fix commit changes no executable production source (comment-only, whitespace-only, or test-only diffs are not fixes)"
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
if (kind === "regression_test") {
|
|
59
|
+
const testId = str(artifact.test_id);
|
|
60
|
+
const fixCommit = str(artifact.fix_commit);
|
|
61
|
+
const parentCommit = str(artifact.parent_commit);
|
|
62
|
+
if (!testId || !HEX_SHA.test(fixCommit) || !HEX_SHA.test(parentCommit)) {
|
|
63
|
+
return deny("artifact_malformed", "regression_test requires test_id, fix_commit and parent_commit");
|
|
64
|
+
}
|
|
65
|
+
if (fixCommit.toLowerCase() === parentCommit.toLowerCase()) {
|
|
66
|
+
return deny("parent_equals_fix", "parent_commit must be the commit BEFORE the fix");
|
|
67
|
+
}
|
|
68
|
+
if (str(artifact.parent_result) !== "fail") {
|
|
69
|
+
return deny(
|
|
70
|
+
"test_did_not_fail_at_parent",
|
|
71
|
+
"the named test must FAIL at the parent commit \u2014 a test that already passed does not detect the defect"
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
if (str(artifact.fix_result) !== "pass") {
|
|
75
|
+
return deny("test_did_not_pass_at_fix", "the named test must PASS at the fix commit");
|
|
76
|
+
}
|
|
77
|
+
return ok;
|
|
78
|
+
}
|
|
79
|
+
const verifier = str(artifact.verifier);
|
|
80
|
+
if (!verifier) {
|
|
81
|
+
return deny("manual_verifier_missing", "manual verification requires a named verifier");
|
|
82
|
+
}
|
|
83
|
+
const authors = (context.authorIdentities ?? []).map((a) => str(a).toLowerCase()).filter(Boolean);
|
|
84
|
+
if (authors.includes(verifier.toLowerCase())) {
|
|
85
|
+
return deny(
|
|
86
|
+
"manual_verifier_is_author",
|
|
87
|
+
"manual verification must be attested by someone other than the bug's author or assignee"
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
if (!str(artifact.method)) {
|
|
91
|
+
return deny("artifact_malformed", "manual verification requires a method");
|
|
92
|
+
}
|
|
93
|
+
if (str(artifact.observation).length < MIN_OBSERVATION_CHARS) {
|
|
94
|
+
return deny(
|
|
95
|
+
"manual_observation_too_thin",
|
|
96
|
+
"manual verification requires an observation describing the defect's absence"
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
if (!HEX_SHA.test(str(artifact.fix_commit))) {
|
|
100
|
+
return deny("artifact_malformed", "manual verification requires a fix_commit");
|
|
101
|
+
}
|
|
102
|
+
return ok;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// src/lib/verification-evidence.ts
|
|
106
|
+
var TEST_PATH = /(?:^|\/)(?:tests?|__tests__|__mocks__|e2e|fixtures)\//i;
|
|
107
|
+
var TEST_FILE = /\.(?:test|spec)\.[cm]?[jt]sx?$/i;
|
|
108
|
+
var NON_SOURCE_FILE = /\.(?:md|mdx|txt|rst|adoc|snap|lock)$/i;
|
|
109
|
+
var COMMENT_LINE = /^(?:\/\/|\/\*|\*\/|\*(?!\/)|#|--|<!--|-->)/;
|
|
110
|
+
function isTestPath(path) {
|
|
111
|
+
return TEST_PATH.test(path) || TEST_FILE.test(path);
|
|
112
|
+
}
|
|
113
|
+
function isNonSourcePath(path) {
|
|
114
|
+
return NON_SOURCE_FILE.test(path);
|
|
115
|
+
}
|
|
116
|
+
function isCommentOrBlank(line) {
|
|
117
|
+
const trimmed = line.trim();
|
|
118
|
+
if (!trimmed) return true;
|
|
119
|
+
return COMMENT_LINE.test(trimmed);
|
|
120
|
+
}
|
|
121
|
+
function measureUnifiedDiff(diff) {
|
|
122
|
+
let added = 0;
|
|
123
|
+
let deleted = 0;
|
|
124
|
+
let substantiveAdded = 0;
|
|
125
|
+
const sourceFiles = /* @__PURE__ */ new Set();
|
|
126
|
+
let currentPath = "";
|
|
127
|
+
let currentIsSource = false;
|
|
128
|
+
for (const line of diff.split(/\r?\n/)) {
|
|
129
|
+
if (line.startsWith("+++ ")) {
|
|
130
|
+
const path = line.slice(4).replace(/^b\//, "").trim();
|
|
131
|
+
currentPath = path === "/dev/null" ? "" : path;
|
|
132
|
+
currentIsSource = Boolean(currentPath) && !isTestPath(currentPath) && !isNonSourcePath(currentPath);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (line.startsWith("--- ") || line.startsWith("diff ") || line.startsWith("index ") || line.startsWith("@@")) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (line.startsWith("+")) {
|
|
139
|
+
added += 1;
|
|
140
|
+
if (currentIsSource) {
|
|
141
|
+
const content = line.slice(1);
|
|
142
|
+
if (!isCommentOrBlank(content)) {
|
|
143
|
+
substantiveAdded += 1;
|
|
144
|
+
sourceFiles.add(currentPath);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
} else if (line.startsWith("-")) {
|
|
148
|
+
deleted += 1;
|
|
149
|
+
if (currentIsSource) {
|
|
150
|
+
const content = line.slice(1);
|
|
151
|
+
if (!isCommentOrBlank(content)) sourceFiles.add(currentPath);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
added,
|
|
157
|
+
deleted,
|
|
158
|
+
substantive_added: substantiveAdded,
|
|
159
|
+
source_files: sourceFiles.size
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function measureCommitSubstance(sha, cwd) {
|
|
163
|
+
if (!/^[0-9a-f]{7,64}$/i.test(sha)) return null;
|
|
164
|
+
try {
|
|
165
|
+
const diff = execFileSync(
|
|
166
|
+
"git",
|
|
167
|
+
["show", "--format=", "--unified=0", "--no-color", sha],
|
|
168
|
+
{ cwd, encoding: "utf8", timeout: 15e3, maxBuffer: 32 * 1024 * 1024 }
|
|
169
|
+
);
|
|
170
|
+
return measureUnifiedDiff(diff);
|
|
171
|
+
} catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function resolveParentCommit(sha, cwd) {
|
|
176
|
+
if (!/^[0-9a-f]{7,64}$/i.test(sha)) return null;
|
|
177
|
+
try {
|
|
178
|
+
const out = execFileSync("git", ["rev-parse", `${sha}^`], {
|
|
179
|
+
cwd,
|
|
180
|
+
encoding: "utf8",
|
|
181
|
+
timeout: 1e4
|
|
182
|
+
});
|
|
183
|
+
const parent = out.trim();
|
|
184
|
+
return /^[0-9a-f]{7,64}$/i.test(parent) ? parent : null;
|
|
185
|
+
} catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function fail(code, message) {
|
|
190
|
+
return { ok: false, code, message };
|
|
191
|
+
}
|
|
192
|
+
var PLACEHOLDER_VERIFIERS = /* @__PURE__ */ new Set([
|
|
193
|
+
"me",
|
|
194
|
+
"self",
|
|
195
|
+
"myself",
|
|
196
|
+
"i",
|
|
197
|
+
"agent",
|
|
198
|
+
"the agent",
|
|
199
|
+
"assistant",
|
|
200
|
+
"ai",
|
|
201
|
+
"bot",
|
|
202
|
+
"n/a",
|
|
203
|
+
"na",
|
|
204
|
+
"none",
|
|
205
|
+
"unknown",
|
|
206
|
+
"tbd",
|
|
207
|
+
"todo",
|
|
208
|
+
"system",
|
|
209
|
+
"automated",
|
|
210
|
+
"auto",
|
|
211
|
+
"claude",
|
|
212
|
+
"user",
|
|
213
|
+
"test",
|
|
214
|
+
"someone",
|
|
215
|
+
"team"
|
|
216
|
+
]);
|
|
217
|
+
var LOW_CONTENT_OBSERVATION = /^(?:it(?:'s| is)? |the bug (?:is|was) |this (?:is|was) )?(?:fixed|resolved|working|done|good|ok|verified|closed)\b/i;
|
|
218
|
+
function resolveCommit(sha, cwd) {
|
|
219
|
+
if (!/^[0-9a-f]{7,64}$/i.test(sha)) return null;
|
|
220
|
+
try {
|
|
221
|
+
const out = execFileSync("git", ["rev-parse", "--verify", `${sha}^{commit}`], {
|
|
222
|
+
cwd,
|
|
223
|
+
encoding: "utf8",
|
|
224
|
+
timeout: 1e4
|
|
225
|
+
}).trim();
|
|
226
|
+
return /^[0-9a-f]{40}$/i.test(out) ? out : null;
|
|
227
|
+
} catch {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function buildVerificationArtifact(request, context = {}) {
|
|
232
|
+
const repo = request.repo_path;
|
|
233
|
+
if (!repo || !repo.trim()) {
|
|
234
|
+
return fail("repo_path_missing", "repo_path is required: the fix commit must be measured in the repository that contains it");
|
|
235
|
+
}
|
|
236
|
+
const fixCommit = resolveCommit(request.fix_commit ?? "", repo);
|
|
237
|
+
if (!fixCommit) {
|
|
238
|
+
return fail(
|
|
239
|
+
"fix_commit_unresolvable",
|
|
240
|
+
`fix_commit ${request.fix_commit} is not a commit in ${repo} \u2014 verification evidence cannot be measured, and will not be guessed`
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
const substance = measureCommitSubstance(fixCommit, repo);
|
|
244
|
+
if (!substance) {
|
|
245
|
+
return fail("commit_not_measurable", `git could not diff ${fixCommit} in ${repo}`);
|
|
246
|
+
}
|
|
247
|
+
let artifact;
|
|
248
|
+
if (request.kind === "regression_test") {
|
|
249
|
+
const parentCommit = resolveParentCommit(fixCommit, repo);
|
|
250
|
+
if (!parentCommit) {
|
|
251
|
+
return fail(
|
|
252
|
+
"parent_commit_unresolvable",
|
|
253
|
+
`could not resolve the first parent of ${fixCommit} \u2014 a regression_test artifact needs the tree WITHOUT the fix`
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
const testId = (request.test_id ?? "").trim();
|
|
257
|
+
if (!testId) return fail("artifact_malformed", "regression_test requires test_id (e.g. 'tests/foo.test.ts::rejects empty scope')");
|
|
258
|
+
const parentResult = (request.parent_result ?? "").trim();
|
|
259
|
+
const fixResult = (request.fix_result ?? "").trim();
|
|
260
|
+
if (parentResult !== "fail" && parentResult !== "pass" && parentResult !== "error") {
|
|
261
|
+
return fail("artifact_malformed", "parent_result must be the result you OBSERVED running the test at the parent commit: fail, pass or error");
|
|
262
|
+
}
|
|
263
|
+
if (fixResult !== "fail" && fixResult !== "pass" && fixResult !== "error") {
|
|
264
|
+
return fail("artifact_malformed", "fix_result must be the result you OBSERVED running the test at the fix commit: fail, pass or error");
|
|
265
|
+
}
|
|
266
|
+
const regression = {
|
|
267
|
+
kind: "regression_test",
|
|
268
|
+
test_id: testId,
|
|
269
|
+
fix_commit: fixCommit,
|
|
270
|
+
parent_commit: parentCommit,
|
|
271
|
+
parent_result: parentResult,
|
|
272
|
+
fix_result: fixResult,
|
|
273
|
+
substance
|
|
274
|
+
};
|
|
275
|
+
artifact = regression;
|
|
276
|
+
} else if (request.kind === "manual") {
|
|
277
|
+
const verifier = (request.verifier ?? "").trim();
|
|
278
|
+
if (!verifier) return fail("manual_verifier_missing", "manual verification requires a named verifier");
|
|
279
|
+
if (PLACEHOLDER_VERIFIERS.has(verifier.toLowerCase())) {
|
|
280
|
+
return fail(
|
|
281
|
+
"manual_verifier_placeholder",
|
|
282
|
+
`"${verifier}" is not an identity. Name the person or employee who reproduced the original defect and confirmed it is gone.`
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
const method = (request.method ?? "").trim();
|
|
286
|
+
if (!method) return fail("artifact_malformed", "manual verification requires a method someone else could repeat");
|
|
287
|
+
const observation = (request.observation ?? "").replace(/\s+/g, " ").trim();
|
|
288
|
+
if (LOW_CONTENT_OBSERVATION.test(observation)) {
|
|
289
|
+
return fail(
|
|
290
|
+
"manual_observation_too_thin",
|
|
291
|
+
"the observation must describe what you saw that shows the DEFECT IS ABSENT \u2014 not that the bug is 'fixed'"
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
if (observation.toLowerCase() === method.toLowerCase()) {
|
|
295
|
+
return fail("manual_observation_too_thin", "the observation must say what you saw, not repeat the method");
|
|
296
|
+
}
|
|
297
|
+
const manual = {
|
|
298
|
+
kind: "manual",
|
|
299
|
+
verifier,
|
|
300
|
+
method,
|
|
301
|
+
observation,
|
|
302
|
+
fix_commit: fixCommit,
|
|
303
|
+
substance
|
|
304
|
+
};
|
|
305
|
+
artifact = manual;
|
|
306
|
+
} else {
|
|
307
|
+
return fail("artifact_unknown_kind", "verification kind must be regression_test or manual");
|
|
308
|
+
}
|
|
309
|
+
const assessed = assessVerificationArtifact(artifact, context);
|
|
310
|
+
if (!assessed.ok) return fail(assessed.code, assessed.message);
|
|
311
|
+
return { ok: true, artifact, substance };
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export {
|
|
315
|
+
isSubstantiveCommit,
|
|
316
|
+
assessVerificationArtifact,
|
|
317
|
+
measureCommitSubstance,
|
|
318
|
+
buildVerificationArtifact
|
|
319
|
+
};
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
dispatchTaskToEmployee,
|
|
3
3
|
markTaskNotificationsRead,
|
|
4
4
|
notifyTaskDone
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-NWE3CFX7.js";
|
|
6
6
|
import {
|
|
7
7
|
clearCurrentTask,
|
|
8
8
|
writeCurrentTask
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
strictSessionScopeFilter,
|
|
17
17
|
updateTaskStatus,
|
|
18
18
|
writeNotification
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-Y4AYNLXU.js";
|
|
20
20
|
import {
|
|
21
21
|
getAgentContext
|
|
22
22
|
} from "./chunk-GJV3WDWM.js";
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
getClient,
|
|
28
28
|
getCoordinatorName,
|
|
29
29
|
isCoordinatorName
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-OBESOWFJ.js";
|
|
31
31
|
|
|
32
32
|
// src/lib/tasks-chain.ts
|
|
33
33
|
import path from "path";
|
|
@@ -62,7 +62,7 @@ async function cascadeUnblock(taskId, baseDir, now) {
|
|
|
62
62
|
}
|
|
63
63
|
if (unblockedRows.rows.length > 0 && !process.env.VITEST) {
|
|
64
64
|
try {
|
|
65
|
-
const { dispatchTaskToEmployee: dispatchTaskToEmployee2 } = await import("./tasks-notify-
|
|
65
|
+
const { dispatchTaskToEmployee: dispatchTaskToEmployee2 } = await import("./tasks-notify-7UVC3VGI.js");
|
|
66
66
|
const dispatched = /* @__PURE__ */ new Set();
|
|
67
67
|
for (const ur of unblockedRows.rows) {
|
|
68
68
|
const assignee = String(ur.assigned_to);
|
|
@@ -87,7 +87,7 @@ async function cascadeUnblock(taskId, baseDir, now) {
|
|
|
87
87
|
}
|
|
88
88
|
} catch {
|
|
89
89
|
try {
|
|
90
|
-
const { queueIntercom } = await import("./intercom-queue-
|
|
90
|
+
const { queueIntercom } = await import("./intercom-queue-BZ4M3L4S.js");
|
|
91
91
|
const dispatched = /* @__PURE__ */ new Set();
|
|
92
92
|
for (const ur of unblockedRows.rows) {
|
|
93
93
|
const assignee = String(ur.assigned_to);
|
|
@@ -285,7 +285,7 @@ async function updateTask(input) {
|
|
|
285
285
|
try {
|
|
286
286
|
process.stderr.write(`[tasks] EVENT: tmux delivery failed for reviewer="${reviewer}". Queueing for daemon delivery.
|
|
287
287
|
`);
|
|
288
|
-
const { queueIntercom } = await import("./intercom-queue-
|
|
288
|
+
const { queueIntercom } = await import("./intercom-queue-BZ4M3L4S.js");
|
|
289
289
|
const { resolveExeSession } = await import("./lib/tmux-routing.js");
|
|
290
290
|
const exeSession = row.session_scope ? String(row.session_scope) : resolveExeSession();
|
|
291
291
|
if (exeSession) {
|
|
@@ -302,7 +302,7 @@ async function updateTask(input) {
|
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
304
|
try {
|
|
305
|
-
const { pushNotifyAsync } = await import("./push-notifications-
|
|
305
|
+
const { pushNotifyAsync } = await import("./push-notifications-DFSR6P7V.js");
|
|
306
306
|
pushNotifyAsync({
|
|
307
307
|
event: "review_ready",
|
|
308
308
|
title: `Review ready: ${taskTitle.slice(0, 50)}`,
|
|
@@ -314,7 +314,7 @@ async function updateTask(input) {
|
|
|
314
314
|
}
|
|
315
315
|
if (!isCoordinator && isCompletionReviewTransition) {
|
|
316
316
|
try {
|
|
317
|
-
const { pushNotifyAsync } = await import("./push-notifications-
|
|
317
|
+
const { pushNotifyAsync } = await import("./push-notifications-DFSR6P7V.js");
|
|
318
318
|
const event = input.status === "needs_review" ? "review_ready" : "task_complete";
|
|
319
319
|
pushNotifyAsync({
|
|
320
320
|
event,
|
|
@@ -329,7 +329,7 @@ async function updateTask(input) {
|
|
|
329
329
|
await markTaskNotificationsRead(taskFile);
|
|
330
330
|
if (isCompletionReviewTransition && !isCoordinator && row.reviewer) {
|
|
331
331
|
try {
|
|
332
|
-
const { writeNotification: writeNotification2 } = await import("./notifications-
|
|
332
|
+
const { writeNotification: writeNotification2 } = await import("./notifications-LLCCHRYV.js");
|
|
333
333
|
const reviewer = String(row.reviewer);
|
|
334
334
|
await writeNotification2({
|
|
335
335
|
agentId: reviewer,
|
|
@@ -3,13 +3,13 @@ import {
|
|
|
3
3
|
} from "./chunk-VMJ2UH4S.js";
|
|
4
4
|
import {
|
|
5
5
|
vectorToSqlLiteral
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ELY5WBZX.js";
|
|
7
7
|
import {
|
|
8
8
|
blobToVector
|
|
9
9
|
} from "./chunk-OTVEIJUQ.js";
|
|
10
10
|
import {
|
|
11
11
|
getClient
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-OBESOWFJ.js";
|
|
13
13
|
|
|
14
14
|
// src/lib/behaviors.ts
|
|
15
15
|
import crypto from "crypto";
|
|
@@ -118,6 +118,33 @@ async function storeBehavior(opts) {
|
|
|
118
118
|
});
|
|
119
119
|
return id;
|
|
120
120
|
}
|
|
121
|
+
async function countActiveBehaviors(agentId, projectName) {
|
|
122
|
+
const client = getClient();
|
|
123
|
+
let currentDeviceId = null;
|
|
124
|
+
try {
|
|
125
|
+
const { loadDeviceId } = await import("./lib/license.js");
|
|
126
|
+
currentDeviceId = loadDeviceId() ?? null;
|
|
127
|
+
} catch {
|
|
128
|
+
}
|
|
129
|
+
const { offloadReadIfMain } = await import("./lib/database.js");
|
|
130
|
+
const result = await offloadReadIfMain(
|
|
131
|
+
client,
|
|
132
|
+
`SELECT count(*) AS total,
|
|
133
|
+
sum(CASE WHEN priority = 'p0' THEN 1 ELSE 0 END) AS p0
|
|
134
|
+
FROM behaviors
|
|
135
|
+
WHERE agent_id = ? AND active = 1
|
|
136
|
+
AND id IS NOT NULL AND trim(coalesce(content, '')) != ''
|
|
137
|
+
AND (project_name IS NULL OR project_name = ?)
|
|
138
|
+
AND (device_id IS NULL OR device_id = ?)`,
|
|
139
|
+
[agentId, projectName ?? "", currentDeviceId ?? ""],
|
|
140
|
+
true
|
|
141
|
+
);
|
|
142
|
+
const row = result.rows[0];
|
|
143
|
+
return {
|
|
144
|
+
total: Number(row?.total ?? 0),
|
|
145
|
+
p0: Number(row?.p0 ?? 0)
|
|
146
|
+
};
|
|
147
|
+
}
|
|
121
148
|
async function listBehaviors(agentId, projectName, limit = 30) {
|
|
122
149
|
const client = getClient();
|
|
123
150
|
let currentDeviceId = null;
|
|
@@ -329,6 +356,7 @@ export {
|
|
|
329
356
|
isReflexBehavior,
|
|
330
357
|
storeReflexBehavior,
|
|
331
358
|
storeBehavior,
|
|
359
|
+
countActiveBehaviors,
|
|
332
360
|
listBehaviors,
|
|
333
361
|
listBehaviorsByDomain,
|
|
334
362
|
listBehaviorsSince,
|
|
@@ -25,7 +25,10 @@ function normalizeState(value) {
|
|
|
25
25
|
paused: raw.paused === true,
|
|
26
26
|
pausedAt: typeof raw.pausedAt === "string" ? raw.pausedAt : null,
|
|
27
27
|
intervalMs,
|
|
28
|
-
updatedAt
|
|
28
|
+
updatedAt,
|
|
29
|
+
// Optional and only present when actually set, so existing readers that
|
|
30
|
+
// compare whole state objects are unaffected by the new field.
|
|
31
|
+
...typeof raw.pendingSliceAt === "string" && raw.pendingSliceAt !== "" ? { pendingSliceAt: raw.pendingSliceAt } : {}
|
|
29
32
|
};
|
|
30
33
|
}
|
|
31
34
|
function readCloudSyncState(statePath = resolveCloudSyncStatePath()) {
|
|
@@ -85,6 +88,14 @@ function newestCloudSyncFailureFromHealthLog(healthLogPath) {
|
|
|
85
88
|
}
|
|
86
89
|
return null;
|
|
87
90
|
}
|
|
91
|
+
function hasPendingCloudSyncSlice(state, nowMs, intervalMs) {
|
|
92
|
+
const pendingSliceAt = state?.pendingSliceAt;
|
|
93
|
+
if (typeof pendingSliceAt !== "string" || pendingSliceAt === "") return false;
|
|
94
|
+
const pendingMs = Date.parse(pendingSliceAt);
|
|
95
|
+
if (!Number.isFinite(pendingMs)) return false;
|
|
96
|
+
const ageMs = nowMs - pendingMs;
|
|
97
|
+
return ageMs >= 0 && ageMs < (intervalMs > 0 ? intervalMs : DEFAULT_INTERVAL_MS);
|
|
98
|
+
}
|
|
88
99
|
function resolveCloudSyncStatus(options) {
|
|
89
100
|
if (!options.cloudConfigured) return { status: "not-configured" };
|
|
90
101
|
const nowMs = options.nowMs ?? Date.now();
|
|
@@ -142,5 +153,6 @@ export {
|
|
|
142
153
|
resolveDaemonHealthLogPath,
|
|
143
154
|
readCloudSyncState,
|
|
144
155
|
writeCloudSyncState,
|
|
156
|
+
hasPendingCloudSyncSlice,
|
|
145
157
|
resolveCloudSyncStatus
|
|
146
158
|
};
|
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
} from "./chunk-75H4R62K.js";
|
|
4
4
|
import {
|
|
5
5
|
initStore
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ELY5WBZX.js";
|
|
7
7
|
import {
|
|
8
8
|
getClient,
|
|
9
9
|
isInitialized
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-OBESOWFJ.js";
|
|
11
11
|
|
|
12
12
|
// src/lib/schedules.ts
|
|
13
13
|
import crypto from "crypto";
|
|
@@ -6,13 +6,13 @@ import {
|
|
|
6
6
|
queryTaskRows,
|
|
7
7
|
resolveExeSession,
|
|
8
8
|
sendIntercom
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-Y4AYNLXU.js";
|
|
10
10
|
import {
|
|
11
11
|
getTransport
|
|
12
12
|
} from "./chunk-UXLO7VHX.js";
|
|
13
13
|
import {
|
|
14
14
|
recordOrchestrationEventBestEffort
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-BFL3UB77.js";
|
|
16
16
|
import {
|
|
17
17
|
releaseDispatchClaim,
|
|
18
18
|
tryAcquireDispatchClaim
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
isCoordinatorName,
|
|
28
28
|
isMultiInstance,
|
|
29
29
|
shouldAutoInstance
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-OBESOWFJ.js";
|
|
31
31
|
|
|
32
32
|
// src/lib/tasks-notify.ts
|
|
33
33
|
var VERIFY_DELAY_MS = 1e4;
|
|
@@ -89,7 +89,7 @@ async function dispatchTaskToEmployee(input) {
|
|
|
89
89
|
let crossProject = false;
|
|
90
90
|
if (input.projectName) {
|
|
91
91
|
try {
|
|
92
|
-
const { assertSessionScope } = await import("./session-scope-
|
|
92
|
+
const { assertSessionScope } = await import("./session-scope-LXDW7LJJ.js");
|
|
93
93
|
const check = assertSessionScope("dispatch_task", input.projectName);
|
|
94
94
|
if (check.reason === "cross_session_denied") {
|
|
95
95
|
crossProject = true;
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from "./chunk-5YEUPUV4.js";
|
|
10
10
|
import {
|
|
11
11
|
listBackups
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-JDPV7W2L.js";
|
|
13
13
|
import {
|
|
14
14
|
isPostgresBackendEnabled
|
|
15
15
|
} from "./chunk-YYB5PMTK.js";
|
|
@@ -1333,7 +1333,7 @@ async function migrateReflectionDedup(client) {
|
|
|
1333
1333
|
"ALTER TABLE memory_reflections ADD COLUMN dedup_key TEXT",
|
|
1334
1334
|
"migration add memory_reflections.dedup_key"
|
|
1335
1335
|
);
|
|
1336
|
-
const { reflectionDedupKey } = await import("./memory-reflection-
|
|
1336
|
+
const { reflectionDedupKey } = await import("./memory-reflection-5IJ6RE2J.js");
|
|
1337
1337
|
const keyForRow = (row) => {
|
|
1338
1338
|
let sources = [];
|
|
1339
1339
|
try {
|
|
@@ -2346,7 +2346,7 @@ async function sweepExpiredSoftDeletedMemories(client, options = {}) {
|
|
|
2346
2346
|
const purgeArchived = archDays !== void 0;
|
|
2347
2347
|
const BATCH_SIZE = 2e3;
|
|
2348
2348
|
const MAX_BATCHES = 500;
|
|
2349
|
-
const { cleanupCardsForMemories, cleanupGraphLinksForMemories } = await import("./graph-rag-
|
|
2349
|
+
const { cleanupCardsForMemories, cleanupGraphLinksForMemories } = await import("./graph-rag-RLRQMY54.js");
|
|
2350
2350
|
const softCutoff = `-${softDays} days`;
|
|
2351
2351
|
const selectArgsBase = [softCutoff];
|
|
2352
2352
|
let predicate = `status = 'deleted' AND COALESCE(deleted_at, timestamp) < datetime('now', ?)`;
|