@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
|
@@ -4,6 +4,9 @@ import {
|
|
|
4
4
|
atomicWriteJsonSync,
|
|
5
5
|
ensurePrivateDir
|
|
6
6
|
} from "./chunk-HSGBZSCA.js";
|
|
7
|
+
import {
|
|
8
|
+
assertHermeticPath
|
|
9
|
+
} from "./chunk-RH4AH3YB.js";
|
|
7
10
|
import {
|
|
8
11
|
currentKeyDirContext,
|
|
9
12
|
refusedQuarantineDir,
|
|
@@ -13,61 +16,8 @@ import {
|
|
|
13
16
|
// src/lib/config.ts
|
|
14
17
|
import { readFile } from "fs/promises";
|
|
15
18
|
import { readFileSync, existsSync, renameSync } from "fs";
|
|
16
|
-
import path2 from "path";
|
|
17
|
-
import os2 from "os";
|
|
18
|
-
|
|
19
|
-
// src/lib/hermetic-guard.ts
|
|
20
|
-
import { realpathSync } from "fs";
|
|
21
|
-
import os from "os";
|
|
22
19
|
import path from "path";
|
|
23
|
-
|
|
24
|
-
function isHermeticTestEnv() {
|
|
25
|
-
return process.env.EXE_TEST_HERMETIC === "1";
|
|
26
|
-
}
|
|
27
|
-
function harnessRealHome() {
|
|
28
|
-
const v = process.env.EXE_HERMETIC_REAL_HOME ?? process.env.EXE_REAL_HOME;
|
|
29
|
-
return v && v.trim() ? v : null;
|
|
30
|
-
}
|
|
31
|
-
function harnessSandboxRoot() {
|
|
32
|
-
const v = process.env.EXE_HERMETIC_SANDBOX_ROOT;
|
|
33
|
-
return v && v.trim() ? v : null;
|
|
34
|
-
}
|
|
35
|
-
function canonical(p) {
|
|
36
|
-
let dir = path.resolve(p);
|
|
37
|
-
const tail = [];
|
|
38
|
-
for (; ; ) {
|
|
39
|
-
try {
|
|
40
|
-
return path.join(realpathSync(dir), ...tail);
|
|
41
|
-
} catch {
|
|
42
|
-
}
|
|
43
|
-
const parent = path.dirname(dir);
|
|
44
|
-
if (parent === dir) return path.resolve(p);
|
|
45
|
-
tail.unshift(path.basename(dir));
|
|
46
|
-
dir = parent;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function isInside(candidate, base) {
|
|
50
|
-
const rel = path.relative(canonical(base), canonical(candidate));
|
|
51
|
-
return rel === "" || !rel.startsWith("..") && !path.isAbsolute(rel);
|
|
52
|
-
}
|
|
53
|
-
function realInstallDirs(realHome) {
|
|
54
|
-
return [path.join(realHome, ".exe-os"), path.join(realHome, ".exe-mem")];
|
|
55
|
-
}
|
|
56
|
-
function assertHermeticPath(what, resolved) {
|
|
57
|
-
if (!isHermeticTestEnv()) return;
|
|
58
|
-
const realHome = harnessRealHome();
|
|
59
|
-
if (!realHome) return;
|
|
60
|
-
const sandboxRoot = harnessSandboxRoot();
|
|
61
|
-
if (sandboxRoot && isInside(resolved, sandboxRoot)) return;
|
|
62
|
-
const breached = realInstallDirs(realHome).find((dir) => isInside(resolved, dir));
|
|
63
|
-
if (!breached) return;
|
|
64
|
-
throw new Error(
|
|
65
|
-
`[hermetic-guard] Test isolation breach: ${what} resolved to ${resolved}, which is the REAL exe-os install at ${breached}.
|
|
66
|
-
This process runs under the hermetic test harness (EXE_TEST_HERMETIC=1) but is operating on the LIVE install. Real product code reached from here can and does kill the production daemon (bug 2b7072a7 / 7a915790).
|
|
67
|
-
Cause is almost always a spawn that overrode the sandbox: an explicit env: {...} that dropped EXE_OS_DIR/EXE_MEM_DIR, or HOME: os.homedir() captured outside the sandbox.
|
|
68
|
-
Fix: inherit ...process.env, or use the hermetic HOME (process.env.HOME), never os.homedir().`
|
|
69
|
-
);
|
|
70
|
-
}
|
|
20
|
+
import os from "os";
|
|
71
21
|
|
|
72
22
|
// src/lib/theme.ts
|
|
73
23
|
var THEME_MODES = ["dark", "light", "system"];
|
|
@@ -151,7 +101,7 @@ function resolveDataDir() {
|
|
|
151
101
|
return dir;
|
|
152
102
|
}
|
|
153
103
|
if (!existsSync(dir)) {
|
|
154
|
-
const legacyDir =
|
|
104
|
+
const legacyDir = path.join(path.dirname(dir), ".exe-mem");
|
|
155
105
|
if (existsSync(legacyDir)) {
|
|
156
106
|
try {
|
|
157
107
|
renameSync(legacyDir, dir);
|
|
@@ -166,9 +116,9 @@ function resolveDataDir() {
|
|
|
166
116
|
return dir;
|
|
167
117
|
}
|
|
168
118
|
var EXE_AI_DIR = resolveDataDir();
|
|
169
|
-
var DB_PATH =
|
|
170
|
-
var MODELS_DIR =
|
|
171
|
-
var CONFIG_PATH =
|
|
119
|
+
var DB_PATH = path.join(EXE_AI_DIR, "memories.db");
|
|
120
|
+
var MODELS_DIR = path.join(EXE_AI_DIR, "models");
|
|
121
|
+
var CONFIG_PATH = path.join(EXE_AI_DIR, "config.json");
|
|
172
122
|
var CANONICAL_EMBED_MODEL_FILE = "exe-embeddings-v1-q4_k_m.gguf";
|
|
173
123
|
var LEGACY_EMBED_MODEL_FILES = [
|
|
174
124
|
"jina-embeddings-v5-small-q4_k_m.gguf",
|
|
@@ -178,14 +128,14 @@ var LEGACY_EMBED_MODEL_FILES = [
|
|
|
178
128
|
function resolveEmbedModelFile(dir = MODELS_DIR, preferred = CANONICAL_EMBED_MODEL_FILE) {
|
|
179
129
|
const candidates = [preferred, CANONICAL_EMBED_MODEL_FILE, ...LEGACY_EMBED_MODEL_FILES];
|
|
180
130
|
for (const name of candidates) {
|
|
181
|
-
if (name && existsSync(
|
|
131
|
+
if (name && existsSync(path.join(dir, name))) return name;
|
|
182
132
|
}
|
|
183
133
|
return preferred || CANONICAL_EMBED_MODEL_FILE;
|
|
184
134
|
}
|
|
185
135
|
function isDbAuthorityEnabled() {
|
|
186
136
|
return (process.env.EXE_DB_AUTHORITY ?? "") === "1";
|
|
187
137
|
}
|
|
188
|
-
var LEGACY_LANCE_PATH =
|
|
138
|
+
var LEGACY_LANCE_PATH = path.join(EXE_AI_DIR, "local.lance");
|
|
189
139
|
var CURRENT_CONFIG_VERSION = 1;
|
|
190
140
|
var DEFAULT_CONFIG = {
|
|
191
141
|
config_version: CURRENT_CONFIG_VERSION,
|
|
@@ -223,6 +173,8 @@ var DEFAULT_CONFIG = {
|
|
|
223
173
|
consolidationMaxCallsPerRun: 20,
|
|
224
174
|
selfQueryRouter: true,
|
|
225
175
|
selfQueryModel: "claude-haiku-4-5-20251001",
|
|
176
|
+
hyde: false,
|
|
177
|
+
hydeModel: "claude-haiku-4-5-20251001",
|
|
226
178
|
rerankerEnabled: true,
|
|
227
179
|
scalingRoadmap: {
|
|
228
180
|
rerankerAutoTrigger: {
|
|
@@ -428,7 +380,7 @@ function normalizeCloudEndpoint(raw) {
|
|
|
428
380
|
}
|
|
429
381
|
try {
|
|
430
382
|
const cfgDir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
|
|
431
|
-
const cfgPath =
|
|
383
|
+
const cfgPath = path.join(cfgDir, "config.json");
|
|
432
384
|
if (existsSync(cfgPath)) {
|
|
433
385
|
const onDisk = JSON.parse(readFileSync(cfgPath, "utf8"));
|
|
434
386
|
const diskCloud = onDisk.cloud;
|
|
@@ -443,9 +395,9 @@ function normalizeCloudEndpoint(raw) {
|
|
|
443
395
|
async function loadConfig() {
|
|
444
396
|
const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
|
|
445
397
|
await ensurePrivateDir(dir);
|
|
446
|
-
const configPath =
|
|
398
|
+
const configPath = path.join(dir, "config.json");
|
|
447
399
|
if (!existsSync(configPath)) {
|
|
448
|
-
return { ...DEFAULT_CONFIG, dbPath:
|
|
400
|
+
return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
|
|
449
401
|
}
|
|
450
402
|
let raw;
|
|
451
403
|
try {
|
|
@@ -461,11 +413,11 @@ async function loadConfig() {
|
|
|
461
413
|
await atomicWrite(configPath, raw);
|
|
462
414
|
} catch {
|
|
463
415
|
process.stderr.write("[exe-os] config.json.bak also corrupt \u2014 using defaults\n");
|
|
464
|
-
return { ...DEFAULT_CONFIG, dbPath:
|
|
416
|
+
return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
|
|
465
417
|
}
|
|
466
418
|
} else {
|
|
467
419
|
process.stderr.write("[exe-os] config.json corrupt, no backup available \u2014 using defaults\n");
|
|
468
|
-
return { ...DEFAULT_CONFIG, dbPath:
|
|
420
|
+
return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
|
|
469
421
|
}
|
|
470
422
|
}
|
|
471
423
|
try {
|
|
@@ -491,24 +443,24 @@ async function loadConfig() {
|
|
|
491
443
|
normalizeEmbeddingPrefixes(migratedCfg);
|
|
492
444
|
normalizeAppearance(migratedCfg);
|
|
493
445
|
normalizeCloudEndpoint(migratedCfg);
|
|
494
|
-
const config = { ...DEFAULT_CONFIG, dbPath:
|
|
446
|
+
const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
|
|
495
447
|
if (config.dbPath.startsWith("~")) {
|
|
496
|
-
config.dbPath = config.dbPath.replace(/^~/,
|
|
448
|
+
config.dbPath = config.dbPath.replace(/^~/, os.homedir());
|
|
497
449
|
}
|
|
498
|
-
const envDbPath =
|
|
450
|
+
const envDbPath = path.join(dir, "memories.db");
|
|
499
451
|
if (process.env.EXE_OS_DIR && config.dbPath !== envDbPath && !existsSync(config.dbPath) && existsSync(envDbPath)) {
|
|
500
452
|
config.dbPath = envDbPath;
|
|
501
453
|
}
|
|
502
454
|
return config;
|
|
503
455
|
} catch {
|
|
504
|
-
return { ...DEFAULT_CONFIG, dbPath:
|
|
456
|
+
return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
|
|
505
457
|
}
|
|
506
458
|
}
|
|
507
459
|
function loadConfigSync() {
|
|
508
460
|
const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
|
|
509
|
-
const configPath =
|
|
461
|
+
const configPath = path.join(dir, "config.json");
|
|
510
462
|
if (!existsSync(configPath)) {
|
|
511
|
-
return { ...DEFAULT_CONFIG, dbPath:
|
|
463
|
+
return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
|
|
512
464
|
}
|
|
513
465
|
try {
|
|
514
466
|
const raw = readFileSync(configPath, "utf-8");
|
|
@@ -526,23 +478,23 @@ function loadConfigSync() {
|
|
|
526
478
|
normalizeEmbeddingPrefixes(migratedCfg);
|
|
527
479
|
normalizeAppearance(migratedCfg);
|
|
528
480
|
normalizeCloudEndpoint(migratedCfg);
|
|
529
|
-
const config = { ...DEFAULT_CONFIG, dbPath:
|
|
481
|
+
const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
|
|
530
482
|
if (config.dbPath.startsWith("~")) {
|
|
531
|
-
config.dbPath = config.dbPath.replace(/^~/,
|
|
483
|
+
config.dbPath = config.dbPath.replace(/^~/, os.homedir());
|
|
532
484
|
}
|
|
533
|
-
const envDbPath =
|
|
485
|
+
const envDbPath = path.join(dir, "memories.db");
|
|
534
486
|
if (process.env.EXE_OS_DIR && config.dbPath !== envDbPath && !existsSync(config.dbPath) && existsSync(envDbPath)) {
|
|
535
487
|
config.dbPath = envDbPath;
|
|
536
488
|
}
|
|
537
489
|
return config;
|
|
538
490
|
} catch {
|
|
539
|
-
return { ...DEFAULT_CONFIG, dbPath:
|
|
491
|
+
return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
|
|
540
492
|
}
|
|
541
493
|
}
|
|
542
494
|
async function saveConfig(config) {
|
|
543
495
|
const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
|
|
544
496
|
await ensurePrivateDir(dir);
|
|
545
|
-
const configPath =
|
|
497
|
+
const configPath = path.join(dir, "config.json");
|
|
546
498
|
await atomicWriteJson(configPath, config);
|
|
547
499
|
}
|
|
548
500
|
async function loadConfigFrom(configPath) {
|
|
@@ -6,8 +6,15 @@ import {
|
|
|
6
6
|
supportVersionSchema
|
|
7
7
|
} from "./chunk-5H47VHB7.js";
|
|
8
8
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
assessAttribution,
|
|
10
|
+
assessDisposition,
|
|
11
|
+
buildVerificationArtifact,
|
|
12
|
+
isPlaceholderIdentity,
|
|
13
|
+
isUnresolvedIdentity
|
|
14
|
+
} from "./chunk-4YNA3CM6.js";
|
|
15
|
+
import {
|
|
16
|
+
getActiveAgent
|
|
17
|
+
} from "./chunk-55BEFF4V.js";
|
|
11
18
|
import {
|
|
12
19
|
SUPPORT_PRODUCTS,
|
|
13
20
|
sanitizeProductFilter,
|
|
@@ -17,7 +24,7 @@ import {
|
|
|
17
24
|
import {
|
|
18
25
|
loadLicense,
|
|
19
26
|
readCachedLicenseToken
|
|
20
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-L6RXG36J.js";
|
|
21
28
|
|
|
22
29
|
// src/mcp/tools/support-inbox.ts
|
|
23
30
|
import { z as z2 } from "zod";
|
|
@@ -27,23 +34,183 @@ import { homedir } from "os";
|
|
|
27
34
|
|
|
28
35
|
// src/lib/support-verification-input.ts
|
|
29
36
|
import { z } from "zod";
|
|
37
|
+
|
|
38
|
+
// src/lib/attribution-resolve.ts
|
|
39
|
+
import { execFileSync } from "child_process";
|
|
40
|
+
function resolveModelFromEnvironment() {
|
|
41
|
+
const candidates = [
|
|
42
|
+
process.env.EXE_ATTRIBUTION_MODEL,
|
|
43
|
+
process.env.ANTHROPIC_MODEL,
|
|
44
|
+
process.env.CLAUDE_MODEL,
|
|
45
|
+
process.env.EXE_MODEL
|
|
46
|
+
];
|
|
47
|
+
for (const candidate of candidates) {
|
|
48
|
+
const value = candidate?.trim();
|
|
49
|
+
if (value && !isPlaceholderIdentity(value)) return value;
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
function resolveRef(ref, cwd) {
|
|
54
|
+
try {
|
|
55
|
+
const out = execFileSync("git", ["rev-parse", "--verify", `${ref}^{commit}`], {
|
|
56
|
+
cwd,
|
|
57
|
+
encoding: "utf8",
|
|
58
|
+
timeout: 1e4
|
|
59
|
+
}).trim();
|
|
60
|
+
return /^[0-9a-f]{40}$/i.test(out) ? out : null;
|
|
61
|
+
} catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
var MODEL_HELP = "Set ANTHROPIC_MODEL (employee sessions get it automatically at launch) or pass attribution_model explicitly. It is NOT guessed: a wrong model on the record is worse than no record at all, because it points at the wrong suspect.";
|
|
66
|
+
function resolveAttribution(purpose, input = {}) {
|
|
67
|
+
const stated = input.agent?.trim() ?? "";
|
|
68
|
+
let observed = "";
|
|
69
|
+
try {
|
|
70
|
+
observed = getActiveAgent().agentId?.trim() ?? "";
|
|
71
|
+
} catch {
|
|
72
|
+
observed = "";
|
|
73
|
+
}
|
|
74
|
+
let agent;
|
|
75
|
+
if (purpose === "verdict") {
|
|
76
|
+
const observedIsReal = observed !== "" && !isUnresolvedIdentity(observed);
|
|
77
|
+
if (observedIsReal && stated && stated.toLowerCase() !== observed.toLowerCase()) {
|
|
78
|
+
return {
|
|
79
|
+
ok: false,
|
|
80
|
+
code: "attribution_agent_conflict",
|
|
81
|
+
message: `Refused locally [attribution_agent_conflict]: attribution_agent was given as "${stated}", but this session resolves to "${observed}". A verdict is signed by whoever actually made it \u2014 attribution_agent is a fallback for a session that cannot observe its own identity (the MCP daemon), not a way to record the call under another employee's name. Omit attribution_agent to sign as "${observed}", or make the call from that employee's session.`
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
agent = observedIsReal ? observed : stated;
|
|
85
|
+
} else {
|
|
86
|
+
agent = stated || observed;
|
|
87
|
+
}
|
|
88
|
+
if (purpose === "verdict" && isUnresolvedIdentity(agent)) {
|
|
89
|
+
agent = "";
|
|
90
|
+
}
|
|
91
|
+
if (!agent) {
|
|
92
|
+
const message = purpose === "verdict" ? "Refused locally [attribution_agent_missing]: could not resolve which agent is producing this verdict, and it will not be invented. The MCP tools run in the launchd daemon, which carries no active-agent marker, no tmux session and no AGENT_ID, so the session identity is not observable from there. Pass attribution_agent with your own employee name exactly as it appears in the roster \u2014 never a role like 'admin'." : `Refused locally [attribution_agent_missing]: could not resolve which agent is producing this ${purpose}, and it will not be invented. Restore the active-agent marker or set AGENT_ID to your real employee name.`;
|
|
93
|
+
return {
|
|
94
|
+
ok: false,
|
|
95
|
+
code: "attribution_agent_missing",
|
|
96
|
+
// Every refusal out of this function names its machine-stable code in the message,
|
|
97
|
+
// including the ones below that come back from `assessAttribution`. A caller only
|
|
98
|
+
// ever sees the message, so a code that appears in some refusals and not others is
|
|
99
|
+
// a code the caller cannot rely on.
|
|
100
|
+
message
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const model = input.model?.trim() || resolveModelFromEnvironment();
|
|
104
|
+
if (!model) {
|
|
105
|
+
return {
|
|
106
|
+
ok: false,
|
|
107
|
+
code: "attribution_model_missing",
|
|
108
|
+
message: `Refused locally [attribution_model_missing]: could not resolve which model is producing this record. ${MODEL_HELP}`
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const observedAt = input.observed_at?.trim() || (/* @__PURE__ */ new Date()).toISOString();
|
|
112
|
+
const attribution = {
|
|
113
|
+
agent,
|
|
114
|
+
model,
|
|
115
|
+
observed_at: observedAt
|
|
116
|
+
};
|
|
117
|
+
if (purpose === "verdict") {
|
|
118
|
+
const repo = input.repo_path?.trim() || process.cwd();
|
|
119
|
+
const requested = input.evidence_ref?.trim() || "HEAD";
|
|
120
|
+
const resolved = resolveRef(requested, repo);
|
|
121
|
+
if (!resolved) {
|
|
122
|
+
return {
|
|
123
|
+
ok: false,
|
|
124
|
+
code: "attribution_evidence_ref_invalid",
|
|
125
|
+
message: `Refused locally [attribution_evidence_ref_invalid]: evidence_ref "${requested}" does not resolve to a commit in ${repo}. A verdict is only meaningful against a ref someone else can check out \u2014 name the commit you actually read; if the repository is wrong, pass repo_path for the repository that contains the commit.`
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
attribution.evidence_ref = resolved;
|
|
129
|
+
}
|
|
130
|
+
if (input.second_opinion_model || input.second_opinion_verdict) {
|
|
131
|
+
attribution.second_opinion = {
|
|
132
|
+
model: input.second_opinion_model?.trim() ?? "",
|
|
133
|
+
verdict: input.second_opinion_verdict ?? "confirmed"
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const assessed = assessAttribution(attribution, purpose);
|
|
137
|
+
if (!assessed.ok) {
|
|
138
|
+
return { ok: false, code: assessed.code, message: `Refused locally [${assessed.code}]: ${assessed.message}` };
|
|
139
|
+
}
|
|
140
|
+
return { ok: true, attribution };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// src/lib/support-verification-input.ts
|
|
30
144
|
function isVerifiedStatus(status) {
|
|
31
145
|
return status === "fixed" || status === "closed";
|
|
32
146
|
}
|
|
33
147
|
var verificationArtifactInputSchema = {
|
|
34
|
-
verification_kind: z.enum(["regression_test", "manual"]).optional().describe(
|
|
35
|
-
"REQUIRED to set status=fixed or closed. 'regression_test' when you actually RAN a test that fails at the parent commit and passes at the fix. 'manual' when a named person reproduced the original defect and confirmed it is gone."
|
|
148
|
+
verification_kind: z.enum(["regression_test", "manual", "ops_transcript"]).optional().describe(
|
|
149
|
+
"REQUIRED to set status=fixed or closed (unless closing with a non-'fixed' disposition). 'regression_test' when you actually RAN a test that fails at the parent commit and passes at the fix. 'manual' when a named person reproduced the original defect and confirmed it is gone. 'ops_transcript' when the defect was settled by running commands against a live system and there is no commit (CI state, a VPS config edit, an ops confirmation)."
|
|
150
|
+
),
|
|
151
|
+
defect_layer: z.enum(["production", "test_harness"]).optional().describe(
|
|
152
|
+
"Where the DEFECT lives. Omit for the normal case (production source). Declare 'test_harness' ONLY when the filed defect IS the test/harness \u2014 a flaky fixture, a leaked singleton, a test that spawns a hook wrong \u2014 so that a production diff would be the WRONG fix. This costs MORE evidence, not less: it additionally requires regression_test_id and reverted_result. It is NOT a way past a refused substance check; if your fix was supposed to change production code and did not, the honest answer is that it is not finished."
|
|
153
|
+
),
|
|
154
|
+
reverted_result: z.enum(["fail", "pass", "error"]).optional().describe(
|
|
155
|
+
"defect_layer=test_harness only: the result you OBSERVED re-running the named test with the fix reverted. Must be 'fail' \u2014 a test-only diff that does not go red when removed evidences nothing."
|
|
156
|
+
),
|
|
157
|
+
claim_type: z.enum(["point_in_time", "ongoing_state"]).optional().describe(
|
|
158
|
+
"ops_transcript only. 'point_in_time' for a fact true when observed (a config now routes correctly). 'ongoing_state' for a claim that a condition HOLDS (an agent is reporting, CI is green) \u2014 that requires at least two probes taken at two distinct times, because one sample cannot evidence a continuing condition."
|
|
159
|
+
),
|
|
160
|
+
ops_probes: z.string().optional().describe(
|
|
161
|
+
`ops_transcript only. JSON array of probes, each {"command","output","host","ran_at"}. VERBATIM: the command as typed, its real output, the host/system it ran against, and an ISO timestamp. Summaries are refused \u2014 'checked the VPS and it looks fine' is not a probe.`
|
|
36
162
|
),
|
|
37
163
|
fix_commit: supportCommitSchema.optional().describe("SHA of the merged commit containing the fix. Its diff is measured locally \u2014 a comment-only or test-only commit is refused."),
|
|
38
164
|
repo_path: z.string().optional().describe("Absolute path to the repository containing fix_commit. Required when the fix landed outside the current working repo (e.g. exe-gateway, exe-crm). Defaults to the current directory."),
|
|
39
165
|
regression_test_id: z.string().optional().describe("regression_test only: the test that detects the defect, e.g. 'tests/raw-event-backlog.test.ts::counts unprocessed events'."),
|
|
40
166
|
parent_result: z.enum(["fail", "pass", "error"]).optional().describe("regression_test only: the result you OBSERVED running that test at the parent commit. Must be 'fail' \u2014 a test that already passed does not detect the defect."),
|
|
41
167
|
fix_result: z.enum(["fail", "pass", "error"]).optional().describe("regression_test only: the result you OBSERVED running that test at the fix commit. Must be 'pass'."),
|
|
42
|
-
verifier: z.string().optional().describe("manual
|
|
168
|
+
verifier: z.string().optional().describe("manual and ops_transcript: the identity of the person or employee who confirmed the defect is gone. Checked server-side against the bug's filer and assignee \u2014 it may not be either. Placeholders ('me', 'agent') are refused."),
|
|
169
|
+
disposition: z.enum(["fixed", "not_a_defect", "superseded", "wontfix"]).optional().describe(
|
|
170
|
+
"WHY the record is closing. Omit (or 'fixed') for the normal case: a defect was repaired, and a verification artifact is required. Use 'not_a_defect' when there was nothing to fix (a smoke-test record, a misfiled report), 'superseded' when another record covers it, 'wontfix' when it is a deliberate decline. Those three require NO fix_commit but DO require disposition_reason \u2014 and they are recorded as closed, not as fixed, because asserting a repair that never happened is its own kind of false record."
|
|
171
|
+
),
|
|
172
|
+
disposition_reason: z.string().optional().describe(
|
|
173
|
+
"REQUIRED for any disposition other than 'fixed': what makes this record a non-defect. Explain the call \u2014 a bare label or a hedge is refused."
|
|
174
|
+
),
|
|
175
|
+
superseded_by: z.string().optional().describe("REQUIRED for disposition='superseded': the id of the record that replaces this one, so the claim is checkable."),
|
|
176
|
+
superseded_coverage: z.string().optional().describe(
|
|
177
|
+
`REQUIRED for disposition='superseded': JSON array of {"id","evidence"} \u2014 one entry per declared symptom, each naming where the superseding record covers it. PARTIAL COVERAGE SUPERSEDES NOTHING: if the other record covers three of five symptoms, the honest outcome is to keep this record open with the two survivors as its remaining scope, not to close it. The refusal names the survivors.`
|
|
178
|
+
),
|
|
179
|
+
symptoms: z.string().optional().describe(
|
|
180
|
+
`JSON array of the distinct defects this record claims, as ids or {"id"} objects. Required to close as 'superseded' so coverage can be checked one by one.`
|
|
181
|
+
),
|
|
182
|
+
observed_at: z.string().optional().describe(
|
|
183
|
+
"ISO timestamp of when you actually READ the evidence. Defaults to now. Set it explicitly when the evidence was observed earlier than this call."
|
|
184
|
+
),
|
|
185
|
+
evidence_ref: z.string().optional().describe(
|
|
186
|
+
"The git ref you read the evidence at (defaults to HEAD of repo_path, resolved locally and refused if it does not exist). main moves several times a day, so a verdict against an unnamed ref cannot be reproduced."
|
|
187
|
+
),
|
|
188
|
+
attribution_agent: z.string().optional().describe(
|
|
189
|
+
"The employee identity producing this verdict \u2014 your own name as it appears in the roster. Normally OMITTED: it is resolved from the session's active-agent marker. Supply it when the call is made through the MCP daemon (which has no marker, no tmux and no AGENT_ID and would otherwise sign the record 'default') or from a harness. It is never guessed, and a role ('admin', 'agent', 'support') is refused \u2014 the whole point is that a verdict can be traced to someone."
|
|
190
|
+
),
|
|
191
|
+
attribution_model: z.string().optional().describe(
|
|
192
|
+
"The model producing this verdict, e.g. 'claude-opus-5'. Normally OMITTED: it is read from ANTHROPIC_MODEL, which employee launches set automatically. Supply it only when the session carries no such variable \u2014 a session launched outside the employee router, or a harness. It is still never guessed: omit it with no environment model and the close is refused, naming the variable."
|
|
193
|
+
),
|
|
194
|
+
second_opinion_model: z.string().optional().describe("Optional adversarial review: the OTHER model that checked this verdict. Must differ from the model producing it."),
|
|
195
|
+
second_opinion_verdict: z.enum(["confirmed", "refuted"]).optional().describe("Optional adversarial review: what the second model concluded. A 'refuted' verdict cannot be closed over."),
|
|
196
|
+
disposition_verifier: z.string().optional().describe(
|
|
197
|
+
"REQUIRED for disposition='not_a_defect' or 'superseded': a named identity, not the record's filer or assignee, who agrees that what was filed is not a defect. Same identity rule as a manual verification."
|
|
198
|
+
),
|
|
43
199
|
verification_method: z.string().optional().describe("manual only: how it was verified, in enough detail for someone else to repeat it."),
|
|
44
200
|
verification_observation: z.string().optional().describe("manual only: what was observed that shows the DEFECT IS ABSENT \u2014 not what the change did. 'It is fixed' is refused."),
|
|
45
201
|
delivery_proof: z.string().optional().describe('Optional JSON delivery declaration, e.g. {"channel":"npm","version":"0.9.364","tarball_shasum":"\u2026","fix_path_published":true}. Recorded, not required \u2014 delivery does not gate closing. A declaration that is present must still be true.')
|
|
46
202
|
};
|
|
203
|
+
function buildVerdictAttribution(input) {
|
|
204
|
+
return resolveAttribution("verdict", {
|
|
205
|
+
agent: input.attribution_agent,
|
|
206
|
+
model: input.attribution_model,
|
|
207
|
+
observed_at: input.observed_at,
|
|
208
|
+
evidence_ref: input.evidence_ref,
|
|
209
|
+
repo_path: input.repo_path,
|
|
210
|
+
second_opinion_model: input.second_opinion_model,
|
|
211
|
+
second_opinion_verdict: input.second_opinion_verdict
|
|
212
|
+
});
|
|
213
|
+
}
|
|
47
214
|
var NO_ARTIFACT_HELP = [
|
|
48
215
|
"Refused locally: setting status=fixed or closed requires evidence that the defect is ABSENT.",
|
|
49
216
|
"",
|
|
@@ -58,33 +225,94 @@ var NO_ARTIFACT_HELP = [
|
|
|
58
225
|
"The fix commit's diff is measured from the repository; substance is never taken from the caller.",
|
|
59
226
|
"If you have not verified the defect is absent, do not close it \u2014 record what you found with notes instead."
|
|
60
227
|
].join("\n");
|
|
228
|
+
var ATTRIBUTION_REQUIRED_HELP = [
|
|
229
|
+
"Refused locally [attribution_missing]: a close carries WHO made the call, with WHAT model, at WHICH commit \u2014 and it did not resolve here, so it will not be sent unattributed for the server to refuse with an opaque 422.",
|
|
230
|
+
"",
|
|
231
|
+
"Supply the parts that could not be resolved from this session:",
|
|
232
|
+
" attribution_agent \u2014 your real employee name (the MCP daemon has no session identity to read).",
|
|
233
|
+
" attribution_model \u2014 the model producing this verdict, e.g. 'claude-opus-5'.",
|
|
234
|
+
" evidence_ref / repo_path \u2014 the commit you actually read the evidence at, in the repo it lives in.",
|
|
235
|
+
"",
|
|
236
|
+
"None of these are guessed: a verdict signed with the wrong agent or model is a record pointing at the wrong suspect."
|
|
237
|
+
].join("\n");
|
|
238
|
+
function assertVerdictAttribution(status, resolved) {
|
|
239
|
+
if (!isVerifiedStatus(status) || !resolved.ok || resolved.attribution) return { ok: true };
|
|
240
|
+
return { ok: false, message: ATTRIBUTION_REQUIRED_HELP };
|
|
241
|
+
}
|
|
61
242
|
function resolveVerificationArtifact(status, input, context = {}) {
|
|
62
243
|
if (!isVerifiedStatus(status)) return { ok: true };
|
|
244
|
+
const disposition = input.disposition ?? "fixed";
|
|
245
|
+
if (disposition !== "fixed") {
|
|
246
|
+
const assessed = assessDisposition(disposition, {
|
|
247
|
+
status: typeof status === "string" ? status : "closed",
|
|
248
|
+
disposition,
|
|
249
|
+
disposition_reason: input.disposition_reason,
|
|
250
|
+
superseded_by: input.superseded_by,
|
|
251
|
+
disposition_verifier: input.disposition_verifier,
|
|
252
|
+
superseded_coverage: input.superseded_coverage,
|
|
253
|
+
symptoms: input.symptoms,
|
|
254
|
+
context
|
|
255
|
+
});
|
|
256
|
+
if (!assessed.ok) return { ok: false, message: `Refused locally [${assessed.code}]: ${assessed.message}` };
|
|
257
|
+
const dispositionAttribution = buildVerdictAttribution(input);
|
|
258
|
+
if (!dispositionAttribution.ok) return { ok: false, message: dispositionAttribution.message };
|
|
259
|
+
return { ok: true, attribution: dispositionAttribution.attribution };
|
|
260
|
+
}
|
|
63
261
|
if (!input.verification_kind && !input.fix_commit) {
|
|
64
262
|
return { ok: false, message: NO_ARTIFACT_HELP };
|
|
65
263
|
}
|
|
66
264
|
if (!input.verification_kind) {
|
|
67
|
-
return { ok: false, message: "verification_kind is required (regression_test or
|
|
265
|
+
return { ok: false, message: "verification_kind is required (regression_test, manual or ops_transcript) when setting status=fixed or closed." };
|
|
68
266
|
}
|
|
69
|
-
if (!input.fix_commit) {
|
|
267
|
+
if (!input.fix_commit && input.verification_kind !== "ops_transcript") {
|
|
70
268
|
return { ok: false, message: "fix_commit is required when setting status=fixed or closed \u2014 the diff is measured, not described." };
|
|
71
269
|
}
|
|
270
|
+
let probes;
|
|
271
|
+
if (input.verification_kind === "ops_transcript") {
|
|
272
|
+
const parsed = parseOpsProbes(input.ops_probes);
|
|
273
|
+
if (!parsed.ok) return { ok: false, message: parsed.message };
|
|
274
|
+
probes = parsed.probes;
|
|
275
|
+
}
|
|
72
276
|
const request = {
|
|
73
277
|
kind: input.verification_kind,
|
|
74
|
-
fix_commit: input.fix_commit,
|
|
278
|
+
fix_commit: input.fix_commit ?? "",
|
|
75
279
|
repo_path: input.repo_path?.trim() || process.cwd(),
|
|
76
280
|
test_id: input.regression_test_id,
|
|
77
281
|
parent_result: input.parent_result,
|
|
78
282
|
fix_result: input.fix_result,
|
|
79
283
|
verifier: input.verifier,
|
|
80
284
|
method: input.verification_method,
|
|
81
|
-
observation: input.verification_observation
|
|
285
|
+
observation: input.verification_observation,
|
|
286
|
+
defect_layer: input.defect_layer,
|
|
287
|
+
reverted_result: input.reverted_result,
|
|
288
|
+
claim_type: input.claim_type,
|
|
289
|
+
probes
|
|
82
290
|
};
|
|
83
291
|
const built = buildVerificationArtifact(request, context);
|
|
84
292
|
if (!built.ok) {
|
|
85
293
|
return { ok: false, message: `Refused locally [${built.code}]: ${built.message}` };
|
|
86
294
|
}
|
|
87
|
-
|
|
295
|
+
const attribution = buildVerdictAttribution(input);
|
|
296
|
+
if (!attribution.ok) return { ok: false, message: attribution.message };
|
|
297
|
+
return { ok: true, artifact: built.artifact, attribution: attribution.attribution };
|
|
298
|
+
}
|
|
299
|
+
function parseOpsProbes(raw) {
|
|
300
|
+
if (raw === void 0 || !raw.trim()) {
|
|
301
|
+
return {
|
|
302
|
+
ok: false,
|
|
303
|
+
message: "ops_probes is required for verification_kind='ops_transcript': a JSON array of {command, output, host, ran_at}, all verbatim."
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
let parsed;
|
|
307
|
+
try {
|
|
308
|
+
parsed = JSON.parse(raw);
|
|
309
|
+
} catch {
|
|
310
|
+
return { ok: false, message: "ops_probes must be valid JSON: an array of {command, output, host, ran_at}." };
|
|
311
|
+
}
|
|
312
|
+
if (!Array.isArray(parsed) || parsed.length === 0) {
|
|
313
|
+
return { ok: false, message: "ops_probes must be a non-empty JSON array of {command, output, host, ran_at}." };
|
|
314
|
+
}
|
|
315
|
+
return { ok: true, probes: parsed };
|
|
88
316
|
}
|
|
89
317
|
function parseDeliveryProof(raw) {
|
|
90
318
|
if (raw === void 0 || !raw.trim()) return { ok: true };
|
|
@@ -336,8 +564,9 @@ function registerTriageBugReport(server) {
|
|
|
336
564
|
},
|
|
337
565
|
async ({ id, status, triage_notes, add_note, linked_task_id, linked_commit, fixed_version, product, ...verification }) => {
|
|
338
566
|
const bugUrl = `${endpoint()}/${encodeURIComponent(sanitizeUpstreamId(id))}`;
|
|
567
|
+
const attestsByIdentity = verification.verification_kind === "manual" || verification.verification_kind === "ops_transcript" || verification.disposition !== void 0 && verification.disposition !== "fixed";
|
|
339
568
|
let authorIdentities = [];
|
|
340
|
-
if (isVerifiedStatus(status) &&
|
|
569
|
+
if (isVerifiedStatus(status) && attestsByIdentity) {
|
|
341
570
|
try {
|
|
342
571
|
const row = await requestJson(bugUrl);
|
|
343
572
|
authorIdentities = [row?.agent_id, row?.license_email];
|
|
@@ -348,6 +577,10 @@ function registerTriageBugReport(server) {
|
|
|
348
577
|
if (!resolved.ok) {
|
|
349
578
|
return { isError: true, content: [{ type: "text", text: resolved.message }] };
|
|
350
579
|
}
|
|
580
|
+
const attribution = assertVerdictAttribution(status, resolved);
|
|
581
|
+
if (!attribution.ok) {
|
|
582
|
+
return { isError: true, content: [{ type: "text", text: attribution.message }] };
|
|
583
|
+
}
|
|
351
584
|
const delivery = parseDeliveryProof(verification.delivery_proof);
|
|
352
585
|
if (!delivery.ok) {
|
|
353
586
|
return { isError: true, content: [{ type: "text", text: delivery.message }] };
|
|
@@ -363,7 +596,17 @@ function registerTriageBugReport(server) {
|
|
|
363
596
|
fixed_version,
|
|
364
597
|
product,
|
|
365
598
|
verification_artifact: resolved.artifact,
|
|
366
|
-
delivery_proof: delivery.value
|
|
599
|
+
delivery_proof: delivery.value,
|
|
600
|
+
// The disposition travels with the close: the server gates on it, and stores
|
|
601
|
+
// it so the record reads as "closed because there was nothing to fix" rather
|
|
602
|
+
// than as an unexplained close.
|
|
603
|
+
disposition: verification.disposition,
|
|
604
|
+
disposition_reason: verification.disposition_reason,
|
|
605
|
+
superseded_by: verification.superseded_by,
|
|
606
|
+
disposition_verifier: verification.disposition_verifier,
|
|
607
|
+
superseded_coverage: verification.superseded_coverage,
|
|
608
|
+
symptoms: verification.symptoms,
|
|
609
|
+
attribution: resolved.attribution
|
|
367
610
|
}, "support-inbox:triage_bug")
|
|
368
611
|
});
|
|
369
612
|
const response = fixed_version && !status ? withStatusNotice(
|
|
@@ -521,7 +764,9 @@ function registerTriageReview(server) {
|
|
|
521
764
|
}
|
|
522
765
|
|
|
523
766
|
export {
|
|
767
|
+
resolveAttribution,
|
|
524
768
|
verificationArtifactInputSchema,
|
|
769
|
+
assertVerdictAttribution,
|
|
525
770
|
resolveVerificationArtifact,
|
|
526
771
|
parseDeliveryProof,
|
|
527
772
|
registerListBugReports,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EXE_AI_DIR
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZIG7VPJV.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/worker-gate.ts
|
|
6
6
|
import { readdirSync, writeFileSync, unlinkSync, mkdirSync, existsSync, readFileSync } from "fs";
|
|
@@ -119,7 +119,7 @@ function releaseBackfillLock() {
|
|
|
119
119
|
}
|
|
120
120
|
async function getTaskAwareCapacity() {
|
|
121
121
|
const { getClient } = await import("./lib/database.js");
|
|
122
|
-
const { sessionScopeFilter } = await import("./task-scope-
|
|
122
|
+
const { sessionScopeFilter } = await import("./task-scope-ERVEUEYU.js");
|
|
123
123
|
const client = getClient();
|
|
124
124
|
const scope = sessionScopeFilter();
|
|
125
125
|
const result = await client.execute({
|
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import "./chunk-
|
|
2
|
+
import "./chunk-LGS2V2XD.js";
|
|
3
3
|
import {
|
|
4
4
|
isGarbageEntity
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-Z6BZQHP5.js";
|
|
5
|
+
} from "./chunk-ULIBLJ6W.js";
|
|
7
6
|
import "./chunk-GUMRIUI5.js";
|
|
7
|
+
import "./chunk-Z6BZQHP5.js";
|
|
8
8
|
import "./chunk-VGMACSEV.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-VZAFWPAY.js";
|
|
10
10
|
import "./chunk-CHCA3ZM2.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-DN4YVV4Z.js";
|
|
12
12
|
import {
|
|
13
13
|
fastDbInit
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-M4IRPXSZ.js";
|
|
15
15
|
import "./chunk-5MOYSU5A.js";
|
|
16
16
|
import "./chunk-4QCFFW2H.js";
|
|
17
17
|
import "./chunk-76CJBM36.js";
|
|
18
18
|
import {
|
|
19
19
|
getClient
|
|
20
|
-
} from "./chunk-
|
|
21
|
-
import "./chunk-TKDITWDN.js";
|
|
20
|
+
} from "./chunk-TAMDAOCU.js";
|
|
22
21
|
import "./chunk-BBMTVAE3.js";
|
|
22
|
+
import "./chunk-TKDITWDN.js";
|
|
23
23
|
import "./chunk-5YEUPUV4.js";
|
|
24
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-DSJI76XL.js";
|
|
25
25
|
import "./chunk-YYB5PMTK.js";
|
|
26
26
|
import "./chunk-NJFJWQNN.js";
|
|
27
27
|
import "./chunk-V3W3SATA.js";
|
|
28
28
|
import "./chunk-JY5GAZYC.js";
|
|
29
29
|
import "./chunk-FXU7JOXK.js";
|
|
30
|
-
import "./chunk-
|
|
30
|
+
import "./chunk-ZIG7VPJV.js";
|
|
31
31
|
import "./chunk-HSGBZSCA.js";
|
|
32
|
+
import "./chunk-RH4AH3YB.js";
|
|
32
33
|
import {
|
|
33
34
|
isMainModule
|
|
34
35
|
} from "./chunk-6Y4B3QF6.js";
|
|
@@ -23,7 +23,7 @@ async function runCloudSyncCli() {
|
|
|
23
23
|
const { getMasterKey } = await import("./lib/keychain.js");
|
|
24
24
|
const { initSyncCrypto } = await import("./lib/crypto.js");
|
|
25
25
|
const { assertCloudSyncReachable, withTimeout } = await import("./bin/exe-cloud.js");
|
|
26
|
-
const { runCloudSyncShutdown } = await import("./cloud-sync-shutdown-
|
|
26
|
+
const { runCloudSyncShutdown } = await import("./cloud-sync-shutdown-BNALPWGX.js");
|
|
27
27
|
const { disconnectClient } = await import("./lib/exe-daemon-client.js");
|
|
28
28
|
let shuttingDown = false;
|
|
29
29
|
const handleShutdown = (signal) => {
|
|
@@ -48,7 +48,7 @@ async function runCloudSyncCli() {
|
|
|
48
48
|
const { initPostgresOnlyDatabase } = await import("./lib/database.js");
|
|
49
49
|
await initPostgresOnlyDatabase();
|
|
50
50
|
} else {
|
|
51
|
-
const { initCloudSyncDatabase } = await import("./cloud-sync-db-init-
|
|
51
|
+
const { initCloudSyncDatabase } = await import("./cloud-sync-db-init-V2LWIUQU.js");
|
|
52
52
|
await initCloudSyncDatabase();
|
|
53
53
|
}
|
|
54
54
|
const masterKey = await getMasterKey();
|