@askexenow/exe-os 0.9.359 → 0.9.362
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/docker-compose.yml +7 -1
- package/deploy/compose/generate-env.ts +23 -4
- package/deploy/compose/sso-edge/default.conf.template +35 -0
- package/deploy/compose/sso-edge/sso-redirect.conf +23 -2
- package/deploy/stack-manifests/v0.9.json +228 -2
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-DMKNHGSG.js → active-agent-3FV5V7SS.js} +9 -8
- package/dist/{active-agent-Y3DCBD7J.js → active-agent-BPNEBKHI.js} +9 -8
- package/dist/{agentic-ontology-3233PNKV.js → agentic-ontology-RCVCJ6WB.js} +1 -1
- package/dist/{backfill-gate-DA7UT6UD.js → backfill-gate-LRX77SUD.js} +3 -2
- package/dist/{backfill-metadata-4DS4A5U3.js → backfill-metadata-Y3DGVCK5.js} +12 -11
- package/dist/{background-jobs-XGTLESKM.js → background-jobs-Z6KHCWES.js} +3 -2
- package/dist/{backup-verify-JNYKXIU2.js → backup-verify-TZPPUCLU.js} +5 -4
- package/dist/{behavior-injection-CGAMI552.js → behavior-injection-JMGGWCWG.js} +21 -13
- package/dist/{behaviors-57AMN5IP.js → behaviors-TT6CMEKC.js} +20 -12
- package/dist/bin/age-ontology-load.js +3 -2
- package/dist/bin/agentic-ontology-backfill.js +14 -13
- package/dist/bin/agentic-reflection-backfill.js +15 -14
- package/dist/bin/agentic-semantic-label.js +14 -13
- package/dist/bin/backfill-conversations.js +16 -14
- package/dist/bin/backfill-responses.js +16 -14
- package/dist/bin/backfill-vectors.js +20 -18
- package/dist/bin/bulk-sync-postgres.js +27 -24
- package/dist/bin/cc-doctor.js +13 -11
- package/dist/bin/cleanup-stale-review-tasks.js +31 -28
- package/dist/bin/cli.js +157 -47
- package/dist/bin/customer-readiness.js +10 -1
- package/dist/bin/deferred-daemon-restart.js +127 -104
- package/dist/bin/exe-agent-config.js +9 -8
- package/dist/bin/exe-agent.js +17 -16
- package/dist/bin/exe-assign.js +18 -16
- package/dist/bin/exe-boot.js +62 -49
- package/dist/bin/exe-call.js +10 -9
- package/dist/bin/exe-cloud.js +29 -26
- package/dist/bin/exe-config-dump.js +9 -8
- package/dist/bin/exe-dispatch.js +31 -28
- package/dist/bin/exe-doctor.js +14 -10
- package/dist/bin/exe-export-behaviors.js +22 -14
- package/dist/bin/exe-forget.js +14 -13
- package/dist/bin/exe-gateway.js +13 -12
- package/dist/bin/exe-grant.js +6 -6
- package/dist/bin/exe-healthcheck.js +13 -11
- package/dist/bin/exe-heartbeat.js +33 -30
- package/dist/bin/exe-kill.js +36 -33
- package/dist/bin/exe-launch-agent.js +126 -44
- package/dist/bin/exe-mcp.js +165 -1
- package/dist/bin/exe-memory-reads.js +12 -11
- package/dist/bin/exe-new-employee.js +20 -17
- package/dist/bin/exe-os-mcp-proxy.js +9 -8
- package/dist/bin/exe-pending-messages.js +32 -29
- package/dist/bin/exe-pending-notifications.js +31 -28
- package/dist/bin/exe-pending-reviews.js +31 -28
- package/dist/bin/exe-preflight.js +1 -1
- package/dist/bin/exe-rename.js +10 -9
- package/dist/bin/exe-review.js +35 -32
- package/dist/bin/exe-search.js +13 -12
- package/dist/bin/exe-session-cleanup.js +36 -33
- package/dist/bin/exe-settings.js +28 -25
- package/dist/bin/exe-start-codex.js +27 -19
- package/dist/bin/exe-start-opencode.js +23 -15
- package/dist/bin/exe-start.sh +11 -7
- package/dist/bin/exe-status.js +32 -29
- package/dist/bin/exe-support.js +5 -4
- package/dist/bin/exe-team.js +9 -8
- package/dist/bin/exe-watchdog.js +115 -30
- package/dist/bin/git-sweep.js +32 -29
- package/dist/bin/graph-backfill.js +14 -13
- package/dist/bin/graph-export.js +13 -12
- package/dist/bin/import-history.js +16 -15
- package/dist/bin/install.js +392 -201
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +10 -9
- package/dist/bin/postgres-agentic-reflection-backfill.js +5 -4
- package/dist/bin/postgres-agentic-semantic-backfill.js +4 -3
- package/dist/bin/reconcile-backlog.js +2 -2
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/scan-tasks.js +31 -28
- package/dist/bin/setup.js +7 -4
- package/dist/bin/shard-migrate.js +13 -12
- package/dist/bin/stack-update.js +45 -14
- package/dist/bin/update.js +4 -3
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-4D3CTT7X.js → boot-generation-XABYKF5P.js} +9 -8
- package/dist/{boot-review-sections-NDFE5443.js → boot-review-sections-2X5TFIGU.js} +30 -27
- package/dist/{branch-hygiene-HNSOUDJE.js → branch-hygiene-Z4IBWAOX.js} +2 -1
- package/dist/{branding-6FHWZQYQ.js → branding-7MZDHTKN.js} +3 -2
- package/dist/build-manifest.json +1249 -1069
- package/dist/{capability-cards-OBB7BMMX.js → capability-cards-O5UXDOOA.js} +8 -7
- package/dist/{capacity-monitor-QLPEL6S5.js → capacity-monitor-IPXM726A.js} +32 -29
- package/dist/{catchup-brief-EN7QR6MP.js → catchup-brief-EBIGDXOK.js} +36 -33
- package/dist/{chunk-WRP5AG4D.js → chunk-23KWUA7Z.js} +2 -2
- package/dist/{chunk-PDRIIEFV.js → chunk-2FA4PYYX.js} +1 -1
- package/dist/chunk-2PRAXZWM.js +261 -0
- package/dist/{chunk-R6LNQAUG.js → chunk-327Q53AS.js} +34 -1
- package/dist/{chunk-MBULOZJF.js → chunk-32FEF5BW.js} +2 -2
- package/dist/{chunk-2YGAKBRG.js → chunk-35FD67ZB.js} +3 -3
- package/dist/{chunk-R62ITJDQ.js → chunk-3C7NE4JE.js} +1 -1
- package/dist/{chunk-YBX3G5OP.js → chunk-3ICF4IAZ.js} +1 -1
- package/dist/{chunk-CVTWQZOR.js → chunk-3L2QU5ZF.js} +14 -2
- package/dist/{chunk-I5AVZOL2.js → chunk-3YBJ36UX.js} +2 -2
- package/dist/{chunk-NKDKB2RT.js → chunk-465RCKVI.js} +6 -6
- package/dist/{chunk-QROIFRKI.js → chunk-4AFD4R35.js} +5 -5
- package/dist/{chunk-OSID72CN.js → chunk-4L33OFU4.js} +25 -1
- package/dist/{chunk-A6VIK3SS.js → chunk-4P2BFNSB.js} +2 -2
- package/dist/{chunk-SIGAQQHW.js → chunk-4R2WD6T3.js} +2 -2
- package/dist/{chunk-HPHF5VTT.js → chunk-4U56FZ7B.js} +4 -4
- package/dist/{chunk-2KLVTRY2.js → chunk-54USDN5Q.js} +1 -1
- package/dist/{chunk-CAEWPEBA.js → chunk-5C6ZIJ7J.js} +1 -1
- package/dist/{chunk-46RPEWTH.js → chunk-5H3RHWRE.js} +1 -1
- package/dist/chunk-5OPAUFLP.js +126 -0
- package/dist/{chunk-EHM4E62N.js → chunk-6DTALXOA.js} +1 -1
- package/dist/chunk-6EM6USV7.js +1332 -0
- package/dist/{chunk-JE34CB5H.js → chunk-6N3HUOV3.js} +2 -2
- package/dist/{chunk-6KREY2Q7.js → chunk-6QJXFLNN.js} +5 -5
- package/dist/{chunk-G37RG543.js → chunk-6UZDGEGQ.js} +1 -1
- package/dist/{chunk-APR556TY.js → chunk-6Y3KUO7Q.js} +190 -29
- package/dist/{chunk-2EAYZ3BK.js → chunk-7H3AZNQ7.js} +9 -9
- package/dist/{chunk-C5YZMYQH.js → chunk-7SY2NOMQ.js} +1 -1
- package/dist/{chunk-OAYTQ4RY.js → chunk-AL4HXKDJ.js} +55 -12
- package/dist/{chunk-VY5VU7SX.js → chunk-AOMFYUPT.js} +2 -2
- package/dist/{chunk-EX2SSLNU.js → chunk-AQO3BT3I.js} +12 -12
- package/dist/chunk-ARX6TAGN.js +102 -0
- package/dist/chunk-B6PFGUYJ.js +159 -0
- package/dist/{chunk-FASR2WLT.js → chunk-BDLRTLXY.js} +1 -1
- package/dist/chunk-BJEQBKGH.js +218 -0
- package/dist/{chunk-BCZF3AGJ.js → chunk-BRIZ6OZ3.js} +34 -44
- package/dist/{chunk-OMXJMOBD.js → chunk-BRZR76TS.js} +66 -0
- package/dist/{chunk-XV42EAVK.js → chunk-BT2PUK3S.js} +1 -1
- package/dist/{chunk-6EOLGE7T.js → chunk-CVYDJ2TW.js} +1 -1
- package/dist/{chunk-WCP4OQUL.js → chunk-CXQ724WH.js} +2 -2
- package/dist/{chunk-F3QTF4T7.js → chunk-CY5NVDTH.js} +3 -3
- package/dist/{chunk-3ODATKWH.js → chunk-D5CY4E7I.js} +1 -1
- package/dist/{chunk-W5YV2PZE.js → chunk-DKRDU2AX.js} +16 -16
- package/dist/{chunk-SNWV44E5.js → chunk-DSKEYEL2.js} +12 -5
- package/dist/{chunk-VXL7PJ56.js → chunk-E3YI6FVJ.js} +5 -24
- package/dist/{chunk-6SK4MM5B.js → chunk-E7PL3T2U.js} +1 -1
- package/dist/{chunk-IOEUAQWP.js → chunk-EEZOBN6X.js} +1 -1
- package/dist/{chunk-AHMUF6RO.js → chunk-G2M7WQ2M.js} +0 -2
- package/dist/{chunk-SKGMF2SO.js → chunk-GBNB4EWD.js} +22 -1
- package/dist/{chunk-UZ5RJYL3.js → chunk-HAXCUCJC.js} +1 -1
- package/dist/{chunk-VMR6M6GN.js → chunk-HISFWAAK.js} +1 -1
- package/dist/{chunk-DKRSKC5R.js → chunk-HKQ7UTSE.js} +1 -1
- package/dist/chunk-HLQ4MS42.js +257 -0
- package/dist/{chunk-EA5FVACM.js → chunk-HLU52KTO.js} +29 -18
- package/dist/{chunk-QWVXN224.js → chunk-HPXFKUGU.js} +350 -65
- package/dist/{chunk-2OVTGZYH.js → chunk-HSKABJE6.js} +46 -3
- package/dist/{chunk-NE57GONM.js → chunk-I3SF6QGV.js} +1 -1
- package/dist/chunk-J6KMGEJW.js +238 -0
- package/dist/chunk-JKKZGDLP.js +182 -0
- package/dist/{chunk-3ZEVMZ4G.js → chunk-JYKZVAS6.js} +1 -1
- package/dist/{chunk-4DYJ6NOK.js → chunk-KA4WVDLX.js} +2 -2
- package/dist/{chunk-QH2XAUZ5.js → chunk-KBI4FVBZ.js} +1 -1
- package/dist/{chunk-VAY6IXWY.js → chunk-KDMVVHZH.js} +1 -1
- package/dist/{chunk-4FQIWAXA.js → chunk-KID6T2A4.js} +10 -10
- package/dist/{chunk-HNPHPGGF.js → chunk-KIKB6FY3.js} +2 -2
- package/dist/{chunk-STFR72YH.js → chunk-LCDW2HUL.js} +1 -1
- package/dist/{chunk-RFUTLZ2U.js → chunk-LG37UBBE.js} +4 -4
- package/dist/{chunk-3QWOO74G.js → chunk-LLZNPOGB.js} +97 -3
- package/dist/chunk-M67ARGXY.js +175 -0
- package/dist/chunk-MPVXHYD5.js +85 -0
- package/dist/{chunk-RXL7A7JH.js → chunk-MZYNW5OY.js} +1 -1
- package/dist/{chunk-DQ75MEPU.js → chunk-MZZN5GFC.js} +1 -1
- package/dist/{chunk-X2F6Q7TW.js → chunk-NAHCSQWT.js} +1 -1
- package/dist/{chunk-AL7JMA54.js → chunk-NE4QI2GX.js} +2 -2
- package/dist/chunk-NGDXBN3M.js +254 -0
- package/dist/{chunk-HDSDXGLV.js → chunk-NO5KHKKB.js} +1 -1
- package/dist/chunk-NOKJCF27.js +437 -0
- package/dist/{chunk-PLOEFBFW.js → chunk-O32HTNRX.js} +3 -3
- package/dist/{chunk-UPM5JP6G.js → chunk-OZNCAMS3.js} +47 -4
- package/dist/{chunk-XLEYCOHX.js → chunk-P7CV4SHQ.js} +398 -58
- package/dist/{chunk-G2KK64UB.js → chunk-PDJWHL63.js} +101 -19
- package/dist/{chunk-W3XUU36X.js → chunk-PF7EQSE5.js} +5 -5
- package/dist/{chunk-QX7RWICL.js → chunk-PU7UYQRC.js} +1 -1
- package/dist/{chunk-A5WEEND7.js → chunk-PUMH7JSB.js} +3 -3
- package/dist/{chunk-POZGQQEZ.js → chunk-PV5BIXT6.js} +1 -1
- package/dist/{chunk-TG7JYSEA.js → chunk-Q2VQNAPU.js} +5 -2
- package/dist/{chunk-Z2PAVJJ4.js → chunk-Q7J2SQJ6.js} +127 -29
- package/dist/{chunk-4JERP7NT.js → chunk-QAEWWYHL.js} +29 -1
- package/dist/{chunk-6JTKIXLU.js → chunk-QCJT265O.js} +1 -1
- package/dist/{chunk-OY2PWHYR.js → chunk-QI25QRUP.js} +2 -2
- package/dist/chunk-QILQ5FCG.js +198 -0
- package/dist/{chunk-LRETL4I3.js → chunk-QJBX3MBV.js} +3 -3
- package/dist/{chunk-57GRYGDU.js → chunk-QP53XLC5.js} +1 -1
- package/dist/{chunk-JBAMYKBL.js → chunk-QQMYD4M7.js} +1 -1
- package/dist/{chunk-SHEWTDPC.js → chunk-QY3TM2T3.js} +4 -4
- package/dist/{chunk-WA2MJGPT.js → chunk-QYRI25IP.js} +3 -3
- package/dist/{chunk-QLFN3MUW.js → chunk-RCOIKTHM.js} +1 -1
- package/dist/{chunk-ITRKRKS7.js → chunk-RFKRCVGW.js} +1 -1
- package/dist/{chunk-HK7SQDKJ.js → chunk-RNSAVQEU.js} +2 -2
- package/dist/{chunk-44WFVMZ5.js → chunk-RUUX2ZST.js} +1 -1
- package/dist/{chunk-DWKH2H7W.js → chunk-RWKX2TK5.js} +1 -1
- package/dist/{chunk-MCNDZU5W.js → chunk-RYRNY6IF.js} +2 -2
- package/dist/{chunk-5I3YC7ER.js → chunk-SC6WDF3Q.js} +2 -2
- package/dist/chunk-SLBOKYYQ.js +197 -0
- package/dist/{chunk-74R44E4S.js → chunk-SQM4ZTL2.js} +246 -96
- package/dist/{chunk-KIXNMTGC.js → chunk-SRFRUN66.js} +5 -5
- package/dist/chunk-SXKIGBNF.js +61 -0
- package/dist/chunk-T2RZU7JA.js +2607 -0
- package/dist/{chunk-2I23RPSI.js → chunk-TKDITWDN.js} +9 -0
- package/dist/{chunk-5UAMBMNR.js → chunk-TN2E6ZCM.js} +44 -34
- package/dist/{chunk-SQBNN44X.js → chunk-TP7RXGMP.js} +49 -15
- package/dist/{chunk-GSVQBBE5.js → chunk-TY4JLBFO.js} +2 -2
- package/dist/{chunk-7QRMFYOV.js → chunk-UHPMK6QZ.js} +17 -3
- package/dist/{chunk-LPKTGK7L.js → chunk-UO5QJ2RX.js} +4 -4
- package/dist/{chunk-VCCZQDCU.js → chunk-URNVIZXU.js} +3 -3
- package/dist/{chunk-OIS5VIAH.js → chunk-UWEFIIEG.js} +6 -2
- package/dist/{chunk-IQWAYXVF.js → chunk-V5I5N7NC.js} +3 -3
- package/dist/{chunk-GD7VXXW6.js → chunk-V6YLIDLK.js} +801 -180
- package/dist/chunk-VAOUB2TK.js +23 -0
- package/dist/{chunk-XVTKJEI2.js → chunk-VDMFVUSY.js} +3 -3
- package/dist/{chunk-RJ67HG2P.js → chunk-VWTUKKUF.js} +4 -4
- package/dist/{chunk-4WSUP4CC.js → chunk-W3LKIQJ2.js} +43 -17
- package/dist/{chunk-EUQF3JOH.js → chunk-WBG7XYVR.js} +1 -1
- package/dist/{chunk-YKRNH5LU.js → chunk-WH2VVEGD.js} +1 -1
- package/dist/{chunk-NP2Y7P3I.js → chunk-WP2TGH5R.js} +1 -1
- package/dist/chunk-WT4RI36X.js +23 -0
- package/dist/{chunk-LXG37RB2.js → chunk-XJIRUTGJ.js} +1 -1
- package/dist/chunk-XRCX6R5S.js +57 -0
- package/dist/{chunk-XWWNRFRF.js → chunk-XSYQ5EPE.js} +11 -11
- package/dist/{chunk-HKK7LLS5.js → chunk-XTGR3LMF.js} +34 -3
- package/dist/{chunk-HLEZ5O5P.js → chunk-XUB4GFPN.js} +17 -15
- package/dist/chunk-YZUHSV24.js +277 -0
- package/dist/{chunk-6WHYSLGF.js → chunk-Z67DIJKT.js} +1 -1
- package/dist/{chunk-6LY3QSJA.js → chunk-ZI3HA3XW.js} +11 -6
- package/dist/{chunk-YEOIPUFO.js → chunk-ZR4CQBAP.js} +1 -1
- package/dist/{chunk-VNK3MNZE.js → chunk-ZZEKOI2M.js} +1 -1
- package/dist/{cleanup-graph-garbage-XFGY4EEE.js → cleanup-graph-garbage-6F22Y5SD.js} +13 -12
- package/dist/{cloud-sync-shutdown-XCOATIJW.js → cloud-sync-shutdown-FWERMZB5.js} +8 -7
- package/dist/{co-activation-XNBLOGK3.js → co-activation-UEEDCM5U.js} +8 -7
- package/dist/{co-occurrence-HO4PGQC4.js → co-occurrence-W6OPFRSY.js} +11 -10
- package/dist/{code-context-index-5RY66SWZ.js → code-context-index-DWR6HS35.js} +7 -5
- package/dist/consent-passphrase-Z64GFJXK.js +23 -0
- package/dist/{conversation-entity-extractor-5G5DGRJU.js → conversation-entity-extractor-LWUIH3UB.js} +3 -3
- package/dist/{conversation-wiki-populator-RZKG6PK4.js → conversation-wiki-populator-5EGRW2UZ.js} +1 -1
- package/dist/{crdt-sync-6TD7LSZW.js → crdt-sync-NHJX3ZJD.js} +5 -4
- package/dist/{crm-webhook-WZAV5776.js → crm-webhook-OY467ATC.js} +2 -2
- package/dist/{cto-delegation-gate-UHMYFM4D.js → cto-delegation-gate-XH4YSQVC.js} +30 -27
- package/dist/{daemon-auth-SXZHLUYS.js → daemon-auth-OCHW2U6B.js} +3 -2
- package/dist/{daemon-orchestration-DT5M2ZAR.js → daemon-orchestration-7425ZVNH.js} +35 -32
- package/dist/{daemon-ready-56VAPZU6.js → daemon-ready-VGPSRI3Z.js} +1 -1
- package/dist/{daemon-restart-circuit-breaker-5V6B6NLS.js → daemon-restart-circuit-breaker-SMTWFX27.js} +25 -3
- package/dist/db-backend-ODVJ3Q3D.js +7 -0
- package/dist/{db-restore-events-ZLD2HRQV.js → db-restore-events-TFCZ4CPM.js} +2 -1
- package/dist/{doc-graph-extractor-FNCYPFKY.js → doc-graph-extractor-RR2VSO4W.js} +11 -10
- package/dist/{documents-GKDZDUED.js → documents-TRZ4R2ZW.js} +18 -16
- package/dist/dreaming-MAMZAPYW.js +63 -0
- package/dist/{exe-drift-QTKD2FHT.js → exe-drift-VBWB5E6S.js} +9 -8
- package/dist/{exe-export-ESJ6KP6J.js → exe-export-XJJTVVT7.js} +21 -13
- package/dist/{exe-import-N4X3GEQB.js → exe-import-G6O7JFNZ.js} +21 -13
- package/dist/{exe-key-KZCCHX3W.js → exe-key-A2WJLLTM.js} +116 -99
- package/dist/exe-org-HXF4XBB3.js +672 -0
- package/dist/{exe-snapshot-SCRPHCPZ.js → exe-snapshot-TL3TLKLR.js} +38 -33
- package/dist/{fast-db-init-6H67K76Q.js → fast-db-init-SO2XUQ7T.js} +1 -1
- package/dist/{founder-context-C7X7IRDA.js → founder-context-IOCADC66.js} +4 -3
- package/dist/{founder-monitor-envelope-DHSUMBWU.js → founder-monitor-envelope-SMILO4BT.js} +7 -5
- package/dist/gateway/index.js +23 -22
- package/dist/{gateway-client-7LMZKHTH.js → gateway-client-JA2BH7QO.js} +1 -1
- package/dist/{git-staleness-JCKVMWPO.js → git-staleness-I6WT7EXV.js} +8 -7
- package/dist/{global-procedures-BR7WGSE7.js → global-procedures-3RMO6C3C.js} +9 -8
- package/dist/{graph-auto-extract-EOXWQRBZ.js → graph-auto-extract-NKTYPD2I.js} +11 -10
- package/dist/{graph-rag-5FVC5JXH.js → graph-rag-EOGPZOYI.js} +3 -3
- package/dist/{hook-integrity-TYGDD7OE.js → hook-integrity-RTBF2BL2.js} +1 -1
- package/dist/{hook-prefetch-2CN3MK4H.js → hook-prefetch-V5KCGW2N.js} +31 -28
- package/dist/hooks/bug-report-worker.js +35 -32
- package/dist/hooks/codex-stop-task-finalizer.js +36 -33
- package/dist/hooks/commit-complete.js +34 -31
- package/dist/hooks/error-recall.js +16 -15
- package/dist/hooks/exe-heartbeat-hook.js +10 -9
- package/dist/hooks/ingest-worker.js +12 -10
- package/dist/hooks/ingest.js +19 -18
- package/dist/hooks/instructions-loaded.js +11 -10
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +11 -10
- package/dist/hooks/post-compact.js +11 -115
- package/dist/hooks/post-tool-combined.js +11 -11
- package/dist/hooks/pre-compact.js +38 -64
- package/dist/hooks/pre-tool-use.js +95 -36
- package/dist/hooks/prompt-submit.js +50 -47
- package/dist/hooks/session-end.js +39 -36
- package/dist/hooks/session-start.js +64 -18
- package/dist/hooks/stop.js +40 -37
- package/dist/hooks/subagent-stop.js +35 -32
- package/dist/hooks/summary-worker.js +41 -38
- package/dist/index.js +45 -42
- package/dist/inrun-inbox-DRKVDPLY.js +29 -0
- package/dist/{installer-VPNTM3X6.js → installer-G67M3DME.js} +11 -10
- package/dist/{installer-YDLSXGD2.js → installer-L3ZKMOPU.js} +11 -10
- package/dist/{installer-7UV3CNWZ.js → installer-QBWZSYDG.js} +11 -10
- package/dist/{intercom-queue-KHKJJYCQ.js → intercom-queue-R5LSXD3V.js} +30 -27
- package/dist/{key-backup-status-YMS7YGWO.js → key-backup-status-3RC6XTUX.js} +2 -1
- package/dist/lib/agent-config.js +3 -2
- package/dist/lib/cloud-sync.js +27 -24
- package/dist/lib/config.js +6 -1
- package/dist/lib/consolidation.js +14 -13
- package/dist/lib/crypto.js +4 -3
- package/dist/lib/database.js +8 -7
- package/dist/lib/db-backup.js +4 -3
- package/dist/lib/db-checkpoint-worker.js +1 -1
- package/dist/lib/db-daemon-client.js +7 -5
- package/dist/lib/db-read-worker-client.js +1 -1
- package/dist/lib/db-read-worker.js +1 -1
- package/dist/lib/db-write-worker-client.js +4 -2
- package/dist/lib/db-write-worker.js +21 -3
- package/dist/lib/db.js +8 -7
- package/dist/lib/device-registry.js +3 -2
- package/dist/lib/embed-worker.js +2 -1
- package/dist/lib/embedder.js +7 -5
- package/dist/lib/employee-templates.js +10 -9
- package/dist/lib/employees.js +8 -7
- package/dist/lib/error-detector.js +1 -1
- package/dist/lib/exe-daemon-client.js +16 -6
- package/dist/lib/exe-daemon.js +342 -168
- package/dist/lib/hybrid-search.js +13 -12
- package/dist/lib/identity-templates.js +3 -1
- package/dist/lib/identity.js +8 -7
- package/dist/lib/keychain.js +41 -3
- package/dist/lib/license.js +12 -3
- package/dist/lib/messaging.js +31 -28
- package/dist/lib/platform-support.js +25 -0
- package/dist/lib/post-tool-memory.js +6 -4
- package/dist/lib/preflight.js +29 -0
- package/dist/lib/registry-proxy.js +1 -1
- package/dist/lib/reminders.js +9 -8
- package/dist/lib/schedules.js +13 -12
- package/dist/lib/session-registry.js +10 -9
- package/dist/lib/session-wrappers.js +7 -3
- package/dist/lib/skill-learning.js +21 -13
- package/dist/lib/status-brief.js +8 -3
- package/dist/lib/store.js +12 -11
- package/dist/lib/task-router.js +9 -8
- package/dist/lib/tasks.js +32 -29
- package/dist/lib/tmux-routing.js +45 -29
- package/dist/lib/tmux-status.js +7 -3
- package/dist/lib/token-spend.js +9 -8
- package/dist/lib/ws-client.js +1 -1
- package/dist/{license-gate-YXUSNA2I.js → license-gate-6R3F3NQR.js} +5 -4
- package/dist/{license-sync-XFDOXL3Z.js → license-sync-VBJCXBAP.js} +4 -3
- package/dist/linux-systemd-LRW3BYSS.js +38 -0
- package/dist/mailbox-inbox-CP2VRBXZ.js +10 -0
- package/dist/mailbox-outbox-HXI7DYNC.js +19 -0
- package/dist/mcp/register-tools.js +110 -94
- package/dist/mcp/server.js +113 -97
- package/dist/mcp/tools/complete-reminder.js +10 -9
- package/dist/mcp/tools/create-reminder.js +10 -9
- package/dist/mcp/tools/create-task.js +38 -31
- package/dist/mcp/tools/deactivate-behavior.js +22 -14
- package/dist/mcp/tools/list-reminders.js +10 -9
- package/dist/mcp/tools/list-tasks.js +34 -31
- package/dist/mcp/tools/send-message.js +33 -30
- package/dist/mcp/tools/update-task.js +33 -30
- package/dist/{mcp-http-config-HIP5CEDV.js → mcp-http-config-BWX7AMAZ.js} +9 -8
- package/dist/{mcp-session-identity-RTNZ2ZLW.js → mcp-session-identity-GOBGICLI.js} +30 -27
- package/dist/{memory-cards-KG4TPNKK.js → memory-cards-4EXX3BQS.js} +12 -11
- package/dist/{memory-graph-extractor-6HTBLO2N.js → memory-graph-extractor-OYVZIJ3R.js} +12 -11
- package/dist/{memory-poisoning-defense-3ZT57RSJ.js → memory-poisoning-defense-AHOD2EBX.js} +8 -7
- package/dist/{memory-pressure-watchdog-ZOZBIMKC.js → memory-pressure-watchdog-COJC3OYS.js} +31 -28
- package/dist/{memory-queue-W54BYW7V.js → memory-queue-4VN3DTOE.js} +3 -2
- package/dist/memory-queue-client-OI4LDT4W.js +18 -0
- package/dist/{memory-reflection-EQC4FXSW.js → memory-reflection-V2SNAUIB.js} +8 -7
- package/dist/{monitor-grants-BDLVFVDR.js → monitor-grants-W3ISOLMC.js} +6 -4
- package/dist/{monitor-identity-GLFZSEAH.js → monitor-identity-AN3B5QIN.js} +3 -2
- package/dist/{notification-ledger-NZ4HO3M5.js → notification-ledger-J6Q2GAYU.js} +117 -53
- package/dist/{notifications-74YECZ4V.js → notifications-56TP36IK.js} +30 -27
- package/dist/{orchestration-events-KRQI4ED5.js → orchestration-events-CKQ756NA.js} +9 -8
- package/dist/{orchestration-phase-KVF42ZKU.js → orchestration-phase-ZJ4XVNFO.js} +3 -2
- package/dist/orchestrator-ERSQ3KNT.js +55 -0
- package/dist/org-brief-session-FSZ3QJDN.js +45 -0
- package/dist/org-consent-policy-BN7MKCZ2.js +68 -0
- package/dist/org-join-HTQ57JYH.js +35 -0
- package/dist/org-key-admin-4W6LZ5KZ.js +242 -0
- package/dist/org-key-pin-OTOKAELD.js +37 -0
- package/dist/{org-membership-B32NS5NI.js → org-membership-SML6GCHP.js} +11 -7
- package/dist/org-partner-config-XQGOB7EJ.js +25 -0
- package/dist/org-partner-runtime-RNNUL5IN.js +44 -0
- package/dist/org-row-visibility-JZFJ3YRJ.js +18 -0
- package/dist/{pipeline-router-6ZZV7JMA.js → pipeline-router-IUENNTAY.js} +9 -8
- package/dist/{plan-limits-B7AZKZ6U.js → plan-limits-ZUII366B.js} +11 -10
- package/dist/postinstall-failure-A7WTAXD6.js +20 -0
- package/dist/{project-boot-WEQSKDD7.js → project-boot-3DFY5F35.js} +7 -2
- package/dist/{projection-worker-LRFFQ6JB.js → projection-worker-MBWUPB5O.js} +5 -4
- package/dist/{prospective-memory-A4GDTIWG.js → prospective-memory-GHE5ORN4.js} +8 -7
- package/dist/push-notifications-PTQ5DHCD.js +60 -0
- package/dist/{reranker-YVTLJCFC.js → reranker-NUIGAPA3.js} +3 -2
- package/dist/{retrieval-health-PK2ODTXM.js → retrieval-health-XHCERQPG.js} +1 -1
- package/dist/{review-polling-JFWRNQF6.js → review-polling-CYBCBHZA.js} +31 -28
- package/dist/runtime/index.js +41 -38
- package/dist/{session-events-VMQBCUH3.js → session-events-X33W4JNA.js} +31 -28
- package/dist/{session-kill-telemetry-Z3W256T5.js → session-kill-telemetry-I2F5PUIW.js} +31 -28
- package/dist/session-lineage-AGOHSXIS.js +66 -0
- package/dist/{session-scope-2ADEVY3C.js → session-scope-WXP4F7OF.js} +30 -27
- package/dist/setup-wizard-2CTVITIX.js +35 -0
- package/dist/{shard-manager-DFLCDZT5.js → shard-manager-YEOHEOHL.js} +4 -3
- package/dist/{skill-refinement-APBYOSGX.js → skill-refinement-VDR5OT4V.js} +9 -8
- package/dist/{stack-promote-SZYIPTFT.js → stack-promote-XVC7FRJW.js} +6 -5
- package/dist/{stack-release-EYRDEGPD.js → stack-release-6PWAACRM.js} +101 -80
- package/dist/{stack-update-YWK2YXP6.js → stack-update-24VRBQ3U.js} +9 -4
- package/dist/{steward-gate-CIOBPNX6.js → steward-gate-2ZNYDVFO.js} +9 -8
- package/dist/{support-inbox-OAWGFRKW.js → support-inbox-ZHKLDETT.js} +5 -4
- package/dist/{task-enforcement-YAU6ZGDC.js → task-enforcement-GQDUTIFY.js} +37 -28
- package/dist/task-request-inbox-BFXNUU44.js +64 -0
- package/dist/{task-scope-44N7XP5N.js → task-scope-ERHPHLUM.js} +30 -27
- package/dist/{tasks-crud-IWVDREXG.js → tasks-crud-NVNF3NRA.js} +30 -27
- package/dist/tasks-notify-DXLU5VCT.js +60 -0
- package/dist/{tasks-review-VDFWFETP.js → tasks-review-BST6N34P.js} +30 -27
- package/dist/{telemetry-upload-3X5ESEKM.js → telemetry-upload-NY3EKOGY.js} +13 -12
- package/dist/{token-budget-WZGO22ME.js → token-budget-CLB3GUIX.js} +9 -8
- package/dist/{tool-capability-index-IFNZ6QUS.js → tool-capability-index-WZWVBI2R.js} +1 -1
- package/dist/{tool-telemetry-F7RWUNVK.js → tool-telemetry-PALAZUXT.js} +1 -1
- package/dist/tui/App.js +44 -41
- package/dist/{tui-data-KT7YGVQS.js → tui-data-CNFSRZP7.js} +30 -27
- package/dist/{typed-messages-TKDGVPHS.js → typed-messages-RCMPEKJN.js} +1 -1
- package/dist/{update-support-ZVRMECNQ.js → update-support-ZVB3CNGY.js} +24 -22
- package/dist/{work-state-heartbeat-CA4CN7DQ.js → work-state-heartbeat-O7UMB6SE.js} +1 -1
- package/dist/{worker-gate-52MVKYGZ.js → worker-gate-6DQQWDNB.js} +3 -2
- package/dist/{workflow-engine-ZAFBPVUP.js → workflow-engine-5ZULFH7O.js} +2 -2
- package/dist/{worktree-NNVXVV6A.js → worktree-ZWA35PKW.js} +10 -9
- package/dist/{worktree-sweep-IM2ZQG6Z.js → worktree-sweep-5LCVT46V.js} +11 -10
- package/package.json +8 -20
- package/postinstall.mjs +124 -0
- package/release-notes.json +18 -16
- package/stack.release.schema.json +4 -0
- package/dist/chunk-AFNRE2RV.js +0 -408
- package/dist/chunk-OSKWCKUC.js +0 -6
- package/dist/chunk-S3FIQCSM.js +0 -232
- package/dist/chunk-W6UB2AWP.js +0 -656
- package/dist/dreaming-WPMQJAXW.js +0 -60
- package/dist/exe-org-UK77DUU4.js +0 -73
- package/dist/memory-queue-client-RRNW2IFZ.js +0 -16
- package/dist/orchestrator-WV2YCHTK.js +0 -52
- package/dist/push-notifications-GOFTDDWW.js +0 -15
- package/dist/setup-wizard-26B36FMC.js +0 -14
- package/dist/tasks-notify-WK5HA77D.js +0 -57
- /package/dist/{chunk-YL2JH3XV.js → chunk-6C4UAKMS.js} +0 -0
- /package/dist/{chunk-YMCIZCNK.js → chunk-BN26LSME.js} +0 -0
- /package/dist/{chunk-WTH4CSAP.js → chunk-DFQEUZSI.js} +0 -0
- /package/dist/{chunk-FVWI2AR4.js → chunk-FIPUVCKC.js} +0 -0
- /package/dist/{chunk-ZMYXQU4L.js → chunk-L4LPJMPV.js} +0 -0
- /package/dist/{chunk-COHHVCFA.js → chunk-UELGUVNL.js} +0 -0
- /package/dist/{chunk-U7RZIY74.js → chunk-X7LY3IOB.js} +0 -0
- /package/dist/{chunk-BGYCUZYK.js → chunk-YAZ5ECEG.js} +0 -0
- /package/dist/{chunk-DSGFX3RT.js → chunk-YWN3XMPU.js} +0 -0
- /package/dist/{chunk-YMUZWC33.js → chunk-YYB5PMTK.js} +0 -0
- /package/dist/{core-memory-AATZRQEY.js → core-memory-BZFPVS43.js} +0 -0
- /package/dist/{entity-boost-HLFG2CH3.js → entity-boost-VXXED26D.js} +0 -0
- /package/dist/{memory-isolation-CF6FYSXD.js → memory-isolation-3PIOWLYP.js} +0 -0
- /package/dist/{message-queue-client-AX6KQK7T.js → message-queue-client-5XW7ZOK2.js} +0 -0
- /package/dist/{oauth-server-VE5ELXTF.js → oauth-server-KW5M437C.js} +0 -0
- /package/dist/{webhook-pipe-A4X4SCMW.js → webhook-pipe-QJRFZVKA.js} +0 -0
- /package/dist/{wiki-acl-GNIXYWHJ.js → wiki-acl-RXFV5OEU.js} +0 -0
- /package/dist/{wiki-client-7RRYRSPS.js → wiki-client-57QWZIHQ.js} +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
// src/lib/preflight.ts
|
|
2
|
+
import { spawnSync } from "child_process";
|
|
3
|
+
import { readFileSync } from "fs";
|
|
4
|
+
var TMUX_MIN_MAJOR = 3;
|
|
5
|
+
var TMUX_MIN_MINOR = 2;
|
|
6
|
+
function parseTmuxVersion(raw) {
|
|
7
|
+
const text = (raw ?? "").trim();
|
|
8
|
+
if (!text) return null;
|
|
9
|
+
const m = /^tmux\s+(\d+)\.(\d+)([a-z]*)/i.exec(text);
|
|
10
|
+
if (!m) return null;
|
|
11
|
+
const major = Number.parseInt(m[1] ?? "", 10);
|
|
12
|
+
const minor = Number.parseInt(m[2] ?? "", 10);
|
|
13
|
+
if (!Number.isFinite(major) || !Number.isFinite(minor)) return null;
|
|
14
|
+
return { major, minor, suffix: m[3] ?? "", raw: text };
|
|
15
|
+
}
|
|
16
|
+
function tmuxVersionSatisfies(v) {
|
|
17
|
+
if (v.major !== TMUX_MIN_MAJOR) return v.major > TMUX_MIN_MAJOR;
|
|
18
|
+
return v.minor >= TMUX_MIN_MINOR;
|
|
19
|
+
}
|
|
20
|
+
function detectDistroFamily(osReleaseContent) {
|
|
21
|
+
if (!osReleaseContent) return "unknown";
|
|
22
|
+
const fields = /* @__PURE__ */ new Map();
|
|
23
|
+
for (const line of osReleaseContent.split("\n")) {
|
|
24
|
+
const eq = line.indexOf("=");
|
|
25
|
+
if (eq <= 0) continue;
|
|
26
|
+
const key = line.slice(0, eq).trim();
|
|
27
|
+
const value = line.slice(eq + 1).trim().replace(/^["']|["']$/g, "").toLowerCase();
|
|
28
|
+
fields.set(key, value);
|
|
29
|
+
}
|
|
30
|
+
const tokens = [
|
|
31
|
+
...(fields.get("ID") ?? "").split(/\s+/),
|
|
32
|
+
...(fields.get("ID_LIKE") ?? "").split(/\s+/)
|
|
33
|
+
].filter(Boolean);
|
|
34
|
+
for (const t of tokens) {
|
|
35
|
+
if (["debian", "ubuntu", "linuxmint", "pop", "raspbian"].includes(t)) return "debian";
|
|
36
|
+
if (["rhel", "fedora", "centos", "rocky", "almalinux", "amzn"].includes(t)) return "rhel";
|
|
37
|
+
if (["arch", "archarm", "manjaro", "endeavouros"].includes(t)) return "arch";
|
|
38
|
+
if (["suse", "opensuse", "sles", "opensuse-leap", "opensuse-tumbleweed"].includes(t)) return "suse";
|
|
39
|
+
if (["alpine"].includes(t)) return "alpine";
|
|
40
|
+
}
|
|
41
|
+
return "unknown";
|
|
42
|
+
}
|
|
43
|
+
function readOsRelease() {
|
|
44
|
+
try {
|
|
45
|
+
return readFileSync("/etc/os-release", "utf8");
|
|
46
|
+
} catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function installCommand(pkg, ctx) {
|
|
51
|
+
if (ctx.platform === "darwin") {
|
|
52
|
+
return pkg === "tmux" ? "brew install tmux" : null;
|
|
53
|
+
}
|
|
54
|
+
if (ctx.platform !== "linux") return null;
|
|
55
|
+
if (pkg === "tmux") {
|
|
56
|
+
switch (ctx.family) {
|
|
57
|
+
case "debian":
|
|
58
|
+
return "sudo apt update && sudo apt install -y tmux";
|
|
59
|
+
case "rhel":
|
|
60
|
+
return "sudo dnf install -y tmux";
|
|
61
|
+
case "arch":
|
|
62
|
+
return "sudo pacman -S --noconfirm tmux";
|
|
63
|
+
case "suse":
|
|
64
|
+
return "sudo zypper install -y tmux";
|
|
65
|
+
case "alpine":
|
|
66
|
+
return "sudo apk add tmux";
|
|
67
|
+
default:
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
switch (ctx.family) {
|
|
72
|
+
case "debian":
|
|
73
|
+
return "sudo apt install -y libsecret-tools gnome-keyring";
|
|
74
|
+
case "rhel":
|
|
75
|
+
return "sudo dnf install -y libsecret gnome-keyring";
|
|
76
|
+
case "arch":
|
|
77
|
+
return "sudo pacman -S --noconfirm libsecret gnome-keyring";
|
|
78
|
+
case "suse":
|
|
79
|
+
return "sudo zypper install -y libsecret-tools gnome-keyring";
|
|
80
|
+
case "alpine":
|
|
81
|
+
return "sudo apk add libsecret gnome-keyring";
|
|
82
|
+
default:
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function assessTmux(probe, ctx) {
|
|
87
|
+
const fix = installCommand("tmux", ctx);
|
|
88
|
+
if (probe.errorCode === "ENOENT") {
|
|
89
|
+
return {
|
|
90
|
+
name: "tmux",
|
|
91
|
+
state: "missing",
|
|
92
|
+
required: true,
|
|
93
|
+
detail: "not found on PATH. exe-os runs every agent in a tmux session, so without it sessions never start \u2014 and the session list reads as empty rather than erroring.",
|
|
94
|
+
fix: fix ?? "install tmux with your package manager"
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (probe.errorCode) {
|
|
98
|
+
return {
|
|
99
|
+
name: "tmux",
|
|
100
|
+
state: "unknown",
|
|
101
|
+
required: true,
|
|
102
|
+
detail: `could not run \`tmux -V\` (${probe.errorCode}) \u2014 tmux may well be installed; not treating this as missing.`
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const parsed = parseTmuxVersion(probe.stdout ?? "");
|
|
106
|
+
if (!parsed) {
|
|
107
|
+
const seen = (probe.stdout ?? "").trim() || (probe.stderr ?? "").trim();
|
|
108
|
+
return {
|
|
109
|
+
name: "tmux",
|
|
110
|
+
state: "unknown",
|
|
111
|
+
required: true,
|
|
112
|
+
detail: `tmux is installed but \`tmux -V\` printed something unrecognised${seen ? ` (${seen})` : ""} \u2014 assuming it is fine. exe-os needs ${TMUX_MIN_MAJOR}.${TMUX_MIN_MINOR}+ for \`new-session -e\`.`
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (!tmuxVersionSatisfies(parsed)) {
|
|
116
|
+
return {
|
|
117
|
+
name: "tmux",
|
|
118
|
+
state: "too-old",
|
|
119
|
+
required: true,
|
|
120
|
+
detail: `tmux ${parsed.major}.${parsed.minor}${parsed.suffix} is too old. exe-os passes each agent's environment with \`tmux new-session -e KEY=VAL\`, and \`-e\` was added in tmux ${TMUX_MIN_MAJOR}.${TMUX_MIN_MINOR}. On this version EVERY employee spawn fails with "unknown flag -e".`,
|
|
121
|
+
// apt on Ubuntu 20.04 / Debian 11 will hand back the same too-old build,
|
|
122
|
+
// so quoting the install command here would send the user in a circle.
|
|
123
|
+
fix: ctx.family === "debian" ? "your distro's tmux package is older than 3.2 (Ubuntu 20.04 ships 3.0a, Debian 11 ships 3.1c) \u2014 upgrade the distro (Ubuntu 22.04+/Debian 12+ ship 3.2a+), or build tmux from source" : fix ?? "upgrade tmux to 3.2 or newer"
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
name: "tmux",
|
|
128
|
+
state: "ok",
|
|
129
|
+
required: true,
|
|
130
|
+
detail: `tmux ${parsed.major}.${parsed.minor}${parsed.suffix}`
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function assessKeyring(probe, ctx) {
|
|
134
|
+
if (ctx.platform !== "linux") {
|
|
135
|
+
return { name: "keyring", state: "ok", required: false, detail: "OS keychain is built in on this platform" };
|
|
136
|
+
}
|
|
137
|
+
const fix = installCommand("keyring", ctx);
|
|
138
|
+
if (probe.errorCode === "ENOENT") {
|
|
139
|
+
return {
|
|
140
|
+
name: "keyring",
|
|
141
|
+
state: "missing",
|
|
142
|
+
required: false,
|
|
143
|
+
detail: "`secret-tool` not found, so there is no Secret Service to store the master key in. The key will go in a machine-bound encrypted file instead.",
|
|
144
|
+
fix: fix ?? "install libsecret's CLI tools and a keyring daemon"
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
if (probe.errorCode) {
|
|
148
|
+
return {
|
|
149
|
+
name: "keyring",
|
|
150
|
+
state: "unknown",
|
|
151
|
+
required: false,
|
|
152
|
+
detail: `could not run \`secret-tool\` (${probe.errorCode}) \u2014 not drawing a conclusion about key custody from that.`
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
if (ctx.serviceReachable === false) {
|
|
156
|
+
return {
|
|
157
|
+
name: "keyring",
|
|
158
|
+
state: "missing",
|
|
159
|
+
required: false,
|
|
160
|
+
detail: "`secret-tool` is installed but no Secret Service is answering (the keyring daemon is not running). The key will go in a machine-bound encrypted file instead.",
|
|
161
|
+
fix: "start your keyring daemon for this session (e.g. `gnome-keyring-daemon --start`), then re-run `exe-os setup`"
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
if (ctx.serviceReachable === void 0) {
|
|
165
|
+
return {
|
|
166
|
+
name: "keyring",
|
|
167
|
+
state: "unknown",
|
|
168
|
+
required: false,
|
|
169
|
+
detail: "`secret-tool` is installed; did not probe whether a Secret Service is answering."
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return { name: "keyring", state: "ok", required: false, detail: "Secret Service is reachable" };
|
|
173
|
+
}
|
|
174
|
+
function prereqLines(findings) {
|
|
175
|
+
const notable = findings.filter((f) => f.state !== "ok");
|
|
176
|
+
if (notable.length === 0) return [];
|
|
177
|
+
const out = ["System check:"];
|
|
178
|
+
for (const f of notable) {
|
|
179
|
+
const marker = f.state === "unknown" ? "?" : f.required ? "\u2717" : "\u26A0";
|
|
180
|
+
const label = f.state === "missing" ? f.required ? "MISSING (required)" : "missing" : f.state === "too-old" ? "TOO OLD" : "could not check";
|
|
181
|
+
out.push(` ${marker} ${f.name} \u2014 ${label}`);
|
|
182
|
+
out.push(` ${f.detail}`);
|
|
183
|
+
if (f.fix) out.push(` Fix: ${f.fix}`);
|
|
184
|
+
}
|
|
185
|
+
out.push("");
|
|
186
|
+
out.push(" Setup will continue \u2014 none of the above blocks it. Nothing here is");
|
|
187
|
+
out.push(" a guess about your machine: anything we could not determine is");
|
|
188
|
+
out.push(' reported as "could not check" rather than as a problem.');
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
function probeCommand(cmd, args, timeoutMs = 3e3) {
|
|
192
|
+
try {
|
|
193
|
+
const r = spawnSync(cmd, args, { encoding: "utf8", timeout: timeoutMs });
|
|
194
|
+
if (r.error) {
|
|
195
|
+
const code = r.error.code;
|
|
196
|
+
return { errorCode: code ?? "ESPAWN", stderr: r.error.message };
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
exitCode: r.status,
|
|
200
|
+
stdout: (r.stdout ?? "").toString(),
|
|
201
|
+
stderr: (r.stderr ?? "").toString()
|
|
202
|
+
};
|
|
203
|
+
} catch (err) {
|
|
204
|
+
return { errorCode: err.code ?? "ESPAWN" };
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
function runPrereqPreflight(deps = {}) {
|
|
208
|
+
const platform = deps.platform ?? process.platform;
|
|
209
|
+
const family = deps.family ?? (platform === "linux" ? detectDistroFamily(readOsRelease()) : "unknown");
|
|
210
|
+
const ctx = { platform, family };
|
|
211
|
+
const findings = [
|
|
212
|
+
assessTmux((deps.probeTmux ?? (() => probeCommand("tmux", ["-V"])))(), ctx)
|
|
213
|
+
];
|
|
214
|
+
if (!deps.skipKeyring) {
|
|
215
|
+
findings.push(
|
|
216
|
+
assessKeyring((deps.probeSecretTool ?? (() => probeCommand("secret-tool", ["--version"])))(), {
|
|
217
|
+
...ctx,
|
|
218
|
+
serviceReachable: deps.secretServiceReachable
|
|
219
|
+
})
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
return findings;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export {
|
|
226
|
+
TMUX_MIN_MAJOR,
|
|
227
|
+
TMUX_MIN_MINOR,
|
|
228
|
+
parseTmuxVersion,
|
|
229
|
+
tmuxVersionSatisfies,
|
|
230
|
+
detectDistroFamily,
|
|
231
|
+
readOsRelease,
|
|
232
|
+
installCommand,
|
|
233
|
+
assessTmux,
|
|
234
|
+
assessKeyring,
|
|
235
|
+
prereqLines,
|
|
236
|
+
probeCommand,
|
|
237
|
+
runPrereqPreflight
|
|
238
|
+
};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// src/lib/key-dir.ts
|
|
2
|
+
import { statSync, readFileSync } from "fs";
|
|
3
|
+
import { execFileSync } from "child_process";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import os from "os";
|
|
6
|
+
var INSTALL_DIR_NAME = ".exe-os";
|
|
7
|
+
var KeyDirRefusalError = class extends Error {
|
|
8
|
+
code = "EXE_KEY_DIR_REFUSED";
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "KeyDirRefusalError";
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
var KEY_DIR_REFUSAL_HINT = "Run exe-os as the user that owns the install (without sudo), or set EXE_OS_DIR to that install's directory explicitly. exe-os will never adopt another user's key directory.";
|
|
15
|
+
function realOwnerUidOf(p) {
|
|
16
|
+
try {
|
|
17
|
+
return statSync(p).uid;
|
|
18
|
+
} catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function resolveKeyDirStrict(ctx) {
|
|
23
|
+
if (ctx.envDir) return ctx.envDir;
|
|
24
|
+
const ownerUidOf = ctx.ownerUidOf ?? realOwnerUidOf;
|
|
25
|
+
if (ctx.uid === 0 && ctx.sudoUser && ctx.sudoHome && typeof ctx.sudoUid === "number") {
|
|
26
|
+
const sudoDir = path.join(ctx.sudoHome, INSTALL_DIR_NAME);
|
|
27
|
+
const owner2 = ownerUidOf(sudoDir);
|
|
28
|
+
if (owner2 !== null) {
|
|
29
|
+
if (owner2 !== ctx.sudoUid && owner2 !== 0) {
|
|
30
|
+
throw new KeyDirRefusalError(
|
|
31
|
+
`refusing to use ${sudoDir}: it is owned by uid ${owner2}, not by SUDO_USER=${ctx.sudoUser} (uid ${ctx.sudoUid}). ${KEY_DIR_REFUSAL_HINT}`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
return sudoDir;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const selfDir = path.join(ctx.selfHome, INSTALL_DIR_NAME);
|
|
38
|
+
const owner = ownerUidOf(selfDir);
|
|
39
|
+
if (owner !== null && ctx.uid >= 0 && owner !== ctx.uid) {
|
|
40
|
+
throw new KeyDirRefusalError(
|
|
41
|
+
`refusing to use ${selfDir}: it is owned by uid ${owner}, not by the current user (uid ${ctx.uid}). ` + KEY_DIR_REFUSAL_HINT
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
return selfDir;
|
|
45
|
+
}
|
|
46
|
+
function parsePasswdLine(line, user) {
|
|
47
|
+
const fields = line.split(":");
|
|
48
|
+
if (fields[0] !== user) return null;
|
|
49
|
+
const uid = Number(fields[2]);
|
|
50
|
+
const home = fields[5]?.trim() ?? "";
|
|
51
|
+
if (!Number.isInteger(uid) || !home) return null;
|
|
52
|
+
return { uid, home };
|
|
53
|
+
}
|
|
54
|
+
function lookupPasswd(user) {
|
|
55
|
+
try {
|
|
56
|
+
const entry = execFileSync("getent", ["passwd", user], { encoding: "utf8", timeout: 3e3 });
|
|
57
|
+
const parsed = parsePasswdLine(entry.trim(), user);
|
|
58
|
+
if (parsed) return parsed;
|
|
59
|
+
} catch {
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
for (const line of readFileSync("/etc/passwd", "utf8").split("\n")) {
|
|
63
|
+
const parsed = parsePasswdLine(line.trim(), user);
|
|
64
|
+
if (parsed) return parsed;
|
|
65
|
+
}
|
|
66
|
+
} catch {
|
|
67
|
+
}
|
|
68
|
+
if (process.platform === "darwin") {
|
|
69
|
+
try {
|
|
70
|
+
const home = execFileSync("dscl", [".", "-read", `/Users/${user}`, "NFSHomeDirectory"], {
|
|
71
|
+
encoding: "utf8",
|
|
72
|
+
timeout: 3e3
|
|
73
|
+
}).split(":").slice(1).join(":").trim();
|
|
74
|
+
const uid = Number(
|
|
75
|
+
execFileSync("id", ["-u", user], { encoding: "utf8", timeout: 3e3 }).trim()
|
|
76
|
+
);
|
|
77
|
+
if (home && Number.isInteger(uid)) return { uid, home };
|
|
78
|
+
} catch {
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
var emittedNotices = /* @__PURE__ */ new Set();
|
|
84
|
+
function noticeOnce(key, message) {
|
|
85
|
+
if (emittedNotices.has(key)) return;
|
|
86
|
+
emittedNotices.add(key);
|
|
87
|
+
process.stderr.write(message.endsWith("\n") ? message : `${message}
|
|
88
|
+
`);
|
|
89
|
+
}
|
|
90
|
+
function describeInstallAmbiguity(ctx, chosen) {
|
|
91
|
+
if (ctx.envDir) return null;
|
|
92
|
+
const ownerUidOf = ctx.ownerUidOf ?? realOwnerUidOf;
|
|
93
|
+
const candidates = [];
|
|
94
|
+
if (ctx.sudoHome) candidates.push(path.join(ctx.sudoHome, INSTALL_DIR_NAME));
|
|
95
|
+
candidates.push(path.join(ctx.selfHome, INSTALL_DIR_NAME));
|
|
96
|
+
const other = candidates.find((c) => c !== chosen && ownerUidOf(c) !== null);
|
|
97
|
+
if (!other) return null;
|
|
98
|
+
return `[exe-os] Two exe-os installs exist on this host. Using: ${chosen}
|
|
99
|
+
[exe-os] NOT using: ${other}
|
|
100
|
+
[exe-os] Both the encryption key and the memory database come from the install above. If that is the wrong one, set EXE_OS_DIR=${other} explicitly (or run without sudo).`;
|
|
101
|
+
}
|
|
102
|
+
function currentKeyDirContext() {
|
|
103
|
+
const envDir = process.env.EXE_OS_DIR || process.env.EXE_MEM_DIR || void 0;
|
|
104
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : -1;
|
|
105
|
+
let selfHome = os.homedir();
|
|
106
|
+
if (uid === 0) {
|
|
107
|
+
let passwdHome = "";
|
|
108
|
+
try {
|
|
109
|
+
passwdHome = os.userInfo().homedir;
|
|
110
|
+
} catch {
|
|
111
|
+
passwdHome = "";
|
|
112
|
+
}
|
|
113
|
+
selfHome = passwdHome || "/root";
|
|
114
|
+
}
|
|
115
|
+
const ctx = {
|
|
116
|
+
envDir,
|
|
117
|
+
uid,
|
|
118
|
+
selfHome,
|
|
119
|
+
// Recorded, never read by the resolver — see KeyDirContext.homeBase.
|
|
120
|
+
homeBase: process.platform === "darwin" ? "/Users" : "/home"
|
|
121
|
+
};
|
|
122
|
+
if (uid === 0) {
|
|
123
|
+
const sudoUser = process.env.SUDO_USER ?? "";
|
|
124
|
+
if (sudoUser) {
|
|
125
|
+
const entry = lookupPasswd(sudoUser);
|
|
126
|
+
if (entry) {
|
|
127
|
+
ctx.sudoUser = sudoUser;
|
|
128
|
+
ctx.sudoHome = entry.home;
|
|
129
|
+
ctx.sudoUid = entry.uid;
|
|
130
|
+
} else {
|
|
131
|
+
noticeOnce(
|
|
132
|
+
`sudo-user-unresolved:${sudoUser}`,
|
|
133
|
+
`[exe-os] Running as root under sudo, but user "${sudoUser}" could not be resolved in the passwd database (getent, /etc/passwd${process.platform === "darwin" ? ", dscl" : ""} all failed).
|
|
134
|
+
[exe-os] Falling back to root's own install at ${path.join(selfHome, INSTALL_DIR_NAME)}. Set EXE_OS_DIR explicitly if that is not the install you meant.`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return ctx;
|
|
140
|
+
}
|
|
141
|
+
function resolveInstallDir() {
|
|
142
|
+
const ctx = currentKeyDirContext();
|
|
143
|
+
const dir = resolveKeyDirStrict(ctx);
|
|
144
|
+
const ambiguity = describeInstallAmbiguity(ctx, dir);
|
|
145
|
+
if (ambiguity) noticeOnce(`ambiguous:${dir}`, ambiguity);
|
|
146
|
+
if (ctx.envDir && ctx.uid >= 0) {
|
|
147
|
+
const owner = (ctx.ownerUidOf ?? realOwnerUidOf)(ctx.envDir);
|
|
148
|
+
if (owner !== null && owner !== ctx.uid) {
|
|
149
|
+
noticeOnce(
|
|
150
|
+
`env-dir-foreign:${ctx.envDir}`,
|
|
151
|
+
`[exe-os] WARNING: ${ctx.envDir} is owned by uid ${owner}, not by the current user (uid ${ctx.uid}).
|
|
152
|
+
[exe-os] It was used because EXE_OS_DIR names it explicitly. Everything in it \u2014 the master key and its recovery phrase \u2014 belongs to that user, not to you.`
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return dir;
|
|
157
|
+
}
|
|
158
|
+
var REFUSED_DIR_MARKER = "exe-os-REFUSED";
|
|
159
|
+
function refusedQuarantineDir(uid) {
|
|
160
|
+
return path.join(os.tmpdir(), `${REFUSED_DIR_MARKER}-${uid}-${process.pid}`);
|
|
161
|
+
}
|
|
162
|
+
function isRefusedQuarantinePath(p) {
|
|
163
|
+
return p.includes(REFUSED_DIR_MARKER);
|
|
164
|
+
}
|
|
165
|
+
function getKeyDirSafe() {
|
|
166
|
+
try {
|
|
167
|
+
return { dir: resolveInstallDir(), error: null };
|
|
168
|
+
} catch (err) {
|
|
169
|
+
return { dir: null, error: err instanceof Error ? err.message : String(err) };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export {
|
|
174
|
+
KeyDirRefusalError,
|
|
175
|
+
KEY_DIR_REFUSAL_HINT,
|
|
176
|
+
resolveKeyDirStrict,
|
|
177
|
+
currentKeyDirContext,
|
|
178
|
+
resolveInstallDir,
|
|
179
|
+
refusedQuarantineDir,
|
|
180
|
+
isRefusedQuarantinePath,
|
|
181
|
+
getKeyDirSafe
|
|
182
|
+
};
|
|
@@ -8,11 +8,11 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
loadLicense,
|
|
10
10
|
readCachedLicenseToken
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-HSKABJE6.js";
|
|
12
12
|
import {
|
|
13
13
|
EXE_AI_DIR,
|
|
14
14
|
loadConfig
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-BRIZ6OZ3.js";
|
|
16
16
|
|
|
17
17
|
// src/bin/exe-support.ts
|
|
18
18
|
import { mkdirSync, readFileSync, unlinkSync, writeFileSync } from "fs";
|
|
@@ -263,7 +263,7 @@ async function runRegistryProxy(options = registryProxyOptionsFromEnv()) {
|
|
|
263
263
|
await new Promise((resolve) => server.listen(options.port, options.host, resolve));
|
|
264
264
|
console.log(`exe-registry-proxy listening on ${options.host ?? "0.0.0.0"}:${options.port}`);
|
|
265
265
|
console.log(`proxying /v2/${options.allowedNamespace ?? "askexe"}/* -> ${options.upstream ?? "https://ghcr.io"}`);
|
|
266
|
-
const { licenseSyncConfigFromEnv, startLicenseSyncScheduler } = await import("./license-sync-
|
|
266
|
+
const { licenseSyncConfigFromEnv, startLicenseSyncScheduler } = await import("./license-sync-VBJCXBAP.js");
|
|
267
267
|
const syncConfig = licenseSyncConfigFromEnv();
|
|
268
268
|
if (syncConfig) {
|
|
269
269
|
startLicenseSyncScheduler(syncConfig);
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
buildSystemStateExclusionFilter,
|
|
12
12
|
buildWikiScopeFilter,
|
|
13
13
|
searchMemories
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-DKRDU2AX.js";
|
|
15
15
|
import {
|
|
16
16
|
blobToVector
|
|
17
17
|
} from "./chunk-OTVEIJUQ.js";
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
} from "./chunk-GJV3WDWM.js";
|
|
25
25
|
import {
|
|
26
26
|
getClient
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-HLU52KTO.js";
|
|
28
28
|
|
|
29
29
|
// src/lib/memory-reads.ts
|
|
30
30
|
import crypto from "crypto";
|
|
@@ -566,7 +566,7 @@ async function hybridSearch(queryText, agentId, options) {
|
|
|
566
566
|
let rerankerAvailable = false;
|
|
567
567
|
if (process.env.EXE_IS_DAEMON === "1") {
|
|
568
568
|
try {
|
|
569
|
-
const { isRerankerAvailable } = await import("./reranker-
|
|
569
|
+
const { isRerankerAvailable } = await import("./reranker-NUIGAPA3.js");
|
|
570
570
|
rerankerAvailable = isRerankerAvailable();
|
|
571
571
|
} catch {
|
|
572
572
|
}
|
|
@@ -635,7 +635,7 @@ async function hybridSearch(queryText, agentId, options) {
|
|
|
635
635
|
]).catch(() => []),
|
|
636
636
|
includeStructuredCards ? (async () => {
|
|
637
637
|
try {
|
|
638
|
-
const { searchMemoryCards } = await import("./memory-cards-
|
|
638
|
+
const { searchMemoryCards } = await import("./memory-cards-4EXX3BQS.js");
|
|
639
639
|
return await searchMemoryCards(effectiveQuery, agentId, fetchOptions);
|
|
640
640
|
} catch {
|
|
641
641
|
return [];
|
|
@@ -644,7 +644,7 @@ async function hybridSearch(queryText, agentId, options) {
|
|
|
644
644
|
// Reflection insights: patterns, contradictions, summaries across sessions
|
|
645
645
|
includeStructuredCards ? (async () => {
|
|
646
646
|
try {
|
|
647
|
-
const { searchReflections } = await import("./memory-reflection-
|
|
647
|
+
const { searchReflections } = await import("./memory-reflection-V2SNAUIB.js");
|
|
648
648
|
const insights = await searchReflections(effectiveQuery, agentId, 5, {
|
|
649
649
|
includeArchived: options?.includeArchived
|
|
650
650
|
});
|
|
@@ -745,7 +745,7 @@ async function hybridSearch(queryText, agentId, options) {
|
|
|
745
745
|
let entityBoostRan = false;
|
|
746
746
|
if (merged.length > 0) {
|
|
747
747
|
try {
|
|
748
|
-
const { applyEntityBoost } = await import("./entity-boost-
|
|
748
|
+
const { applyEntityBoost } = await import("./entity-boost-VXXED26D.js");
|
|
749
749
|
const boosted = await applyEntityBoost(merged, effectiveQuery, getClient());
|
|
750
750
|
merged = boosted.results;
|
|
751
751
|
graphContextMap = boosted.graphContext;
|
|
@@ -769,7 +769,7 @@ async function hybridSearch(queryText, agentId, options) {
|
|
|
769
769
|
try {
|
|
770
770
|
let rerankedRecords;
|
|
771
771
|
if (graphContextMap.size > 0) {
|
|
772
|
-
const { rerankWithContext } = await import("./reranker-
|
|
772
|
+
const { rerankWithContext } = await import("./reranker-NUIGAPA3.js");
|
|
773
773
|
const candidates = merged.map((m) => ({
|
|
774
774
|
text: m.raw_text,
|
|
775
775
|
context: graphContextMap.get(m.id)
|
|
@@ -777,7 +777,7 @@ async function hybridSearch(queryText, agentId, options) {
|
|
|
777
777
|
const scored = await rerankWithContext(effectiveQuery, candidates, rerankReturnLimit);
|
|
778
778
|
rerankedRecords = scored.map((s) => merged[s.index]);
|
|
779
779
|
} else {
|
|
780
|
-
const { rerank } = await import("./reranker-
|
|
780
|
+
const { rerank } = await import("./reranker-NUIGAPA3.js");
|
|
781
781
|
rerankedRecords = await rerank(effectiveQuery, merged, rerankReturnLimit);
|
|
782
782
|
}
|
|
783
783
|
if (rerankedRecords.length > 0) {
|
|
@@ -1191,7 +1191,7 @@ async function lightweightSearch(queryText, agentId, options) {
|
|
|
1191
1191
|
}
|
|
1192
1192
|
if (results.length >= 2) {
|
|
1193
1193
|
try {
|
|
1194
|
-
const { recordCoActivations } = await import("./co-activation-
|
|
1194
|
+
const { recordCoActivations } = await import("./co-activation-UEEDCM5U.js");
|
|
1195
1195
|
const ids = results.slice(0, 10).map((r) => r.id);
|
|
1196
1196
|
void recordCoActivations(ids).catch((e) => {
|
|
1197
1197
|
try {
|
|
@@ -1207,7 +1207,7 @@ async function lightweightSearch(queryText, agentId, options) {
|
|
|
1207
1207
|
}
|
|
1208
1208
|
if (options?.includeStructuredCards !== true) return results;
|
|
1209
1209
|
try {
|
|
1210
|
-
const { searchMemoryCards } = await import("./memory-cards-
|
|
1210
|
+
const { searchMemoryCards } = await import("./memory-cards-4EXX3BQS.js");
|
|
1211
1211
|
const cardResults = await searchMemoryCards(queryText, agentId, options);
|
|
1212
1212
|
if (cardResults.length > 0) {
|
|
1213
1213
|
return rrfMergeMulti([results, cardResults], limit, RRF_K, [1, 0.85]);
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
embed
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-3YBJ36UX.js";
|
|
4
4
|
import {
|
|
5
5
|
reserveVersions,
|
|
6
6
|
vectorToBlob
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-DKRDU2AX.js";
|
|
8
8
|
import {
|
|
9
9
|
getClient
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-HLU52KTO.js";
|
|
11
11
|
|
|
12
12
|
// src/lib/documents.ts
|
|
13
13
|
import crypto from "crypto";
|
|
@@ -270,7 +270,7 @@ async function ingestDocument(input) {
|
|
|
270
270
|
await client.batch([documentStmt, ...chunkStmts], "write");
|
|
271
271
|
const embedded = vectors.filter((v) => v !== null).length;
|
|
272
272
|
const originalTexts = input.chunks.map((c) => c.text);
|
|
273
|
-
import("./doc-graph-extractor-
|
|
273
|
+
import("./doc-graph-extractor-RR2VSO4W.js").then(
|
|
274
274
|
({ extractAndStoreDocumentGraph }) => extractAndStoreDocumentGraph(documentId, originalTexts)
|
|
275
275
|
).catch((err) => {
|
|
276
276
|
process.stderr.write(
|