@askexenow/exe-os 0.9.362 → 0.9.365
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.customer.example +46 -2
- package/deploy/compose/.env.example +49 -2
- package/deploy/compose/cloudflared/config.yml.example +15 -8
- package/deploy/compose/docker-compose.yml +240 -34
- package/deploy/compose/generate-env.ts +88 -2
- package/deploy/compose/status.sh +30 -0
- package/deploy/compose/uptime-check.sh +39 -2
- package/deploy/compose/wiki-schema-guard.sh +302 -0
- package/deploy/stack-manifests/v0.9.json +232 -2
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-BPNEBKHI.js → active-agent-C6DPH43L.js} +10 -5
- package/dist/{active-agent-3FV5V7SS.js → active-agent-MGF7J3HB.js} +10 -5
- package/dist/agent-defs-generator-X7TVMPVB.js +240 -0
- package/dist/{agentic-ontology-RCVCJ6WB.js → agentic-ontology-CARDCG37.js} +1 -1
- package/dist/artifact-backup-767STHSW.js +209 -0
- package/dist/artifact-provenance-C7HQ267L.js +13 -0
- package/dist/{backfill-gate-LRX77SUD.js → backfill-gate-VX2RZTQV.js} +2 -2
- package/dist/{backfill-metadata-Y3DGVCK5.js → backfill-metadata-ANCJA6LA.js} +7 -7
- package/dist/{background-jobs-Z6KHCWES.js → background-jobs-LTPWCMA3.js} +2 -2
- package/dist/{backup-verify-TZPPUCLU.js → backup-verify-F7BHVEF7.js} +27 -14
- package/dist/{behavior-injection-JMGGWCWG.js → behavior-injection-XQ4B7DCF.js} +13 -12
- package/dist/{behaviors-TT6CMEKC.js → behaviors-R2IE3PEN.js} +12 -11
- package/dist/bin/age-ontology-load.js +2 -2
- package/dist/bin/agentic-ontology-backfill.js +9 -9
- package/dist/bin/agentic-reflection-backfill.js +10 -10
- package/dist/bin/agentic-semantic-label.js +9 -9
- package/dist/bin/backfill-conversations.js +10 -9
- package/dist/bin/backfill-responses.js +10 -9
- package/dist/bin/backfill-vectors.js +14 -13
- package/dist/bin/bulk-sync-postgres.js +23 -19
- package/dist/bin/cc-doctor.js +11 -8
- package/dist/bin/cleanup-stale-review-tasks.js +26 -24
- package/dist/bin/cli.js +29 -102
- package/dist/bin/customer-readiness.js +3 -1
- package/dist/bin/deferred-daemon-restart.js +115 -103
- package/dist/bin/exe-agent-config.js +5 -5
- package/dist/bin/exe-agent.js +14 -14
- package/dist/bin/exe-assign.js +12 -11
- package/dist/bin/exe-boot.js +60 -51
- package/dist/bin/exe-call.js +7 -7
- package/dist/bin/exe-cloud.js +26 -22
- package/dist/bin/exe-config-dump.js +5 -5
- package/dist/bin/exe-dispatch.js +30 -24
- package/dist/bin/exe-doctor.js +10 -9
- package/dist/bin/exe-export-behaviors.js +14 -13
- package/dist/bin/exe-forget.js +9 -9
- package/dist/bin/exe-gateway.js +9 -9
- package/dist/bin/exe-grant.js +5 -5
- package/dist/bin/exe-healthcheck.js +13 -8
- package/dist/bin/exe-heartbeat.js +36 -29
- package/dist/bin/exe-kill.js +30 -28
- package/dist/bin/exe-launch-agent.js +41 -37
- package/dist/bin/exe-mcp.js +5 -5
- package/dist/bin/exe-memory-reads.js +7 -7
- package/dist/bin/exe-new-employee.js +12 -11
- package/dist/bin/exe-os-mcp-proxy.js +5 -5
- package/dist/bin/exe-pending-messages.js +27 -25
- package/dist/bin/exe-pending-notifications.js +26 -24
- package/dist/bin/exe-pending-reviews.js +27 -25
- package/dist/bin/exe-rename.js +7 -7
- package/dist/bin/exe-review.js +29 -27
- package/dist/bin/exe-search.js +8 -8
- package/dist/bin/exe-session-cleanup.js +31 -29
- package/dist/bin/exe-settings.js +24 -20
- package/dist/bin/exe-start-codex.js +36 -21
- package/dist/bin/exe-start-opencode.js +15 -14
- package/dist/bin/exe-status.js +28 -25
- package/dist/bin/exe-support.js +5 -4
- package/dist/bin/exe-team.js +12 -6
- package/dist/bin/exe-verify-running-images.js +145 -0
- package/dist/bin/exe-watchdog.js +16 -6
- package/dist/bin/git-sweep.js +27 -25
- package/dist/bin/graph-backfill.js +10 -9
- package/dist/bin/graph-export.js +8 -8
- package/dist/bin/import-history.js +13 -11
- package/dist/bin/install.js +119 -107
- package/dist/bin/intercom-check.js +5 -5
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +6 -6
- package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
- package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
- package/dist/bin/pre-publish.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 +26 -24
- package/dist/bin/setup.js +4 -3
- package/dist/bin/shard-migrate.js +8 -8
- package/dist/bin/stack-update.js +87 -38
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-XABYKF5P.js → boot-generation-X45BSVZY.js} +5 -5
- package/dist/{boot-review-sections-2X5TFIGU.js → boot-review-sections-OBVRXXSF.js} +25 -23
- package/dist/{branch-hygiene-Z4IBWAOX.js → branch-hygiene-HFJ3HA62.js} +17 -10
- package/dist/{branding-7MZDHTKN.js → branding-GH43W3PU.js} +2 -2
- package/dist/build-manifest.json +1189 -1049
- package/dist/{capability-cards-O5UXDOOA.js → capability-cards-57FURUMR.js} +4 -4
- package/dist/{capacity-monitor-IPXM726A.js → capacity-monitor-QEL62JDO.js} +27 -25
- package/dist/{catchup-brief-EBIGDXOK.js → catchup-brief-PMXTCASA.js} +30 -28
- package/dist/{chunk-UO5QJ2RX.js → chunk-22YQBVMO.js} +4 -4
- package/dist/chunk-2ADYTOHQ.js +189 -0
- package/dist/{chunk-NO5KHKKB.js → chunk-2CWS374F.js} +1 -1
- package/dist/{chunk-NAHCSQWT.js → chunk-2ESB5SDP.js} +19 -7
- package/dist/{chunk-CY5NVDTH.js → chunk-2FYIMTQE.js} +9 -5
- package/dist/{chunk-SC6WDF3Q.js → chunk-2RQT7TED.js} +2 -2
- package/dist/{chunk-UWEFIIEG.js → chunk-3CIMDFXG.js} +1 -1
- package/dist/{chunk-E7PL3T2U.js → chunk-3JNVB5LG.js} +1 -1
- package/dist/{chunk-7SY2NOMQ.js → chunk-3THNS2T7.js} +1 -1
- package/dist/{chunk-XJIRUTGJ.js → chunk-45EQTS7B.js} +1 -1
- package/dist/{chunk-YZUHSV24.js → chunk-4LWBC7CM.js} +1 -1
- package/dist/{chunk-DKRDU2AX.js → chunk-4QKKLK3C.js} +14 -14
- package/dist/{chunk-WP2TGH5R.js → chunk-52TIQJEQ.js} +2 -2
- package/dist/{chunk-LG37UBBE.js → chunk-5CBGH6RA.js} +5 -5
- package/dist/{chunk-W3LKIQJ2.js → chunk-6GQYPJPG.js} +22 -16
- package/dist/{chunk-I3SF6QGV.js → chunk-6Q263OZE.js} +1 -1
- package/dist/{chunk-XSYQ5EPE.js → chunk-7C4FUNVO.js} +11 -11
- package/dist/{chunk-P7CV4SHQ.js → chunk-7Y6AQWVT.js} +21 -10
- package/dist/{chunk-NGDXBN3M.js → chunk-A6PDF4BO.js} +2 -2
- package/dist/chunk-A7XLR3K7.js +45 -0
- package/dist/{chunk-7H3AZNQ7.js → chunk-AGQAGOQN.js} +9 -9
- package/dist/{chunk-VDMFVUSY.js → chunk-ANPE3TT3.js} +3 -3
- package/dist/{chunk-NE4QI2GX.js → chunk-BATQKSLI.js} +2 -2
- package/dist/{chunk-AOMFYUPT.js → chunk-BEHLIRRJ.js} +2 -2
- package/dist/{chunk-6EM6USV7.js → chunk-BNHAZ65R.js} +42 -50
- package/dist/{chunk-HLU52KTO.js → chunk-BRLS5OLZ.js} +257 -36
- package/dist/{chunk-QCJT265O.js → chunk-BY7WWPRM.js} +1 -1
- package/dist/{chunk-Z67DIJKT.js → chunk-C3UAQ3JG.js} +1 -1
- package/dist/{chunk-MZYNW5OY.js → chunk-CDUB5Q6J.js} +1 -1
- package/dist/{chunk-5H3RHWRE.js → chunk-CKG6CVKI.js} +1 -1
- package/dist/{chunk-WH2VVEGD.js → chunk-CMBF5WCL.js} +56 -2
- package/dist/{chunk-JYKZVAS6.js → chunk-CPILYY2K.js} +1 -1
- package/dist/{chunk-XTGR3LMF.js → chunk-CW2UCKHS.js} +2 -2
- package/dist/{chunk-32FEF5BW.js → chunk-CWBFOAGM.js} +2 -2
- package/dist/{chunk-V5I5N7NC.js → chunk-DEFSN2FQ.js} +3 -3
- package/dist/{chunk-HAXCUCJC.js → chunk-DJK45U7B.js} +1 -1
- package/dist/{chunk-MZZN5GFC.js → chunk-DQ5KHWFD.js} +1 -1
- package/dist/{chunk-SLBOKYYQ.js → chunk-DWAQOEXL.js} +2 -2
- package/dist/{chunk-T2RZU7JA.js → chunk-DYWGIPVP.js} +7 -7
- package/dist/{chunk-6DTALXOA.js → chunk-E5HAY3DQ.js} +1 -1
- package/dist/{chunk-D5CY4E7I.js → chunk-EHHMNKOA.js} +1 -1
- package/dist/{chunk-54USDN5Q.js → chunk-EJ4522YM.js} +1 -1
- package/dist/{chunk-URNVIZXU.js → chunk-EKVTRI3N.js} +52 -6
- package/dist/{chunk-KID6T2A4.js → chunk-EMZHB767.js} +44 -35
- package/dist/{chunk-KBI4FVBZ.js → chunk-EPDNWY5P.js} +111 -22
- package/dist/{chunk-AQO3BT3I.js → chunk-EPNWEOOE.js} +13 -13
- package/dist/{chunk-5C6ZIJ7J.js → chunk-ESTR7QUP.js} +1 -1
- package/dist/{chunk-Q2VQNAPU.js → chunk-EVPBYX2Z.js} +2 -2
- package/dist/{chunk-CVYDJ2TW.js → chunk-EWCEUO65.js} +1 -1
- package/dist/{chunk-RNSAVQEU.js → chunk-EWZYFG5Q.js} +8 -3
- package/dist/{chunk-R7F6HKTH.js → chunk-EXDW3E2R.js} +3 -1
- package/dist/{chunk-TY4JLBFO.js → chunk-F2S3M5MB.js} +3 -3
- package/dist/{chunk-BT2PUK3S.js → chunk-FXPAUDCZ.js} +1 -1
- package/dist/{chunk-3C7NE4JE.js → chunk-G2EAYH4U.js} +1 -1
- package/dist/{chunk-WDA2KAV7.js → chunk-GSJLB6JI.js} +1 -1
- package/dist/{chunk-M67ARGXY.js → chunk-H37FSTF2.js} +1 -1
- package/dist/{chunk-ZR4CQBAP.js → chunk-H74466TM.js} +1 -1
- package/dist/{chunk-3BAGFZFN.js → chunk-HHGOCBVQ.js} +9 -9
- package/dist/{working-memory-BACVOAIV.js → chunk-HSFBNCNC.js} +3 -3
- package/dist/{chunk-PF7EQSE5.js → chunk-IIZITKBV.js} +6 -6
- package/dist/{chunk-2FA4PYYX.js → chunk-IM2I7OOS.js} +1 -1
- package/dist/{chunk-DSKEYEL2.js → chunk-IXEFO6HD.js} +3 -3
- package/dist/{chunk-TN2E6ZCM.js → chunk-J4U5Z7VX.js} +214 -58
- package/dist/{chunk-PU7UYQRC.js → chunk-J5EYOBFF.js} +1 -1
- package/dist/{chunk-RWKX2TK5.js → chunk-J6I7X272.js} +1 -1
- package/dist/{chunk-BDLRTLXY.js → chunk-JITNFE4W.js} +6 -2
- package/dist/{chunk-PUMH7JSB.js → chunk-JNVQGLPX.js} +3 -3
- package/dist/{chunk-VAOUB2TK.js → chunk-JTB5V6BV.js} +1 -1
- package/dist/{chunk-QYRI25IP.js → chunk-JUOZLXLH.js} +2 -2
- package/dist/{chunk-RYRNY6IF.js → chunk-JYFYIGYK.js} +2 -2
- package/dist/{chunk-2PRAXZWM.js → chunk-KOYGRP2L.js} +10 -5
- package/dist/{chunk-4AFD4R35.js → chunk-KRUYQFSH.js} +5 -5
- package/dist/chunk-L25OAFOU.js +93 -0
- package/dist/{chunk-FUQ2OSDV.js → chunk-L2VZBPJJ.js} +25 -8
- package/dist/{chunk-LCDW2HUL.js → chunk-LHOKWZKL.js} +1 -1
- package/dist/{chunk-BN26LSME.js → chunk-LKYGSJ2E.js} +13 -2
- package/dist/chunk-LNOS24GV.js +214 -0
- package/dist/{chunk-O32HTNRX.js → chunk-LZKYVMBY.js} +13 -4
- package/dist/{chunk-35FD67ZB.js → chunk-M7EES2KM.js} +3 -3
- package/dist/chunk-MBBFL2SP.js +45 -0
- package/dist/{chunk-4R2WD6T3.js → chunk-MPQXQ5IE.js} +2 -2
- package/dist/{chunk-QQMYD4M7.js → chunk-MXEIZUXG.js} +1 -1
- package/dist/{chunk-6QJXFLNN.js → chunk-MZJBUAC3.js} +5 -5
- package/dist/chunk-NEHOQ3P2.js +19 -0
- package/dist/{chunk-BRZR76TS.js → chunk-NJFJWQNN.js} +49 -14
- package/dist/{chunk-Q7J2SQJ6.js → chunk-NO3M2AFM.js} +100 -32
- package/dist/{gotrue-session-2IT7MDGW.js → chunk-NUTZJZKW.js} +7 -8
- package/dist/{chunk-6UZDGEGQ.js → chunk-NV6A5HDN.js} +71 -1
- package/dist/{chunk-ZI3HA3XW.js → chunk-O2MEBF23.js} +3 -3
- package/dist/{chunk-V6YLIDLK.js → chunk-ODBRU6BF.js} +577 -230
- package/dist/{chunk-6N3HUOV3.js → chunk-OFGFRT5J.js} +2 -2
- package/dist/{chunk-HKQ7UTSE.js → chunk-OPNROU5B.js} +1 -1
- package/dist/{chunk-SQM4ZTL2.js → chunk-ORNCMRIX.js} +60 -33
- package/dist/{chunk-RUUX2ZST.js → chunk-P47MPWNU.js} +1 -1
- package/dist/{org-key-admin-4W6LZ5KZ.js → chunk-P5XTVIEC.js} +62 -17
- package/dist/{chunk-OZNCAMS3.js → chunk-POPRJKAY.js} +122 -20
- package/dist/{chunk-SRFRUN66.js → chunk-PPGPCWRC.js} +5 -5
- package/dist/{chunk-B6PFGUYJ.js → chunk-PVEM537A.js} +46 -5
- package/dist/{chunk-QJBX3MBV.js → chunk-Q7BU5Q6I.js} +3 -3
- package/dist/{chunk-SXKIGBNF.js → chunk-QFIVK3G5.js} +1 -1
- package/dist/{chunk-BRIZ6OZ3.js → chunk-QMSEL5YS.js} +81 -23
- package/dist/{chunk-BJEQBKGH.js → chunk-QYJANQWC.js} +8 -8
- package/dist/{chunk-4U56FZ7B.js → chunk-R7RM766N.js} +3 -3
- package/dist/{chunk-QI25QRUP.js → chunk-RD4E5G3B.js} +2 -2
- package/dist/{chunk-QP53XLC5.js → chunk-RHX6MNWY.js} +1 -1
- package/dist/chunk-RIECV7SR.js +234 -0
- package/dist/{chunk-3YBJ36UX.js → chunk-RLDMUSRM.js} +2 -2
- package/dist/{chunk-CXQ724WH.js → chunk-RVWALVDT.js} +2 -2
- package/dist/{chunk-VWTUKKUF.js → chunk-RZIKSE6N.js} +10 -4
- package/dist/chunk-SBAU735L.js +328 -0
- package/dist/{chunk-XRCX6R5S.js → chunk-SBJV2PCU.js} +1 -1
- package/dist/chunk-SO7KTH3Q.js +27 -0
- package/dist/{chunk-327Q53AS.js → chunk-SP37DONS.js} +17 -6
- package/dist/{chunk-KA4WVDLX.js → chunk-T6S45OLV.js} +4 -4
- package/dist/chunk-TCTED52S.js +120 -0
- package/dist/{chunk-HLQ4MS42.js → chunk-TO6TB75E.js} +4 -4
- package/dist/{chunk-465RCKVI.js → chunk-U373MEF5.js} +6 -6
- package/dist/{chunk-AL4HXKDJ.js → chunk-VGE6IHZB.js} +10 -10
- package/dist/{chunk-WBG7XYVR.js → chunk-VHJVD3MZ.js} +8 -0
- package/dist/{chunk-ZZEKOI2M.js → chunk-VMJ2UH4S.js} +1 -1
- package/dist/{chunk-3ICF4IAZ.js → chunk-VS4LPG66.js} +1 -1
- package/dist/{chunk-E3YI6FVJ.js → chunk-VV5EZZNT.js} +1 -1
- package/dist/{chunk-OPU3NYOO.js → chunk-W2IRQJ6R.js} +12 -0
- package/dist/{chunk-PV5BIXT6.js → chunk-WR75WUEP.js} +1 -1
- package/dist/{chunk-XUB4GFPN.js → chunk-WYLFDSIE.js} +144 -99
- package/dist/{chunk-4L33OFU4.js → chunk-X2P43TB2.js} +6 -3
- package/dist/chunk-X2X3IGZU.js +215 -0
- package/dist/{chunk-KIKB6FY3.js → chunk-X6A2VWVJ.js} +2 -2
- package/dist/chunk-XMVSLLED.js +38 -0
- package/dist/{chunk-KDMVVHZH.js → chunk-XTWHNLGD.js} +95 -23
- package/dist/{chunk-QY3TM2T3.js → chunk-YMJOLEPE.js} +4 -4
- package/dist/{chunk-RFKRCVGW.js → chunk-YYA5LXCT.js} +1 -1
- package/dist/{chunk-HSKABJE6.js → chunk-ZDUO6QBH.js} +5 -10
- package/dist/{chunk-PDJWHL63.js → chunk-ZEKCHV43.js} +4 -4
- package/dist/{chunk-23KWUA7Z.js → chunk-ZNEBZCZR.js} +53 -2
- package/dist/chunk-ZNUJFX7L.js +135 -0
- package/dist/{chunk-TP7RXGMP.js → chunk-ZRKEUCUZ.js} +315 -67
- package/dist/{chunk-6Y3KUO7Q.js → chunk-ZSZPMUNX.js} +244 -21
- package/dist/{chunk-4P2BFNSB.js → chunk-ZVTKWWLV.js} +2 -2
- package/dist/{chunk-RCOIKTHM.js → chunk-ZZXMB5F2.js} +1 -1
- package/dist/{cleanup-graph-garbage-6F22Y5SD.js → cleanup-graph-garbage-CAA625RJ.js} +10 -9
- package/dist/cloud-sync-command-DBB7WRHL.js +96 -0
- package/dist/cloud-sync-db-init-V7IB23W5.js +46 -0
- package/dist/{cloud-sync-shutdown-FWERMZB5.js → cloud-sync-shutdown-2D3B73CJ.js} +10 -4
- package/dist/{cloud-sync-state-DJRZORFI.js → cloud-sync-state-5DFKLWNB.js} +1 -1
- package/dist/{co-activation-UEEDCM5U.js → co-activation-JVN7EBS6.js} +4 -4
- package/dist/{co-occurrence-W6OPFRSY.js → co-occurrence-526PTFGT.js} +8 -7
- package/dist/{code-context-index-DWR6HS35.js → code-context-index-XOP6TLPZ.js} +5 -4
- package/dist/{conversation-entity-extractor-LWUIH3UB.js → conversation-entity-extractor-JO56DB2E.js} +9 -4
- package/dist/{conversation-wiki-populator-5EGRW2UZ.js → conversation-wiki-populator-EBUZXYEU.js} +1 -1
- package/dist/{crdt-sync-NHJX3ZJD.js → crdt-sync-LIJLZKFE.js} +2 -2
- package/dist/{crm-webhook-OY467ATC.js → crm-webhook-55F7Y6D2.js} +2 -2
- package/dist/{cto-delegation-gate-XH4YSQVC.js → cto-delegation-gate-QIYV4KFO.js} +41 -24
- package/dist/daemon-auth-SSPY5ODS.js +46 -0
- package/dist/{daemon-orchestration-7425ZVNH.js → daemon-orchestration-Q3GJA2JJ.js} +46 -30
- package/dist/{daemon-ready-VGPSRI3Z.js → daemon-ready-MKBH4QWD.js} +1 -1
- package/dist/{daemon-restart-report-HZU5LWXN.js → daemon-restart-report-EIVD6WDJ.js} +1 -1
- package/dist/db-integrity-events-5DTASXJF.js +22 -0
- package/dist/{db-restore-events-TFCZ4CPM.js → db-restore-events-2FI4ZMKA.js} +1 -1
- package/dist/{doc-graph-extractor-RR2VSO4W.js → doc-graph-extractor-P46R4QME.js} +13 -8
- package/dist/{documents-TRZ4R2ZW.js → documents-7KFEREWO.js} +12 -11
- package/dist/{dreaming-MAMZAPYW.js → dreaming-JMUXBAPU.js} +29 -27
- package/dist/employee-boot-brief-HN63D2BY.js +71 -0
- package/dist/{exe-drift-VBWB5E6S.js → exe-drift-7J7GX7DP.js} +5 -5
- package/dist/{exe-export-XJJTVVT7.js → exe-export-KJ7B2OBU.js} +14 -13
- package/dist/{exe-import-G6O7JFNZ.js → exe-import-HPZDWKGE.js} +14 -13
- package/dist/{exe-key-A2WJLLTM.js → exe-key-2PREP464.js} +117 -105
- package/dist/{exe-org-HXF4XBB3.js → exe-org-VEIISATF.js} +88 -26
- package/dist/{exe-snapshot-TL3TLKLR.js → exe-snapshot-JXQFLUKA.js} +33 -40
- package/dist/{fast-db-init-SO2XUQ7T.js → fast-db-init-SCXJXOYX.js} +1 -1
- package/dist/{founder-context-IOCADC66.js → founder-context-U2SZPLYV.js} +4 -3
- package/dist/{founder-monitor-envelope-SMILO4BT.js → founder-monitor-envelope-5KTKNL5G.js} +4 -4
- package/dist/fts-integrity-LKAZEZJE.js +96 -0
- package/dist/gateway/index.js +19 -19
- package/dist/{git-staleness-I6WT7EXV.js → git-staleness-S4NDR7NX.js} +4 -4
- package/dist/{global-procedures-3RMO6C3C.js → global-procedures-ZOFTOXIR.js} +6 -6
- package/dist/gotrue-session-ODZ2ERJX.js +25 -0
- package/dist/{graph-auto-extract-NKTYPD2I.js → graph-auto-extract-CLVTSUSB.js} +8 -7
- package/dist/{graph-rag-EOGPZOYI.js → graph-rag-LSJLWGXV.js} +4 -3
- package/dist/{hook-integrity-RTBF2BL2.js → hook-integrity-SGTKBL6W.js} +1 -1
- package/dist/{hook-prefetch-V5KCGW2N.js → hook-prefetch-BDSLB6F4.js} +26 -24
- package/dist/hooks/bug-report-worker.js +30 -28
- package/dist/hooks/codex-stop-task-finalizer.js +32 -30
- package/dist/hooks/commit-complete.js +29 -27
- package/dist/hooks/error-recall.js +11 -10
- package/dist/hooks/exe-heartbeat-hook.js +7 -6
- package/dist/hooks/ingest-worker.js +10 -9
- package/dist/hooks/ingest.js +18 -16
- package/dist/hooks/instructions-loaded.js +12 -8
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +8 -7
- package/dist/hooks/post-compact.js +7 -6
- package/dist/hooks/post-tool-combined.js +33 -14
- package/dist/hooks/pre-compact.js +31 -28
- package/dist/hooks/pre-tool-use.js +61 -34
- package/dist/hooks/prompt-submit.js +45 -42
- package/dist/hooks/session-end.js +40 -35
- package/dist/hooks/session-start.js +29 -71
- package/dist/hooks/stop.js +42 -36
- package/dist/hooks/subagent-stop.js +49 -33
- package/dist/hooks/summary-worker.js +35 -33
- package/dist/index.js +40 -38
- package/dist/{installer-G67M3DME.js → installer-EA7T3PBD.js} +7 -7
- package/dist/{installer-L3ZKMOPU.js → installer-KCEM4RCG.js} +7 -7
- package/dist/{installer-QBWZSYDG.js → installer-RC2JCKSE.js} +9 -7
- package/dist/{intercom-queue-R5LSXD3V.js → intercom-queue-6DZPHHQ2.js} +25 -23
- package/dist/{key-backup-status-3RC6XTUX.js → key-backup-status-6L2ARCXW.js} +1 -1
- package/dist/lib/agent-config.js +2 -2
- package/dist/lib/cloud-sync.js +25 -19
- package/dist/lib/config.js +1 -1
- package/dist/lib/consolidation.js +9 -9
- package/dist/lib/crypto.js +3 -1
- package/dist/lib/database.js +18 -4
- package/dist/lib/db-backup.js +4 -2
- package/dist/lib/db-daemon-client.js +5 -4
- package/dist/lib/db-write-worker.js +3 -3
- package/dist/lib/db.js +18 -4
- package/dist/lib/device-registry.js +2 -2
- package/dist/lib/embed-worker.js +1 -1
- package/dist/lib/embedder.js +5 -4
- package/dist/lib/employee-templates.js +7 -7
- package/dist/lib/employees.js +4 -4
- package/dist/lib/exe-daemon-client.js +4 -3
- package/dist/lib/exe-daemon.js +473 -206
- package/dist/lib/hybrid-search.js +8 -8
- package/dist/lib/identity-templates.js +1 -1
- package/dist/lib/identity.js +4 -4
- package/dist/lib/license.js +6 -4
- package/dist/lib/messaging.js +26 -24
- package/dist/lib/post-tool-memory.js +2 -2
- package/dist/lib/registry-proxy.js +3 -1
- package/dist/lib/reminders.js +5 -5
- package/dist/lib/schedules.js +8 -8
- package/dist/lib/session-registry.js +6 -6
- package/dist/lib/skill-learning.js +14 -12
- package/dist/lib/stack-invariants.js +21 -0
- package/dist/lib/status-brief.js +3 -3
- package/dist/lib/store.js +7 -7
- package/dist/lib/task-router.js +5 -5
- package/dist/lib/tasks.js +27 -25
- package/dist/lib/tmux-routing.js +25 -23
- package/dist/lib/token-spend.js +5 -5
- package/dist/{license-gate-6R3F3NQR.js → license-gate-HMSMUIAU.js} +5 -4
- package/dist/{license-sync-VBJCXBAP.js → license-sync-FBCMPC4J.js} +4 -3
- package/dist/{mailbox-inbox-CP2VRBXZ.js → mailbox-inbox-4MEUOL3J.js} +2 -2
- package/dist/{mailbox-outbox-HXI7DYNC.js → mailbox-outbox-J6WIF3UY.js} +1 -1
- package/dist/mcp/register-tools.js +114 -102
- package/dist/mcp/server.js +120 -108
- package/dist/mcp/tools/complete-reminder.js +6 -6
- package/dist/mcp/tools/create-reminder.js +6 -6
- package/dist/mcp/tools/create-task.js +30 -27
- package/dist/mcp/tools/deactivate-behavior.js +15 -13
- package/dist/mcp/tools/list-reminders.js +6 -6
- package/dist/mcp/tools/list-tasks.js +30 -27
- package/dist/mcp/tools/send-message.js +29 -26
- package/dist/mcp/tools/update-task.js +28 -26
- package/dist/{mcp-http-config-BWX7AMAZ.js → mcp-http-config-YKJN52HG.js} +5 -5
- package/dist/{mcp-session-identity-GOBGICLI.js → mcp-session-identity-QLUVYWPR.js} +25 -23
- package/dist/{memory-cards-4EXX3BQS.js → memory-cards-K2OSX4AW.js} +7 -7
- package/dist/{memory-graph-extractor-OYVZIJ3R.js → memory-graph-extractor-YLTSKLSY.js} +9 -8
- package/dist/{memory-poisoning-defense-AHOD2EBX.js → memory-poisoning-defense-IPO4ADRL.js} +4 -4
- package/dist/{memory-pressure-watchdog-COJC3OYS.js → memory-pressure-watchdog-ZI3TH2OF.js} +26 -24
- package/dist/{memory-queue-4VN3DTOE.js → memory-queue-QJNWKWKG.js} +2 -2
- package/dist/{memory-queue-client-OI4LDT4W.js → memory-queue-client-HIHCA3W4.js} +6 -5
- package/dist/{memory-reflection-V2SNAUIB.js → memory-reflection-ZKVRU3NT.js} +4 -4
- package/dist/{monitor-grants-W3ISOLMC.js → monitor-grants-BW2WL4IU.js} +3 -3
- package/dist/{notification-ledger-J6Q2GAYU.js → notification-ledger-4REL6M3T.js} +27 -25
- package/dist/{notifications-56TP36IK.js → notifications-UXJUAP3C.js} +25 -23
- package/dist/{orchestration-events-CKQ756NA.js → orchestration-events-GMRGGBMN.js} +5 -5
- package/dist/{orchestration-phase-ZJ4XVNFO.js → orchestration-phase-UDS24CVQ.js} +2 -2
- package/dist/{orchestrator-ERSQ3KNT.js → orchestrator-5TV75HDJ.js} +27 -25
- package/dist/{org-brief-session-FSZ3QJDN.js → org-brief-session-7AZZEO3F.js} +13 -13
- package/dist/{org-consent-policy-BN7MKCZ2.js → org-consent-policy-XT6UZENB.js} +2 -2
- package/dist/{org-join-HTQ57JYH.js → org-join-BMBQDMVF.js} +10 -7
- package/dist/org-key-admin-SCCVVE2H.js +38 -0
- package/dist/{org-key-pin-OTOKAELD.js → org-key-pin-5WUSPGVN.js} +3 -3
- package/dist/{org-membership-SML6GCHP.js → org-membership-ESALTLLN.js} +4 -4
- package/dist/{org-partner-config-XQGOB7EJ.js → org-partner-config-YKHPDPZR.js} +6 -6
- package/dist/{org-partner-runtime-RNNUL5IN.js → org-partner-runtime-WLZAZJIY.js} +14 -14
- package/dist/{org-row-visibility-JZFJ3YRJ.js → org-row-visibility-A5XM4MVO.js} +1 -1
- package/dist/{pipeline-router-IUENNTAY.js → pipeline-router-UEVXDUHR.js} +5 -5
- package/dist/{plan-limits-ZUII366B.js → plan-limits-QEP32X4W.js} +8 -7
- package/dist/{platform-procedures-2VQGBJU7.js → platform-procedures-44NDFTB6.js} +1 -1
- package/dist/{postinstall-failure-A7WTAXD6.js → postinstall-failure-B2JHNFPM.js} +2 -2
- package/dist/{project-boot-3DFY5F35.js → project-boot-LEZSK3W7.js} +9 -1
- package/dist/project-name-ILJTETUE.js +14 -0
- package/dist/{projection-worker-MBWUPB5O.js → projection-worker-GMRC6SBH.js} +4 -4
- package/dist/{prospective-memory-GHE5ORN4.js → prospective-memory-QLHSAPSG.js} +4 -4
- package/dist/{push-notifications-PTQ5DHCD.js → push-notifications-GKRPXOGI.js} +26 -24
- package/dist/reproject-worktree-memories-IXYGHTGA.js +224 -0
- package/dist/{reranker-NUIGAPA3.js → reranker-GB4VEMUV.js} +2 -2
- package/dist/{retrieval-health-XHCERQPG.js → retrieval-health-QIBPBGN6.js} +5 -1
- package/dist/{review-polling-CYBCBHZA.js → review-polling-MU47NQ2N.js} +26 -24
- package/dist/runtime/index.js +37 -35
- package/dist/seat-benefit-VDQJYJOB.js +17 -0
- package/dist/{session-events-X33W4JNA.js → session-events-YMQ3VGBJ.js} +26 -24
- package/dist/{session-kill-telemetry-I2F5PUIW.js → session-kill-telemetry-VGPKE57M.js} +26 -24
- package/dist/{session-mcp-config-YKNXG5DW.js → session-mcp-config-F7KATWOF.js} +10 -1
- package/dist/{session-scope-WXP4F7OF.js → session-scope-P46KAHXQ.js} +26 -24
- package/dist/{setup-wizard-2CTVITIX.js → setup-wizard-BRNHSJ4U.js} +4 -3
- package/dist/{shard-manager-YEOHEOHL.js → shard-manager-UROHZE46.js} +2 -2
- package/dist/{skill-refinement-VDR5OT4V.js → skill-refinement-NLYDSFEH.js} +5 -5
- package/dist/{stack-promote-XVC7FRJW.js → stack-promote-NHFTNIM2.js} +7 -5
- package/dist/{stack-release-6PWAACRM.js → stack-release-AQVKZUS7.js} +7 -5
- package/dist/{stack-update-24VRBQ3U.js → stack-update-LLX5KT7G.js} +38 -6
- package/dist/{steward-gate-2ZNYDVFO.js → steward-gate-JKHYFAHA.js} +5 -5
- package/dist/subagent-brief-injection-VDVOHDOU.js +97 -0
- package/dist/subagent-spawn-ledger-USYZXU3M.js +22 -0
- package/dist/{support-inbox-ZHKLDETT.js → support-inbox-S6YO5YZU.js} +5 -4
- package/dist/{support-outbox-DSWU3IXH.js → support-outbox-HFJWG52M.js} +1 -1
- package/dist/{task-enforcement-GQDUTIFY.js → task-enforcement-LXW45H5Z.js} +26 -24
- package/dist/{task-request-inbox-BFXNUU44.js → task-request-inbox-UCSKDC3R.js} +2 -2
- package/dist/{task-scope-ERHPHLUM.js → task-scope-GDLFE26E.js} +25 -23
- package/dist/{tasks-crud-NVNF3NRA.js → tasks-crud-W7VGWRUV.js} +25 -23
- package/dist/{tasks-notify-DXLU5VCT.js → tasks-notify-CT7NWCS4.js} +26 -24
- package/dist/{tasks-review-BST6N34P.js → tasks-review-WCSKOUFW.js} +25 -23
- package/dist/{telemetry-upload-NY3EKOGY.js → telemetry-upload-FK5WKXVB.js} +10 -9
- package/dist/{token-budget-CLB3GUIX.js → token-budget-GBNGSIU3.js} +5 -5
- package/dist/{tool-capability-index-WZWVBI2R.js → tool-capability-index-BT2GGLLI.js} +1 -1
- package/dist/{tool-telemetry-PALAZUXT.js → tool-telemetry-VKMRS6MP.js} +1 -1
- package/dist/tui/App.js +39 -37
- package/dist/{tui-data-CNFSRZP7.js → tui-data-FTPV2XBQ.js} +25 -23
- package/dist/{update-support-ZVB3CNGY.js → update-support-J6UWPUOC.js} +18 -15
- package/dist/{work-state-heartbeat-O7UMB6SE.js → work-state-heartbeat-4LDF6DSM.js} +1 -1
- package/dist/{worker-gate-6DQQWDNB.js → worker-gate-35VZINZG.js} +2 -2
- package/dist/{workflow-engine-5ZULFH7O.js → workflow-engine-4DA6RSHI.js} +2 -2
- package/dist/working-memory-DPFRSKH3.js +18 -0
- package/dist/{worktree-ZWA35PKW.js → worktree-H3YFJ3NU.js} +6 -6
- package/dist/{worktree-sweep-5LCVT46V.js → worktree-sweep-4EDLLQ2E.js} +9 -7
- package/package.json +11 -5
- package/release-notes.json +86 -34
- package/src/commands/exe/call.md +6 -4
- package/src/commands/exe-reference.md +11 -7
- package/src/commands/exe.md +16 -20
- package/dist/chunk-HISFWAAK.js +0 -90
- package/dist/daemon-auth-OCHW2U6B.js +0 -20
- package/dist/project-name-EWG5KAZP.js +0 -10
- package/dist/session-summary-5EYI4XW4.js +0 -128
- /package/dist/{chunk-YAZ5ECEG.js → chunk-3NBWARKC.js} +0 -0
- /package/dist/{chunk-6C4UAKMS.js → chunk-6CAX7YH4.js} +0 -0
- /package/dist/{chunk-FIPUVCKC.js → chunk-7DMCAGSC.js} +0 -0
- /package/dist/{chunk-X7LY3IOB.js → chunk-JRPYLUXH.js} +0 -0
- /package/dist/{chunk-L4LPJMPV.js → chunk-QYECRPGD.js} +0 -0
- /package/dist/{chunk-UELGUVNL.js → chunk-UY6HRDB2.js} +0 -0
- /package/dist/{chunk-YWN3XMPU.js → chunk-YSDIJ3VI.js} +0 -0
- /package/dist/{core-memory-BZFPVS43.js → core-memory-CMPPHJN5.js} +0 -0
- /package/dist/{entity-boost-VXXED26D.js → entity-boost-CDFAXVYL.js} +0 -0
- /package/dist/{memory-isolation-3PIOWLYP.js → memory-isolation-ZB5S5HCO.js} +0 -0
- /package/dist/{message-queue-client-5XW7ZOK2.js → message-queue-client-PL2POQOV.js} +0 -0
- /package/dist/{oauth-server-KW5M437C.js → oauth-server-NP7KGF7N.js} +0 -0
- /package/dist/{webhook-pipe-QJRFZVKA.js → webhook-pipe-UQSEHFPO.js} +0 -0
- /package/dist/{wiki-acl-RXFV5OEU.js → wiki-acl-5DKOWOIH.js} +0 -0
- /package/dist/{wiki-client-57QWZIHQ.js → wiki-client-AXNM5FWY.js} +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isPaneBusy
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZEKCHV43.js";
|
|
4
4
|
import {
|
|
5
5
|
recordSessionKill
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ANPE3TT3.js";
|
|
7
7
|
import {
|
|
8
8
|
updateTask
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-AGQAGOQN.js";
|
|
10
10
|
import {
|
|
11
11
|
BUSY_PATTERN,
|
|
12
12
|
countPendingReviews,
|
|
@@ -23,26 +23,26 @@ import {
|
|
|
23
23
|
sessionScopeFilter,
|
|
24
24
|
strictSessionScopeFilter,
|
|
25
25
|
writeNotification
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-ORNCMRIX.js";
|
|
27
27
|
import {
|
|
28
28
|
LEASE_MINUTES,
|
|
29
29
|
isLeaseExpired
|
|
30
30
|
} from "./chunk-E23LNUWJ.js";
|
|
31
31
|
import {
|
|
32
32
|
listSessions
|
|
33
|
-
} from "./chunk-
|
|
34
|
-
import {
|
|
35
|
-
getTransport
|
|
36
|
-
} from "./chunk-UXLO7VHX.js";
|
|
33
|
+
} from "./chunk-EHHMNKOA.js";
|
|
37
34
|
import {
|
|
38
35
|
capturePaneLinesAsync,
|
|
39
36
|
listTmuxSessions,
|
|
40
37
|
parseContextPercentage,
|
|
41
38
|
parseContextPercentageAsync
|
|
42
39
|
} from "./chunk-GBNB4EWD.js";
|
|
40
|
+
import {
|
|
41
|
+
getTransport
|
|
42
|
+
} from "./chunk-UXLO7VHX.js";
|
|
43
43
|
import {
|
|
44
44
|
recordOrchestrationEventBestEffort
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-WR75WUEP.js";
|
|
46
46
|
import {
|
|
47
47
|
checkDispatchStatus,
|
|
48
48
|
readTerminalLauncherFailure,
|
|
@@ -51,27 +51,32 @@ import {
|
|
|
51
51
|
} from "./chunk-AJIXH5JF.js";
|
|
52
52
|
import {
|
|
53
53
|
getAgentRuntime
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-XTWHNLGD.js";
|
|
55
|
+
import {
|
|
56
|
+
killIfSameProcess,
|
|
57
|
+
processStartedAt,
|
|
58
|
+
recordKillIntent
|
|
59
|
+
} from "./chunk-LNOS24GV.js";
|
|
55
60
|
import {
|
|
56
61
|
baseAgentName,
|
|
57
62
|
getCoordinatorName,
|
|
58
63
|
isCoordinatorName,
|
|
59
64
|
shouldAutoInstance
|
|
60
|
-
} from "./chunk-
|
|
65
|
+
} from "./chunk-BRLS5OLZ.js";
|
|
61
66
|
import {
|
|
62
67
|
eventLoopBlockedMarkerPath
|
|
63
68
|
} from "./chunk-JY5GAZYC.js";
|
|
64
69
|
import {
|
|
65
70
|
loadConfigSync
|
|
66
|
-
} from "./chunk-
|
|
71
|
+
} from "./chunk-QMSEL5YS.js";
|
|
67
72
|
|
|
68
73
|
// src/lib/daemon-orchestration.ts
|
|
69
74
|
import { execFile, execFileSync, execSync } from "child_process";
|
|
70
75
|
import { promisify } from "util";
|
|
71
76
|
import { randomUUID } from "crypto";
|
|
72
|
-
import { existsSync as existsSync2, readFileSync, writeFileSync, unlinkSync, statSync as statSync2 } from "fs";
|
|
77
|
+
import { existsSync as existsSync2, mkdirSync, readFileSync, writeFileSync, unlinkSync, statSync as statSync2 } from "fs";
|
|
73
78
|
import { homedir, loadavg, freemem, cpus as osCpus, platform } from "os";
|
|
74
|
-
import { join, basename } from "path";
|
|
79
|
+
import { join, basename, dirname } from "path";
|
|
75
80
|
|
|
76
81
|
// src/lib/session-pane-snapshot.ts
|
|
77
82
|
var CONTEXT_BAR = /[█░]+\s*(\d+)%/;
|
|
@@ -209,29 +214,41 @@ async function collectAgentSignals(client, agentId, sessionName, intercomAckWind
|
|
|
209
214
|
|
|
210
215
|
// src/lib/daemon-orchestration.ts
|
|
211
216
|
var cpuCount = () => osCpus().length;
|
|
212
|
-
function
|
|
213
|
-
|
|
217
|
+
function parseVmStatAvailableGB(vmStatOutput) {
|
|
218
|
+
const pageSizeMatch = vmStatOutput.match(/page size of (\d+)/);
|
|
219
|
+
const pageSize = pageSizeMatch ? parseInt(pageSizeMatch[1], 10) : 16384;
|
|
220
|
+
const parsePages = (label) => {
|
|
221
|
+
const re = new RegExp(`${label}:\\s+([\\d]+)\\.`);
|
|
222
|
+
const m = vmStatOutput.match(re);
|
|
223
|
+
return m ? parseInt(m[1], 10) : 0;
|
|
224
|
+
};
|
|
225
|
+
const freePages = parsePages("Pages free");
|
|
226
|
+
const inactivePages = parsePages("Pages inactive");
|
|
227
|
+
const purgeablePages = parsePages("Pages purgeable");
|
|
228
|
+
const availableBytes = (freePages + inactivePages + purgeablePages) * pageSize;
|
|
229
|
+
return availableBytes / 1024 ** 3;
|
|
230
|
+
}
|
|
231
|
+
var VM_STAT_TTL_MS = 1e4;
|
|
232
|
+
var _vmStatAvailableGB = null;
|
|
233
|
+
var _vmStatSampledAt = 0;
|
|
234
|
+
var _vmStatRefreshing = false;
|
|
235
|
+
function refreshVmStatAvailableGB() {
|
|
236
|
+
if (_vmStatRefreshing) return;
|
|
237
|
+
_vmStatRefreshing = true;
|
|
238
|
+
execFile("vm_stat", [], { encoding: "utf8", timeout: 3e3 }, (err, stdout) => {
|
|
239
|
+
_vmStatRefreshing = false;
|
|
240
|
+
if (err) return;
|
|
214
241
|
try {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
timeout: 3e3,
|
|
218
|
-
stdio: ["pipe", "pipe", "pipe"]
|
|
219
|
-
});
|
|
220
|
-
const pageSizeMatch = vmStatOutput.match(/page size of (\d+)/);
|
|
221
|
-
const pageSize = pageSizeMatch ? parseInt(pageSizeMatch[1], 10) : 16384;
|
|
222
|
-
const parsePages = (label) => {
|
|
223
|
-
const re = new RegExp(`${label}:\\s+([\\d]+)\\.`);
|
|
224
|
-
const m = vmStatOutput.match(re);
|
|
225
|
-
return m ? parseInt(m[1], 10) : 0;
|
|
226
|
-
};
|
|
227
|
-
const freePages = parsePages("Pages free");
|
|
228
|
-
const inactivePages = parsePages("Pages inactive");
|
|
229
|
-
const purgeablePages = parsePages("Pages purgeable");
|
|
230
|
-
const availableBytes = (freePages + inactivePages + purgeablePages) * pageSize;
|
|
231
|
-
return availableBytes / 1024 ** 3;
|
|
242
|
+
_vmStatAvailableGB = parseVmStatAvailableGB(String(stdout));
|
|
243
|
+
_vmStatSampledAt = Date.now();
|
|
232
244
|
} catch {
|
|
233
|
-
return freemem() / 1024 ** 3;
|
|
234
245
|
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
function getAvailableMemoryGB() {
|
|
249
|
+
if (platform() === "darwin") {
|
|
250
|
+
if (Date.now() - _vmStatSampledAt > VM_STAT_TTL_MS) refreshVmStatAvailableGB();
|
|
251
|
+
return _vmStatAvailableGB ?? freemem() / 1024 ** 3;
|
|
235
252
|
}
|
|
236
253
|
return freemem() / 1024 ** 3;
|
|
237
254
|
}
|
|
@@ -2670,16 +2687,49 @@ var HOOK_PROCESS_PATTERNS = [
|
|
|
2670
2687
|
"exe-heartbeat-hook.js"
|
|
2671
2688
|
];
|
|
2672
2689
|
var AGENT_CLI_EXECUTABLES = /* @__PURE__ */ new Set(["claude", "codex", "opencode"]);
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2690
|
+
var RUNTIME_EXECUTABLES = /* @__PURE__ */ new Set([
|
|
2691
|
+
"node",
|
|
2692
|
+
"nodejs",
|
|
2693
|
+
"bun",
|
|
2694
|
+
"deno",
|
|
2695
|
+
"npx",
|
|
2696
|
+
"python",
|
|
2697
|
+
"python2",
|
|
2698
|
+
"python3",
|
|
2699
|
+
"sh",
|
|
2700
|
+
"bash",
|
|
2701
|
+
"zsh",
|
|
2702
|
+
"dash",
|
|
2703
|
+
"env"
|
|
2704
|
+
]);
|
|
2705
|
+
function getProcessIdentityTokens(args) {
|
|
2706
|
+
const tokens = args.trim().split(/\s+/);
|
|
2707
|
+
const argv0 = tokens[0] ?? "";
|
|
2708
|
+
const identity = [argv0];
|
|
2709
|
+
if (!RUNTIME_EXECUTABLES.has(basenameOf(argv0))) return identity;
|
|
2710
|
+
for (let i = 1; i < tokens.length; i++) {
|
|
2711
|
+
const token = tokens[i];
|
|
2712
|
+
if (token.startsWith("-")) continue;
|
|
2713
|
+
identity.push(token);
|
|
2714
|
+
break;
|
|
2715
|
+
}
|
|
2716
|
+
return identity;
|
|
2717
|
+
}
|
|
2718
|
+
function basenameOf(token) {
|
|
2719
|
+
return token.split("/").pop() ?? token;
|
|
2720
|
+
}
|
|
2721
|
+
function identityMatchesPattern(identity, pattern) {
|
|
2722
|
+
return identity.some((token) => token === pattern || token.endsWith(`/${pattern}`));
|
|
2723
|
+
}
|
|
2724
|
+
function isAgentCliProcess(args) {
|
|
2725
|
+
return getProcessIdentityTokens(args).some(
|
|
2726
|
+
(token) => AGENT_CLI_EXECUTABLES.has(basenameOf(token).replace(/\.(?:js|mjs|cjs)$/, ""))
|
|
2727
|
+
);
|
|
2679
2728
|
}
|
|
2680
2729
|
var ZOMBIE_AGENT_MAX_AGE_SECS = 300;
|
|
2681
2730
|
var REAPER_MAX_BUFFER_BYTES = 64 * 1024 * 1024;
|
|
2682
2731
|
function reapZombieAgentProcesses(deps) {
|
|
2732
|
+
const readStartedAt = deps.getStartedAtMs ?? processStartedAt;
|
|
2683
2733
|
let liveSessions;
|
|
2684
2734
|
try {
|
|
2685
2735
|
liveSessions = new Set(deps.listTmuxSessions());
|
|
@@ -2827,6 +2877,20 @@ function reapZombieAgentProcesses(deps) {
|
|
|
2827
2877
|
const rssKb = deps.getRssKb ? deps.getRssKb(pid) : null;
|
|
2828
2878
|
const rssMb = rssKb ? Math.round(rssKb / 1024) : "?";
|
|
2829
2879
|
const desc = `PID ${pid} (age=${ageSecs}s, RSS=${rssMb}MB, ${info.args.slice(0, 80)})`;
|
|
2880
|
+
const startedAt = readStartedAt(pid);
|
|
2881
|
+
const wrapperStartedAt = wrapperPid > 1 ? readStartedAt(wrapperPid) : null;
|
|
2882
|
+
const guard = (reason) => ({
|
|
2883
|
+
sender: "zombie-reaper",
|
|
2884
|
+
reason,
|
|
2885
|
+
kill: (p, s) => deps.killProcess(p, s),
|
|
2886
|
+
startedAt: readStartedAt
|
|
2887
|
+
});
|
|
2888
|
+
recordKillIntent({
|
|
2889
|
+
targetPid: pid,
|
|
2890
|
+
signal: "SIGTERM",
|
|
2891
|
+
sender: "zombie-reaper",
|
|
2892
|
+
reason: `matched agent pattern, no live tmux session (age=${ageSecs}s) :: ${info.args.slice(0, 200)}`
|
|
2893
|
+
});
|
|
2830
2894
|
try {
|
|
2831
2895
|
deps.killProcess(pid, "SIGTERM");
|
|
2832
2896
|
} catch {
|
|
@@ -2837,6 +2901,12 @@ function reapZombieAgentProcesses(deps) {
|
|
|
2837
2901
|
`);
|
|
2838
2902
|
if (wrapperPid > 1 && procMap.has(wrapperPid)) {
|
|
2839
2903
|
try {
|
|
2904
|
+
recordKillIntent({
|
|
2905
|
+
targetPid: wrapperPid,
|
|
2906
|
+
signal: "SIGTERM",
|
|
2907
|
+
sender: "zombie-reaper",
|
|
2908
|
+
reason: `wrapper of zombie agent PID ${pid} :: ${procMap.get(wrapperPid)?.args.slice(0, 200) ?? ""}`
|
|
2909
|
+
});
|
|
2840
2910
|
deps.killProcess(wrapperPid, "SIGTERM");
|
|
2841
2911
|
process.stderr.write(`[zombie-agent-reaper] Killed wrapper PID ${wrapperPid}
|
|
2842
2912
|
`);
|
|
@@ -2844,17 +2914,11 @@ function reapZombieAgentProcesses(deps) {
|
|
|
2844
2914
|
}
|
|
2845
2915
|
}
|
|
2846
2916
|
deps.scheduleKill(pid, ORPHAN_SIGKILL_DELAY_MS, () => {
|
|
2847
|
-
|
|
2848
|
-
deps.killProcess(pid, "SIGKILL");
|
|
2849
|
-
} catch {
|
|
2850
|
-
}
|
|
2917
|
+
killIfSameProcess(pid, startedAt, "SIGKILL", guard(`zombie agent survived SIGTERM :: ${info.args.slice(0, 200)}`));
|
|
2851
2918
|
});
|
|
2852
2919
|
if (wrapperPid > 1) {
|
|
2853
2920
|
deps.scheduleKill(wrapperPid, ORPHAN_SIGKILL_DELAY_MS, () => {
|
|
2854
|
-
|
|
2855
|
-
deps.killProcess(wrapperPid, "SIGKILL");
|
|
2856
|
-
} catch {
|
|
2857
|
-
}
|
|
2921
|
+
killIfSameProcess(wrapperPid, wrapperStartedAt, "SIGKILL", guard(`wrapper of zombie agent PID ${pid} survived SIGTERM`));
|
|
2858
2922
|
});
|
|
2859
2923
|
}
|
|
2860
2924
|
}
|
|
@@ -2978,6 +3042,7 @@ function parseEtime(etime) {
|
|
|
2978
3042
|
return 0;
|
|
2979
3043
|
}
|
|
2980
3044
|
function reapOrphanedMcpProcesses(deps) {
|
|
3045
|
+
const readStartedAt = deps.getStartedAtMs ?? processStartedAt;
|
|
2981
3046
|
let lines;
|
|
2982
3047
|
try {
|
|
2983
3048
|
lines = deps.listProcesses();
|
|
@@ -2994,27 +3059,42 @@ function reapOrphanedMcpProcesses(deps) {
|
|
|
2994
3059
|
const etime = match[3];
|
|
2995
3060
|
const args = match[4];
|
|
2996
3061
|
if (pid === deps.selfPid) continue;
|
|
2997
|
-
|
|
2998
|
-
const
|
|
2999
|
-
const isPpid1Orphan = ppid === 1 && ORPHAN_PATTERNS.some((pat) => matchScope.includes(pat));
|
|
3062
|
+
const identity = getProcessIdentityTokens(args);
|
|
3063
|
+
const isPpid1Orphan = ppid === 1 && ORPHAN_PATTERNS.some((pat) => identityMatchesPattern(identity, pat));
|
|
3000
3064
|
const ageSecs = parseEtime(etime);
|
|
3001
|
-
const isAgedHookOrphan = ageSecs > ORPHAN_MAX_AGE_SECS && HOOK_PROCESS_PATTERNS.some((pat) =>
|
|
3065
|
+
const isAgedHookOrphan = ageSecs > ORPHAN_MAX_AGE_SECS && HOOK_PROCESS_PATTERNS.some((pat) => identityMatchesPattern(identity, pat));
|
|
3002
3066
|
if (!isPpid1Orphan && !isAgedHookOrphan) continue;
|
|
3067
|
+
if (isAgentCliProcess(args)) {
|
|
3068
|
+
process.stderr.write(
|
|
3069
|
+
`[orphan-reaper] Protected PID ${pid} \u2014 agent CLI (${identity.join(" ").slice(0, 100)})
|
|
3070
|
+
`
|
|
3071
|
+
);
|
|
3072
|
+
continue;
|
|
3073
|
+
}
|
|
3074
|
+
const reason = isPpid1Orphan ? "ppid=1" : `age=${ageSecs}s`;
|
|
3075
|
+
const startedAt = readStartedAt(pid);
|
|
3076
|
+
recordKillIntent({
|
|
3077
|
+
targetPid: pid,
|
|
3078
|
+
signal: "SIGTERM",
|
|
3079
|
+
sender: "orphan-reaper",
|
|
3080
|
+
reason: `matched ${isPpid1Orphan ? "ORPHAN_PATTERNS" : "HOOK_PROCESS_PATTERNS"} (${reason}) :: ${args.slice(0, 200)}`
|
|
3081
|
+
});
|
|
3003
3082
|
try {
|
|
3004
3083
|
deps.killProcess(pid, "SIGTERM");
|
|
3005
3084
|
} catch {
|
|
3006
3085
|
continue;
|
|
3007
3086
|
}
|
|
3008
|
-
const reason = isPpid1Orphan ? "ppid=1" : `age=${ageSecs}s`;
|
|
3009
3087
|
const desc = `PID ${pid} (${reason}, ${args.slice(0, 100)})`;
|
|
3010
3088
|
reaped.push(desc);
|
|
3011
3089
|
process.stderr.write(`[orphan-reaper] Killed ${desc}
|
|
3012
3090
|
`);
|
|
3013
3091
|
deps.scheduleKill(pid, ORPHAN_SIGKILL_DELAY_MS, () => {
|
|
3014
|
-
|
|
3015
|
-
|
|
3016
|
-
|
|
3017
|
-
|
|
3092
|
+
killIfSameProcess(pid, startedAt, "SIGKILL", {
|
|
3093
|
+
sender: "orphan-reaper",
|
|
3094
|
+
reason: `orphan survived SIGTERM (${reason}) :: ${args.slice(0, 200)}`,
|
|
3095
|
+
kill: (p, s) => deps.killProcess(p, s),
|
|
3096
|
+
startedAt: readStartedAt
|
|
3097
|
+
});
|
|
3018
3098
|
});
|
|
3019
3099
|
}
|
|
3020
3100
|
return reaped;
|
|
@@ -3070,8 +3150,77 @@ var WORKTREE_REAPER_INTERVAL_MS = 30 * 60 * 1e3;
|
|
|
3070
3150
|
var WORKTREE_MIN_AGE_MS = 60 * 60 * 1e3;
|
|
3071
3151
|
var WORKTREE_MAX_PRUNES_PER_TICK = 5;
|
|
3072
3152
|
var WORKTREE_DIRTY_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
3153
|
+
var WORKTREE_ARCHIVE_FAILURE_MAX_ATTEMPTS = 3;
|
|
3154
|
+
var WORKTREE_ARCHIVE_FAILURE_STATE_PATH = join(homedir(), ".exe-os", "session-cache", "worktree-reaper-archive-failures.json");
|
|
3155
|
+
function worktreeArchiveFailureKey(repoRoot, wtPath, branch) {
|
|
3156
|
+
return JSON.stringify([repoRoot, wtPath, branch]);
|
|
3157
|
+
}
|
|
3158
|
+
function normalizeArchiveFailureState(raw) {
|
|
3159
|
+
const entries = {};
|
|
3160
|
+
if (!raw || typeof raw !== "object") return { entries };
|
|
3161
|
+
const src = raw.entries;
|
|
3162
|
+
if (!src || typeof src !== "object") return { entries };
|
|
3163
|
+
for (const [key, val] of Object.entries(src)) {
|
|
3164
|
+
if (!val || typeof val !== "object") continue;
|
|
3165
|
+
const e = val;
|
|
3166
|
+
if (typeof e.attempts !== "number" || !Number.isFinite(e.attempts) || e.attempts < 0 || typeof e.firstFailureAt !== "number" || !Number.isFinite(e.firstFailureAt) || typeof e.lastFailureAt !== "number" || !Number.isFinite(e.lastFailureAt) || typeof e.mtimeMs !== "number" || !Number.isFinite(e.mtimeMs)) continue;
|
|
3167
|
+
entries[key] = {
|
|
3168
|
+
attempts: Math.floor(e.attempts),
|
|
3169
|
+
firstFailureAt: e.firstFailureAt,
|
|
3170
|
+
lastFailureAt: e.lastFailureAt,
|
|
3171
|
+
mtimeMs: e.mtimeMs,
|
|
3172
|
+
...typeof e.lastError === "string" ? { lastError: e.lastError.slice(0, 500) } : {}
|
|
3173
|
+
};
|
|
3174
|
+
}
|
|
3175
|
+
return { entries };
|
|
3176
|
+
}
|
|
3177
|
+
function loadWorktreeArchiveFailureState(statePath = WORKTREE_ARCHIVE_FAILURE_STATE_PATH) {
|
|
3178
|
+
try {
|
|
3179
|
+
if (!existsSync2(statePath)) return { entries: {} };
|
|
3180
|
+
return normalizeArchiveFailureState(JSON.parse(readFileSync(statePath, "utf8")));
|
|
3181
|
+
} catch {
|
|
3182
|
+
return { entries: {} };
|
|
3183
|
+
}
|
|
3184
|
+
}
|
|
3185
|
+
function saveWorktreeArchiveFailureState(state, statePath = WORKTREE_ARCHIVE_FAILURE_STATE_PATH) {
|
|
3186
|
+
mkdirSync(dirname(statePath), { recursive: true });
|
|
3187
|
+
writeFileSync(statePath, JSON.stringify({ entries: state.entries }, null, 2), "utf8");
|
|
3188
|
+
}
|
|
3189
|
+
function archiveFailureEntryFor(state, key, mtimeMs) {
|
|
3190
|
+
const entry = state.entries[key];
|
|
3191
|
+
if (!entry) return null;
|
|
3192
|
+
if (entry.mtimeMs !== mtimeMs) return null;
|
|
3193
|
+
return entry;
|
|
3194
|
+
}
|
|
3195
|
+
function shouldSkipWorktreeArchiveAfterFailures(state, key, mtimeMs, maxAttempts = WORKTREE_ARCHIVE_FAILURE_MAX_ATTEMPTS) {
|
|
3196
|
+
const entry = archiveFailureEntryFor(state, key, mtimeMs);
|
|
3197
|
+
if (!entry) return null;
|
|
3198
|
+
return entry.attempts >= maxAttempts ? entry : null;
|
|
3199
|
+
}
|
|
3200
|
+
function recordWorktreeArchiveFailure(state, key, mtimeMs, nowMs, err) {
|
|
3201
|
+
const prev = archiveFailureEntryFor(state, key, mtimeMs);
|
|
3202
|
+
const text = err instanceof Error ? err.message : String(err);
|
|
3203
|
+
const entry = {
|
|
3204
|
+
attempts: (prev?.attempts ?? 0) + 1,
|
|
3205
|
+
firstFailureAt: prev?.firstFailureAt ?? nowMs,
|
|
3206
|
+
lastFailureAt: nowMs,
|
|
3207
|
+
mtimeMs,
|
|
3208
|
+
lastError: text.slice(0, 500)
|
|
3209
|
+
};
|
|
3210
|
+
state.entries[key] = entry;
|
|
3211
|
+
return entry;
|
|
3212
|
+
}
|
|
3213
|
+
function clearWorktreeArchiveFailure(state, key) {
|
|
3214
|
+
if (!(key in state.entries)) return false;
|
|
3215
|
+
delete state.entries[key];
|
|
3216
|
+
return true;
|
|
3217
|
+
}
|
|
3073
3218
|
async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
|
|
3074
3219
|
const result = { pruned: [], skipped: [] };
|
|
3220
|
+
const archiveFailureState = deps.loadArchiveFailureState?.() ?? { entries: {} };
|
|
3221
|
+
const rawArchiveFailureMaxAttempts = deps.archiveFailureMaxAttempts ?? WORKTREE_ARCHIVE_FAILURE_MAX_ATTEMPTS;
|
|
3222
|
+
const archiveFailureMaxAttempts = Number.isFinite(rawArchiveFailureMaxAttempts) && rawArchiveFailureMaxAttempts > 0 ? Math.floor(rawArchiveFailureMaxAttempts) : WORKTREE_ARCHIVE_FAILURE_MAX_ATTEMPTS;
|
|
3223
|
+
let archiveFailureStateChanged = false;
|
|
3075
3224
|
let sessions;
|
|
3076
3225
|
try {
|
|
3077
3226
|
sessions = deps.listTmuxSessions();
|
|
@@ -3129,7 +3278,39 @@ async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
|
|
|
3129
3278
|
}
|
|
3130
3279
|
if (await deps.isWorktreeDirty(wt.path)) {
|
|
3131
3280
|
const ageH2 = Math.round(ageMs / 36e5);
|
|
3281
|
+
let archiveFailureReason = null;
|
|
3132
3282
|
if (ageMs >= WORKTREE_DIRTY_MAX_AGE_MS && deps.archiveDirtyWorktree) {
|
|
3283
|
+
const archiveFailureKey = worktreeArchiveFailureKey(repoRoot, wt.path, wt.branch);
|
|
3284
|
+
const suppressed = shouldSkipWorktreeArchiveAfterFailures(
|
|
3285
|
+
archiveFailureState,
|
|
3286
|
+
archiveFailureKey,
|
|
3287
|
+
mtimeMs,
|
|
3288
|
+
archiveFailureMaxAttempts
|
|
3289
|
+
);
|
|
3290
|
+
if (suppressed) {
|
|
3291
|
+
process.stderr.write(
|
|
3292
|
+
`[worktree-reaper] Archive retry limit reached for ${wt.path} (${suppressed.attempts}/${archiveFailureMaxAttempts} failures; last=${suppressed.lastError ?? "unknown"}). Skipping future archive attempts until the worktree changes or ${WORKTREE_ARCHIVE_FAILURE_STATE_PATH} is cleared.
|
|
3293
|
+
`
|
|
3294
|
+
);
|
|
3295
|
+
result.skipped.push({
|
|
3296
|
+
path: wt.path,
|
|
3297
|
+
reason: `uncommitted changes (archive retry limit reached ${suppressed.attempts}/${archiveFailureMaxAttempts})`
|
|
3298
|
+
});
|
|
3299
|
+
recordOrchestrationEventBestEffort({
|
|
3300
|
+
eventType: "worktree.skipped",
|
|
3301
|
+
source: "daemon-orchestration.reapOrphanedWorktrees",
|
|
3302
|
+
severity: "warn",
|
|
3303
|
+
agentId: agentName,
|
|
3304
|
+
payload: {
|
|
3305
|
+
reason: "archive retry limit reached",
|
|
3306
|
+
branch: wt.branch,
|
|
3307
|
+
ageHours: ageH2,
|
|
3308
|
+
attempts: suppressed.attempts,
|
|
3309
|
+
maxAttempts: archiveFailureMaxAttempts
|
|
3310
|
+
}
|
|
3311
|
+
});
|
|
3312
|
+
continue;
|
|
3313
|
+
}
|
|
3133
3314
|
process.stderr.write(
|
|
3134
3315
|
`[worktree-reaper] Dirty orphan worktree aged out (${ageH2}h > ${WORKTREE_DIRTY_MAX_AGE_MS / 36e5}h), archiving: ${wt.path} (agent: ${agentName})
|
|
3135
3316
|
`
|
|
@@ -3137,6 +3318,9 @@ async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
|
|
|
3137
3318
|
try {
|
|
3138
3319
|
const archived = await deps.archiveDirtyWorktree(repoRoot, wt.path, wt.branch, agentName);
|
|
3139
3320
|
if (archived) {
|
|
3321
|
+
if (clearWorktreeArchiveFailure(archiveFailureState, archiveFailureKey)) {
|
|
3322
|
+
archiveFailureStateChanged = true;
|
|
3323
|
+
}
|
|
3140
3324
|
const removed2 = await deps.removeWorktree(repoRoot, wt.path);
|
|
3141
3325
|
if (removed2) {
|
|
3142
3326
|
await deps.deleteBranch(repoRoot, wt.branch);
|
|
@@ -3154,25 +3338,64 @@ async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
|
|
|
3154
3338
|
result.pruned.push(wt.path);
|
|
3155
3339
|
continue;
|
|
3156
3340
|
}
|
|
3341
|
+
archiveFailureReason = "git worktree remove failed after archive";
|
|
3342
|
+
} else {
|
|
3343
|
+
const failure = recordWorktreeArchiveFailure(
|
|
3344
|
+
archiveFailureState,
|
|
3345
|
+
archiveFailureKey,
|
|
3346
|
+
mtimeMs,
|
|
3347
|
+
nowMs,
|
|
3348
|
+
new Error("archive returned false")
|
|
3349
|
+
);
|
|
3350
|
+
archiveFailureStateChanged = true;
|
|
3351
|
+
archiveFailureReason = `uncommitted changes (archive failed ${failure.attempts}/${archiveFailureMaxAttempts}${failure.attempts >= archiveFailureMaxAttempts ? "; retry limit reached" : ""})`;
|
|
3352
|
+
if (failure.attempts >= archiveFailureMaxAttempts) {
|
|
3353
|
+
process.stderr.write(
|
|
3354
|
+
`[worktree-reaper] Archive retry limit reached for ${wt.path} (${failure.attempts}/${archiveFailureMaxAttempts} failures). Future ticks will skip git archive attempts until the worktree changes.
|
|
3355
|
+
`
|
|
3356
|
+
);
|
|
3357
|
+
}
|
|
3157
3358
|
}
|
|
3158
3359
|
} catch (err) {
|
|
3360
|
+
const failure = recordWorktreeArchiveFailure(
|
|
3361
|
+
archiveFailureState,
|
|
3362
|
+
archiveFailureKey,
|
|
3363
|
+
mtimeMs,
|
|
3364
|
+
nowMs,
|
|
3365
|
+
err
|
|
3366
|
+
);
|
|
3367
|
+
archiveFailureStateChanged = true;
|
|
3368
|
+
archiveFailureReason = `uncommitted changes (archive failed ${failure.attempts}/${archiveFailureMaxAttempts}${failure.attempts >= archiveFailureMaxAttempts ? "; retry limit reached" : ""})`;
|
|
3159
3369
|
process.stderr.write(
|
|
3160
3370
|
`[worktree-reaper] Failed to archive dirty orphan ${wt.path}: ${err instanceof Error ? err.message : String(err)}
|
|
3161
3371
|
`
|
|
3162
3372
|
);
|
|
3373
|
+
if (failure.attempts >= archiveFailureMaxAttempts) {
|
|
3374
|
+
process.stderr.write(
|
|
3375
|
+
`[worktree-reaper] Archive retry limit reached for ${wt.path} (${failure.attempts}/${archiveFailureMaxAttempts} failures). Future ticks will skip git archive attempts until the worktree changes.
|
|
3376
|
+
`
|
|
3377
|
+
);
|
|
3378
|
+
}
|
|
3163
3379
|
}
|
|
3164
3380
|
}
|
|
3165
3381
|
process.stderr.write(
|
|
3166
3382
|
`[worktree-reaper] WARNING: Orphan worktree has uncommitted changes, skipping: ${wt.path} (agent: ${agentName}, age: ${ageH2}h)
|
|
3167
3383
|
`
|
|
3168
3384
|
);
|
|
3169
|
-
result.skipped.push({
|
|
3385
|
+
result.skipped.push({
|
|
3386
|
+
path: wt.path,
|
|
3387
|
+
reason: archiveFailureReason ?? (ageMs >= WORKTREE_DIRTY_MAX_AGE_MS ? "uncommitted changes (archive failed)" : "uncommitted changes")
|
|
3388
|
+
});
|
|
3170
3389
|
recordOrchestrationEventBestEffort({
|
|
3171
3390
|
eventType: "worktree.skipped",
|
|
3172
3391
|
source: "daemon-orchestration.reapOrphanedWorktrees",
|
|
3173
3392
|
severity: "warn",
|
|
3174
3393
|
agentId: agentName,
|
|
3175
|
-
payload: {
|
|
3394
|
+
payload: {
|
|
3395
|
+
reason: archiveFailureReason ?? "uncommitted changes",
|
|
3396
|
+
ageHours: ageH2,
|
|
3397
|
+
agedOut: ageMs >= WORKTREE_DIRTY_MAX_AGE_MS
|
|
3398
|
+
}
|
|
3176
3399
|
});
|
|
3177
3400
|
continue;
|
|
3178
3401
|
}
|
|
@@ -3224,11 +3447,17 @@ async function reapOrphanedWorktrees(deps, nowMs = Date.now()) {
|
|
|
3224
3447
|
}
|
|
3225
3448
|
}
|
|
3226
3449
|
}
|
|
3450
|
+
if (archiveFailureStateChanged) {
|
|
3451
|
+
try {
|
|
3452
|
+
deps.saveArchiveFailureState?.(archiveFailureState);
|
|
3453
|
+
} catch {
|
|
3454
|
+
}
|
|
3455
|
+
}
|
|
3227
3456
|
return result;
|
|
3228
3457
|
}
|
|
3229
3458
|
async function createWorktreeReaperRealDeps() {
|
|
3230
3459
|
const { getPaneCwdAsync } = await import("./lib/tmux-status.js");
|
|
3231
|
-
const { getGitRootAsync, isWorktreeDirtyAsync } = await import("./worktree-
|
|
3460
|
+
const { getGitRootAsync, isWorktreeDirtyAsync } = await import("./worktree-H3YFJ3NU.js");
|
|
3232
3461
|
const { statSync: statSync3 } = await import("fs");
|
|
3233
3462
|
const { basename: basename2 } = await import("path");
|
|
3234
3463
|
const { promisify: promisify2 } = await import("util");
|
|
@@ -3243,28 +3472,39 @@ async function createWorktreeReaperRealDeps() {
|
|
|
3243
3472
|
sessions = String(stdout ?? "").split("\n").map((s) => s.trim()).filter(Boolean);
|
|
3244
3473
|
} catch {
|
|
3245
3474
|
}
|
|
3475
|
+
const REAPER_FANOUT = 4;
|
|
3476
|
+
const runPooled = async (items, fn) => {
|
|
3477
|
+
let next = 0;
|
|
3478
|
+
const worker = async () => {
|
|
3479
|
+
for (; ; ) {
|
|
3480
|
+
const i = next++;
|
|
3481
|
+
if (i >= items.length) return;
|
|
3482
|
+
await fn(items[i]);
|
|
3483
|
+
}
|
|
3484
|
+
};
|
|
3485
|
+
const lanes = Math.max(1, Math.min(REAPER_FANOUT, items.length));
|
|
3486
|
+
await Promise.all(Array.from({ length: lanes }, () => worker()));
|
|
3487
|
+
};
|
|
3246
3488
|
const cwdMap = /* @__PURE__ */ new Map();
|
|
3247
|
-
|
|
3489
|
+
await runPooled(sessions, async (s) => {
|
|
3248
3490
|
try {
|
|
3249
3491
|
const cwd = await getPaneCwdAsync(s);
|
|
3250
3492
|
if (cwd) cwdMap.set(s, cwd);
|
|
3251
3493
|
} catch {
|
|
3252
3494
|
}
|
|
3253
3495
|
});
|
|
3254
|
-
await Promise.all(cwdPromises);
|
|
3255
3496
|
const gitRootCache = /* @__PURE__ */ new Map();
|
|
3256
|
-
|
|
3497
|
+
await runPooled([...new Set(cwdMap.values())], async (cwd) => {
|
|
3257
3498
|
if (gitRootCache.has(cwd)) return;
|
|
3258
3499
|
const root = await getGitRootAsync(cwd);
|
|
3259
3500
|
gitRootCache.set(cwd, root);
|
|
3260
3501
|
});
|
|
3261
|
-
await Promise.all(rootPromises);
|
|
3262
3502
|
const repoRoots = /* @__PURE__ */ new Set();
|
|
3263
3503
|
for (const root of gitRootCache.values()) {
|
|
3264
3504
|
if (root) repoRoots.add(root);
|
|
3265
3505
|
}
|
|
3266
3506
|
const worktreeCache = /* @__PURE__ */ new Map();
|
|
3267
|
-
|
|
3507
|
+
await runPooled([...repoRoots], async (repoRoot) => {
|
|
3268
3508
|
try {
|
|
3269
3509
|
const { stdout } = await execFileAsync2("git", ["worktree", "list", "--porcelain"], {
|
|
3270
3510
|
cwd: repoRoot,
|
|
@@ -3285,7 +3525,6 @@ async function createWorktreeReaperRealDeps() {
|
|
|
3285
3525
|
} catch {
|
|
3286
3526
|
}
|
|
3287
3527
|
});
|
|
3288
|
-
await Promise.all(wtPromises);
|
|
3289
3528
|
return {
|
|
3290
3529
|
listTmuxSessions: () => sessions,
|
|
3291
3530
|
getPaneCwd: (s) => cwdMap.get(s),
|
|
@@ -3371,6 +3610,8 @@ async function createWorktreeReaperRealDeps() {
|
|
|
3371
3610
|
// Pure cache lookup — the async prefetch above populated gitRootCache for
|
|
3372
3611
|
// every live session cwd, so the reaper never shells out on the event loop.
|
|
3373
3612
|
getGitRoot: (dir) => gitRootCache.get(dir) ?? null,
|
|
3613
|
+
loadArchiveFailureState: () => loadWorktreeArchiveFailureState(),
|
|
3614
|
+
saveArchiveFailureState: (state) => saveWorktreeArchiveFailureState(state),
|
|
3374
3615
|
archiveDirtyWorktree: async (_repoRoot, wtPath, _branch, agentName) => {
|
|
3375
3616
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").slice(0, 19);
|
|
3376
3617
|
const quarantineBranch = `quarantine/${agentName}-${timestamp}`;
|
|
@@ -3459,7 +3700,7 @@ async function gcStaleCheckpoints() {
|
|
|
3459
3700
|
}
|
|
3460
3701
|
async function pollTaskGroupBarriers() {
|
|
3461
3702
|
try {
|
|
3462
|
-
const { checkAndFireBarriers } = await import("./tasks-crud-
|
|
3703
|
+
const { checkAndFireBarriers } = await import("./tasks-crud-W7VGWRUV.js");
|
|
3463
3704
|
const firedGroupIds = await checkAndFireBarriers();
|
|
3464
3705
|
if (firedGroupIds.length === 0) return 0;
|
|
3465
3706
|
const { getClient } = await import("./lib/database.js");
|
|
@@ -3600,6 +3841,13 @@ export {
|
|
|
3600
3841
|
createOrphanReaperRealDeps,
|
|
3601
3842
|
createOrphanReaperRealDepsAsync,
|
|
3602
3843
|
WORKTREE_REAPER_INTERVAL_MS,
|
|
3844
|
+
WORKTREE_ARCHIVE_FAILURE_MAX_ATTEMPTS,
|
|
3845
|
+
worktreeArchiveFailureKey,
|
|
3846
|
+
loadWorktreeArchiveFailureState,
|
|
3847
|
+
saveWorktreeArchiveFailureState,
|
|
3848
|
+
shouldSkipWorktreeArchiveAfterFailures,
|
|
3849
|
+
recordWorktreeArchiveFailure,
|
|
3850
|
+
clearWorktreeArchiveFailure,
|
|
3603
3851
|
reapOrphanedWorktrees,
|
|
3604
3852
|
createWorktreeReaperRealDeps,
|
|
3605
3853
|
gcStaleCheckpoints,
|