@askexenow/exe-os 0.9.365 → 0.9.367
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/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-C6DPH43L.js → active-agent-R6Q7UEUD.js} +3 -3
- package/dist/{active-agent-MGF7J3HB.js → active-agent-V3CUDNED.js} +3 -3
- package/dist/{agent-defs-generator-X7TVMPVB.js → agent-defs-generator-MLPRGY75.js} +2 -2
- package/dist/agent-heartbeat-CQPGJIFF.js +13 -0
- package/dist/{agent-loop-E7RZCFDB.js → agent-loop-FOK2IRZQ.js} +1 -1
- package/dist/{agentic-ontology-CARDCG37.js → agentic-ontology-5FMQWGDZ.js} +1 -1
- package/dist/{backfill-metadata-ANCJA6LA.js → backfill-metadata-YXUMCKRV.js} +5 -5
- package/dist/{backup-verify-F7BHVEF7.js → backup-verify-GYHKAX7K.js} +1 -1
- package/dist/{behavior-injection-XQ4B7DCF.js → behavior-injection-7VGYY2KO.js} +7 -7
- package/dist/{behaviors-R2IE3PEN.js → behaviors-O6HKTSOF.js} +6 -6
- package/dist/bin/agentic-ontology-backfill.js +6 -6
- package/dist/bin/agentic-reflection-backfill.js +7 -7
- package/dist/bin/agentic-semantic-label.js +6 -6
- package/dist/bin/backfill-conversations.js +5 -5
- package/dist/bin/backfill-responses.js +5 -5
- package/dist/bin/backfill-vectors.js +6 -6
- package/dist/bin/bulk-sync-postgres.js +10 -10
- package/dist/bin/cc-doctor.js +5 -5
- package/dist/bin/cleanup-stale-review-tasks.js +14 -13
- package/dist/bin/cli.js +20 -20
- package/dist/bin/deferred-daemon-restart.js +78 -75
- package/dist/bin/exe-agent-config.js +2 -2
- package/dist/bin/exe-agent.js +251 -13
- package/dist/bin/exe-assign.js +6 -6
- package/dist/bin/exe-boot.js +29 -27
- 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 -14
- package/dist/bin/exe-doctor.js +5 -5
- package/dist/bin/exe-export-behaviors.js +8 -8
- package/dist/bin/exe-forget.js +7 -7
- package/dist/bin/exe-gateway.js +7 -7
- package/dist/bin/exe-healthcheck.js +5 -5
- package/dist/bin/exe-heartbeat.js +17 -16
- package/dist/bin/exe-kill.js +18 -17
- package/dist/bin/exe-launch-agent.js +23 -22
- 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 -14
- package/dist/bin/exe-pending-notifications.js +14 -13
- package/dist/bin/exe-pending-reviews.js +14 -13
- package/dist/bin/exe-rename.js +4 -4
- package/dist/bin/exe-review.js +17 -16
- package/dist/bin/exe-search.js +6 -6
- package/dist/bin/exe-session-cleanup.js +18 -17
- package/dist/bin/exe-settings.js +10 -10
- package/dist/bin/exe-start-codex.js +21 -13
- package/dist/bin/exe-start-opencode.js +9 -9
- package/dist/bin/exe-status.js +16 -15
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +4 -4
- package/dist/bin/git-sweep.js +23 -14
- package/dist/bin/graph-backfill.js +6 -6
- package/dist/bin/graph-export.js +6 -6
- package/dist/bin/import-history.js +9 -9
- package/dist/bin/install.js +80 -77
- 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 +2 -2
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- package/dist/bin/reconcile-backlog.js +2 -2
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/scan-tasks.js +14 -13
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +5 -5
- package/dist/bin/stack-update.js +34 -6
- package/dist/bin/verify-stack.js +6 -1
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-X45BSVZY.js → boot-generation-EZ2Y74IG.js} +3 -3
- package/dist/{boot-review-sections-OBVRXXSF.js → boot-review-sections-7CNQTAYR.js} +13 -12
- package/dist/build-manifest.json +865 -835
- package/dist/{capability-cards-57FURUMR.js → capability-cards-ZTFMK4VJ.js} +2 -2
- package/dist/{capacity-monitor-QEL62JDO.js → capacity-monitor-B2XU4YHP.js} +15 -14
- package/dist/{catchup-brief-PMXTCASA.js → catchup-brief-3BEOL7EV.js} +18 -17
- package/dist/{chunk-J6I7X272.js → chunk-267QB6VB.js} +1 -1
- package/dist/{chunk-IXEFO6HD.js → chunk-2IZH6W73.js} +3 -3
- package/dist/{chunk-6GQYPJPG.js → chunk-4DJDC4Y2.js} +8 -8
- package/dist/{chunk-LZKYVMBY.js → chunk-4WOOCTON.js} +2 -2
- package/dist/{chunk-RHX6MNWY.js → chunk-52CFP2AV.js} +1 -1
- package/dist/{chunk-EWZYFG5Q.js → chunk-53LCVVX5.js} +2 -2
- package/dist/{chunk-52TIQJEQ.js → chunk-5CH6XKVC.js} +1 -1
- package/dist/{chunk-22YQBVMO.js → chunk-66BFQOWR.js} +4 -4
- package/dist/{chunk-ESTR7QUP.js → chunk-6MCUXRIP.js} +1 -1
- package/dist/{chunk-LHOKWZKL.js → chunk-6NJURKRG.js} +1 -1
- package/dist/{chunk-VGE6IHZB.js → chunk-7W5LCREK.js} +80 -12
- package/dist/{chunk-FXPAUDCZ.js → chunk-7W6FDHHY.js} +1 -1
- package/dist/{chunk-E6ORBQHP.js → chunk-AAMGHW5W.js} +1 -0
- package/dist/{chunk-EMZHB767.js → chunk-AE3PYLLS.js} +9 -9
- package/dist/{chunk-JUOZLXLH.js → chunk-AEVE654G.js} +1 -1
- package/dist/{chunk-PPGPCWRC.js → chunk-ALKYXAMB.js} +4 -4
- package/dist/{chunk-MPQXQ5IE.js → chunk-ALYI3P5D.js} +1 -1
- package/dist/{chunk-4QKKLK3C.js → chunk-BQYQES2Z.js} +10 -10
- package/dist/{chunk-WYLFDSIE.js → chunk-BTMX2D4X.js} +5 -5
- package/dist/chunk-BTSWFMEH.js +14 -0
- package/dist/{chunk-EKVTRI3N.js → chunk-BY3V5CLX.js} +5 -4
- package/dist/{chunk-ZSZPMUNX.js → chunk-CKKLSY7B.js} +126 -7
- package/dist/{chunk-6Q263OZE.js → chunk-CTPG4KYZ.js} +1 -1
- package/dist/{chunk-C3UAQ3JG.js → chunk-CX4MVEM3.js} +1 -1
- package/dist/{chunk-DEFSN2FQ.js → chunk-CYNL3ZFD.js} +3 -3
- package/dist/{chunk-RD4E5G3B.js → chunk-DTTISDTI.js} +1 -1
- package/dist/{chunk-ZRKEUCUZ.js → chunk-DXCTHNEF.js} +12 -10
- package/dist/{chunk-KSVLBATT.js → chunk-E5QQZDQN.js} +53 -0
- package/dist/{chunk-DQ5KHWFD.js → chunk-EDZ5URGR.js} +1 -1
- package/dist/{chunk-ZDUO6QBH.js → chunk-F3PIHVVY.js} +1 -1
- package/dist/{chunk-EJ4522YM.js → chunk-FSIAGX55.js} +1 -1
- package/dist/{chunk-RVWALVDT.js → chunk-GUOMZ3JM.js} +2 -2
- package/dist/{chunk-BRLS5OLZ.js → chunk-HSBKV5LB.js} +35 -4
- package/dist/{chunk-QFIVK3G5.js → chunk-IIVFXD6P.js} +1 -1
- package/dist/{chunk-SBAU735L.js → chunk-J6VQ7HYV.js} +4 -4
- package/dist/{chunk-EWCEUO65.js → chunk-JFOZHVNO.js} +1 -1
- package/dist/{chunk-T6S45OLV.js → chunk-JJRZE2LD.js} +1 -1
- package/dist/{chunk-DYWGIPVP.js → chunk-JOKKIFRN.js} +3 -3
- package/dist/{chunk-X6A2VWVJ.js → chunk-K2OFS57E.js} +2 -2
- package/dist/{chunk-NV6A5HDN.js → chunk-KDD26FUY.js} +1 -1
- package/dist/{chunk-L3TB7CC3.js → chunk-KM6XSFHP.js} +12 -2
- package/dist/{chunk-CKG6CVKI.js → chunk-LIZ3QQGK.js} +1 -1
- package/dist/{chunk-OFGFRT5J.js → chunk-LW5WRSDD.js} +1 -1
- package/dist/{chunk-JITNFE4W.js → chunk-MLPPG2OG.js} +1 -1
- package/dist/{chunk-3JNVB5LG.js → chunk-MQ3N4KZY.js} +1 -1
- package/dist/{chunk-2FYIMTQE.js → chunk-N3JLNMPF.js} +2 -2
- package/dist/{chunk-RZIKSE6N.js → chunk-NPND34FS.js} +4 -4
- package/dist/{chunk-DWAQOEXL.js → chunk-O3F5P6Z5.js} +2 -2
- package/dist/{chunk-M7EES2KM.js → chunk-OADOH45L.js} +3 -3
- package/dist/{chunk-MZJBUAC3.js → chunk-OISZ2I4X.js} +4 -4
- package/dist/{chunk-R7RM766N.js → chunk-OPS7KUFV.js} +3 -3
- package/dist/{chunk-JNVQGLPX.js → chunk-P5XER5QY.js} +3 -3
- package/dist/{chunk-J4U5Z7VX.js → chunk-P76VYS6V.js} +4 -4
- package/dist/{chunk-KRUYQFSH.js → chunk-PFOJX6CR.js} +5 -5
- package/dist/chunk-PFR6EOUY.js +356 -0
- package/dist/{agent-heartbeat-I5UPGXAU.js → chunk-PHUHIVD5.js} +4 -5
- package/dist/{chunk-45EQTS7B.js → chunk-PQ6NRLKL.js} +1 -1
- package/dist/{chunk-5CBGH6RA.js → chunk-PR3AHVFW.js} +3 -3
- package/dist/{chunk-ODBRU6BF.js → chunk-PS4NA7PM.js} +1399 -943
- package/dist/{chunk-CPILYY2K.js → chunk-PS6VPW64.js} +1 -1
- package/dist/{chunk-YMJOLEPE.js → chunk-PWCZFIQH.js} +4 -4
- package/dist/{chunk-POPRJKAY.js → chunk-QS6HI4B6.js} +6 -0
- package/dist/{chunk-ZNEBZCZR.js → chunk-QWDZNQXA.js} +1 -1
- package/dist/{chunk-ORNCMRIX.js → chunk-QX33D4CH.js} +25 -31
- package/dist/{chunk-BATQKSLI.js → chunk-R3H3WW7H.js} +2 -2
- package/dist/chunk-R4AROSYI.js +496 -0
- package/dist/{chunk-F2S3M5MB.js → chunk-SFKIZYKK.js} +2 -2
- package/dist/{chunk-IIZITKBV.js → chunk-TCR7NBHD.js} +4 -4
- package/dist/{chunk-7C4FUNVO.js → chunk-TJSTWACD.js} +2 -2
- package/dist/chunk-TX3Q2GIL.js +97 -0
- package/dist/{chunk-2ESB5SDP.js → chunk-TZFOWWPM.js} +1 -1
- package/dist/{chunk-WR75WUEP.js → chunk-UI3K73LD.js} +1 -1
- package/dist/{chunk-DJK45U7B.js → chunk-URHJDUWO.js} +1 -1
- package/dist/{chunk-SP37DONS.js → chunk-V3ISR2QT.js} +1 -1
- package/dist/{chunk-EPNWEOOE.js → chunk-VY3QUSWS.js} +6 -6
- package/dist/{chunk-O2MEBF23.js → chunk-WBKIU6UJ.js} +2 -2
- package/dist/{chunk-TO6TB75E.js → chunk-WCDIDSLR.js} +2 -2
- package/dist/{chunk-EVPBYX2Z.js → chunk-WSLFGJBA.js} +1 -1
- package/dist/{chunk-OPNROU5B.js → chunk-WYVBWDFY.js} +1 -1
- package/dist/{chunk-JYFYIGYK.js → chunk-XA4EU3CW.js} +1 -1
- package/dist/{chunk-ZEKCHV43.js → chunk-XAMLDTRA.js} +4 -4
- package/dist/{chunk-EHHMNKOA.js → chunk-XKFMNAJ7.js} +1 -1
- package/dist/{chunk-5KLQCGI5.js → chunk-XKZD5FGK.js} +55 -0
- package/dist/{chunk-U373MEF5.js → chunk-XSXZVKJ7.js} +3 -3
- package/dist/{chunk-IM2I7OOS.js → chunk-XTEKGO44.js} +1 -1
- package/dist/{chunk-Q7BU5Q6I.js → chunk-XUGOVOID.js} +3 -3
- package/dist/{chunk-BEHLIRRJ.js → chunk-XVRQZCTS.js} +1 -1
- package/dist/{chunk-P47MPWNU.js → chunk-Y4JVM3SI.js} +1 -1
- package/dist/{chunk-NO3M2AFM.js → chunk-Y7OK5PJE.js} +1 -1
- package/dist/{chunk-ANPE3TT3.js → chunk-YA4PM3MV.js} +3 -3
- package/dist/{chunk-EPDNWY5P.js → chunk-YYLVHUYZ.js} +1 -1
- package/dist/{chunk-QYJANQWC.js → chunk-Z5Z3MYUW.js} +2 -2
- package/dist/{chunk-MXEIZUXG.js → chunk-ZSHLY5BS.js} +1 -1
- package/dist/{chunk-AGQAGOQN.js → chunk-ZZ3JQM5I.js} +9 -9
- package/dist/{cleanup-graph-garbage-CAA625RJ.js → cleanup-graph-garbage-XDIX3HLN.js} +7 -7
- package/dist/{cloud-sync-command-DBB7WRHL.js → cloud-sync-command-VPYE4FIH.js} +2 -2
- package/dist/{cloud-sync-db-init-V7IB23W5.js → cloud-sync-db-init-NSDBTFGI.js} +1 -1
- package/dist/{cloud-sync-shutdown-2D3B73CJ.js → cloud-sync-shutdown-6OUYTG4T.js} +2 -2
- package/dist/{co-activation-JVN7EBS6.js → co-activation-EAAKGGZH.js} +2 -2
- package/dist/{co-occurrence-526PTFGT.js → co-occurrence-OFVF55RX.js} +5 -5
- package/dist/codex-consolidation-PPXNBXCV.js +96 -0
- package/dist/{conversation-entity-extractor-JO56DB2E.js → conversation-entity-extractor-ZR5GFKAI.js} +3 -3
- package/dist/{crdt-sync-LIJLZKFE.js → crdt-sync-FGH4SBFW.js} +1 -1
- package/dist/{crm-webhook-55F7Y6D2.js → crm-webhook-PJATR2DC.js} +2 -2
- package/dist/{cto-delegation-gate-QIYV4KFO.js → cto-delegation-gate-PO4LSSQ4.js} +13 -12
- package/dist/{daemon-orchestration-Q3GJA2JJ.js → daemon-orchestration-IJFZFQUX.js} +18 -17
- package/dist/{doc-graph-extractor-P46R4QME.js → doc-graph-extractor-CAYUAM5A.js} +5 -5
- package/dist/{documents-7KFEREWO.js → documents-W2G477QE.js} +6 -6
- package/dist/{dreaming-JMUXBAPU.js → dreaming-FVXSIIWV.js} +17 -16
- package/dist/{employee-boot-brief-HN63D2BY.js → employee-boot-brief-OYMSHFHA.js} +19 -18
- package/dist/{exe-drift-7J7GX7DP.js → exe-drift-67RGJOBX.js} +3 -3
- package/dist/{exe-export-KJ7B2OBU.js → exe-export-SGYX6XZG.js} +7 -7
- package/dist/{exe-import-HPZDWKGE.js → exe-import-UABVA5N3.js} +7 -7
- package/dist/{exe-key-2PREP464.js → exe-key-XNYDCVFE.js} +78 -75
- package/dist/{exe-org-VEIISATF.js → exe-org-XJVSU5HN.js} +8 -8
- package/dist/{exe-snapshot-JXQFLUKA.js → exe-snapshot-YXOGYZUX.js} +18 -17
- package/dist/{fast-db-init-SCXJXOYX.js → fast-db-init-GDFJY5UH.js} +1 -1
- package/dist/{founder-context-U2SZPLYV.js → founder-context-KUXSNXKS.js} +2 -2
- package/dist/gateway/index.js +8 -8
- package/dist/{git-staleness-S4NDR7NX.js → git-staleness-NN6RWNLW.js} +2 -2
- package/dist/{global-procedures-ZOFTOXIR.js → global-procedures-XDNA3TNA.js} +3 -3
- package/dist/{graph-auto-extract-CLVTSUSB.js → graph-auto-extract-KTOR45V4.js} +5 -5
- package/dist/{graph-rag-LSJLWGXV.js → graph-rag-L5NV5YWD.js} +3 -3
- package/dist/{hook-integrity-SGTKBL6W.js → hook-integrity-X3YAVGUW.js} +1 -1
- package/dist/{hook-prefetch-BDSLB6F4.js → hook-prefetch-WE4MIXBM.js} +14 -13
- package/dist/hooks/bug-report-worker.js +18 -17
- package/dist/hooks/codex-stop-task-finalizer.js +19 -18
- package/dist/hooks/commit-complete.js +33 -19
- package/dist/hooks/error-recall.js +8 -8
- package/dist/hooks/exe-heartbeat-hook.js +4 -4
- package/dist/hooks/ingest-worker.js +2 -2
- package/dist/hooks/ingest.js +11 -11
- package/dist/hooks/instructions-loaded.js +5 -5
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +5 -5
- package/dist/hooks/post-compact.js +4 -4
- package/dist/hooks/post-tool-combined.js +12 -12
- package/dist/hooks/pre-compact.js +17 -16
- package/dist/hooks/pre-tool-use.js +68 -23
- package/dist/hooks/prompt-submit.js +30 -29
- package/dist/hooks/session-end.js +113 -99
- package/dist/hooks/session-start.js +16 -16
- package/dist/hooks/stop.js +82 -19
- package/dist/hooks/subagent-stop.js +18 -17
- package/dist/hooks/summary-worker.js +22 -21
- package/dist/index.js +24 -23
- package/dist/{installer-RC2JCKSE.js → installer-EAAYEEEF.js} +6 -6
- package/dist/{installer-KCEM4RCG.js → installer-EPQAOI6M.js} +152 -8
- package/dist/{installer-EA7T3PBD.js → installer-UDRMFY75.js} +6 -6
- package/dist/{intercom-queue-6DZPHHQ2.js → intercom-queue-IBOAVT2I.js} +13 -12
- package/dist/lib/cloud-sync.js +10 -10
- package/dist/lib/consolidation.js +7 -7
- 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/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 +77 -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 -13
- package/dist/lib/registry-proxy.js +1 -1
- package/dist/lib/reminders.js +3 -3
- package/dist/lib/schedules.js +6 -6
- package/dist/lib/session-registry.js +4 -4
- package/dist/lib/skill-learning.js +7 -7
- package/dist/lib/status-brief.js +2 -1
- package/dist/lib/store.js +5 -5
- package/dist/lib/task-router.js +3 -3
- package/dist/lib/tasks.js +15 -14
- package/dist/lib/tmux-routing.js +13 -12
- package/dist/lib/token-spend.js +3 -3
- package/dist/{license-gate-HMSMUIAU.js → license-gate-3TTWJABL.js} +3 -3
- package/dist/{license-sync-FBCMPC4J.js → license-sync-ZC6TPKVV.js} +2 -2
- package/dist/mcp/register-tools.js +77 -74
- package/dist/mcp/server.js +78 -75
- 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 +17 -16
- 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 -16
- package/dist/mcp/tools/send-message.js +16 -15
- package/dist/mcp/tools/update-task.js +16 -15
- package/dist/{mcp-http-config-YKJN52HG.js → mcp-http-config-ROF5EPEF.js} +3 -3
- package/dist/{mcp-session-identity-QLUVYWPR.js → mcp-session-identity-ERU6FEUB.js} +13 -12
- package/dist/{memory-cards-K2OSX4AW.js → memory-cards-3QTXI2SG.js} +5 -5
- package/dist/{memory-graph-extractor-YLTSKLSY.js → memory-graph-extractor-7GAILMYG.js} +6 -6
- package/dist/{memory-poisoning-defense-IPO4ADRL.js → memory-poisoning-defense-TPXSRJTQ.js} +2 -2
- package/dist/{memory-pressure-watchdog-ZI3TH2OF.js → memory-pressure-watchdog-ZSOP6T2F.js} +14 -13
- package/dist/{memory-reflection-ZKVRU3NT.js → memory-reflection-3AI4JBV2.js} +2 -2
- package/dist/{notification-ledger-4REL6M3T.js → notification-ledger-ZU7ZFJJX.js} +16 -14
- package/dist/{notifications-UXJUAP3C.js → notifications-S4GU22GF.js} +13 -12
- package/dist/{orchestration-events-GMRGGBMN.js → orchestration-events-HVG56HJ5.js} +3 -3
- package/dist/{orchestrator-5TV75HDJ.js → orchestrator-UW3Q3WYG.js} +15 -14
- package/dist/{org-brief-session-7AZZEO3F.js → org-brief-session-G36TJBN4.js} +5 -5
- package/dist/{org-consent-policy-XT6UZENB.js → org-consent-policy-RMYVMM3X.js} +1 -1
- package/dist/{org-partner-runtime-WLZAZJIY.js → org-partner-runtime-KXMGEYFW.js} +5 -5
- package/dist/{org-row-visibility-A5XM4MVO.js → org-row-visibility-UI5PGN76.js} +1 -1
- package/dist/{pipeline-router-UEVXDUHR.js → pipeline-router-IODWXDDI.js} +3 -3
- package/dist/{plan-limits-QEP32X4W.js → plan-limits-XMAQVEJZ.js} +5 -5
- package/dist/{projection-worker-GMRC6SBH.js → projection-worker-6LZUCI3B.js} +2 -2
- package/dist/{prospective-memory-QLHSAPSG.js → prospective-memory-G5VK5GCD.js} +2 -2
- package/dist/{push-notifications-GKRPXOGI.js → push-notifications-S2RYRXLF.js} +14 -13
- package/dist/{reranker-GB4VEMUV.js → reranker-EHQTAA3L.js} +1 -1
- package/dist/{retrieval-health-QIBPBGN6.js → retrieval-health-WZ4ICGNF.js} +1 -1
- package/dist/{review-polling-MU47NQ2N.js → review-polling-MAWLRDSP.js} +14 -13
- package/dist/runtime/index.js +18 -17
- package/dist/{session-events-YMQ3VGBJ.js → session-events-BRUIZ5E4.js} +14 -13
- package/dist/{session-kill-telemetry-VGPKE57M.js → session-kill-telemetry-PTZLHT33.js} +14 -13
- package/dist/{session-scope-P46KAHXQ.js → session-scope-G4RVJJGR.js} +13 -12
- package/dist/{setup-wizard-BRNHSJ4U.js → setup-wizard-WFEUB63Z.js} +1 -1
- package/dist/{skill-refinement-NLYDSFEH.js → skill-refinement-2OYPH7WD.js} +3 -3
- package/dist/{stack-promote-NHFTNIM2.js → stack-promote-DLYYQXQI.js} +5 -4
- package/dist/{stack-release-AQVKZUS7.js → stack-release-OPWARLXI.js} +5 -4
- package/dist/{stack-update-LLX5KT7G.js → stack-update-SJ43IEQE.js} +10 -3
- package/dist/{steward-gate-JKHYFAHA.js → steward-gate-V7PBGVFK.js} +3 -3
- package/dist/{subagent-brief-injection-VDVOHDOU.js → subagent-brief-injection-BLCRI2AJ.js} +20 -19
- package/dist/{support-inbox-S6YO5YZU.js → support-inbox-6HOQYFD2.js} +3 -3
- package/dist/{task-enforcement-LXW45H5Z.js → task-enforcement-EF6O2V26.js} +14 -13
- package/dist/{task-request-inbox-UCSKDC3R.js → task-request-inbox-OB2KIJWO.js} +1 -1
- package/dist/{task-scope-GDLFE26E.js → task-scope-74JBTKJN.js} +17 -15
- package/dist/{tasks-crud-W7VGWRUV.js → tasks-crud-ZU6RZDEZ.js} +13 -12
- package/dist/{tasks-notify-CT7NWCS4.js → tasks-notify-767DRYAA.js} +14 -13
- package/dist/{tasks-review-WCSKOUFW.js → tasks-review-4F6PZZ3B.js} +13 -12
- package/dist/{telemetry-upload-FK5WKXVB.js → telemetry-upload-2JM6KIAB.js} +7 -7
- package/dist/{token-budget-GBNGSIU3.js → token-budget-NH2RD4YX.js} +3 -3
- package/dist/{tool-gates-3IC7DK4R.js → tool-gates-2OZY3GZM.js} +1 -1
- package/dist/{tool-gates-GXSYBVK4.js → tool-gates-7PLIOLAL.js} +1 -1
- package/dist/{tool-telemetry-VKMRS6MP.js → tool-telemetry-CHCBD4OQ.js} +1 -1
- package/dist/tui/App.js +22 -21
- package/dist/{tui-data-FTPV2XBQ.js → tui-data-244GF3BI.js} +13 -12
- package/dist/{update-support-J6UWPUOC.js → update-support-P2LO3DAB.js} +9 -9
- package/dist/work-claims-4QOE7DT2.js +53 -0
- package/dist/{work-state-heartbeat-4LDF6DSM.js → work-state-heartbeat-GX3VWWWK.js} +1 -1
- package/dist/{worker-gate-35VZINZG.js → worker-gate-62PZATOV.js} +1 -1
- package/dist/{workflow-engine-4DA6RSHI.js → workflow-engine-7YIRU62F.js} +2 -2
- package/dist/{worktree-H3YFJ3NU.js → worktree-3TUKIZWY.js} +4 -4
- package/dist/{worktree-sweep-4EDLLQ2E.js → worktree-sweep-MYQHUXDE.js} +5 -5
- package/package.json +6 -2
- package/release-notes.json +68 -62
- package/dist/chunk-2RQT7TED.js +0 -275
- /package/dist/{chunk-7Y6AQWVT.js → chunk-25EN7XXN.js} +0 -0
- /package/dist/{chunk-3THNS2T7.js → chunk-62U63R3E.js} +0 -0
- /package/dist/{chunk-VS4LPG66.js → chunk-65ZSFW3O.js} +0 -0
- /package/dist/{chunk-LKYGSJ2E.js → chunk-BTFDA3UJ.js} +0 -0
- /package/dist/{chunk-JRPYLUXH.js → chunk-DAXFAXLN.js} +0 -0
- /package/dist/{chunk-3NBWARKC.js → chunk-FLP2BQOA.js} +0 -0
- /package/dist/{chunk-CMBF5WCL.js → chunk-GTOMDMJL.js} +0 -0
- /package/dist/{chunk-QYECRPGD.js → chunk-JLYHJJHU.js} +0 -0
- /package/dist/{chunk-MBBFL2SP.js → chunk-JZBZI36P.js} +0 -0
- /package/dist/{chunk-BY7WWPRM.js → chunk-OUIEDJFO.js} +0 -0
- /package/dist/{chunk-7DMCAGSC.js → chunk-WM7Y5ZV2.js} +0 -0
- /package/dist/{chunk-G2EAYH4U.js → chunk-XM7HJ5SS.js} +0 -0
- /package/dist/{chunk-UY6HRDB2.js → chunk-YNPOELAN.js} +0 -0
- /package/dist/{core-memory-CMPPHJN5.js → core-memory-EARETDZ6.js} +0 -0
- /package/dist/{memory-isolation-ZB5S5HCO.js → memory-isolation-XASOGA7G.js} +0 -0
- /package/dist/{oauth-server-NP7KGF7N.js → oauth-server-C3BXAKAW.js} +0 -0
- /package/dist/{project-boot-LEZSK3W7.js → project-boot-LCFBQ6NB.js} +0 -0
- /package/dist/{wiki-acl-5DKOWOIH.js → wiki-acl-XQH4UBP2.js} +0 -0
|
@@ -10,8 +10,8 @@ import {
|
|
|
10
10
|
persistWorkflows,
|
|
11
11
|
runWorkflow,
|
|
12
12
|
startWorkflow
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-Y4JVM3SI.js";
|
|
14
|
+
import "./chunk-YNPOELAN.js";
|
|
15
15
|
import "./chunk-MLKGABMK.js";
|
|
16
16
|
export {
|
|
17
17
|
advanceWorkflow,
|
|
@@ -16,13 +16,13 @@ import {
|
|
|
16
16
|
resolveGitWithRetrySync,
|
|
17
17
|
worktreeBranch,
|
|
18
18
|
worktreePath
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
19
|
+
} from "./chunk-7W6FDHHY.js";
|
|
20
|
+
import "./chunk-UI3K73LD.js";
|
|
21
|
+
import "./chunk-HSBKV5LB.js";
|
|
22
22
|
import "./chunk-TKDITWDN.js";
|
|
23
23
|
import "./chunk-BBMTVAE3.js";
|
|
24
24
|
import "./chunk-5YEUPUV4.js";
|
|
25
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-Y7OK5PJE.js";
|
|
26
26
|
import "./chunk-YYB5PMTK.js";
|
|
27
27
|
import "./chunk-NJFJWQNN.js";
|
|
28
28
|
import "./chunk-V3W3SATA.js";
|
|
@@ -4,14 +4,14 @@ import {
|
|
|
4
4
|
discoverRepoPathsAsync,
|
|
5
5
|
isWorktreePathOccupiedByCwd,
|
|
6
6
|
sweepWorktrees
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-KDD26FUY.js";
|
|
8
|
+
import "./chunk-7W6FDHHY.js";
|
|
9
|
+
import "./chunk-UI3K73LD.js";
|
|
10
|
+
import "./chunk-HSBKV5LB.js";
|
|
11
11
|
import "./chunk-TKDITWDN.js";
|
|
12
12
|
import "./chunk-BBMTVAE3.js";
|
|
13
13
|
import "./chunk-5YEUPUV4.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-Y7OK5PJE.js";
|
|
15
15
|
import "./chunk-YYB5PMTK.js";
|
|
16
16
|
import "./chunk-NJFJWQNN.js";
|
|
17
17
|
import "./chunk-V3W3SATA.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askexenow/exe-os",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.367",
|
|
4
4
|
"description": "AI employee operating system \u2014 persistent memory, task management, and multi-agent coordination for Claude Code.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"type": "module",
|
|
@@ -112,6 +112,7 @@
|
|
|
112
112
|
"test:watch": "vitest",
|
|
113
113
|
"lint": "eslint src/ --max-warnings 53",
|
|
114
114
|
"typecheck": "tsc --noEmit",
|
|
115
|
+
"typecheck:workers": "tsc --noEmit -p api-router/tsconfig.json && tsc --noEmit -p api-router/tsconfig.test.json && tsc --noEmit -p worker/tsconfig.json",
|
|
115
116
|
"build": "node scripts/dist-ownership-guard.mjs && bash scripts/build-lock.sh && mkdir -p dist/assets && cp src/assets/tmux.conf dist/assets/ && cp src/assets/ghostty.conf dist/assets/ && cp src/assets/statusline-command.sh dist/assets/ && cp src/assets/wezterm.lua dist/assets/ && cp src/assets/com.askexe.exed.plist dist/assets/ && cp src/bin/exe-start.sh dist/bin/exe-start.sh && (node dist/bin/generate-hook-manifest.js 2>/dev/null || true) && node scripts/dist-integrity.mjs --record",
|
|
116
117
|
"deploy": "node dist/bin/pre-build-guard.js && EXE_DIST_OP_RESTARTS_DAEMON=1 EXE_DIST_CLEAN=1 npm run build && node scripts/dist-integrity.mjs --verify && (node dist/bin/prune-orphan-chunks.js || true) && npm install -g . && node dist/bin/install.js --global && echo '[exe-os] Deploy complete. Run /mcp in active sessions to reconnect.'",
|
|
117
118
|
"postinstall": "node postinstall.mjs",
|
|
@@ -120,6 +121,7 @@
|
|
|
120
121
|
"benchmark:longmemeval": "npx tsx tests/benchmarks/longmemeval.ts",
|
|
121
122
|
"guard:esm-require": "node scripts/check-no-runtime-require.mjs",
|
|
122
123
|
"guard:defect-classes": "node scripts/check-defect-gates.mjs",
|
|
124
|
+
"guard:required-checks": "node scripts/check-required-checks-evaluable.mjs",
|
|
123
125
|
"check:schema-version": "node scripts/check-schema-version.mjs",
|
|
124
126
|
"check:perms-ui-sync": "node packages/permissions-ui/sync.mjs --check",
|
|
125
127
|
"check:switcher-ui-sync": "node packages/exe-service-switcher/sync.mjs --check",
|
|
@@ -158,6 +160,7 @@
|
|
|
158
160
|
"zod": "^4.3.6"
|
|
159
161
|
},
|
|
160
162
|
"devDependencies": {
|
|
163
|
+
"@cloudflare/workers-types": "^4.0.0",
|
|
161
164
|
"@types/node": "^22.0.0",
|
|
162
165
|
"@types/nodemailer": "^8.0.0",
|
|
163
166
|
"@types/pg": "^8.20.0",
|
|
@@ -168,7 +171,8 @@
|
|
|
168
171
|
"eslint": "^10.4.0",
|
|
169
172
|
"tsup": "^8.5.1",
|
|
170
173
|
"tsx": "^4.0.0",
|
|
171
|
-
"vitest": "^4.1.0"
|
|
174
|
+
"vitest": "^4.1.0",
|
|
175
|
+
"yaml": "2.8.3"
|
|
172
176
|
},
|
|
173
177
|
"optionalDependencies": {
|
|
174
178
|
"keytar": "^7.9.0",
|
package/release-notes.json
CHANGED
|
@@ -1,47 +1,81 @@
|
|
|
1
1
|
{
|
|
2
|
-
"current": "0.9.
|
|
2
|
+
"current": "0.9.367",
|
|
3
3
|
"notes": {
|
|
4
|
+
"0.9.367": {
|
|
5
|
+
"version": "0.9.367",
|
|
6
|
+
"date": "2026-08-13",
|
|
7
|
+
"features": [],
|
|
8
|
+
"fixes": [],
|
|
9
|
+
"security": [],
|
|
10
|
+
"other": [
|
|
11
|
+
"v0.9.367 (#699)"
|
|
12
|
+
],
|
|
13
|
+
"migration_notes": []
|
|
14
|
+
},
|
|
15
|
+
"0.9.366": {
|
|
16
|
+
"version": "0.9.366",
|
|
17
|
+
"date": "2026-08-13",
|
|
18
|
+
"features": [
|
|
19
|
+
"atomic work claims — two sessions can no longer take the same job, enforced at every dispatch path",
|
|
20
|
+
"Codex session consolidation + hook trust: Codex hooks were never actually running, so fresh installs captured nothing",
|
|
21
|
+
"auth page: confirmation state, gated token tab, and opt-in cross-app SSO",
|
|
22
|
+
"wiki docs: seal/unseal capability with cloud-docs worker endpoints"
|
|
23
|
+
],
|
|
24
|
+
"fixes": [
|
|
25
|
+
"SECURITY: GoTrue's admin API is no longer published on the public internet",
|
|
26
|
+
"SECURITY: account termination was reversible by the terminated user — now tombstoned and lock-fenced",
|
|
27
|
+
"SSO cookie contract is gated at deploy and monitored live",
|
|
28
|
+
"task + tracker close gates now require a verification artifact, so automated completion cannot close work that was never verified",
|
|
29
|
+
"runtime: exe-os MCP tools are registered and the agent loop detects stalls",
|
|
30
|
+
"stack-update: unset-pin rollback and a stale-deploy alert",
|
|
31
|
+
"preflight: SMTP recovery fails on incomplete credentials instead of silently continuing",
|
|
32
|
+
"hook tests: empty stdout is now a clear diagnostic rather than an opaque JSON parse error, and hook fixtures are isolated from the live daemon"
|
|
33
|
+
],
|
|
34
|
+
"infrastructure": [
|
|
35
|
+
"restored 52 test files that ran in NO CI job at all — including 33 gateway security suites covering permission-guard, api-router enforcement, read-only SQL and rate limiting, dark since 2026-04-20 and green in 17 seconds",
|
|
36
|
+
"a guard that fails loudly when a required check cannot evaluate on a pull request, so a required context can never again be satisfied by never running",
|
|
37
|
+
"native-addon smoke gate: node-llama-cpp's addon had zero coverage, meaning production was the first place it ever executed",
|
|
38
|
+
"the CI sweeper's four correctness fixes finally reached main — an absent required check no longer reads as green",
|
|
39
|
+
"stopped paying for lint and typecheck twice per PR; sweeps every 5 minutes",
|
|
40
|
+
"SHA-pinned the last mutable action ref"
|
|
41
|
+
],
|
|
42
|
+
"security": [],
|
|
43
|
+
"other": [],
|
|
44
|
+
"migration_notes": []
|
|
45
|
+
},
|
|
4
46
|
"0.9.365": {
|
|
5
47
|
"version": "0.9.365",
|
|
6
48
|
"date": "2026-08-13",
|
|
7
49
|
"features": [
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"phase 4 — atomic spend-cap admission + freeze kill-switch (api-router lane) (#672)",
|
|
12
|
-
"phase 2 — self-serve org scoping (GET /v1/orgs, is_staff, panel mode 'self') (#653)",
|
|
13
|
-
"phase 3 — spend-limits model, authoring + ceiling guard, claim projection (e51ca54c) (#663)",
|
|
14
|
-
"detect the unsupervised-daemon state (ad8886b8) (#623)",
|
|
15
|
-
"phase 0 — planning-doc truth, permsSubject() identity join, live self-edit warning (#649)"
|
|
50
|
+
"org permissions: self-serve org scoping, spend-limits with an atomic admission cap and freeze kill-switch, role revoke path, and invite emails that are actually redeemable",
|
|
51
|
+
"dashboard: org-aware usage, credits, keys and billing with persisted alert thresholds, plus the cross-app service switcher",
|
|
52
|
+
"daemon: detects the unsupervised-daemon state instead of failing silently"
|
|
16
53
|
],
|
|
17
54
|
"fixes": [
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"role 'none' clears the roster admin bit + a real revoke path in the panel (Phase 1, e51ca54c) (#650)",
|
|
33
|
-
"enforce prepaid credit balance with a 402 gate (5a862f9c) (#642)",
|
|
34
|
-
"add missing /openai segment to Gemini base URL (#648)",
|
|
35
|
-
"stop committing empty secrets in wrangler [vars] (b6f1cbf9) (#647)",
|
|
36
|
-
"make isolation real and non-optional (2b7072a7) (#621)"
|
|
55
|
+
"api-router: prepaid credit balance is now enforced with a 402 gate — a zero or negative balance could previously consume AI indefinitely (P0 5a862f9c)",
|
|
56
|
+
"daemon: every kill is attributed and the PID identity verified before signalling (7a915790)",
|
|
57
|
+
"memory: project attribution survives git worktrees (e19ce3a3)",
|
|
58
|
+
"stack: every shipped image is digest-pinned and strict-digest is now the DEFAULT",
|
|
59
|
+
"stack-update: fail-closed manifest signatures with a built-in verification key; live manifest first with the packaged copy only as an offline fallback (c00e1544)",
|
|
60
|
+
"stack-update: --services is run-scoped and managed-set writes are additive-only (db262248)",
|
|
61
|
+
"stack-update: state files written 0644 so the drift watchdog can read them",
|
|
62
|
+
"db-integrity: honest backup verification — the index was healthy and the alarm was not (e0b92e67)",
|
|
63
|
+
"worker: stop committing empty secrets in wrangler [vars] (b6f1cbf9)",
|
|
64
|
+
"api-router: add the missing /openai segment to the Gemini base URL",
|
|
65
|
+
"monitor: agent healthcheck matches the pinned image generation (9ce2a68b)",
|
|
66
|
+
"deploy: resolve the exe-db container dynamically; managed-permissions mode is explicit in the shipped stack",
|
|
67
|
+
"dispatch: the named-subagent default is taught at every layer, not just the ladder",
|
|
68
|
+
"tests: hermetic isolation is real and non-optional (2b7072a7)"
|
|
37
69
|
],
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
"v0.9.
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
70
|
+
"infrastructure": [
|
|
71
|
+
"release path is deadlock-proof: the publish gate now asserts the branch-protection REQUIRED CONTEXTS on the release SHA instead of waiting for a whole workflow run to conclude, and it runs on a local runner so it can never hold the lane it is waiting for. A non-required job can no longer gate a release",
|
|
72
|
+
"release-drift monitor: every 30 minutes the published npm dist-tag is compared against main's package.json and alerts on divergence — v0.9.363 was believed shipped while npm served 0.9.362 for five days",
|
|
73
|
+
"x64 Linux release gate right-sized to native-module verification (e8f2cccd) — the full 8,400-test matrix no longer runs on the shared VPS",
|
|
74
|
+
"extended-tests moved out of the CI workflow so a non-required nightly job stops gating releases",
|
|
75
|
+
"dashboard image is built and pushed on main instead of being hand-shipped"
|
|
44
76
|
],
|
|
77
|
+
"security": [],
|
|
78
|
+
"other": [],
|
|
45
79
|
"migration_notes": []
|
|
46
80
|
},
|
|
47
81
|
"0.9.364": {
|
|
@@ -91,34 +125,6 @@
|
|
|
91
125
|
"security": [],
|
|
92
126
|
"other": [],
|
|
93
127
|
"migration_notes": []
|
|
94
|
-
},
|
|
95
|
-
"0.9.362": {
|
|
96
|
-
"version": "0.9.362",
|
|
97
|
-
"date": "2026-08-08",
|
|
98
|
-
"features": [
|
|
99
|
-
"p0 timers: daemon timers moved off the event loop — long-running timer callbacks no longer block the daemon event loop, and a worker-race in timer scheduling is closed so overlapping ticks cannot starve MCP handling (Codex gpt-5.5 build, triage 2026-08-06) (#562, re-review findings closed in #571)",
|
|
100
|
-
"p0 durability: last-mile durability for the local store — encrypted backups now actually run, the write path preserves the WAL and does not drop the ledger, and duplicate writes are de-duplicated (Codex gpt-5.5 build) (#560, 5 Codex NO-GO findings closed in #570)",
|
|
101
|
-
"p0 postinstall: postinstall now fails loud on genuine failures — the real exit code is propagated instead of being swallowed, so a broken install surfaces immediately instead of silently degrading (rebuild of #561, Codex findings fixed) (#574)"
|
|
102
|
-
],
|
|
103
|
-
"fixes": [
|
|
104
|
-
"p0 provenance: app-image provenance repo map hardened against spoofing — the imageName→ghRepo mapping is enforced so a cross-named app image cannot masquerade under another repo's provenance (#572)"
|
|
105
|
-
],
|
|
106
|
-
"security": [],
|
|
107
|
-
"other": [],
|
|
108
|
-
"migration_notes": []
|
|
109
|
-
},
|
|
110
|
-
"0.9.359": {
|
|
111
|
-
"version": "0.9.359",
|
|
112
|
-
"date": "2026-07-30",
|
|
113
|
-
"features": [],
|
|
114
|
-
"fixes": [
|
|
115
|
-
"org-mode: the org-mode-anchor keychain probe no longer risks raising the DESTRUCTIVE macOS 'A keychain cannot be found to store org-mode-anchor' dialog (whose 'Reset To Defaults' button can wipe the login keychain). nativeKeychainAllowed() now skips the native keychain — a best-effort mirror of the authoritative home-anchored file, so nothing is lost — in the daemon (EXE_IS_DAEMON), SSH/remote sessions, and on macOS with no default keychain (probed via a read-only `security default-keychain` that never invokes SecurityAgent). A healthy interactive GUI login is unaffected. Strictly-safer 1-file guard tightening (#514)",
|
|
116
|
-
"privacy: stop unconsented telemetry + support-content egress (bug 4b8b47fd, P0) (#510)",
|
|
117
|
-
"internal (dormant — no user-facing change until the org feature is wired): AI-Partner phase-1 infrastructure — B1 org-mode privacy/crypto boundary via a boot-resolved SyncCipher (existing single-user installs keep byte-identical v=1 cloud-sync encryption; the org path stays dormant until an org-membership anchor exists) + partner signing identity + sealed mailbox envelope (#504), and B2 sealed-mailbox relay/transport with cross-tenant SQL-predicate scoping (#505)"
|
|
118
|
-
],
|
|
119
|
-
"security": [],
|
|
120
|
-
"other": [],
|
|
121
|
-
"migration_notes": []
|
|
122
128
|
}
|
|
123
129
|
}
|
|
124
130
|
}
|
package/dist/chunk-2RQT7TED.js
DELETED
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
sessionScopeFilter
|
|
3
|
-
} from "./chunk-ORNCMRIX.js";
|
|
4
|
-
|
|
5
|
-
// src/lib/git-task-sweep.ts
|
|
6
|
-
import { execSync } from "child_process";
|
|
7
|
-
var DEFAULT_COMMIT_LIMIT = 50;
|
|
8
|
-
var DEFAULT_STALE_MINUTES = 10;
|
|
9
|
-
var AUTO_ESCALATE_THRESHOLD = 0.6;
|
|
10
|
-
var EXACT_UUID_SCORE = 1;
|
|
11
|
-
var TITLE_KEYWORD_SCORE = 0.5;
|
|
12
|
-
var FILE_PATH_SCORE = 0.3;
|
|
13
|
-
var MIN_KEYWORD_OVERLAP = 3;
|
|
14
|
-
var STOP_WORDS = /* @__PURE__ */ new Set([
|
|
15
|
-
"a",
|
|
16
|
-
"an",
|
|
17
|
-
"the",
|
|
18
|
-
"and",
|
|
19
|
-
"or",
|
|
20
|
-
"but",
|
|
21
|
-
"in",
|
|
22
|
-
"on",
|
|
23
|
-
"at",
|
|
24
|
-
"to",
|
|
25
|
-
"for",
|
|
26
|
-
"of",
|
|
27
|
-
"with",
|
|
28
|
-
"by",
|
|
29
|
-
"from",
|
|
30
|
-
"is",
|
|
31
|
-
"it",
|
|
32
|
-
"as",
|
|
33
|
-
"be",
|
|
34
|
-
"was",
|
|
35
|
-
"are",
|
|
36
|
-
"this",
|
|
37
|
-
"that",
|
|
38
|
-
"not",
|
|
39
|
-
"no",
|
|
40
|
-
"if",
|
|
41
|
-
"so",
|
|
42
|
-
"do",
|
|
43
|
-
"up"
|
|
44
|
-
]);
|
|
45
|
-
function extractKeywords(text) {
|
|
46
|
-
return text.toLowerCase().replace(/[^a-z0-9\s-]/g, " ").split(/\s+/).filter((w) => w.length >= 3 && !STOP_WORDS.has(w));
|
|
47
|
-
}
|
|
48
|
-
function matchScore(task, commitMessage, changedFiles) {
|
|
49
|
-
if (task.id.length >= 8 && commitMessage.includes(task.id)) {
|
|
50
|
-
return EXACT_UUID_SCORE;
|
|
51
|
-
}
|
|
52
|
-
let score = 0;
|
|
53
|
-
const titleWords = extractKeywords(task.title);
|
|
54
|
-
const commitWords = new Set(extractKeywords(commitMessage));
|
|
55
|
-
const overlap = titleWords.filter((w) => commitWords.has(w));
|
|
56
|
-
if (overlap.length >= MIN_KEYWORD_OVERLAP) {
|
|
57
|
-
score += TITLE_KEYWORD_SCORE;
|
|
58
|
-
}
|
|
59
|
-
if (task.context && changedFiles.length > 0) {
|
|
60
|
-
const contextLower = task.context.toLowerCase();
|
|
61
|
-
const hasFileMatch = changedFiles.some(
|
|
62
|
-
(f) => contextLower.includes(f.toLowerCase())
|
|
63
|
-
);
|
|
64
|
-
if (hasFileMatch) {
|
|
65
|
-
score += FILE_PATH_SCORE;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return score;
|
|
69
|
-
}
|
|
70
|
-
function getRecentCommits(limit = DEFAULT_COMMIT_LIMIT) {
|
|
71
|
-
try {
|
|
72
|
-
const SEPARATOR = "<<SEP>>";
|
|
73
|
-
const output = execSync(
|
|
74
|
-
`git log --format="%h${SEPARATOR}%s${SEPARATOR}%aI" --name-only -n ${limit} -z`,
|
|
75
|
-
{ encoding: "utf8", timeout: 1e4 }
|
|
76
|
-
);
|
|
77
|
-
const entries = output.split("\0").filter(Boolean);
|
|
78
|
-
const commits = [];
|
|
79
|
-
let current = null;
|
|
80
|
-
for (const entry of entries) {
|
|
81
|
-
if (entry.includes(SEPARATOR)) {
|
|
82
|
-
const lines = entry.split("\n");
|
|
83
|
-
const headerLine = lines[0];
|
|
84
|
-
const parts = headerLine.split(SEPARATOR);
|
|
85
|
-
if (parts.length >= 3) {
|
|
86
|
-
if (current) commits.push(current);
|
|
87
|
-
current = {
|
|
88
|
-
hash: parts[0],
|
|
89
|
-
message: parts[1],
|
|
90
|
-
files: lines.slice(1).filter(Boolean),
|
|
91
|
-
date: new Date(parts[2])
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
} else if (current) {
|
|
95
|
-
const files = entry.split("\n").filter(Boolean);
|
|
96
|
-
current.files.push(...files);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
if (current) commits.push(current);
|
|
100
|
-
return commits;
|
|
101
|
-
} catch {
|
|
102
|
-
return [];
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
function pushUnpushedCommits() {
|
|
106
|
-
const run = (args) => execSync(`git ${args}`, { encoding: "utf8", timeout: 15e3, stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
107
|
-
let branch;
|
|
108
|
-
try {
|
|
109
|
-
branch = run("rev-parse --abbrev-ref HEAD");
|
|
110
|
-
} catch {
|
|
111
|
-
return { branch: null, ahead: 0, pushed: false, status: "not_a_repo" };
|
|
112
|
-
}
|
|
113
|
-
if (!branch || branch === "HEAD") {
|
|
114
|
-
return { branch: null, ahead: 0, pushed: false, status: "no_branch" };
|
|
115
|
-
}
|
|
116
|
-
if (branch === "main" || branch === "master") {
|
|
117
|
-
return { branch, ahead: 0, pushed: false, status: "default_branch_skipped" };
|
|
118
|
-
}
|
|
119
|
-
let ahead = 0;
|
|
120
|
-
let hasUpstream = false;
|
|
121
|
-
try {
|
|
122
|
-
run("rev-parse --abbrev-ref --symbolic-full-name @{u}");
|
|
123
|
-
hasUpstream = true;
|
|
124
|
-
const count = run("rev-list --count @{u}..HEAD");
|
|
125
|
-
ahead = Number.parseInt(count, 10) || 0;
|
|
126
|
-
} catch {
|
|
127
|
-
hasUpstream = false;
|
|
128
|
-
for (const base of ["origin/main", "origin/master"]) {
|
|
129
|
-
try {
|
|
130
|
-
const count = run(`rev-list --count ${base}..HEAD`);
|
|
131
|
-
ahead = Number.parseInt(count, 10) || 0;
|
|
132
|
-
if (ahead > 0) break;
|
|
133
|
-
} catch {
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
if (ahead === 0) {
|
|
137
|
-
try {
|
|
138
|
-
const count = run("rev-list --count HEAD");
|
|
139
|
-
ahead = Number.parseInt(count, 10) || 0;
|
|
140
|
-
} catch {
|
|
141
|
-
ahead = 0;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
if (ahead <= 0) {
|
|
146
|
-
return { branch, ahead: 0, pushed: false, status: "nothing_to_push" };
|
|
147
|
-
}
|
|
148
|
-
try {
|
|
149
|
-
if (hasUpstream) {
|
|
150
|
-
run("push");
|
|
151
|
-
} else {
|
|
152
|
-
run(`push --set-upstream origin ${branch}`);
|
|
153
|
-
}
|
|
154
|
-
return { branch, ahead, pushed: true, status: "pushed" };
|
|
155
|
-
} catch (err) {
|
|
156
|
-
return {
|
|
157
|
-
branch,
|
|
158
|
-
ahead,
|
|
159
|
-
pushed: false,
|
|
160
|
-
status: "push_failed",
|
|
161
|
-
error: err instanceof Error ? err.message : String(err)
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
function isStale(updatedAt, staleMinutes) {
|
|
166
|
-
const updated = new Date(updatedAt).getTime();
|
|
167
|
-
const threshold = Date.now() - staleMinutes * 6e4;
|
|
168
|
-
return updated < threshold;
|
|
169
|
-
}
|
|
170
|
-
function findBestMatch(task, commits) {
|
|
171
|
-
let best = null;
|
|
172
|
-
for (const commit of commits) {
|
|
173
|
-
const score = matchScore(task, commit.message, commit.files);
|
|
174
|
-
if (score >= AUTO_ESCALATE_THRESHOLD && (!best || score > best.score)) {
|
|
175
|
-
best = { commit, score };
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return best;
|
|
179
|
-
}
|
|
180
|
-
async function sweepTasks(projectName, options = {}) {
|
|
181
|
-
const commitLimit = options.commitLimit ?? DEFAULT_COMMIT_LIMIT;
|
|
182
|
-
const staleMinutes = options.staleMinutes ?? DEFAULT_STALE_MINUTES;
|
|
183
|
-
const dryRun = options.dryRun ?? false;
|
|
184
|
-
const result = { escalated: [], unchanged: 0, errors: [] };
|
|
185
|
-
const commits = getRecentCommits(commitLimit);
|
|
186
|
-
if (commits.length === 0) {
|
|
187
|
-
result.errors.push("No git commits found (not a git repo or empty history)");
|
|
188
|
-
return result;
|
|
189
|
-
}
|
|
190
|
-
let tasks;
|
|
191
|
-
try {
|
|
192
|
-
const { initStore } = await import("./lib/store.js");
|
|
193
|
-
await initStore();
|
|
194
|
-
const { getClient } = await import("./lib/database.js");
|
|
195
|
-
const client = getClient();
|
|
196
|
-
const conditions = ["status = 'in_progress'"];
|
|
197
|
-
const args = [];
|
|
198
|
-
if (projectName) {
|
|
199
|
-
conditions.push("project_name = ?");
|
|
200
|
-
args.push(projectName);
|
|
201
|
-
}
|
|
202
|
-
const swScope = sessionScopeFilter();
|
|
203
|
-
if (swScope.sql) {
|
|
204
|
-
conditions.push("(session_scope IS NULL OR session_scope = ?)");
|
|
205
|
-
args.push(...swScope.args);
|
|
206
|
-
}
|
|
207
|
-
const queryResult = await client.execute({
|
|
208
|
-
sql: `SELECT id, title, assigned_to, project_name, status, updated_at, context
|
|
209
|
-
FROM tasks WHERE ${conditions.join(" AND ")}
|
|
210
|
-
ORDER BY updated_at ASC`,
|
|
211
|
-
args
|
|
212
|
-
});
|
|
213
|
-
tasks = queryResult.rows.map((r) => ({
|
|
214
|
-
id: String(r.id),
|
|
215
|
-
title: String(r.title),
|
|
216
|
-
assignedTo: String(r.assigned_to),
|
|
217
|
-
projectName: String(r.project_name),
|
|
218
|
-
status: String(r.status),
|
|
219
|
-
updatedAt: String(r.updated_at),
|
|
220
|
-
context: r.context ? String(r.context) : void 0
|
|
221
|
-
}));
|
|
222
|
-
} catch (err) {
|
|
223
|
-
result.errors.push(`DB query failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
224
|
-
return result;
|
|
225
|
-
}
|
|
226
|
-
if (tasks.length === 0) {
|
|
227
|
-
return result;
|
|
228
|
-
}
|
|
229
|
-
for (const task of tasks) {
|
|
230
|
-
if (!isStale(task.updatedAt, staleMinutes)) {
|
|
231
|
-
result.unchanged++;
|
|
232
|
-
continue;
|
|
233
|
-
}
|
|
234
|
-
const match = findBestMatch(task, commits);
|
|
235
|
-
if (!match) {
|
|
236
|
-
result.unchanged++;
|
|
237
|
-
continue;
|
|
238
|
-
}
|
|
239
|
-
if (!dryRun) {
|
|
240
|
-
try {
|
|
241
|
-
const { updateTaskStatus } = await import("./tasks-crud-W7VGWRUV.js");
|
|
242
|
-
await updateTaskStatus({
|
|
243
|
-
taskId: task.id,
|
|
244
|
-
status: "needs_review",
|
|
245
|
-
result: `Auto-escalated by git-sweep: matching commit ${match.commit.hash} found (score: ${match.score.toFixed(2)})`
|
|
246
|
-
});
|
|
247
|
-
} catch (err) {
|
|
248
|
-
result.errors.push(
|
|
249
|
-
`Failed to escalate task ${task.id}: ${err instanceof Error ? err.message : String(err)}`
|
|
250
|
-
);
|
|
251
|
-
continue;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
result.escalated.push({
|
|
255
|
-
taskId: task.id,
|
|
256
|
-
title: task.title,
|
|
257
|
-
matchedCommit: match.commit.hash,
|
|
258
|
-
score: match.score
|
|
259
|
-
});
|
|
260
|
-
process.stderr.write(
|
|
261
|
-
`[git-sweep] ${dryRun ? "WOULD escalate" : "Escalated"} task ${task.id} \u2192 commit ${match.commit.hash} (score: ${match.score.toFixed(2)})
|
|
262
|
-
`
|
|
263
|
-
);
|
|
264
|
-
}
|
|
265
|
-
return result;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
export {
|
|
269
|
-
extractKeywords,
|
|
270
|
-
matchScore,
|
|
271
|
-
getRecentCommits,
|
|
272
|
-
pushUnpushedCommits,
|
|
273
|
-
findBestMatch,
|
|
274
|
-
sweepTasks
|
|
275
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|