@askexenow/exe-os 0.9.372 → 0.9.374
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 +45 -10
- package/deploy/compose/.env.example +46 -9
- package/deploy/compose/docker-compose.yml +136 -18
- package/deploy/compose/generate-env.ts +142 -34
- package/deploy/compose/sso-edge/default.conf.template +78 -7
- package/deploy/compose/sso-edge/sso-redirect.conf +109 -13
- package/deploy/stack-manifests/v0.9.30-apps.json +1 -1
- package/deploy/stack-manifests/v0.9.json +4 -4
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-GRT5MKD5.js → active-agent-ONPPEWQV.js} +7 -6
- package/dist/{active-agent-L2ZSSXDK.js → active-agent-UJKMG7LJ.js} +7 -6
- package/dist/{agent-defs-generator-M4ZNYIVX.js → agent-defs-generator-ZWI6DXOE.js} +6 -5
- package/dist/{agent-loop-FOK2IRZQ.js → agent-loop-OYHJKNYH.js} +1 -1
- package/dist/{agentic-ontology-DMPRDEUX.js → agentic-ontology-WHFJ3QFS.js} +1 -1
- package/dist/{artifact-backup-767STHSW.js → artifact-backup-WXZNB7KE.js} +2 -1
- package/dist/{backfill-gate-VX2RZTQV.js → backfill-gate-KWJQ35YX.js} +3 -2
- package/dist/{backfill-metadata-ZMEHJQ5M.js → backfill-metadata-3OUSQD5V.js} +8 -7
- package/dist/{background-jobs-LTPWCMA3.js → background-jobs-6VMD55PK.js} +3 -2
- package/dist/{backup-verify-EX2K732J.js → backup-verify-ZKTUYLTA.js} +4 -3
- package/dist/{behavior-injection-22AGMS25.js → behavior-injection-M6UYZCMW.js} +17 -15
- package/dist/{behaviors-DVFXAWF5.js → behaviors-ZJ45TFBJ.js} +21 -13
- package/dist/bin/age-ontology-load.js +3 -2
- package/dist/bin/agentic-ontology-backfill.js +10 -9
- package/dist/bin/agentic-reflection-backfill.js +11 -10
- package/dist/bin/agentic-semantic-label.js +10 -9
- package/dist/bin/backfill-conversations.js +13 -11
- package/dist/bin/backfill-responses.js +13 -11
- package/dist/bin/backfill-vectors.js +17 -15
- package/dist/bin/bulk-sync-postgres.js +22 -20
- package/dist/bin/cc-doctor.js +10 -9
- package/dist/bin/cleanup-stale-review-tasks.js +29 -26
- package/dist/bin/cli.js +36 -26
- package/dist/bin/deferred-daemon-restart.js +114 -110
- package/dist/bin/exe-agent-config.js +6 -5
- package/dist/bin/exe-agent.js +127 -33
- package/dist/bin/exe-assign.js +15 -13
- package/dist/bin/exe-boot.js +57 -54
- package/dist/bin/exe-call.js +8 -7
- package/dist/bin/exe-cloud.js +24 -22
- package/dist/bin/exe-config-dump.js +6 -5
- package/dist/bin/exe-dispatch.js +30 -27
- package/dist/bin/exe-doctor.js +14 -10
- package/dist/bin/exe-export-behaviors.js +19 -17
- package/dist/bin/exe-forget.js +10 -9
- package/dist/bin/exe-gateway.js +199 -19
- package/dist/bin/exe-grant.js +5 -5
- package/dist/bin/exe-healthcheck.js +10 -9
- package/dist/bin/exe-heartbeat.js +35 -32
- package/dist/bin/exe-kill.js +34 -31
- package/dist/bin/exe-launch-agent.js +126 -54
- package/dist/bin/exe-mcp.js +6 -5
- package/dist/bin/exe-memory-reads.js +8 -7
- package/dist/bin/exe-new-employee.js +12 -11
- package/dist/bin/exe-os-mcp-proxy.js +6 -5
- package/dist/bin/exe-pending-messages.js +30 -27
- package/dist/bin/exe-pending-notifications.js +29 -26
- package/dist/bin/exe-pending-reviews.js +30 -27
- package/dist/bin/exe-rename.js +8 -7
- package/dist/bin/exe-repo-truth.js +1 -1
- package/dist/bin/exe-review.js +33 -30
- package/dist/bin/exe-search.js +9 -8
- package/dist/bin/exe-session-cleanup.js +35 -32
- package/dist/bin/exe-settings.js +24 -22
- package/dist/bin/exe-start-codex.js +137 -55
- package/dist/bin/exe-start-opencode.js +121 -23
- package/dist/bin/exe-status.js +31 -28
- package/dist/bin/exe-support.js +5 -4
- package/dist/bin/exe-team.js +7 -6
- package/dist/bin/exe-watchdog.js +31 -11
- package/dist/bin/generate-hook-manifest.js +44 -7
- package/dist/bin/git-sweep.js +31 -28
- package/dist/bin/graph-backfill.js +89 -35
- package/dist/bin/graph-export.js +9 -8
- package/dist/bin/import-history.js +14 -13
- package/dist/bin/install.js +137 -113
- package/dist/bin/intercom-check.js +5 -5
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +7 -6
- package/dist/bin/postgres-agentic-reflection-backfill.js +5 -4
- package/dist/bin/postgres-agentic-semantic-backfill.js +4 -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 +29 -26
- package/dist/bin/setup.js +5 -4
- package/dist/bin/shard-migrate.js +9 -8
- package/dist/bin/stack-update.js +40 -9
- package/dist/bin/verify-stack.js +2 -2
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-OHXH4YC5.js → boot-generation-JKVZ4ZAT.js} +6 -5
- package/dist/{boot-review-sections-N5IXIGSS.js → boot-review-sections-2M6BTG73.js} +28 -25
- package/dist/{branch-hygiene-KCGXRAWP.js → branch-hygiene-U5GFRSTP.js} +31 -7
- package/dist/{branding-GH43W3PU.js → branding-I6KIMB7F.js} +3 -2
- package/dist/budget-fallback-XJRPMP2D.js +11 -0
- package/dist/build-manifest.json +1318 -1233
- package/dist/{capability-cards-4PXVLIVS.js → capability-cards-5IMJT6J7.js} +5 -4
- package/dist/{capacity-monitor-FKMQXORX.js → capacity-monitor-SAXCQK7O.js} +30 -27
- package/dist/{catchup-brief-SN5EKO4N.js → catchup-brief-U2TXBLHD.js} +34 -31
- package/dist/{chunk-CNC57JCS.js → chunk-23MVDXLY.js} +4 -4
- package/dist/{chunk-V4XAKXXF.js → chunk-2AJGV5UL.js} +1 -1
- package/dist/{chunk-FBYAXTDM.js → chunk-2ZOEC4KC.js} +10 -2
- package/dist/{chunk-ELXFSIIM.js → chunk-32YV32VA.js} +2 -2
- package/dist/{chunk-44C7QNZS.js → chunk-3KDCORDO.js} +1 -1
- package/dist/{chunk-JTB5V6BV.js → chunk-3SXHEQ7X.js} +1 -1
- package/dist/{chunk-HDW4XPDV.js → chunk-3UUX5OY4.js} +1 -1
- package/dist/{chunk-7PSLK36P.js → chunk-44TLJZJ5.js} +1 -1
- package/dist/{chunk-JTWTBX2M.js → chunk-4EN3IZ3Q.js} +2 -1
- package/dist/{chunk-KPMC7PY7.js → chunk-4HKTO2SV.js} +1 -1
- package/dist/{chunk-CDUB5Q6J.js → chunk-4IK2K3B3.js} +1 -1
- package/dist/{chunk-GH6YJOOC.js → chunk-4SJ4LK4V.js} +6 -6
- package/dist/{chunk-PVEM537A.js → chunk-4YLBKEL5.js} +2 -2
- package/dist/chunk-4YNA3CM6.js +872 -0
- package/dist/{chunk-KYFFVTGO.js → chunk-55BEFF4V.js} +3 -3
- package/dist/{chunk-SEP5ITFQ.js → chunk-636LKCKE.js} +2 -2
- package/dist/{chunk-QTI4QAWA.js → chunk-6EZQUNE6.js} +338 -5
- package/dist/{chunk-WAEKYKTK.js → chunk-6RKKVPYF.js} +1 -1
- package/dist/{chunk-VX2F4ZUY.js → chunk-6SCGLHJ7.js} +3 -3
- package/dist/{chunk-MEGRQ53A.js → chunk-6VHOQ3IM.js} +51 -6
- package/dist/{chunk-HIIXCAEE.js → chunk-6YVUR3OU.js} +3 -3
- package/dist/{chunk-L6ZNURWN.js → chunk-7GE2EQ23.js} +1 -1
- package/dist/{chunk-2CWS374F.js → chunk-7RI2CNXJ.js} +1 -1
- package/dist/{chunk-OL3QP3AU.js → chunk-7TSBV3SD.js} +1 -1
- package/dist/{chunk-DSOQUQTV.js → chunk-A27Q27CT.js} +27 -0
- package/dist/{chunk-5AHRZI3R.js → chunk-AETLDRZB.js} +1 -1
- package/dist/{chunk-RNLF3CBB.js → chunk-AKLJ4JH3.js} +1 -1
- package/dist/{chunk-XHYHX6F7.js → chunk-AKLQSC6W.js} +329 -164
- package/dist/chunk-ANLFH23R.js +261 -0
- package/dist/{chunk-QLA3RTH4.js → chunk-AWWKRZMB.js} +5 -5
- package/dist/{chunk-ERVQTR7P.js → chunk-BBSIEYF5.js} +17 -3
- package/dist/{chunk-IPMUWYRQ.js → chunk-BJ7AVSY6.js} +2 -2
- package/dist/{chunk-HV6Y6F4X.js → chunk-C2L622QJ.js} +89 -3
- package/dist/{chunk-TX3Q2GIL.js → chunk-C5HUMAA7.js} +24 -1
- package/dist/{chunk-QTYJPWJN.js → chunk-CBCGDEJA.js} +7 -7
- package/dist/{chunk-XXSNLM6R.js → chunk-DB55JZHU.js} +1 -1
- package/dist/{chunk-LAZKEJMS.js → chunk-DIXXEE3S.js} +840 -607
- package/dist/{chunk-FB343XQX.js → chunk-DJ7YXOTU.js} +2 -2
- package/dist/{chunk-YFCNWQAM.js → chunk-DJOIMFKV.js} +2 -2
- package/dist/{chunk-UTDMTQNH.js → chunk-DSJI76XL.js} +92 -14
- package/dist/{chunk-EEXX4UMQ.js → chunk-DZKPOSFD.js} +1 -1
- package/dist/{chunk-WSOA3WMC.js → chunk-E426DOSY.js} +161 -4
- package/dist/{chunk-ZISQOOER.js → chunk-EKE37MO4.js} +3 -3
- package/dist/{chunk-RIECV7SR.js → chunk-EKYYMIVT.js} +1 -1
- package/dist/{chunk-HIVZ53YB.js → chunk-EXTZSNWL.js} +2 -2
- package/dist/{chunk-YYA5LXCT.js → chunk-FNEZ4BWT.js} +1 -1
- package/dist/chunk-FTZET5YX.js +313 -0
- package/dist/chunk-GHR4ZPJ7.js +70 -0
- package/dist/{chunk-MINXPXAB.js → chunk-GJI77VDO.js} +3 -3
- package/dist/{chunk-AAMGHW5W.js → chunk-GLQEJOXE.js} +1 -0
- package/dist/{chunk-ADNBOKYZ.js → chunk-GM7TLYOK.js} +60 -18
- package/dist/{chunk-RUWWES2K.js → chunk-GNUAL43X.js} +2 -2
- package/dist/{chunk-QZL6E4UB.js → chunk-GOMQ7PVQ.js} +2 -2
- package/dist/{chunk-GB3AHV5F.js → chunk-GQOEWNVM.js} +1 -1
- package/dist/{chunk-NQZUSEAR.js → chunk-GS7LIT34.js} +246 -17
- package/dist/{chunk-XTWHNLGD.js → chunk-GZOG2MAX.js} +1 -1
- package/dist/{chunk-E5HAY3DQ.js → chunk-HDLAB7W3.js} +1 -1
- package/dist/{chunk-E5QQZDQN.js → chunk-HNWS7YHN.js} +358 -136
- package/dist/{chunk-VV5EZZNT.js → chunk-HTBEVCO2.js} +1 -1
- package/dist/{chunk-OZBII5E3.js → chunk-I4DNJFDR.js} +4 -4
- package/dist/{chunk-SI5SZAJA.js → chunk-IBS2FAI4.js} +21 -4
- package/dist/{chunk-J5EYOBFF.js → chunk-IHXW4VUI.js} +1 -1
- package/dist/{chunk-RUVO3NJC.js → chunk-IN6CAM4F.js} +9 -3
- package/dist/{chunk-53PYNYTW.js → chunk-IRVOXUSK.js} +5 -5
- package/dist/{chunk-THM7J6UI.js → chunk-JHI5WMK5.js} +5 -5
- package/dist/{chunk-3KTQWMHI.js → chunk-JSMDRKPJ.js} +12 -4
- package/dist/chunk-JTVIANUB.js +131 -0
- package/dist/{chunk-2ADYTOHQ.js → chunk-K4ESASPL.js} +1 -1
- package/dist/{chunk-YWUQVHDL.js → chunk-KTCXJWJG.js} +1 -1
- package/dist/{chunk-RGUDGC6A.js → chunk-KTU3EAWK.js} +5 -5
- package/dist/{chunk-DKBPCOU4.js → chunk-L6RXG36J.js} +2 -2
- package/dist/{chunk-T4EK56WI.js → chunk-LDNYSMPZ.js} +1 -1
- package/dist/{chunk-RIK5GRWI.js → chunk-LGS2V2XD.js} +3 -3
- package/dist/{chunk-JKXZGRWR.js → chunk-LP4GB656.js} +2 -2
- package/dist/{chunk-H74466TM.js → chunk-M7O7TGGU.js} +1 -1
- package/dist/chunk-MJCSEIFI.js +54 -0
- package/dist/{chunk-IDZPQG2D.js → chunk-MOGA4Q7F.js} +2 -2
- package/dist/{chunk-OYQNNKNS.js → chunk-MXPNVSXI.js} +37 -14
- package/dist/{chunk-UVW7YFAF.js → chunk-N7VEP5B3.js} +4 -4
- package/dist/{chunk-HHE2HV3V.js → chunk-NBXDXKLC.js} +1 -1
- package/dist/{chunk-LDL3S7AC.js → chunk-NKETJCB5.js} +7 -3
- package/dist/{chunk-ECHLVLA7.js → chunk-NMH5ZQPU.js} +1 -1
- package/dist/{chunk-U3XLRMJD.js → chunk-NT7W4RXD.js} +1 -1
- package/dist/{chunk-UQUUNGTP.js → chunk-NUK7EEN5.js} +11 -9
- package/dist/{chunk-GBNB4EWD.js → chunk-ORM7ZFKC.js} +16 -0
- package/dist/{chunk-O4ZFRK6W.js → chunk-OVEQE6YS.js} +244 -49
- package/dist/{chunk-4ZJ5BPY6.js → chunk-PB5S7YOF.js} +2 -2
- package/dist/{chunk-JR23BL74.js → chunk-PDVXWXTL.js} +4 -4
- package/dist/{chunk-3CIMDFXG.js → chunk-PFQ3VEEM.js} +1 -1
- package/dist/{chunk-SBJV2PCU.js → chunk-PHBU4LGO.js} +1 -1
- package/dist/{chunk-W25RLOQ2.js → chunk-PLZSZOZN.js} +3 -3
- package/dist/{chunk-THIJIOE2.js → chunk-PY3FOMRN.js} +18 -6
- package/dist/{chunk-AAUWFXOX.js → chunk-Q3AXXKDF.js} +3 -3
- package/dist/{chunk-VKXS2YGN.js → chunk-QHJR7IMX.js} +2 -2
- package/dist/chunk-QLZ46RCK.js +45 -0
- package/dist/{chunk-UHPMK6QZ.js → chunk-R3CZWFFC.js} +10 -2
- package/dist/{chunk-6XEYELCA.js → chunk-R4CBHKZ2.js} +1 -1
- package/dist/{chunk-5APCDDJZ.js → chunk-R522MWAR.js} +9 -9
- package/dist/chunk-RH4AH3YB.js +80 -0
- package/dist/{chunk-AMKSDKMK.js → chunk-S2WBS6BG.js} +22 -35
- package/dist/{chunk-WUKQVNLP.js → chunk-SEQIPGLU.js} +1 -1
- package/dist/{chunk-7WQRFSZI.js → chunk-SL6KQYDU.js} +26 -6
- package/dist/chunk-SLLLOOEI.js +103 -0
- package/dist/{chunk-5N4SG5NB.js → chunk-T35RCQFE.js} +3 -3
- package/dist/{chunk-7V6M3QUS.js → chunk-T3QUKNLI.js} +1 -1
- package/dist/{chunk-CW2UCKHS.js → chunk-TADAO3HV.js} +2 -2
- package/dist/{chunk-5DCCKHDY.js → chunk-TAMDAOCU.js} +109 -13
- package/dist/{chunk-ZXB56YR2.js → chunk-TFKCERAK.js} +101 -23
- package/dist/{chunk-RBYHJDAT.js → chunk-TQAZTRQ3.js} +3 -3
- package/dist/{chunk-OKGIOWOB.js → chunk-U6SUKSZR.js} +2 -2
- package/dist/{chunk-23QKEUF6.js → chunk-U73AC5AN.js} +34 -12
- package/dist/{chunk-PM6WSWVU.js → chunk-UBK7HK3J.js} +3 -3
- package/dist/{chunk-H37FSTF2.js → chunk-UBMZ3YQU.js} +1 -1
- package/dist/{chunk-JJUGI2YL.js → chunk-UCFC2AEI.js} +1 -1
- package/dist/{chunk-6IWLAQ7O.js → chunk-UCUOGVDX.js} +4 -0
- package/dist/{chunk-E7UCDSUE.js → chunk-UKLN57Q5.js} +2 -2
- package/dist/{chunk-ZYCLSEZT.js → chunk-ULIBLJ6W.js} +33 -11
- package/dist/{chunk-RLR6VVKV.js → chunk-UM3N6VND.js} +4 -4
- package/dist/{chunk-ZNUJFX7L.js → chunk-UQGSBM3U.js} +1 -1
- package/dist/{chunk-ZZXMB5F2.js → chunk-UZDF6FLJ.js} +1 -1
- package/dist/{chunk-LNOS24GV.js → chunk-V3WLC5TJ.js} +2 -95
- package/dist/{chunk-UXLO7VHX.js → chunk-VI4ATC6I.js} +1 -1
- package/dist/{chunk-77JP3LK4.js → chunk-VKJGHAZT.js} +92 -21
- package/dist/{chunk-7R73IAHU.js → chunk-VMTZ4RUW.js} +67 -150
- package/dist/{chunk-TGPQMMQP.js → chunk-VYQ7B7DI.js} +30 -17
- package/dist/{chunk-E2WEFZOR.js → chunk-W75GTHR3.js} +1 -1
- package/dist/{chunk-UKLF7F3Z.js → chunk-WJG344NC.js} +9 -9
- package/dist/{chunk-MBNIJXKI.js → chunk-WMEYJT4R.js} +18 -4
- package/dist/{chunk-R6FLELV6.js → chunk-XFTEX77S.js} +3 -3
- package/dist/{chunk-MDGYXUOV.js → chunk-XH7YL7JM.js} +1 -1
- package/dist/{chunk-JOO35RHR.js → chunk-XL5MFGMR.js} +3 -3
- package/dist/{chunk-OW5RZIDW.js → chunk-XNNECNDL.js} +95 -33
- package/dist/{chunk-5AHDQCTB.js → chunk-XXFKSJYA.js} +6 -6
- package/dist/{chunk-TGEPLJ66.js → chunk-XXOPG4BW.js} +3 -3
- package/dist/{chunk-PGLPUP37.js → chunk-XZ65ST2I.js} +1 -1
- package/dist/{chunk-3TTKAT6V.js → chunk-YKC7QDZH.js} +9 -4
- package/dist/{chunk-KXYFBBZR.js → chunk-YMP2QSOP.js} +20 -3
- package/dist/{chunk-TK4MI6F6.js → chunk-YSLGFPWX.js} +6 -6
- package/dist/{chunk-X2P43TB2.js → chunk-YTSXPJUQ.js} +1 -1
- package/dist/{chunk-HECXZGGZ.js → chunk-ZCERWHY2.js} +33 -35
- package/dist/{chunk-IVU3WN7S.js → chunk-ZG62LIK3.js} +74 -4
- package/dist/{chunk-GU62SNDH.js → chunk-ZGYNKA3O.js} +744 -111
- package/dist/{chunk-QMSEL5YS.js → chunk-ZIG7VPJV.js} +28 -76
- package/dist/{chunk-WZJVGA5I.js → chunk-ZL4AGWAH.js} +258 -13
- package/dist/{chunk-QR624DER.js → chunk-ZSODLMFV.js} +2 -2
- package/dist/{cleanup-graph-garbage-IPYDS5OX.js → cleanup-graph-garbage-DPJGO52H.js} +11 -10
- package/dist/{cloud-sync-command-JLNVG7H4.js → cloud-sync-command-JPNTT4OQ.js} +2 -2
- package/dist/{cloud-sync-db-init-JXUF6GI3.js → cloud-sync-db-init-V2LWIUQU.js} +1 -1
- package/dist/{cloud-sync-shutdown-Z4SBP6PL.js → cloud-sync-shutdown-BNALPWGX.js} +5 -4
- package/dist/{co-activation-74RDFTKS.js → co-activation-CMNSWS6B.js} +5 -4
- package/dist/{co-occurrence-CN3TBYVR.js → co-occurrence-WRI2NAN6.js} +9 -8
- package/dist/{code-context-index-D4MJ4VFX.js → code-context-index-NOJSHLPN.js} +12 -6
- package/dist/code-context-watcher-VZNZU3BO.js +118 -0
- package/dist/{codex-consolidation-PPXNBXCV.js → codex-consolidation-SH4UKFBQ.js} +2 -1
- package/dist/{conversation-entity-extractor-QGTLH4BP.js → conversation-entity-extractor-74252CAO.js} +4 -4
- package/dist/{conversation-wiki-populator-EBUZXYEU.js → conversation-wiki-populator-OS4C6W54.js} +1 -1
- package/dist/conversations-retention-C4BLKFEL.js +54 -0
- package/dist/coordinator-notice-MHUY7AQB.js +55 -0
- package/dist/{crdt-sync-7T4WCOKD.js → crdt-sync-B3JN6AIV.js} +1 -1
- package/dist/{crm-webhook-FTW3XZTO.js → crm-webhook-GYWQRFET.js} +2 -2
- package/dist/{cto-delegation-gate-SZCE34LB.js → cto-delegation-gate-LQHVLEMW.js} +29 -26
- package/dist/{daemon-auth-SSPY5ODS.js → daemon-auth-QZHEO7IQ.js} +3 -2
- package/dist/{daemon-orchestration-IGPHVNFR.js → daemon-orchestration-5HIQALZH.js} +36 -34
- package/dist/{daemon-ready-OT2VQLS7.js → daemon-ready-P2BR2XP5.js} +1 -1
- package/dist/{db-integrity-events-5DTASXJF.js → db-integrity-events-2DTFO37N.js} +3 -2
- package/dist/{db-restore-events-2FI4ZMKA.js → db-restore-events-G6NOQOVE.js} +2 -1
- package/dist/{destructive-data-guard-6I5MDFVD.js → destructive-data-guard-BVFWPPIS.js} +1 -1
- package/dist/doc-graph-extractor-PQHDHQPQ.js +367 -0
- package/dist/{documents-URULIXGM.js → documents-C4SSPJMC.js} +15 -13
- package/dist/{dreaming-VIZO3QDO.js → dreaming-XAO3FCBV.js} +33 -30
- package/dist/{employee-boot-brief-XLOG4ULP.js → employee-boot-brief-W4OHUMRQ.js} +37 -34
- package/dist/{exe-drift-TLQM3IHD.js → exe-drift-AG2KMKD5.js} +6 -5
- package/dist/{exe-export-7YWYWJHY.js → exe-export-IC5BT335.js} +17 -15
- package/dist/{exe-import-DW6VAUKW.js → exe-import-A35ZLDPG.js} +17 -15
- package/dist/{exe-key-TLJP2B4Y.js → exe-key-TCMJNYLA.js} +116 -112
- package/dist/{exe-org-LU46N36E.js → exe-org-JXCR3JYZ.js} +24 -23
- package/dist/{exe-snapshot-QHUZRS62.js → exe-snapshot-SV6SRIG6.js} +36 -33
- package/dist/{fast-db-init-SCTOOIUT.js → fast-db-init-L2RGKJWH.js} +1 -1
- package/dist/{founder-context-ZFZC4UHO.js → founder-context-D4HFIESJ.js} +4 -3
- package/dist/{founder-monitor-envelope-5KTKNL5G.js → founder-monitor-envelope-TFKRGCFE.js} +5 -4
- package/dist/{fts-integrity-LKAZEZJE.js → fts-integrity-4YB34KWX.js} +3 -2
- package/dist/gateway/index.js +19 -17
- package/dist/{git-main-guard-TN27QBAI.js → git-main-guard-VTW4N3CM.js} +7 -1
- package/dist/{git-staleness-GSGP344N.js → git-staleness-TN7CYGFG.js} +5 -4
- package/dist/{global-procedures-YAR7G4C6.js → global-procedures-YFDEIOG7.js} +7 -6
- package/dist/{graph-auto-extract-GNQS64F5.js → graph-auto-extract-3YR3TYRW.js} +9 -8
- package/dist/{graph-rag-RMSFLUOB.js → graph-rag-Z2KCJTPK.js} +6 -4
- package/dist/{hook-integrity-CF567MVN.js → hook-integrity-KGAV6ZC2.js} +14 -4
- package/dist/{hook-prefetch-36BK4F7U.js → hook-prefetch-K5DN3TOQ.js} +29 -26
- package/dist/hooks/bug-report-worker.js +34 -30
- package/dist/hooks/codex-stop-task-finalizer.js +36 -32
- package/dist/hooks/commit-complete.js +33 -30
- package/dist/hooks/error-recall.js +12 -11
- package/dist/hooks/exe-heartbeat-hook.js +8 -7
- package/dist/hooks/ingest-worker.js +23 -11
- package/dist/hooks/ingest.js +18 -17
- package/dist/hooks/instructions-loaded.js +10 -9
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +9 -8
- package/dist/hooks/post-compact.js +8 -7
- package/dist/hooks/post-tool-combined.js +26 -15
- package/dist/hooks/pre-compact.js +33 -30
- package/dist/hooks/pre-tool-use.js +404 -46
- package/dist/hooks/prompt-submit.js +57 -47
- package/dist/hooks/session-end.js +40 -41
- package/dist/hooks/session-start.js +21 -20
- package/dist/hooks/stop.js +40 -37
- package/dist/hooks/subagent-stop.js +38 -35
- package/dist/hooks/summary-worker.js +39 -36
- package/dist/hyde-MP4QNMU5.js +80 -0
- package/dist/index.js +44 -39
- package/dist/{installer-LUN4HQIC.js → installer-54HTN5RE.js} +8 -7
- package/dist/{installer-OC5VXNC7.js → installer-LK35OX6R.js} +8 -7
- package/dist/{installer-MPRFUQJE.js → installer-LLWKZI2S.js} +8 -7
- package/dist/intercom-ack-VCW755TN.js +13 -0
- package/dist/{intercom-queue-6DZ7BANV.js → intercom-queue-5NOT2RKI.js} +28 -25
- package/dist/{key-backup-status-6L2ARCXW.js → key-backup-status-LQPINQ3W.js} +2 -1
- package/dist/lib/agent-config.js +3 -2
- package/dist/lib/cloud-sync.js +26 -20
- package/dist/lib/config.js +2 -1
- package/dist/lib/consolidation.js +17 -10
- package/dist/lib/database.js +7 -4
- package/dist/lib/db-backup.js +17 -2
- package/dist/lib/db-daemon-client.js +8 -6
- package/dist/lib/db-write-worker-client.js +3 -1
- package/dist/lib/db-write-worker.js +20 -3
- package/dist/lib/db.js +7 -4
- package/dist/lib/device-registry.js +3 -2
- package/dist/lib/embed-worker.js +2 -1
- package/dist/lib/embedder.js +8 -6
- package/dist/lib/employee-templates.js +8 -7
- package/dist/lib/employees.js +5 -4
- package/dist/lib/exe-daemon-client.js +7 -5
- package/dist/lib/exe-daemon.js +467 -221
- package/dist/lib/hybrid-search.js +11 -8
- package/dist/lib/identity.js +5 -4
- package/dist/lib/license.js +4 -3
- package/dist/lib/messaging.js +29 -26
- package/dist/lib/post-tool-memory.js +16 -2
- package/dist/lib/registry-proxy.js +3 -1
- package/dist/lib/reminders.js +6 -5
- package/dist/lib/schedules.js +9 -8
- package/dist/lib/session-registry.js +7 -6
- package/dist/lib/skill-learning.js +16 -14
- package/dist/lib/stack-invariants.js +17 -1
- package/dist/lib/status-brief.js +5 -4
- package/dist/lib/store.js +10 -7
- package/dist/lib/task-router.js +6 -5
- package/dist/lib/tasks.js +31 -27
- package/dist/lib/tmux-routing.js +40 -25
- package/dist/lib/tmux-status.js +3 -1
- package/dist/lib/tmux-transport.js +2 -1
- package/dist/lib/token-spend.js +6 -5
- package/dist/lib/transport.js +3 -2
- package/dist/{license-gate-ESER24PJ.js → license-gate-JVMB6OFD.js} +5 -4
- package/dist/{license-sync-JVG5KNIY.js → license-sync-5VYS2F2W.js} +4 -3
- package/dist/mcp/register-tools.js +113 -109
- package/dist/mcp/server.js +118 -114
- package/dist/mcp/tools/complete-reminder.js +7 -6
- package/dist/mcp/tools/create-reminder.js +7 -6
- package/dist/mcp/tools/create-task.js +34 -30
- package/dist/mcp/tools/deactivate-behavior.js +18 -16
- package/dist/mcp/tools/list-reminders.js +7 -6
- package/dist/mcp/tools/list-tasks.js +34 -30
- package/dist/mcp/tools/send-message.js +32 -29
- package/dist/mcp/tools/update-task.js +32 -28
- package/dist/mcp-child-registry-OTG4MWO7.js +25 -0
- package/dist/{mcp-http-config-6K6IKH5F.js → mcp-http-config-DQWL7U2Z.js} +6 -5
- package/dist/{mcp-session-identity-LRC6WJSD.js → mcp-session-identity-277GASTQ.js} +28 -25
- package/dist/{memory-cards-V3OZHIYP.js → memory-cards-3S2ZQPR7.js} +17 -8
- package/dist/{memory-graph-extractor-JC2Z64L4.js → memory-graph-extractor-A6DFEFIN.js} +10 -9
- package/dist/{memory-poisoning-defense-YM4QJHCX.js → memory-poisoning-defense-ZVP4H6DY.js} +5 -4
- package/dist/{memory-pressure-watchdog-6F6KEQHN.js → memory-pressure-watchdog-6W5F6R7H.js} +29 -26
- package/dist/{memory-queue-QJNWKWKG.js → memory-queue-YF7IDSFY.js} +3 -2
- package/dist/{memory-queue-client-COA4ABEV.js → memory-queue-client-ADSDP6OX.js} +9 -7
- package/dist/{memory-reflection-QXHJPYPC.js → memory-reflection-BKB2YOE6.js} +52 -6
- package/dist/{monitor-grants-BW2WL4IU.js → monitor-grants-EV747HMW.js} +4 -3
- package/dist/{notification-ledger-6QRLQW4Q.js → notification-ledger-CLGM7ODF.js} +30 -27
- package/dist/{notifications-7B6D7Y5C.js → notifications-MACUZPYP.js} +28 -25
- package/dist/{oauth-server-TZFNQAFS.js → oauth-server-AYM37SQ4.js} +25 -4
- package/dist/{orchestration-events-GY5VP5LU.js → orchestration-events-N7LYMUGA.js} +6 -5
- package/dist/{orchestration-phase-UDS24CVQ.js → orchestration-phase-T2WD45UA.js} +3 -2
- package/dist/{orchestrator-JVPVOYWA.js → orchestrator-4X24EWHV.js} +30 -27
- package/dist/{org-brief-session-GRV5R5E3.js → org-brief-session-FZOFMO5U.js} +13 -12
- package/dist/{org-consent-policy-3FHHSYXV.js → org-consent-policy-O5E6HXBL.js} +1 -1
- package/dist/{org-join-BY4PV6UO.js → org-join-POWUG25F.js} +8 -7
- package/dist/{org-key-admin-WSCPT2CZ.js → org-key-admin-E7EMDOZZ.js} +9 -8
- package/dist/{org-key-pin-5WUSPGVN.js → org-key-pin-WHWHVWUO.js} +4 -3
- package/dist/{org-membership-ESALTLLN.js → org-membership-WRT2IHJK.js} +5 -4
- package/dist/{org-partner-config-YKHPDPZR.js → org-partner-config-B7T4CL2T.js} +7 -6
- package/dist/{org-partner-runtime-UJDGECZ4.js → org-partner-runtime-FODONVTM.js} +13 -12
- package/dist/{org-row-visibility-V5DXIHTE.js → org-row-visibility-VX4AVV5Q.js} +1 -1
- package/dist/{pipeline-router-YY5FQKTY.js → pipeline-router-6GGT2ZW3.js} +6 -5
- package/dist/{plan-limits-OVX6SN6B.js → plan-limits-FUN76LYY.js} +8 -7
- package/dist/{platform-procedures-I57ITMDC.js → platform-procedures-7YSCLF4Z.js} +1 -1
- package/dist/{postinstall-failure-B2JHNFPM.js → postinstall-failure-O6TSSNJB.js} +3 -2
- package/dist/{project-boot-LXLU2J32.js → project-boot-3Q65LCIP.js} +2 -1
- package/dist/project-name-LJVFMYTQ.js +30 -0
- package/dist/{projection-worker-D2472IOD.js → projection-worker-4OANGP5K.js} +5 -4
- package/dist/{prospective-memory-JXO2A6PL.js → prospective-memory-KR3P4T6N.js} +5 -4
- package/dist/{push-notifications-HR3FZRDI.js → push-notifications-NCZLH6DI.js} +29 -26
- package/dist/ref-provenance-gate-M4AQO4OT.js +269 -0
- package/dist/{reproject-worktree-memories-OSS3PGRF.js → reproject-worktree-memories-PWYKPB2U.js} +106 -23
- package/dist/{reranker-IMZRPYJ2.js → reranker-6V3C2AO4.js} +3 -2
- package/dist/resolve-image-labels-ZI6UBW5W.js +15 -0
- package/dist/{retrieval-health-W7OD44FE.js → retrieval-health-5D7O6VH6.js} +4 -3
- package/dist/{review-polling-2INP7H6M.js → review-polling-QW3LJ4KN.js} +29 -26
- package/dist/runtime/index.js +38 -34
- package/dist/{session-events-G4XUPVWV.js → session-events-T45SSTMF.js} +31 -26
- package/dist/{session-kill-telemetry-W7MHWJTQ.js → session-kill-telemetry-QSPVJGBF.js} +29 -26
- package/dist/{session-mcp-config-F7KATWOF.js → session-mcp-config-SC5BLWZG.js} +3 -2
- package/dist/{session-scope-LG2J4EMQ.js → session-scope-KRWE54C4.js} +28 -25
- package/dist/{setup-wizard-YQJI3SVM.js → setup-wizard-GP3TBTPF.js} +5 -4
- package/dist/{shard-manager-UROHZE46.js → shard-manager-OE36A4MY.js} +3 -2
- package/dist/{skill-refinement-RA37U756.js → skill-refinement-C7JTMLJG.js} +6 -5
- package/dist/stack-generate-manifest-MFMDWRUP.js +810 -0
- package/dist/{stack-promote-IYBRXHTA.js → stack-promote-EKSCYY63.js} +8 -6
- package/dist/{stack-release-OXWLVVG6.js → stack-release-2GZAAFO4.js} +8 -6
- package/dist/{stack-update-2CZEROPK.js → stack-update-J6JXSTAZ.js} +51 -5
- package/dist/{steward-gate-LTNFB3FY.js → steward-gate-BFCCMCSW.js} +6 -5
- package/dist/{subagent-brief-injection-OHLWLECQ.js → subagent-brief-injection-ED36PLYY.js} +44 -36
- package/dist/{subagent-spawn-ledger-USYZXU3M.js → subagent-spawn-ledger-E6U3OY6Z.js} +3 -2
- package/dist/{supervisor-handoff-CSJQMI53.js → supervisor-handoff-SGLEPOCY.js} +12 -3
- package/dist/{support-inbox-4KCEPAZQ.js → support-inbox-YW47SYJF.js} +20 -5
- package/dist/{task-enforcement-LGXWXGVZ.js → task-enforcement-CECTQX4U.js} +29 -26
- package/dist/{task-request-inbox-WHCOSUCP.js → task-request-inbox-Q5T4N5K7.js} +1 -1
- package/dist/{task-scope-KXF7Y6KA.js → task-scope-ERVEUEYU.js} +28 -25
- package/dist/{tasks-crud-5EM55WRZ.js → tasks-crud-ZRQNJXQ2.js} +28 -25
- package/dist/{tasks-notify-VFMAURTN.js → tasks-notify-MIZH4C2O.js} +29 -26
- package/dist/{tasks-review-MHGMBHUZ.js → tasks-review-Z7J2P6DG.js} +28 -25
- package/dist/{telemetry-upload-6NRTN7QJ.js → telemetry-upload-LVQUQYFP.js} +10 -9
- package/dist/{token-budget-LZPOYTRP.js → token-budget-BU4NOVZF.js} +6 -5
- package/dist/{tool-capability-index-ED5OAPMW.js → tool-capability-index-7F42MOJT.js} +1 -1
- package/dist/{tool-gates-7PLIOLAL.js → tool-gates-JWVSAYTW.js} +1 -1
- package/dist/{tool-gates-2OZY3GZM.js → tool-gates-VXITVRFQ.js} +1 -1
- package/dist/{tool-telemetry-ZX7VSAXK.js → tool-telemetry-O27EVMBR.js} +1 -1
- package/dist/tui/App.js +43 -40
- package/dist/{tui-data-CC5POSUV.js → tui-data-TPWWBIUQ.js} +28 -25
- package/dist/{update-support-KH6NSQON.js → update-support-F2F5537B.js} +22 -20
- package/dist/{whatsapp-QW3X7OCN.js → whatsapp-YM4A2CSK.js} +3 -1
- package/dist/{work-claims-MNK7PEPW.js → work-claims-B73X5NE7.js} +6 -5
- package/dist/{work-state-heartbeat-YEWT5NMZ.js → work-state-heartbeat-P4YX6E2R.js} +1 -1
- package/dist/{worker-gate-BOQSIU2Z.js → worker-gate-BEEIIVWA.js} +3 -2
- package/dist/{workflow-engine-MUUD7ZEX.js → workflow-engine-5X46PFCW.js} +4 -2
- package/dist/{worktree-GOGT2LZP.js → worktree-W47CIMJ6.js} +9 -6
- package/dist/worktree-ownership-guard-OUWJROW2.js +88 -0
- package/dist/{worktree-sweep-46VWPVQT.js → worktree-sweep-BNBD4RFX.js} +8 -7
- package/package.json +14 -5
- package/release-notes.json +5 -5
- package/src/commands/exe/call.md +1 -1
- package/stack.release.json +6 -0
- package/dist/chunk-KZXMP6JG.js +0 -319
- package/dist/chunk-TCTED52S.js +0 -120
- package/dist/chunk-W2IRQJ6R.js +0 -67
- package/dist/doc-graph-extractor-VPTRIEKN.js +0 -149
- package/dist/project-name-ILJTETUE.js +0 -14
- /package/dist/{chunk-3Y5THOU6.js → chunk-6WIFPD2P.js} +0 -0
- /package/dist/{chunk-7XGXRD22.js → chunk-AISULNGL.js} +0 -0
- /package/dist/{chunk-3F2UB4IQ.js → chunk-DN4YVV4Z.js} +0 -0
- /package/dist/{chunk-WV3TOOL7.js → chunk-KQ6RJWRW.js} +0 -0
- /package/dist/{chunk-HR2R2QER.js → chunk-M4IRPXSZ.js} +0 -0
- /package/dist/{chunk-ORA5BWCV.js → chunk-NRG7KZIP.js} +0 -0
- /package/dist/{chunk-7UTJA6HF.js → chunk-VZAFWPAY.js} +0 -0
- /package/dist/{chunk-VJSDGDNS.js → chunk-WSQASFLP.js} +0 -0
- /package/dist/{chunk-FZQWVQJG.js → chunk-YO4BO2CL.js} +0 -0
- /package/dist/{core-memory-6WBNT2HL.js → core-memory-7I7RE2SJ.js} +0 -0
- /package/dist/{entity-boost-MT336PI3.js → entity-boost-3UWGXG5O.js} +0 -0
- /package/dist/{memory-isolation-EJ45IXBH.js → memory-isolation-2TUZ7Z4K.js} +0 -0
- /package/dist/{message-queue-client-MVBTYCSV.js → message-queue-client-XQN7QABL.js} +0 -0
- /package/dist/{webhook-pipe-UQSEHFPO.js → webhook-pipe-W2FVXY7M.js} +0 -0
- /package/dist/{wiki-acl-WXRJGZ5Q.js → wiki-acl-IBQLLBTS.js} +0 -0
- /package/dist/{wiki-client-AXNM5FWY.js → wiki-client-W65IOSWF.js} +0 -0
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-B6TI3TZT.js";
|
|
4
4
|
import {
|
|
5
5
|
loadEmployeesSync
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-TAMDAOCU.js";
|
|
7
7
|
|
|
8
8
|
// src/adapters/mcp-http-config.ts
|
|
9
9
|
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -39,9 +39,13 @@ function readOrCreateDaemonToken(homeDir = os.homedir()) {
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
const token = randomBytes(32).toString("hex");
|
|
42
|
-
mkdirSync(exeDir, { recursive: true });
|
|
42
|
+
mkdirSync(exeDir, { recursive: true, mode: 448 });
|
|
43
|
+
try {
|
|
44
|
+
chmodSync(exeDir, 448);
|
|
45
|
+
} catch {
|
|
46
|
+
}
|
|
43
47
|
writeFileSync(tokenPath, `${token}
|
|
44
|
-
`, "utf-8");
|
|
48
|
+
`, { encoding: "utf-8", mode: 384 });
|
|
45
49
|
try {
|
|
46
50
|
chmodSync(tokenPath, 384);
|
|
47
51
|
} catch {
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SUPERVISED_ENV
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZG62LIK3.js";
|
|
4
4
|
import {
|
|
5
5
|
ensureDaemonToken,
|
|
6
6
|
readDaemonToken
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EKYYMIVT.js";
|
|
8
|
+
import {
|
|
9
|
+
computeDaemonHeapCapMb
|
|
10
|
+
} from "./chunk-NLEW62VC.js";
|
|
11
|
+
import {
|
|
12
|
+
killIfSameProcess,
|
|
13
|
+
processStartedAt
|
|
14
|
+
} from "./chunk-SLLLOOEI.js";
|
|
8
15
|
import {
|
|
9
16
|
KILL_INTENT_LOOKBACK_MS,
|
|
10
17
|
findRecentKillIntent,
|
|
11
|
-
killIfSameProcess,
|
|
12
|
-
processStartedAt,
|
|
13
18
|
recordKillIntent
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import {
|
|
16
|
-
computeDaemonHeapCapMb
|
|
17
|
-
} from "./chunk-NLEW62VC.js";
|
|
19
|
+
} from "./chunk-V3WLC5TJ.js";
|
|
18
20
|
import {
|
|
19
21
|
SYSTEMD_DAEMON_UNIT,
|
|
20
22
|
SYSTEMD_WATCHDOG_UNIT,
|
|
@@ -26,7 +28,7 @@ import {
|
|
|
26
28
|
import {
|
|
27
29
|
EXE_AI_DIR,
|
|
28
30
|
resolveDataDir
|
|
29
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-ZIG7VPJV.js";
|
|
30
32
|
|
|
31
33
|
// src/lib/exe-daemon-client.ts
|
|
32
34
|
import net from "net";
|
|
@@ -66,6 +66,21 @@ function listTmuxSessions() {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
var listTmuxWindows = listTmuxSessions;
|
|
69
|
+
async function listTmuxSessionsAsync() {
|
|
70
|
+
try {
|
|
71
|
+
const { promisify } = await import("util");
|
|
72
|
+
const { execFile } = await import("child_process");
|
|
73
|
+
const exec = promisify(execFile);
|
|
74
|
+
const { stdout } = await exec("tmux", ["list-sessions", "-F", "#{session_name}"], {
|
|
75
|
+
encoding: "utf8",
|
|
76
|
+
timeout: 3e3
|
|
77
|
+
});
|
|
78
|
+
return String(stdout ?? "").trim().split("\n").filter(Boolean);
|
|
79
|
+
} catch (err) {
|
|
80
|
+
warnTmuxAbsenceOnce(err);
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
69
84
|
function capturePaneLines(windowName, lines = 10) {
|
|
70
85
|
try {
|
|
71
86
|
const out = execFileSync(
|
|
@@ -311,6 +326,7 @@ export {
|
|
|
311
326
|
resetTmuxAbsenceWarning,
|
|
312
327
|
listTmuxSessions,
|
|
313
328
|
listTmuxWindows,
|
|
329
|
+
listTmuxSessionsAsync,
|
|
314
330
|
capturePaneLines,
|
|
315
331
|
capturePaneLinesAsync,
|
|
316
332
|
getPaneCwd,
|
|
@@ -7,22 +7,23 @@ import {
|
|
|
7
7
|
} from "./chunk-S2YTU74T.js";
|
|
8
8
|
import {
|
|
9
9
|
createTask
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ZCERWHY2.js";
|
|
11
11
|
import {
|
|
12
12
|
getActiveAgent
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-55BEFF4V.js";
|
|
14
14
|
import {
|
|
15
15
|
ensureEmployeeAsync,
|
|
16
|
+
isEmployeeAlive,
|
|
16
17
|
isExeSession,
|
|
17
18
|
logTaskDispatch,
|
|
18
19
|
resolveExeSession
|
|
19
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-AKLQSC6W.js";
|
|
20
21
|
import {
|
|
21
22
|
isValidSessionScope
|
|
22
23
|
} from "./chunk-BTSWFMEH.js";
|
|
23
24
|
import {
|
|
24
25
|
recordOrchestrationEventBestEffort
|
|
25
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-W75GTHR3.js";
|
|
26
27
|
import {
|
|
27
28
|
releaseDispatchClaim,
|
|
28
29
|
tryAcquireDispatchClaim,
|
|
@@ -32,21 +33,142 @@ import {
|
|
|
32
33
|
import {
|
|
33
34
|
getAgentRuntime,
|
|
34
35
|
validateRuntimeModel
|
|
35
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-GZOG2MAX.js";
|
|
36
37
|
import {
|
|
37
38
|
getLicenseSync
|
|
38
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-6YVUR3OU.js";
|
|
39
40
|
import {
|
|
40
41
|
getAgentContext
|
|
41
42
|
} from "./chunk-GJV3WDWM.js";
|
|
42
43
|
import {
|
|
43
44
|
isCoordinatorName
|
|
44
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-TAMDAOCU.js";
|
|
46
|
+
import {
|
|
47
|
+
EXE_AI_DIR
|
|
48
|
+
} from "./chunk-ZIG7VPJV.js";
|
|
49
|
+
import {
|
|
50
|
+
atomicWriteJsonSync
|
|
51
|
+
} from "./chunk-HSGBZSCA.js";
|
|
45
52
|
|
|
46
53
|
// src/mcp/tools/create-task.ts
|
|
47
54
|
import { z } from "zod";
|
|
48
|
-
import { existsSync, readdirSync, realpathSync, statSync, writeFileSync, mkdirSync } from "fs";
|
|
55
|
+
import { existsSync as existsSync2, readdirSync, realpathSync, statSync, writeFileSync, mkdirSync as mkdirSync2 } from "fs";
|
|
49
56
|
import { basename, dirname, isAbsolute, join, sep } from "path";
|
|
57
|
+
|
|
58
|
+
// src/lib/project-dir-cache.ts
|
|
59
|
+
import path from "path";
|
|
60
|
+
import { existsSync, mkdirSync, readFileSync } from "fs";
|
|
61
|
+
var MAX_PROJECTS_PER_SCOPE = 64;
|
|
62
|
+
var MAX_SCOPES = 128;
|
|
63
|
+
function cacheDir() {
|
|
64
|
+
return process.env.EXE_OS_DIR || process.env.EXE_MEM_DIR || EXE_AI_DIR;
|
|
65
|
+
}
|
|
66
|
+
function cachePath() {
|
|
67
|
+
return path.join(cacheDir(), "project-dir-cache.json");
|
|
68
|
+
}
|
|
69
|
+
function keyFor(projectName) {
|
|
70
|
+
return projectName.trim().toLowerCase();
|
|
71
|
+
}
|
|
72
|
+
function readCache() {
|
|
73
|
+
try {
|
|
74
|
+
const raw = readFileSync(cachePath(), "utf8");
|
|
75
|
+
const parsed = JSON.parse(raw);
|
|
76
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
77
|
+
return parsed;
|
|
78
|
+
}
|
|
79
|
+
} catch {
|
|
80
|
+
}
|
|
81
|
+
return {};
|
|
82
|
+
}
|
|
83
|
+
function pruneScope(bucket) {
|
|
84
|
+
const entries = Object.entries(bucket);
|
|
85
|
+
if (entries.length <= MAX_PROJECTS_PER_SCOPE) return bucket;
|
|
86
|
+
entries.sort((a, b) => Date.parse(b[1].at) - Date.parse(a[1].at));
|
|
87
|
+
return Object.fromEntries(entries.slice(0, MAX_PROJECTS_PER_SCOPE));
|
|
88
|
+
}
|
|
89
|
+
function pruneScopes(cache) {
|
|
90
|
+
const scopes = Object.keys(cache);
|
|
91
|
+
if (scopes.length <= MAX_SCOPES) return cache;
|
|
92
|
+
const newest = (bucket) => Math.max(0, ...Object.values(bucket).map((e) => Date.parse(e.at) || 0));
|
|
93
|
+
scopes.sort((a, b) => newest(cache[b]) - newest(cache[a]));
|
|
94
|
+
const kept = {};
|
|
95
|
+
for (const s of scopes.slice(0, MAX_SCOPES)) kept[s] = cache[s];
|
|
96
|
+
return kept;
|
|
97
|
+
}
|
|
98
|
+
function rememberProjectDir(scope, projectName, dir, anchor) {
|
|
99
|
+
const s = scope.trim();
|
|
100
|
+
const p = keyFor(projectName);
|
|
101
|
+
const incarnation = anchor?.incarnation?.trim() ?? "";
|
|
102
|
+
const coordDir = anchor?.coordDir ?? "";
|
|
103
|
+
if (!s || !p || !dir || !incarnation || !coordDir) return;
|
|
104
|
+
try {
|
|
105
|
+
const cache = readCache();
|
|
106
|
+
const bucket = { ...cache[s] ?? {} };
|
|
107
|
+
bucket[p] = { dir, at: (/* @__PURE__ */ new Date()).toISOString(), incarnation, coordDir };
|
|
108
|
+
cache[s] = pruneScope(bucket);
|
|
109
|
+
const dirPath = cacheDir();
|
|
110
|
+
if (!existsSync(dirPath)) mkdirSync(dirPath, { recursive: true });
|
|
111
|
+
atomicWriteJsonSync(cachePath(), pruneScopes(cache));
|
|
112
|
+
} catch {
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function recallProjectDir(scope, projectName, incarnation) {
|
|
116
|
+
const s = scope.trim();
|
|
117
|
+
const p = keyFor(projectName);
|
|
118
|
+
const inc = String(incarnation ?? "").trim();
|
|
119
|
+
if (!s || !p || !inc) return null;
|
|
120
|
+
const cache = readCache();
|
|
121
|
+
const entry = cache[s]?.[p];
|
|
122
|
+
if (!entry?.dir || !entry.coordDir) return null;
|
|
123
|
+
if (entry.incarnation !== inc) {
|
|
124
|
+
forgetProjectDir(s, p);
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
return { dir: entry.dir, coordDir: entry.coordDir };
|
|
128
|
+
}
|
|
129
|
+
function forgetProjectDir(scope, projectKey) {
|
|
130
|
+
try {
|
|
131
|
+
const cache = readCache();
|
|
132
|
+
const bucket = cache[scope];
|
|
133
|
+
if (!bucket || !(projectKey in bucket)) return;
|
|
134
|
+
delete bucket[projectKey];
|
|
135
|
+
if (Object.keys(bucket).length === 0) delete cache[scope];
|
|
136
|
+
else cache[scope] = bucket;
|
|
137
|
+
atomicWriteJsonSync(cachePath(), cache);
|
|
138
|
+
} catch {
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// src/lib/session-incarnation.ts
|
|
143
|
+
import { execFile } from "child_process";
|
|
144
|
+
import { promisify } from "util";
|
|
145
|
+
var execFileAsync = promisify(execFile);
|
|
146
|
+
var SAFE_SESSION_NAME = /^[A-Za-z0-9._-]{1,64}$/;
|
|
147
|
+
var INCARNATION_FORMAT = "#{session_name} #{pid} #{session_id} #{session_created}";
|
|
148
|
+
function parseIncarnationLine(expectedName, stdout) {
|
|
149
|
+
const [echoedName, serverPid, sessionId, createdRaw] = String(stdout ?? "").trim().split(" ");
|
|
150
|
+
const created = Number.parseInt(String(createdRaw ?? "").trim(), 10);
|
|
151
|
+
if (echoedName !== expectedName) return null;
|
|
152
|
+
if (!serverPid || !sessionId) return null;
|
|
153
|
+
if (!Number.isFinite(created) || created <= 0) return null;
|
|
154
|
+
return `tmux:${serverPid}:${sessionId}:${created}`;
|
|
155
|
+
}
|
|
156
|
+
async function sessionIncarnationId(sessionName) {
|
|
157
|
+
const name = String(sessionName ?? "").trim();
|
|
158
|
+
if (!SAFE_SESSION_NAME.test(name)) return null;
|
|
159
|
+
try {
|
|
160
|
+
const { stdout } = await execFileAsync(
|
|
161
|
+
"tmux",
|
|
162
|
+
["display-message", "-t", name, "-p", INCARNATION_FORMAT],
|
|
163
|
+
{ encoding: "utf8", timeout: 2e3 }
|
|
164
|
+
);
|
|
165
|
+
return parseIncarnationLine(name, String(stdout));
|
|
166
|
+
} catch {
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// src/mcp/tools/create-task.ts
|
|
50
172
|
function rootFromSessionName(sessionName) {
|
|
51
173
|
const raw = (sessionName ?? "").trim();
|
|
52
174
|
if (!raw) return "";
|
|
@@ -58,13 +180,13 @@ function isRootSessionName(sessionName) {
|
|
|
58
180
|
}
|
|
59
181
|
function isDirectory(pathname) {
|
|
60
182
|
try {
|
|
61
|
-
return
|
|
183
|
+
return existsSync2(pathname) && statSync(pathname).isDirectory();
|
|
62
184
|
} catch {
|
|
63
185
|
return false;
|
|
64
186
|
}
|
|
65
187
|
}
|
|
66
188
|
function isGitRepoDir(pathname) {
|
|
67
|
-
return isDirectory(pathname) &&
|
|
189
|
+
return isDirectory(pathname) && existsSync2(join(pathname, ".git"));
|
|
68
190
|
}
|
|
69
191
|
function realpathSafe(pathname) {
|
|
70
192
|
try {
|
|
@@ -80,6 +202,16 @@ function isRealpathInside(candidate, scopedRoot) {
|
|
|
80
202
|
const prefix = rr.endsWith(sep) ? rr : rr + sep;
|
|
81
203
|
return rc.startsWith(prefix);
|
|
82
204
|
}
|
|
205
|
+
function rememberedDirStillInScope(dir, coordDir, projectName) {
|
|
206
|
+
if (!dir || !coordDir) return false;
|
|
207
|
+
if (!existsSync2(dir) || !existsSync2(coordDir)) return false;
|
|
208
|
+
if (!projectDirMatches(dir, projectName)) return false;
|
|
209
|
+
if (isRealpathInside(coordDir, dir)) return true;
|
|
210
|
+
if (isRealpathInside(dir, coordDir)) return true;
|
|
211
|
+
const workspaceRoot = dirname(coordDir);
|
|
212
|
+
if (workspaceRoot !== coordDir && isRealpathInside(dir, workspaceRoot)) return true;
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
83
215
|
function findNestedGitRepo(parentDir) {
|
|
84
216
|
const preferred = ["website", "app", "repo", "src"];
|
|
85
217
|
for (const child of preferred) {
|
|
@@ -141,7 +273,7 @@ function isSafeProjectName(projectName) {
|
|
|
141
273
|
}
|
|
142
274
|
function findProjectChildDir(parentDir, projectName) {
|
|
143
275
|
if (!isSafeProjectName(projectName)) return null;
|
|
144
|
-
if (!
|
|
276
|
+
if (!existsSync2(parentDir)) return null;
|
|
145
277
|
const normalizedProject = projectName.toLowerCase();
|
|
146
278
|
const aliases = /* @__PURE__ */ new Set([
|
|
147
279
|
normalizedProject,
|
|
@@ -240,7 +372,7 @@ async function inferCoordinatorRootForProject(projectName) {
|
|
|
240
372
|
try {
|
|
241
373
|
const liveRoots = new Set(await listCoordinatorRoots());
|
|
242
374
|
const { listSessions } = await import("./lib/session-registry.js");
|
|
243
|
-
const matches = listSessions().filter((session) => isRootSessionName(session.windowName)).filter((session) => !liveRoots.size || liveRoots.has(session.windowName)).filter((session) => session.projectDir &&
|
|
375
|
+
const matches = listSessions().filter((session) => isRootSessionName(session.windowName)).filter((session) => !liveRoots.size || liveRoots.has(session.windowName)).filter((session) => session.projectDir && existsSync2(session.projectDir)).filter((session) => registeredProjectDirMatches(session.projectDir, projectName)).map((session) => session.windowName);
|
|
244
376
|
return [...new Set(matches)].length === 1 ? matches[0] : "";
|
|
245
377
|
} catch {
|
|
246
378
|
return "";
|
|
@@ -266,28 +398,36 @@ async function resolveProjectDir(projectName, callerSession) {
|
|
|
266
398
|
return null;
|
|
267
399
|
}
|
|
268
400
|
if (callerSession) {
|
|
401
|
+
const coordName = callerSession.includes("-") ? callerSession.slice(callerSession.indexOf("-") + 1) : callerSession;
|
|
402
|
+
let coordinatorScopeWasAuthoritative = false;
|
|
403
|
+
let sessions = [];
|
|
404
|
+
const remember = async (dir, coordDir) => {
|
|
405
|
+
const incarnation = await sessionIncarnationId(coordName);
|
|
406
|
+
if (incarnation) rememberProjectDir(coordName, projectName, dir, { incarnation, coordDir });
|
|
407
|
+
return dir;
|
|
408
|
+
};
|
|
269
409
|
try {
|
|
270
410
|
const { listSessions } = await import("./lib/session-registry.js");
|
|
271
|
-
|
|
272
|
-
const coordName = callerSession.includes("-") ? callerSession.slice(callerSession.indexOf("-") + 1) : callerSession;
|
|
411
|
+
sessions = listSessions();
|
|
273
412
|
const coordSession = sessions.find((s) => s.windowName === coordName) ?? sessions.find((s) => s.windowName === callerSession);
|
|
274
|
-
if (coordSession?.projectDir &&
|
|
413
|
+
if (coordSession?.projectDir && existsSync2(coordSession.projectDir)) {
|
|
275
414
|
const coordDir = coordSession.projectDir;
|
|
415
|
+
coordinatorScopeWasAuthoritative = true;
|
|
276
416
|
if (projectDirMatches(coordDir, projectName)) {
|
|
277
|
-
return coordDir;
|
|
417
|
+
return await remember(coordDir, coordDir);
|
|
278
418
|
}
|
|
279
419
|
const ancestorRoot = findAncestorProjectDir(coordDir, projectName);
|
|
280
|
-
if (ancestorRoot) return ancestorRoot;
|
|
420
|
+
if (ancestorRoot) return await remember(ancestorRoot, coordDir);
|
|
281
421
|
const sameScopeCandidates = /* @__PURE__ */ new Set();
|
|
282
422
|
for (const session of sessions) {
|
|
283
423
|
if (!sessionBelongsToCoordinator(session, coordName, callerSession)) continue;
|
|
284
|
-
if (!session.projectDir || !
|
|
424
|
+
if (!session.projectDir || !existsSync2(session.projectDir)) continue;
|
|
285
425
|
if (registeredProjectDirMatches(session.projectDir, projectName)) {
|
|
286
426
|
sameScopeCandidates.add(session.projectDir);
|
|
287
427
|
}
|
|
288
428
|
}
|
|
289
429
|
const sortedSameScope = [...sameScopeCandidates].sort();
|
|
290
|
-
if (sortedSameScope.length === 1) return sortedSameScope[0];
|
|
430
|
+
if (sortedSameScope.length === 1) return await remember(sortedSameScope[0], coordDir);
|
|
291
431
|
if (sortedSameScope.length > 1) {
|
|
292
432
|
process.stderr.write(
|
|
293
433
|
`[create-task] ambiguous same-session project resolution for "${projectName}" in caller scope "${callerSession}": ${sortedSameScope.join(", ")}. Returning null.
|
|
@@ -296,9 +436,9 @@ async function resolveProjectDir(projectName, callerSession) {
|
|
|
296
436
|
return null;
|
|
297
437
|
}
|
|
298
438
|
const childUnderCoord = findProjectChildDir(coordDir, projectName);
|
|
299
|
-
if (childUnderCoord) return childUnderCoord;
|
|
439
|
+
if (childUnderCoord) return await remember(childUnderCoord, coordDir);
|
|
300
440
|
const automationChildUnderCoord = findAutomationChildDir(coordDir, projectName);
|
|
301
|
-
if (automationChildUnderCoord) return automationChildUnderCoord;
|
|
441
|
+
if (automationChildUnderCoord) return await remember(automationChildUnderCoord, coordDir);
|
|
302
442
|
const workspaceRoot = dirname(coordDir);
|
|
303
443
|
if (workspaceRoot !== coordDir) {
|
|
304
444
|
const sibling = findProjectChildDir(workspaceRoot, projectName);
|
|
@@ -313,13 +453,14 @@ async function resolveProjectDir(projectName, callerSession) {
|
|
|
313
453
|
);
|
|
314
454
|
return null;
|
|
315
455
|
}
|
|
316
|
-
return sibling;
|
|
456
|
+
return await remember(sibling, coordDir);
|
|
317
457
|
}
|
|
318
458
|
}
|
|
319
459
|
process.stderr.write(
|
|
320
|
-
`[create-task] project "${projectName}" not found within caller scope "${callerSession}" (coordinator dir "${coordDir}"). Not scanning other scopes.
|
|
460
|
+
`[create-task] project "${projectName}" not found within caller scope "${callerSession}" (coordinator dir "${coordDir}"). Not scanning other scopes and not consulting the resolution memo \u2014 this is a scope refusal, not registry churn.
|
|
321
461
|
`
|
|
322
462
|
);
|
|
463
|
+
return null;
|
|
323
464
|
}
|
|
324
465
|
} catch (err) {
|
|
325
466
|
process.stderr.write(
|
|
@@ -327,6 +468,28 @@ async function resolveProjectDir(projectName, callerSession) {
|
|
|
327
468
|
`
|
|
328
469
|
);
|
|
329
470
|
}
|
|
471
|
+
if (!coordinatorScopeWasAuthoritative) {
|
|
472
|
+
const incarnation = await sessionIncarnationId(coordName);
|
|
473
|
+
const remembered = incarnation ? recallProjectDir(coordName, projectName, incarnation) : null;
|
|
474
|
+
if (remembered) {
|
|
475
|
+
const inScope = rememberedDirStillInScope(remembered.dir, remembered.coordDir, projectName);
|
|
476
|
+
const owner = !inScope ? null : sessions.find(
|
|
477
|
+
(s) => s.windowName !== coordName && s.windowName !== callerSession && s.projectDir && isRealpathInside(remembered.dir, s.projectDir)
|
|
478
|
+
);
|
|
479
|
+
if (inScope && !owner) {
|
|
480
|
+
process.stderr.write(
|
|
481
|
+
`[create-task] recovered project "${projectName}" for caller scope "${callerSession}" from the in-scope resolution memo (${remembered.dir}, incarnation ${incarnation}) after the live session registry missed \u2014 transient registry churn, not an out-of-scope project.
|
|
482
|
+
`
|
|
483
|
+
);
|
|
484
|
+
return remembered.dir;
|
|
485
|
+
}
|
|
486
|
+
const reason = owner ? `it is now owned by coordinator scope "${owner.windowName}"` : `it is no longer in scope of its anchor "${remembered.coordDir}"`;
|
|
487
|
+
process.stderr.write(
|
|
488
|
+
`[create-task] DISCARDING remembered dir ${remembered.dir} for project "${projectName}" in caller scope "${callerSession}": ${reason}. Refusing rather than misrouting.
|
|
489
|
+
`
|
|
490
|
+
);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
330
493
|
process.stderr.write(
|
|
331
494
|
`[create-task] could not resolve project "${projectName}" within caller scope "${callerSession}". Returning null \u2014 dispatch will be refused (no $HOME/cwd fallback for a scoped caller).
|
|
332
495
|
`
|
|
@@ -338,7 +501,7 @@ async function resolveProjectDir(projectName, callerSession) {
|
|
|
338
501
|
const candidates = /* @__PURE__ */ new Set();
|
|
339
502
|
for (const session of listSessions()) {
|
|
340
503
|
if (!isRootSessionName(session.windowName)) continue;
|
|
341
|
-
if (!session.projectDir || !
|
|
504
|
+
if (!session.projectDir || !existsSync2(session.projectDir)) continue;
|
|
342
505
|
if (registeredProjectDirMatches(session.projectDir, projectName)) {
|
|
343
506
|
candidates.add(session.projectDir);
|
|
344
507
|
}
|
|
@@ -378,7 +541,7 @@ async function resolveCoordinatorOwnProjectDir(callerRoot) {
|
|
|
378
541
|
const coordName = callerRoot.includes("-") ? callerRoot.slice(callerRoot.indexOf("-") + 1) : callerRoot;
|
|
379
542
|
const sessions = listSessions();
|
|
380
543
|
const coordSession = sessions.find((s) => s.windowName === coordName) ?? sessions.find((s) => s.windowName === callerRoot);
|
|
381
|
-
if (coordSession?.projectDir &&
|
|
544
|
+
if (coordSession?.projectDir && existsSync2(coordSession.projectDir)) {
|
|
382
545
|
return coordSession.projectDir;
|
|
383
546
|
}
|
|
384
547
|
} catch {
|
|
@@ -541,7 +704,7 @@ function registerCreateTask(server) {
|
|
|
541
704
|
let claimWarning = "";
|
|
542
705
|
const claimRefRaw = (work_ref ?? "").trim();
|
|
543
706
|
try {
|
|
544
|
-
const { findConflicts, findConflictsInText, describeConflict, normalizeTarget } = await import("./work-claims-
|
|
707
|
+
const { findConflicts, findConflictsInText, describeConflict, normalizeTarget } = await import("./work-claims-B73X5NE7.js");
|
|
545
708
|
const conflicts = claimRefRaw ? await findConflicts(
|
|
546
709
|
[normalizeTarget({ kind: "work_ref", value: claimRefRaw })],
|
|
547
710
|
callerRoot
|
|
@@ -720,7 +883,7 @@ Nothing was created or dispatched. Either pick different work, or \u2014 if that
|
|
|
720
883
|
}
|
|
721
884
|
if (claimRefRaw) {
|
|
722
885
|
try {
|
|
723
|
-
const { acquireClaim } = await import("./work-claims-
|
|
886
|
+
const { acquireClaim } = await import("./work-claims-B73X5NE7.js");
|
|
724
887
|
const acquired = await acquireClaim({
|
|
725
888
|
targets: [{ kind: "work_ref", value: claimRefRaw }],
|
|
726
889
|
holderSession: callerRoot,
|
|
@@ -739,10 +902,10 @@ Claimed ${claimRefRaw} for session ${callerRoot} (claim_group ${acquired.claimGr
|
|
|
739
902
|
}
|
|
740
903
|
}
|
|
741
904
|
try {
|
|
742
|
-
const { existsSync:
|
|
905
|
+
const { existsSync: existsSync3, mkdirSync: mkdirSync3, writeFileSync: writeFileSync2 } = await import("fs");
|
|
743
906
|
const { identityPath } = await import("./lib/identity.js");
|
|
744
907
|
const idPath = identityPath(assigned_to);
|
|
745
|
-
if (!
|
|
908
|
+
if (!existsSync3(idPath)) {
|
|
746
909
|
const { loadEmployees } = await import("./lib/employees.js");
|
|
747
910
|
const employees = await loadEmployees();
|
|
748
911
|
const emp = employees.find((e) => e.name === assigned_to);
|
|
@@ -751,7 +914,7 @@ Claimed ${claimRefRaw} for session ${callerRoot} (claim_group ${acquired.claimGr
|
|
|
751
914
|
const template = getTemplateForTitle(emp.role);
|
|
752
915
|
if (template) {
|
|
753
916
|
const dir = (await import("path")).dirname(idPath);
|
|
754
|
-
if (!
|
|
917
|
+
if (!existsSync3(dir)) mkdirSync3(dir, { recursive: true });
|
|
755
918
|
writeFileSync2(idPath, template.replace(/^agent_id: \w+/m, `agent_id: ${assigned_to}`), "utf-8");
|
|
756
919
|
}
|
|
757
920
|
}
|
|
@@ -763,7 +926,7 @@ Claimed ${claimRefRaw} for session ${callerRoot} (claim_group ${acquired.claimGr
|
|
|
763
926
|
const { taskSignalPath: getSignalPath } = await import("./signal-paths-4G53QTII.js");
|
|
764
927
|
const { taskSignalDir } = await import("./signal-paths-4G53QTII.js");
|
|
765
928
|
const signalDir = taskSignalDir(sessionScope);
|
|
766
|
-
|
|
929
|
+
mkdirSync2(signalDir, { recursive: true });
|
|
767
930
|
const signalPath = getSignalPath(sessionScope, assigned_to, task.id);
|
|
768
931
|
writeFileSync(signalPath, JSON.stringify({
|
|
769
932
|
task_id: task.id,
|
|
@@ -773,7 +936,7 @@ Claimed ${claimRefRaw} for session ${callerRoot} (claim_group ${acquired.claimGr
|
|
|
773
936
|
session_scope: sessionScope,
|
|
774
937
|
created_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
775
938
|
}), "utf-8");
|
|
776
|
-
const { recordOrchestrationEventBestEffort: recordOE } = await import("./orchestration-events-
|
|
939
|
+
const { recordOrchestrationEventBestEffort: recordOE } = await import("./orchestration-events-N7LYMUGA.js");
|
|
777
940
|
recordOE({
|
|
778
941
|
eventType: "signal.created",
|
|
779
942
|
source: "create-task.mcp",
|
|
@@ -805,7 +968,7 @@ Claimed ${claimRefRaw} for session ${callerRoot} (claim_group ${acquired.claimGr
|
|
|
805
968
|
let projectConflictOpts = {};
|
|
806
969
|
try {
|
|
807
970
|
const { getClient } = await import("./lib/database.js");
|
|
808
|
-
const { sessionScopeFilter } = await import("./task-scope-
|
|
971
|
+
const { sessionScopeFilter } = await import("./task-scope-ERVEUEYU.js");
|
|
809
972
|
const client = getClient();
|
|
810
973
|
const scope = sessionScopeFilter(task.sessionScope || callerRoot || exeSession || null);
|
|
811
974
|
const existing = await client.execute({
|
|
@@ -873,30 +1036,60 @@ Dispatched: spawned ${result.sessionName}`;
|
|
|
873
1036
|
Dispatch failed: ${result.error ?? "unknown"}`;
|
|
874
1037
|
break;
|
|
875
1038
|
}
|
|
876
|
-
|
|
877
|
-
if (result.status === "
|
|
1039
|
+
let livenessDemoted = false;
|
|
1040
|
+
if (result.status === "spawned" && result.sessionName) {
|
|
1041
|
+
const reprobeCapMs = Number(process.env.EXE_SPAWN_REPROBE_CAP_MS) || 4e3;
|
|
1042
|
+
const reprobeIntervalMs = Number(process.env.EXE_SPAWN_REPROBE_INTERVAL_MS) || 500;
|
|
1043
|
+
const reprobeIterations = Math.max(1, Math.ceil(reprobeCapMs / reprobeIntervalMs));
|
|
1044
|
+
let confirmedLive = false;
|
|
1045
|
+
for (let i = 0; i < reprobeIterations; i++) {
|
|
1046
|
+
try {
|
|
1047
|
+
if (isEmployeeAlive(result.sessionName)) {
|
|
1048
|
+
confirmedLive = true;
|
|
1049
|
+
break;
|
|
1050
|
+
}
|
|
1051
|
+
} catch {
|
|
1052
|
+
}
|
|
1053
|
+
if (i < reprobeIterations - 1) {
|
|
1054
|
+
await new Promise((r) => setTimeout(r, reprobeIntervalMs));
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
if (!confirmedLive) {
|
|
1058
|
+
livenessDemoted = true;
|
|
1059
|
+
dispatchStatus = `
|
|
1060
|
+
Dispatch failed: spawn reported "spawned ${result.sessionName}" but the tmux session never came alive within ${reprobeCapMs / 1e3}s (post-spawn liveness re-probe). The agent was NOT started \u2014 re-dispatch required.`;
|
|
1061
|
+
process.stderr.write(
|
|
1062
|
+
`[create_task] SPAWN LIVENESS DEMOTION: ${result.sessionName} reported "spawned" but the re-probe found no live session \u2014 reporting dispatch FAILURE instead of a phantom success (bug 1c3ab704)
|
|
1063
|
+
`
|
|
1064
|
+
);
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
const dispatchFailed = result.status === "failed" || livenessDemoted;
|
|
1068
|
+
if (dispatchFailed) dispatchOutcome = "failed";
|
|
1069
|
+
const dispatchFailureError = result.error ?? (livenessDemoted ? "spawn reported success but tmux session never came alive (liveness re-probe)" : "spawn failed");
|
|
1070
|
+
if (dispatchFailed) {
|
|
878
1071
|
try {
|
|
879
|
-
releaseDispatchClaim(task.id, assigned_to,
|
|
1072
|
+
releaseDispatchClaim(task.id, assigned_to, dispatchFailureError);
|
|
880
1073
|
} catch {
|
|
881
1074
|
}
|
|
882
1075
|
try {
|
|
883
|
-
writeDispatchFailed(task.id, assigned_to,
|
|
1076
|
+
writeDispatchFailed(task.id, assigned_to, dispatchFailureError, result.sessionName);
|
|
884
1077
|
} catch {
|
|
885
1078
|
}
|
|
886
1079
|
}
|
|
887
1080
|
recordOrchestrationEventBestEffort({
|
|
888
|
-
eventType:
|
|
1081
|
+
eventType: dispatchFailed ? "dispatch.failed" : "dispatch.completed",
|
|
889
1082
|
source: "create-task.mcp",
|
|
890
|
-
severity:
|
|
1083
|
+
severity: dispatchFailed ? "warn" : "info",
|
|
891
1084
|
taskId: task.id,
|
|
892
1085
|
agentId: assigned_to,
|
|
893
1086
|
sessionScope: task.sessionScope || callerRoot || exeSession,
|
|
894
1087
|
projectName: project_name,
|
|
895
1088
|
tmuxSession: result.sessionName || null,
|
|
896
1089
|
runtime: dispatchRuntime,
|
|
897
|
-
result: result.status,
|
|
898
|
-
errorCode:
|
|
899
|
-
payload: { priority, error: result.error ?? null }
|
|
1090
|
+
result: dispatchFailed ? "failed" : result.status,
|
|
1091
|
+
errorCode: dispatchFailed ? livenessDemoted ? "spawn_liveness_reprobe_failed" : "ensure_employee_failed" : null,
|
|
1092
|
+
payload: { priority, error: dispatchFailed ? dispatchFailureError : result.error ?? null }
|
|
900
1093
|
});
|
|
901
1094
|
try {
|
|
902
1095
|
const { sendIntercom: si } = await import("./lib/tmux-routing.js");
|
|
@@ -912,7 +1105,7 @@ Dispatch failed: ${result.error ?? "unknown"}`;
|
|
|
912
1105
|
}
|
|
913
1106
|
} catch {
|
|
914
1107
|
}
|
|
915
|
-
if (result.sessionName &&
|
|
1108
|
+
if (result.sessionName && !dispatchFailed) {
|
|
916
1109
|
try {
|
|
917
1110
|
const { getClient: gc } = await import("./lib/database.js");
|
|
918
1111
|
await gc().execute({
|
|
@@ -945,9 +1138,11 @@ Dispatch failed: ${result.error ?? "unknown"}`;
|
|
|
945
1138
|
} catch {
|
|
946
1139
|
}
|
|
947
1140
|
}
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
1141
|
+
if (!dispatchFailed) {
|
|
1142
|
+
try {
|
|
1143
|
+
writeDispatchPending(task.id, assigned_to, result.sessionName);
|
|
1144
|
+
} catch {
|
|
1145
|
+
}
|
|
951
1146
|
}
|
|
952
1147
|
logTaskDispatch({
|
|
953
1148
|
taskId: task.id,
|
|
@@ -955,9 +1150,9 @@ Dispatch failed: ${result.error ?? "unknown"}`;
|
|
|
955
1150
|
callerRoot,
|
|
956
1151
|
exeSession,
|
|
957
1152
|
callerSource,
|
|
958
|
-
dispatchResult: result.status,
|
|
1153
|
+
dispatchResult: dispatchFailed ? "failed" : result.status,
|
|
959
1154
|
sessionName: result.sessionName,
|
|
960
|
-
error: result.error
|
|
1155
|
+
error: dispatchFailed ? dispatchFailureError : result.error
|
|
961
1156
|
});
|
|
962
1157
|
}
|
|
963
1158
|
} else {
|
|
@@ -1006,7 +1201,7 @@ ${dispatchErr instanceof Error ? dispatchErr.stack : ""}
|
|
|
1006
1201
|
}
|
|
1007
1202
|
let dupWarning = "";
|
|
1008
1203
|
try {
|
|
1009
|
-
const { findMatchingBranches } = await import("./branch-hygiene-
|
|
1204
|
+
const { findMatchingBranches } = await import("./branch-hygiene-U5GFRSTP.js");
|
|
1010
1205
|
const matches = await findMatchingBranches(resolvedProjectDir, { title });
|
|
1011
1206
|
if (matches.length > 0) {
|
|
1012
1207
|
const top = matches.slice(0, 3).map((m) => {
|