@askexenow/exe-os 0.9.409 → 0.9.411
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/stack-manifests/v0.9.json +408 -1
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-5AKPW2N7.js → active-agent-3YCLS7GB.js} +4 -4
- package/dist/{active-agent-2AMJC3SC.js → active-agent-MHWQDMML.js} +4 -4
- package/dist/agent-defs-generator-DNXMO34I.js +32 -0
- package/dist/{agentic-ontology-6RS7A7KP.js → agentic-ontology-RA6CMND6.js} +1 -1
- package/dist/{artifact-backup-6O4FNYPS.js → artifact-backup-EETHNFFP.js} +3 -3
- package/dist/{backfill-metadata-6YX6LGPJ.js → backfill-metadata-WYT257VG.js} +7 -7
- package/dist/backup-verify-AG54CYGR.js +62 -0
- package/dist/{behavior-injection-NRXTNROW.js → behavior-injection-G7GAUHGO.js} +10 -10
- package/dist/{behavior-promotion-MW7OQ72V.js → behavior-promotion-I2DIUFUR.js} +9 -9
- package/dist/{behaviors-7AOK44QK.js → behaviors-SKVKPCRW.js} +8 -8
- package/dist/bin/agentic-ontology-backfill.js +8 -8
- package/dist/bin/agentic-reflection-backfill.js +9 -9
- package/dist/bin/agentic-semantic-label.js +8 -8
- package/dist/bin/backfill-conversations.js +7 -7
- package/dist/bin/backfill-responses.js +7 -7
- package/dist/bin/backfill-vectors.js +7 -7
- package/dist/bin/bulk-sync-postgres.js +16 -16
- package/dist/bin/cc-doctor.js +8 -8
- package/dist/bin/cleanup-stale-review-tasks.js +13 -16
- package/dist/bin/cli.js +24 -24
- package/dist/bin/deferred-daemon-restart.js +97 -97
- package/dist/bin/exe-actions.js +1 -1
- package/dist/bin/exe-agent-config.js +3 -3
- package/dist/bin/exe-agent.js +12 -12
- package/dist/bin/exe-assign.js +8 -8
- package/dist/bin/exe-boot.js +35 -38
- package/dist/bin/exe-call.js +9 -9
- package/dist/bin/exe-cloud.js +26 -22
- package/dist/bin/exe-config-dump.js +3 -3
- package/dist/bin/exe-dispatch.js +14 -17
- package/dist/bin/exe-doctor.js +5 -5
- package/dist/bin/exe-export-behaviors.js +12 -12
- package/dist/bin/exe-forget.js +12 -12
- package/dist/bin/exe-gateway.js +9 -9
- package/dist/bin/exe-grant.js +6 -6
- package/dist/bin/exe-healthcheck.js +8 -8
- package/dist/bin/exe-heartbeat.js +19 -22
- package/dist/bin/exe-kill.js +18 -21
- package/dist/bin/exe-launch-agent.js +264 -110
- package/dist/bin/exe-mcp.js +5 -5
- package/dist/bin/exe-memory-reads.js +7 -7
- package/dist/bin/exe-new-employee.js +11 -11
- package/dist/bin/exe-os-mcp-proxy.js +5 -5
- package/dist/bin/exe-pending-messages.js +14 -17
- package/dist/bin/exe-pending-notifications.js +13 -16
- package/dist/bin/exe-pending-reviews.js +14 -17
- package/dist/bin/exe-rename.js +7 -7
- package/dist/bin/exe-review.js +17 -20
- package/dist/bin/exe-search.js +11 -11
- package/dist/bin/exe-session-cleanup.js +18 -21
- package/dist/bin/exe-settings.js +16 -16
- package/dist/bin/exe-start-codex.js +37 -19
- package/dist/bin/exe-start-opencode.js +35 -17
- package/dist/bin/exe-status.js +15 -18
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +5 -5
- package/dist/bin/git-sweep.js +15 -17
- package/dist/bin/graph-backfill.js +8 -8
- package/dist/bin/graph-export.js +8 -8
- package/dist/bin/hooks-cli.js +1 -1
- package/dist/bin/import-history.js +11 -11
- package/dist/bin/install.js +99 -99
- package/dist/bin/intercom-check.js +5 -5
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +5 -5
- package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- 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/repair-document-chunks.js +7 -7
- package/dist/bin/scan-tasks.js +14 -17
- package/dist/bin/setup.js +2 -2
- package/dist/bin/shard-migrate.js +8 -8
- package/dist/bin/stack-update.js +4 -4
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-HG6LLZLY.js → boot-generation-RPJVFAQJ.js} +4 -4
- package/dist/{boot-review-sections-STZ5EAIL.js → boot-review-sections-FOPPZTJI.js} +12 -15
- package/dist/{bug-landed-reconciler-EO72HUI2.js → bug-landed-reconciler-FN5KPBRK.js} +6 -6
- package/dist/build-info.json +3 -3
- package/dist/build-manifest.json +997 -987
- package/dist/{capability-cards-C3SMHB2E.js → capability-cards-YQWBEG7A.js} +3 -3
- package/dist/{capacity-monitor-UI553HRL.js → capacity-monitor-7SMEJHYG.js} +14 -17
- package/dist/{catchup-brief-VE2X4HML.js → catchup-brief-IBQ26LEB.js} +21 -23
- package/dist/{chunk-6ZW6BRI4.js → chunk-27NG2NTG.js} +2 -2
- package/dist/{chunk-EIM7OGTD.js → chunk-2BOLFLAU.js} +4 -2
- package/dist/{chunk-DM4VTXM6.js → chunk-2EYVXUGA.js} +4 -4
- package/dist/{chunk-LMF2YC5C.js → chunk-2YFMBXUU.js} +4 -4
- package/dist/{chunk-C426MZMD.js → chunk-2YGBJHC2.js} +3 -3
- package/dist/{chunk-6EY6OFBC.js → chunk-353XF4LU.js} +2 -2
- package/dist/{chunk-VMHZSZQJ.js → chunk-3ARSKDHC.js} +52 -0
- package/dist/{chunk-ZYOIH5NY.js → chunk-3DXAJVXE.js} +6 -6
- package/dist/{chunk-HFSFWMID.js → chunk-3GGMHSY2.js} +3 -3
- package/dist/{chunk-BM467PZN.js → chunk-3N24FV22.js} +1 -1
- package/dist/{chunk-SY53PYLU.js → chunk-47YGEM4N.js} +1 -1
- package/dist/{chunk-NVM3SKJ4.js → chunk-4CN3EE6U.js} +27 -21
- package/dist/{chunk-KIJRAZWR.js → chunk-4J77TCTX.js} +1 -1
- package/dist/{chunk-NHQWPKX7.js → chunk-54STF27U.js} +2 -2
- package/dist/{chunk-Q4GS5VW7.js → chunk-5BWDUUMH.js} +3 -3
- package/dist/{chunk-VYKXRSHU.js → chunk-5ZMNFSHV.js} +1 -1
- package/dist/{chunk-HNGAM3U4.js → chunk-657I6PUF.js} +3 -3
- package/dist/{chunk-OE7TAEOG.js → chunk-6777GNWI.js} +1 -1
- package/dist/{chunk-HYZV25LY.js → chunk-67IVG6CB.js} +1 -11
- package/dist/{chunk-5N34MMKS.js → chunk-6APOLYIZ.js} +43 -3
- package/dist/{chunk-TBYWOHTE.js → chunk-6BD6JYR2.js} +1 -1
- package/dist/{chunk-JJYAETCO.js → chunk-6DMURUBY.js} +4 -4
- package/dist/{chunk-W5XAB2SW.js → chunk-6HJF7IA3.js} +273 -206
- package/dist/{chunk-HRKN3DQE.js → chunk-6J2J3VJS.js} +11 -11
- package/dist/{chunk-XFGS22VE.js → chunk-6PXFF6IV.js} +1 -1
- package/dist/{chunk-RZ23QQCI.js → chunk-7HLAYQRG.js} +4 -4
- package/dist/{chunk-IUBCS6TA.js → chunk-7KPZQ65I.js} +3 -3
- package/dist/{chunk-SYUJCVJG.js → chunk-7PDZBPGW.js} +1 -1
- package/dist/{chunk-VLAENYCN.js → chunk-7SHU5MOD.js} +1 -1
- package/dist/{chunk-6RRPVE5O.js → chunk-A5I2GYVQ.js} +3 -3
- package/dist/{chunk-X4V5ZLNX.js → chunk-A75TAU2I.js} +628 -4
- package/dist/{chunk-SGR4ZQAV.js → chunk-BE3UETW6.js} +3 -3
- package/dist/{chunk-GG73NHZD.js → chunk-BG6RAOCJ.js} +63 -9
- package/dist/{chunk-DMYJVGQM.js → chunk-BIPTWAEO.js} +1 -1
- package/dist/{chunk-B3ISLIKE.js → chunk-BLTXAUP6.js} +2 -2
- package/dist/{chunk-G2M7WQ2M.js → chunk-CBC3JCIF.js} +1 -1
- package/dist/{chunk-FJKUFMNF.js → chunk-CFFSHBQF.js} +1 -1
- package/dist/{chunk-WYNIWJRN.js → chunk-CJ6CS2IH.js} +5 -5
- package/dist/{chunk-7LTAA55U.js → chunk-CRW63CDI.js} +1 -1
- package/dist/{chunk-BHDDDNC6.js → chunk-CWHTUNJX.js} +2 -2
- package/dist/{chunk-FZT4VQP7.js → chunk-D6NZNUVH.js} +1 -1
- package/dist/{chunk-GKPPLIMJ.js → chunk-DHLJZDWI.js} +4 -4
- package/dist/{chunk-JR3GTBV3.js → chunk-DRHTRVDT.js} +1 -1
- package/dist/{chunk-GTRB6DGI.js → chunk-DWRULKB3.js} +2 -2
- package/dist/{chunk-DIKLSAJE.js → chunk-EOWJXCYC.js} +25 -7
- package/dist/{chunk-4W7Y67B5.js → chunk-EWDBWOCX.js} +1 -1
- package/dist/{chunk-EHILXBVT.js → chunk-FPF2PJFK.js} +3 -3
- package/dist/{chunk-BPBEJD7U.js → chunk-FSXMKIDO.js} +1 -1
- package/dist/{chunk-E2Z3F26R.js → chunk-FUDXITKX.js} +1 -1
- package/dist/{chunk-SFGFNJBR.js → chunk-FYV2CTKP.js} +1 -1
- package/dist/{chunk-4M24XCTI.js → chunk-GATAYYAF.js} +53 -7
- package/dist/{chunk-L5CPS34O.js → chunk-GHYHNHDL.js} +1 -1
- package/dist/{chunk-OISOA6NX.js → chunk-GL5ZG72X.js} +1 -1
- package/dist/{chunk-XAGIZVYI.js → chunk-GM4UEZDE.js} +181 -1625
- package/dist/{chunk-4O7OUBEX.js → chunk-GZVFHFO3.js} +27 -140
- package/dist/{chunk-M4N7I2H5.js → chunk-HA6BIZ6L.js} +5 -5
- package/dist/chunk-HDQAVAV6.js +248 -0
- package/dist/{chunk-IPANAGA3.js → chunk-HDV2V25K.js} +1 -1
- package/dist/{chunk-XGPBHKU3.js → chunk-HTFM7ZDD.js} +2 -2
- package/dist/{chunk-KPLMY2GT.js → chunk-HUHR5CKJ.js} +4 -4
- package/dist/{chunk-IPBNHPTE.js → chunk-IC2AONBH.js} +9 -9
- package/dist/{chunk-23XUZHB7.js → chunk-IHAXXDBH.js} +245 -36
- package/dist/{chunk-4S6H2NWS.js → chunk-IPUDXR67.js} +1 -1
- package/dist/{chunk-UXJAW4IQ.js → chunk-J6U4ZR77.js} +2 -2
- package/dist/{chunk-7I6KVKFF.js → chunk-JAIZCE6W.js} +3 -3
- package/dist/{chunk-SA66WRBT.js → chunk-JGBYZTWH.js} +1 -1
- package/dist/{chunk-HRYWB4TO.js → chunk-JJZZXEAN.js} +3 -3
- package/dist/{chunk-IZ24HRDC.js → chunk-JNULO6I5.js} +3 -3
- package/dist/{chunk-YVS77JPW.js → chunk-JTJP4JK7.js} +3 -3
- package/dist/{chunk-BIV4IHED.js → chunk-JW5NUXPN.js} +15 -28
- package/dist/{chunk-NFNM64A7.js → chunk-K2HIXAIF.js} +22 -18
- package/dist/{chunk-F5ZRHLG5.js → chunk-KEDZRQI3.js} +2 -2
- package/dist/{chunk-QPMKVSHU.js → chunk-KN5GAVCG.js} +2 -2
- package/dist/{chunk-3MDUKF3N.js → chunk-L5JFVK5T.js} +5 -4
- package/dist/{chunk-FBZ32BD4.js → chunk-LBSCOP25.js} +1 -1
- package/dist/{chunk-K7DAE2HO.js → chunk-LLZUL7M2.js} +19 -6
- package/dist/{chunk-PCFYNK7V.js → chunk-LQGLGSBY.js} +2 -2
- package/dist/{chunk-APVU4Q5B.js → chunk-LSHUX7P4.js} +16 -16
- package/dist/{chunk-GRAMRMWS.js → chunk-M6AX64J2.js} +2 -2
- package/dist/{chunk-52Z435PH.js → chunk-M6SUJLNP.js} +15 -10
- package/dist/{chunk-GPWXUU3L.js → chunk-MZNLQC6W.js} +1 -1
- package/dist/{chunk-G3ZYXXO7.js → chunk-N7POJZJT.js} +10 -10
- package/dist/{chunk-DE2V7547.js → chunk-NCNT2C2P.js} +2 -2
- package/dist/{chunk-HK7HIDXP.js → chunk-O3BLL6MY.js} +1 -1
- package/dist/{chunk-YLWKWEJJ.js → chunk-O6KQAJCC.js} +3 -3
- package/dist/{chunk-QUK3UDZV.js → chunk-OHHZNNUD.js} +1 -1
- package/dist/{chunk-6JLVCMKH.js → chunk-PDQGR5LZ.js} +1 -1
- package/dist/{chunk-LE3DIA25.js → chunk-PTF5TB6O.js} +3 -3
- package/dist/{chunk-KBHK2WNO.js → chunk-PYXXL7N7.js} +1 -1
- package/dist/{chunk-QK3Z4TKQ.js → chunk-Q6KUBP6R.js} +5 -5
- package/dist/{chunk-NDCW4G55.js → chunk-QJWLQXR7.js} +1 -1
- package/dist/{chunk-ME733Y2F.js → chunk-QOFQY7BJ.js} +37 -9
- package/dist/{chunk-HFXBL7XE.js → chunk-QSW5DHMZ.js} +1 -1
- package/dist/{chunk-OFT5KSBM.js → chunk-QV26G2BF.js} +1 -1
- package/dist/{chunk-LVEMYNYH.js → chunk-RHHEYC6H.js} +3 -3
- package/dist/{chunk-QYIR64RR.js → chunk-RHJOTGEU.js} +1 -1
- package/dist/{chunk-HUMNRJZE.js → chunk-RJIH7JXM.js} +4 -4
- package/dist/{chunk-6TB7UXCA.js → chunk-RMC2A6EE.js} +1 -1
- package/dist/{chunk-XCPD7NGP.js → chunk-RYMXD2NT.js} +1 -1
- package/dist/{chunk-W2VDJKTB.js → chunk-RYYFFCJG.js} +1 -1
- package/dist/{chunk-YUAOQJVV.js → chunk-SINIRUYZ.js} +101 -9
- package/dist/{chunk-R7QZXQPU.js → chunk-SXUABANK.js} +216 -147
- package/dist/{backup-verify-QIAQ63VC.js → chunk-T3AM52YT.js} +411 -90
- package/dist/{chunk-NK4JHJNP.js → chunk-TCBWHLKH.js} +4 -4
- package/dist/{chunk-R6CKQLEA.js → chunk-TS4LSNRI.js} +2 -2
- package/dist/{chunk-4Q7H3TO7.js → chunk-TVWYMOZ4.js} +1 -1
- package/dist/{chunk-TCV3WA5I.js → chunk-VAHQOIQY.js} +1 -1
- package/dist/{chunk-ZEHBSA25.js → chunk-VQQPYI4X.js} +1 -1
- package/dist/{chunk-PZDAPIQL.js → chunk-VS7V5HNO.js} +1 -1
- package/dist/{chunk-7R7KDRKV.js → chunk-W7VKGB42.js} +1 -1
- package/dist/{chunk-M7774YLB.js → chunk-WC44PNZU.js} +1 -1
- package/dist/{chunk-3AL2LO3L.js → chunk-WHUQ44F2.js} +1 -1
- package/dist/{chunk-4RQ62XXK.js → chunk-X2ZHCNNB.js} +5 -5
- package/dist/{chunk-T2PAFWRK.js → chunk-X4FHT6ST.js} +5 -5
- package/dist/{chunk-N3JEYUDV.js → chunk-XC5OASHV.js} +1 -1
- package/dist/{agent-defs-generator-QN3J6FVJ.js → chunk-XDOCXKHW.js} +61 -21
- package/dist/{chunk-OEHZ46WQ.js → chunk-XEAZJXMZ.js} +2 -2
- package/dist/{chunk-DACRR362.js → chunk-XQ7BIVLI.js} +6 -6
- package/dist/{chunk-7P2TDFZL.js → chunk-Z3LGAFMG.js} +1 -1
- package/dist/{chunk-GEQQGN3J.js → chunk-ZJ6AMC4Y.js} +7 -7
- package/dist/{chunk-IURGBN5B.js → chunk-ZZR2WRNW.js} +4 -4
- package/dist/{cleanup-graph-garbage-NKAJSCWZ.js → cleanup-graph-garbage-SYGPMPUM.js} +8 -8
- package/dist/{cli-shutdown-F3DFDCB5.js → cli-shutdown-JI7CASE4.js} +1 -1
- package/dist/{cloud-sync-command-3YBLSMAL.js → cloud-sync-command-ZV3P5FP6.js} +2 -2
- package/dist/{cloud-sync-db-init-JWSPAFKY.js → cloud-sync-db-init-RQIHWKV4.js} +1 -1
- package/dist/{cloud-sync-shutdown-4R6RIO67.js → cloud-sync-shutdown-V2N7VLD3.js} +3 -3
- package/dist/{co-activation-2ZRANV3Q.js → co-activation-SRE6DIRX.js} +3 -3
- package/dist/{co-occurrence-6EELW2L2.js → co-occurrence-F5TMSEQZ.js} +6 -6
- package/dist/{consent-passphrase-TDR263MC.js → consent-passphrase-MWZRHJRC.js} +2 -2
- package/dist/content-extractor-GWF2T7FK.js +13 -0
- package/dist/{conversation-entity-extractor-KUJN3MOH.js → conversation-entity-extractor-XMOUHGMT.js} +3 -3
- package/dist/{crdt-sync-IX43KVQ3.js → crdt-sync-FXEKABM7.js} +4 -4
- package/dist/{crm-webhook-GSCIW6CE.js → crm-webhook-D6IJOPRQ.js} +2 -2
- package/dist/{cto-delegation-gate-ZWD4EFRR.js → cto-delegation-gate-BU3JRCYN.js} +12 -15
- package/dist/{daemon-orchestration-WL6V4QL4.js → daemon-orchestration-K4NKFYXO.js} +19 -21
- package/dist/{destructive-data-guard-JDUJ2ULM.js → destructive-data-guard-3TGAAE7K.js} +77 -23
- package/dist/{doc-graph-extractor-NJ7ZZC2C.js → doc-graph-extractor-TVK2NGAR.js} +6 -6
- package/dist/{documents-O7WYZFFE.js → documents-MDZ4VB5X.js} +8 -8
- package/dist/{dreaming-TUESPDT3.js → dreaming-L24PSS35.js} +17 -20
- package/dist/{employee-boot-brief-UCP6QLN4.js → employee-boot-brief-GQVL3FQC.js} +23 -25
- package/dist/{entity-boost-TK43XT24.js → entity-boost-OMFA5QCG.js} +2 -2
- package/dist/{exe-drift-QD6LUZT2.js → exe-drift-JDDG3OPT.js} +4 -4
- package/dist/{exe-export-QIUNHFSS.js → exe-export-EEGIE3JP.js} +10 -10
- package/dist/{exe-import-3UFOLHEW.js → exe-import-UJNC5Q2L.js} +10 -10
- package/dist/{exe-key-D5NDKGHT.js → exe-key-TYEY4W4E.js} +97 -97
- package/dist/{exe-org-UWDJBOCV.js → exe-org-B3ICTTEV.js} +32 -32
- package/dist/{exe-snapshot-P6SFODEN.js → exe-snapshot-VBFBONYN.js} +20 -23
- package/dist/{fast-db-init-SD7JZSEC.js → fast-db-init-TFRTK6EH.js} +1 -1
- package/dist/{founder-context-QIXDZIJX.js → founder-context-3X4QUWKD.js} +2 -2
- package/dist/{founder-monitor-envelope-TLOC4UYG.js → founder-monitor-envelope-54UNZNY4.js} +4 -4
- package/dist/gateway/index.js +11 -11
- package/dist/{gateway-client-CQTSYJLP.js → gateway-client-OUDO5GGV.js} +1 -1
- package/dist/{git-staleness-JSQTHB4Z.js → git-staleness-73YZ5PGU.js} +3 -3
- package/dist/{global-procedures-T3RKI4QX.js → global-procedures-PYNE2BQG.js} +20 -6
- package/dist/{graph-auto-extract-V75GSTNX.js → graph-auto-extract-PGUMEEQB.js} +6 -6
- package/dist/{graph-query-VAQN2RK3.js → graph-query-7YA3YNKL.js} +1 -1
- package/dist/{graph-rag-GBA5E3QC.js → graph-rag-UWOTK4AQ.js} +3 -3
- package/dist/{hook-integrity-II6QK6Y4.js → hook-integrity-6MNEPT6W.js} +1 -1
- package/dist/{hook-prefetch-5EHPOYY3.js → hook-prefetch-JOF6YZSR.js} +13 -16
- package/dist/hooks/bug-report-worker.js +17 -20
- package/dist/hooks/codex-stop-task-finalizer.js +19 -22
- package/dist/hooks/commit-complete.js +16 -19
- package/dist/hooks/error-recall.js +14 -14
- package/dist/hooks/exe-heartbeat-hook.js +5 -5
- package/dist/hooks/ingest-worker.js +18 -20
- package/dist/hooks/ingest.js +16 -16
- package/dist/hooks/instructions-loaded.js +7 -7
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +6 -6
- package/dist/hooks/post-compact.js +5 -5
- package/dist/hooks/post-tool-combined.js +13 -13
- package/dist/hooks/pre-compact.js +16 -19
- package/dist/hooks/pre-tool-use.js +2 -2
- package/dist/hooks/prompt-submit.js +40 -39
- package/dist/hooks/session-end.js +21 -24
- package/dist/hooks/session-start.js +18 -18
- package/dist/hooks/stop.js +19 -22
- package/dist/hooks/subagent-stop.js +18 -21
- package/dist/hooks/summary-worker.js +20 -23
- package/dist/index.js +25 -28
- package/dist/{installer-XEEZSF3V.js → installer-34XZ7JMW.js} +7 -8
- package/dist/{installer-MPVQ5L22.js → installer-356RMQ2K.js} +7 -8
- package/dist/{installer-ILYC4LI5.js → installer-7TN36Z7T.js} +113 -30
- package/dist/{intercom-queue-QGHAW2KO.js → intercom-queue-ZJ3MNULM.js} +12 -15
- package/dist/lib/backup-verify-worker.js +157 -0
- package/dist/lib/cloud-sync.js +16 -20
- package/dist/lib/consolidation.js +9 -9
- package/dist/lib/crypto.js +3 -3
- package/dist/lib/database.js +3 -3
- package/dist/lib/db-backup.js +7 -3
- package/dist/lib/db-write-worker.js +3 -3
- package/dist/lib/db.js +3 -3
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/employee-templates.js +7 -7
- package/dist/lib/employees.js +3 -3
- package/dist/lib/error-detector.js +2 -2
- package/dist/lib/exe-daemon.js +89 -87
- package/dist/lib/hybrid-search.js +11 -11
- package/dist/lib/identity.js +5 -3
- package/dist/lib/keychain.js +1 -1
- package/dist/lib/license.js +2 -2
- package/dist/lib/messaging.js +13 -16
- package/dist/lib/post-tool-memory.js +16 -18
- package/dist/lib/registry-proxy.js +1 -1
- package/dist/lib/reminders.js +4 -4
- package/dist/lib/schedules.js +8 -8
- package/dist/lib/session-registry.js +5 -5
- package/dist/lib/skill-learning.js +9 -9
- package/dist/lib/store.js +7 -7
- package/dist/lib/task-router.js +4 -4
- package/dist/lib/tasks.js +14 -17
- package/dist/lib/tmux-routing.js +14 -41
- package/dist/lib/token-spend.js +4 -4
- package/dist/lib/ws-client.js +1 -1
- package/dist/{license-gate-CARN6AB6.js → license-gate-4BXUTHLB.js} +3 -3
- package/dist/{license-recheck-7Z3LS6YS.js → license-recheck-QFPUKISQ.js} +1 -1
- package/dist/{license-sync-PUQV3HSZ.js → license-sync-FDEDT4AC.js} +2 -2
- package/dist/mcp/register-tools.js +96 -96
- package/dist/mcp/server.js +96 -96
- package/dist/mcp/tools/complete-reminder.js +5 -5
- package/dist/mcp/tools/create-reminder.js +5 -5
- package/dist/mcp/tools/create-task.js +16 -19
- package/dist/mcp/tools/deactivate-behavior.js +10 -10
- package/dist/mcp/tools/list-reminders.js +5 -5
- package/dist/mcp/tools/list-tasks.js +16 -19
- package/dist/mcp/tools/send-message.js +15 -18
- package/dist/mcp/tools/update-task.js +15 -18
- package/dist/{mcp-http-config-RJKTZPHZ.js → mcp-http-config-GKP5QGAO.js} +5 -5
- package/dist/{mcp-session-identity-HN444A3G.js → mcp-session-identity-JHAGRB7B.js} +12 -15
- package/dist/{memory-cards-AT3QCCWU.js → memory-cards-O377ETAM.js} +8 -8
- package/dist/{memory-graph-extractor-B43UWGV5.js → memory-graph-extractor-4KJCCUOP.js} +7 -7
- package/dist/{memory-maintenance-WDLL3ZX3.js → memory-maintenance-RR5UPRW3.js} +1 -1
- package/dist/{memory-poisoning-defense-TS4WNW4S.js → memory-poisoning-defense-Y5TTKGOP.js} +3 -3
- package/dist/{memory-pressure-watchdog-6YH7S6W7.js → memory-pressure-watchdog-NGXTI4HR.js} +13 -16
- package/dist/{memory-reflection-N6NSYW6S.js → memory-reflection-EXNHRZL7.js} +8 -8
- package/dist/{memory-write-repository-D35RDO62.js → memory-write-repository-S4TX7WQB.js} +1 -1
- package/dist/{monitor-grants-FH4PNYN5.js → monitor-grants-57Q4NL25.js} +3 -3
- package/dist/{monitor-identity-LK5ZCCND.js → monitor-identity-3FQ52SYU.js} +2 -2
- package/dist/{notification-ledger-3WJYJGGS.js → notification-ledger-O6KQYYGK.js} +13 -16
- package/dist/{notifications-T5C2CVB3.js → notifications-6FCQCJ4P.js} +12 -15
- package/dist/{orchestration-events-73VEJT7Q.js → orchestration-events-2Z2BMMA5.js} +4 -4
- package/dist/{orchestrator-3O657734.js → orchestrator-AGOSKPHD.js} +14 -17
- package/dist/{org-brief-session-EGB35QLM.js → org-brief-session-WJHZVXXJ.js} +15 -15
- package/dist/{org-consent-policy-MSVSRI53.js → org-consent-policy-X43UGTHI.js} +5 -5
- package/dist/{org-join-4BK2XJJI.js → org-join-M3UTBMHC.js} +9 -9
- package/dist/{org-key-admin-EUSSGXQ3.js → org-key-admin-AA2DRHB2.js} +11 -11
- package/dist/{org-key-epoch-NMEWDT5L.js → org-key-epoch-Z5UIVUHT.js} +5 -5
- package/dist/{org-key-pin-HUSXGINB.js → org-key-pin-FE6YHEZ3.js} +3 -3
- package/dist/{org-membership-B74IWEM5.js → org-membership-3J2MIGE4.js} +4 -4
- package/dist/{org-partner-config-5FJTJABN.js → org-partner-config-5HATZYG4.js} +8 -8
- package/dist/{org-partner-runtime-GN4GFWI2.js → org-partner-runtime-UI35IHUC.js} +15 -15
- package/dist/{org-row-visibility-PBZ2TSCR.js → org-row-visibility-TRJERVYP.js} +1 -1
- package/dist/{pipeline-router-2IELBSVJ.js → pipeline-router-EKQ6D7ZA.js} +4 -4
- package/dist/{plan-limits-4GXK5PFT.js → plan-limits-3BGHIHX6.js} +6 -6
- package/dist/{platform-procedures-QP3W2NLH.js → platform-procedures-RXW46WNY.js} +1 -1
- package/dist/{pre-tool-use-impl-CY73PRJP.js → pre-tool-use-impl-7BT5TJVM.js} +35 -33
- package/dist/{project-name-337ERIAX.js → project-name-PGJGUEJY.js} +4 -4
- package/dist/{projection-worker-W476IG6V.js → projection-worker-3GEVFPAI.js} +2 -2
- package/dist/{prospective-memory-5INB7NUL.js → prospective-memory-GEN7CN7H.js} +3 -3
- package/dist/{push-notifications-YVOP4KGN.js → push-notifications-QW4BWRC7.js} +13 -16
- package/dist/{reproject-worktree-memories-OGBR3CMO.js → reproject-worktree-memories-DIULBEBD.js} +12 -15
- package/dist/{reranker-W7WCJH6Y.js → reranker-LQ6OPJOI.js} +1 -1
- package/dist/{retrieval-health-R6MGXLTP.js → retrieval-health-XDFYFEOP.js} +1 -1
- package/dist/{review-polling-TKAWVY6G.js → review-polling-ED33YLFT.js} +13 -16
- package/dist/runtime/index.js +20 -23
- package/dist/{session-events-HUCZ7TOR.js → session-events-7IJGTBVH.js} +13 -16
- package/dist/{session-kill-telemetry-RWRWOW4C.js → session-kill-telemetry-RUTEARJ3.js} +13 -16
- package/dist/{session-scope-5CDRHV75.js → session-scope-SSYA64L3.js} +12 -15
- package/dist/{setup-wizard-RBTJAZOP.js → setup-wizard-XD7FZVLJ.js} +2 -2
- package/dist/{shard-manager-LRPAAQA4.js → shard-manager-FH5JZRSE.js} +2 -2
- package/dist/{skill-refinement-MDXKDCY6.js → skill-refinement-UHD4E6GV.js} +4 -4
- package/dist/{skill-retrieval-OWY6MTCX.js → skill-retrieval-F6PAJ3I5.js} +11 -11
- package/dist/{skill-usage-GNV737U5.js → skill-usage-2MBTF7Y4.js} +4 -4
- package/dist/{stack-generate-manifest-S4SBLKBY.js → stack-generate-manifest-SU6OFFY7.js} +4 -4
- package/dist/{stack-promote-U4EZNLOV.js → stack-promote-MJF436JD.js} +4 -4
- package/dist/{stack-release-4VBGOYGK.js → stack-release-S37R57XC.js} +5 -5
- package/dist/{stack-update-C5YKHE7A.js → stack-update-XXDRKGGR.js} +3 -3
- package/dist/{steward-gate-QFPXQBUZ.js → steward-gate-EWG2BHYQ.js} +4 -4
- package/dist/{subagent-brief-injection-GDXO5WNS.js → subagent-brief-injection-YZGSWUEY.js} +25 -27
- package/dist/{support-bug-actions-4XEKXIIO.js → support-bug-actions-RU6WZ3UV.js} +3 -3
- package/dist/{support-inbox-Y7AFCOGM.js → support-inbox-A3S52SPS.js} +12 -12
- package/dist/{task-enforcement-CN3Q4PEH.js → task-enforcement-LVAS55AR.js} +13 -16
- package/dist/{task-request-inbox-AY3C6DND.js → task-request-inbox-2TN4ZUH2.js} +5 -5
- package/dist/{task-scope-AMR3Z3DJ.js → task-scope-NLKUVCP5.js} +12 -15
- package/dist/{tasks-crud-2GHKIZOM.js → tasks-crud-NQDPLHNZ.js} +14 -15
- package/dist/{tasks-notify-Z53446KM.js → tasks-notify-BDM2NEHP.js} +13 -16
- package/dist/{tasks-review-APRNSHMQ.js → tasks-review-3G7CAW2O.js} +12 -15
- package/dist/{telemetry-upload-5XR42SQN.js → telemetry-upload-6DR6AL3V.js} +8 -8
- package/dist/{token-budget-TTNJXI7W.js → token-budget-KNC2WGR7.js} +4 -4
- package/dist/{tool-telemetry-36ST422N.js → tool-telemetry-I3SEU5M5.js} +1 -1
- package/dist/tui/App.js +23 -26
- package/dist/{tui-data-AP5TPUOQ.js → tui-data-KJDWP4CB.js} +16 -19
- package/dist/{update-support-SFTI2PUD.js → update-support-UYDYMHVR.js} +11 -11
- package/dist/{whatsapp-5CXE3JHG.js → whatsapp-5EMPZHF5.js} +2 -2
- package/dist/{wiki-acl-N754BC2W.js → wiki-acl-M7BTQJBZ.js} +1 -1
- package/dist/{work-claims-OAICQBWO.js → work-claims-5CFMZTML.js} +4 -4
- package/dist/{work-state-heartbeat-MTTUGMPU.js → work-state-heartbeat-7IA2DZ2E.js} +1 -1
- package/dist/{workflow-engine-RID3QL2U.js → workflow-engine-S5JOE2YR.js} +2 -2
- package/dist/{worktree-XWVNDBRD.js → worktree-7V4ZMF3D.js} +5 -5
- package/dist/{worktree-sweep-6VEHGH7U.js → worktree-sweep-34MXJ7S6.js} +6 -6
- package/package.json +2 -1
- package/release-notes.json +25 -7
- package/stack.release.json +3 -3
- package/dist/chunk-ESO5JDOT.js +0 -70
- package/dist/chunk-KCRSJ3VU.js +0 -113
- package/dist/content-extractor-OVD7PTSN.js +0 -9
- /package/dist/{chunk-OLMLA377.js → chunk-542FBM5U.js} +0 -0
- /package/dist/{chunk-LDHJX4TZ.js → chunk-6D2O5SAH.js} +0 -0
- /package/dist/{chunk-33PG3KNY.js → chunk-6NRZLVK3.js} +0 -0
- /package/dist/{chunk-CLV7ALXV.js → chunk-CFO47VW4.js} +0 -0
- /package/dist/{chunk-FLO24BNN.js → chunk-EULAP6L6.js} +0 -0
- /package/dist/{chunk-PKM456D2.js → chunk-FYSKQPTE.js} +0 -0
- /package/dist/{chunk-WIDOLS7T.js → chunk-J4B4M5PH.js} +0 -0
- /package/dist/{chunk-YBB43SXC.js → chunk-J635FA7T.js} +0 -0
- /package/dist/{chunk-64UAHPXA.js → chunk-MOBZTIJQ.js} +0 -0
- /package/dist/{chunk-EZQ4W3WW.js → chunk-N45FAI6D.js} +0 -0
- /package/dist/{chunk-OEEHLATI.js → chunk-QDSNEGJE.js} +0 -0
- /package/dist/{chunk-YG4DZZ6J.js → chunk-SKSXROKP.js} +0 -0
- /package/dist/{chunk-FUZHMV7K.js → chunk-YVWXI2HM.js} +0 -0
- /package/dist/{core-memory-WR7I7DIP.js → core-memory-PZEO3OWH.js} +0 -0
- /package/dist/{memory-isolation-4RQJ5RCK.js → memory-isolation-MFNT2ITE.js} +0 -0
- /package/dist/{oauth-server-VBDMZIEV.js → oauth-server-CBGEWD6H.js} +0 -0
- /package/dist/{project-boot-G7T5WHO6.js → project-boot-VESAYDIH.js} +0 -0
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "./chunk-SSC7EKY2.js";
|
|
11
11
|
import {
|
|
12
12
|
computeDegradations
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-QOFQY7BJ.js";
|
|
14
14
|
import {
|
|
15
15
|
inventoryLocalSecretResidue,
|
|
16
16
|
redactResiduePathForDisplay
|
|
@@ -41,13 +41,17 @@ import {
|
|
|
41
41
|
} from "./chunk-BYP3DOUU.js";
|
|
42
42
|
import {
|
|
43
43
|
mcpHttpPort
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-27NG2NTG.js";
|
|
45
45
|
import {
|
|
46
46
|
isWithin
|
|
47
47
|
} from "./chunk-YRUZK2QA.js";
|
|
48
|
+
import {
|
|
49
|
+
eventLoopHeartbeatPath,
|
|
50
|
+
exeDir
|
|
51
|
+
} from "./chunk-ZQEJ4IX2.js";
|
|
48
52
|
import {
|
|
49
53
|
inspectKeyCustodySync
|
|
50
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-4J77TCTX.js";
|
|
51
55
|
import {
|
|
52
56
|
checkSingleGotrueInstance
|
|
53
57
|
} from "./chunk-FTZET5YX.js";
|
|
@@ -61,15 +65,186 @@ import {
|
|
|
61
65
|
// src/bin/exe-healthcheck.ts
|
|
62
66
|
import { existsSync as existsSync2, readFileSync as readFileSync2, readdirSync } from "fs";
|
|
63
67
|
import os2 from "os";
|
|
64
|
-
import
|
|
68
|
+
import path3 from "path";
|
|
65
69
|
import { execSync, spawnSync } from "child_process";
|
|
66
70
|
import { fileURLToPath } from "url";
|
|
67
71
|
|
|
72
|
+
// src/lib/daemon-serving-probe.ts
|
|
73
|
+
import { appendFileSync, closeSync, mkdirSync, openSync, readSync, statSync, writeFileSync } from "fs";
|
|
74
|
+
import { appendFile as appendAsync, mkdir, open as openAsync, stat as statAsync, writeFile } from "fs/promises";
|
|
75
|
+
import net from "net";
|
|
76
|
+
import path from "path";
|
|
77
|
+
var DEFAULT_DAEMON_HTTP_PORT = 48739;
|
|
78
|
+
var HEALTH_TIMEOUT_MS = 3e3;
|
|
79
|
+
var CONNECT_TIMEOUT_MS = 750;
|
|
80
|
+
var STALL_CAPTURE_LOG_TAIL_LINES = 200;
|
|
81
|
+
var STALL_CAPTURE_TAIL_MAX_BYTES = 256 * 1024;
|
|
82
|
+
var STALL_LOG_MAX_BYTES = 1024 * 1024;
|
|
83
|
+
var STALL_LOG_KEEP_BYTES = 512 * 1024;
|
|
84
|
+
function classifyServingEvidence(portOpen, healthAnswered) {
|
|
85
|
+
if (!portOpen) return "down";
|
|
86
|
+
return healthAnswered ? "healthy" : "stalled";
|
|
87
|
+
}
|
|
88
|
+
function stalledMessage() {
|
|
89
|
+
return "STALLED: port listening but /health not answering (event loop blocked?)";
|
|
90
|
+
}
|
|
91
|
+
function tcpConnectProbe(port, timeoutMs) {
|
|
92
|
+
return new Promise((resolve) => {
|
|
93
|
+
let settled = false;
|
|
94
|
+
const finish = (r) => {
|
|
95
|
+
if (settled) return;
|
|
96
|
+
settled = true;
|
|
97
|
+
try {
|
|
98
|
+
sock.destroy();
|
|
99
|
+
} catch {
|
|
100
|
+
}
|
|
101
|
+
resolve(r);
|
|
102
|
+
};
|
|
103
|
+
const sock = net.connect({ host: "127.0.0.1", port });
|
|
104
|
+
sock.once("connect", () => finish("open"));
|
|
105
|
+
sock.once("error", (err) => {
|
|
106
|
+
finish(err?.code === "ECONNREFUSED" ? "refused" : "timeout");
|
|
107
|
+
});
|
|
108
|
+
sock.setTimeout(timeoutMs, () => finish("timeout"));
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async function probeDaemonServing(opts = {}) {
|
|
112
|
+
const port = opts.port ?? DEFAULT_DAEMON_HTTP_PORT;
|
|
113
|
+
const healthTimeoutMs = opts.healthTimeoutMs ?? HEALTH_TIMEOUT_MS;
|
|
114
|
+
const connectTimeoutMs = opts.connectTimeoutMs ?? CONNECT_TIMEOUT_MS;
|
|
115
|
+
const doFetch = opts.fetchImpl ?? fetch;
|
|
116
|
+
const doConnect = opts.connectImpl ?? tcpConnectProbe;
|
|
117
|
+
const connect = await doConnect(port, connectTimeoutMs);
|
|
118
|
+
if (connect === "refused") {
|
|
119
|
+
return { state: "down", portOpen: false, detail: "daemon not listening \u2014 connection refused" };
|
|
120
|
+
}
|
|
121
|
+
if (connect === "timeout") {
|
|
122
|
+
return { state: "stalled", portOpen: true, detail: `${stalledMessage()} (TCP connect timed out \u2014 listen backlog saturated?)` };
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const res = await doFetch(`http://127.0.0.1:${port}/health`, {
|
|
126
|
+
signal: AbortSignal.timeout(healthTimeoutMs)
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
state: "healthy",
|
|
130
|
+
portOpen: true,
|
|
131
|
+
healthStatus: res.status,
|
|
132
|
+
detail: `/health answered (HTTP ${res.status})`
|
|
133
|
+
};
|
|
134
|
+
} catch {
|
|
135
|
+
return { state: "stalled", portOpen: true, detail: stalledMessage() };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function daemonStallsLogPath(dir) {
|
|
139
|
+
return path.join(dir ?? path.join(exeDir(), "logs"), "daemon-stalls.log");
|
|
140
|
+
}
|
|
141
|
+
function launchdLogPath(dir) {
|
|
142
|
+
return path.join(dir ?? path.join(exeDir(), "logs"), "exed-launchd.log");
|
|
143
|
+
}
|
|
144
|
+
function readTailSync(filePath, maxBytes) {
|
|
145
|
+
let fd;
|
|
146
|
+
try {
|
|
147
|
+
fd = openSync(filePath, "r");
|
|
148
|
+
const size = statSync(filePath).size;
|
|
149
|
+
const len = Math.min(size, maxBytes);
|
|
150
|
+
const buf = Buffer.alloc(len);
|
|
151
|
+
readSync(fd, buf, 0, len, Math.max(0, size - len));
|
|
152
|
+
return buf.toString("utf8");
|
|
153
|
+
} catch {
|
|
154
|
+
return "";
|
|
155
|
+
} finally {
|
|
156
|
+
if (fd !== void 0) {
|
|
157
|
+
try {
|
|
158
|
+
closeSync(fd);
|
|
159
|
+
} catch {
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function readTailAsync(filePath, maxBytes) {
|
|
165
|
+
let fh;
|
|
166
|
+
try {
|
|
167
|
+
fh = await openAsync(filePath, "r");
|
|
168
|
+
const { size } = await fh.stat();
|
|
169
|
+
const len = Math.min(size, maxBytes);
|
|
170
|
+
const buf = Buffer.alloc(len);
|
|
171
|
+
await fh.read(buf, 0, len, Math.max(0, size - len));
|
|
172
|
+
return buf.toString("utf8");
|
|
173
|
+
} catch {
|
|
174
|
+
return "";
|
|
175
|
+
} finally {
|
|
176
|
+
try {
|
|
177
|
+
await fh?.close();
|
|
178
|
+
} catch {
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function heartbeatAgeMs(now) {
|
|
183
|
+
try {
|
|
184
|
+
const age = now() - statSync(eventLoopHeartbeatPath()).mtimeMs;
|
|
185
|
+
return age >= 0 ? Math.round(age) : 0;
|
|
186
|
+
} catch {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function buildRecord(probe, opts) {
|
|
191
|
+
const now = opts.now ?? Date.now;
|
|
192
|
+
const tailLines = opts.tailLines ?? STALL_CAPTURE_LOG_TAIL_LINES;
|
|
193
|
+
const ts = new Date(now()).toISOString();
|
|
194
|
+
const hbAge = heartbeatAgeMs(now);
|
|
195
|
+
const tail = readTailSync(launchdLogPath(opts.dir), STALL_CAPTURE_TAIL_MAX_BYTES).split("\n").slice(-tailLines).join("\n").trimEnd();
|
|
196
|
+
const lines = [
|
|
197
|
+
`--- daemon stall ${ts} ---`,
|
|
198
|
+
`state: ${probe.state}`,
|
|
199
|
+
`detail: ${probe.detail}`,
|
|
200
|
+
`port_open: ${probe.portOpen}`,
|
|
201
|
+
`event_loop_heartbeat_age_ms: ${hbAge === null ? "unknown (no heartbeat file)" : String(hbAge)}`,
|
|
202
|
+
`exed-launchd.log tail (last ${tailLines} lines):`,
|
|
203
|
+
tail || "(log absent or empty)",
|
|
204
|
+
"",
|
|
205
|
+
""
|
|
206
|
+
];
|
|
207
|
+
return lines.join("\n");
|
|
208
|
+
}
|
|
209
|
+
function trimIfNeededSync(filePath, maxBytes = STALL_LOG_MAX_BYTES, keepBytes = STALL_LOG_KEEP_BYTES) {
|
|
210
|
+
try {
|
|
211
|
+
const size = statSync(filePath).size;
|
|
212
|
+
if (size <= maxBytes) return;
|
|
213
|
+
const keep = readTailSync(filePath, keepBytes);
|
|
214
|
+
writeFileSync(filePath, keep);
|
|
215
|
+
} catch {
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function captureDaemonStallSync(probe, opts = {}) {
|
|
219
|
+
if (probe.state !== "stalled") return;
|
|
220
|
+
try {
|
|
221
|
+
const target = daemonStallsLogPath(opts.dir);
|
|
222
|
+
mkdirSync(path.dirname(target), { recursive: true });
|
|
223
|
+
appendFileSync(target, buildRecord(probe, opts), "utf8");
|
|
224
|
+
trimIfNeededSync(target, opts.maxBytes, opts.keepBytes);
|
|
225
|
+
} catch {
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async function captureDaemonStall(probe, opts = {}) {
|
|
229
|
+
if (probe.state !== "stalled") return;
|
|
230
|
+
try {
|
|
231
|
+
const target = daemonStallsLogPath(opts.dir);
|
|
232
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
233
|
+
await appendAsync(target, buildRecord(probe, opts), "utf8");
|
|
234
|
+
const { size } = await statAsync(target);
|
|
235
|
+
if (size > (opts.maxBytes ?? STALL_LOG_MAX_BYTES)) {
|
|
236
|
+
const keep = await readTailAsync(target, opts.keepBytes ?? STALL_LOG_KEEP_BYTES);
|
|
237
|
+
await writeFile(target, keep, "utf8");
|
|
238
|
+
}
|
|
239
|
+
} catch {
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
68
243
|
// src/lib/daemon-supervision.ts
|
|
69
244
|
import { execFileSync } from "child_process";
|
|
70
245
|
import { existsSync, readFileSync } from "fs";
|
|
71
246
|
import os from "os";
|
|
72
|
-
import
|
|
247
|
+
import path2 from "path";
|
|
73
248
|
function assessSupervision(i) {
|
|
74
249
|
if (!i.supervisorConfigured) {
|
|
75
250
|
return {
|
|
@@ -153,7 +328,7 @@ function readSystemdPid() {
|
|
|
153
328
|
}
|
|
154
329
|
}
|
|
155
330
|
function readLiveDaemonPid() {
|
|
156
|
-
const pidPath = process.env.EXE_DAEMON_PID ?? process.env.EXE_EMBED_PID ??
|
|
331
|
+
const pidPath = process.env.EXE_DAEMON_PID ?? process.env.EXE_EMBED_PID ?? path2.join(process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? path2.join(os.homedir(), ".exe-os"), "exed.pid");
|
|
157
332
|
try {
|
|
158
333
|
const pid = parseInt(readFileSync(pidPath, "utf8").trim(), 10);
|
|
159
334
|
if (!Number.isFinite(pid) || pid <= 1) return null;
|
|
@@ -167,7 +342,7 @@ function readSupervisionState() {
|
|
|
167
342
|
const platform = process.platform;
|
|
168
343
|
const runningPid = readLiveDaemonPid();
|
|
169
344
|
if (platform === "darwin") {
|
|
170
|
-
const plist =
|
|
345
|
+
const plist = path2.join(os.homedir(), "Library", "LaunchAgents", "com.askexe.exed.plist");
|
|
171
346
|
const plistInstalled = existsSync(plist);
|
|
172
347
|
const launchdPid = plistInstalled ? readLaunchdPid(process.getuid?.() ?? 501) : void 0;
|
|
173
348
|
return assessSupervision({
|
|
@@ -197,17 +372,17 @@ var CC_NATIVE_ONLY_CUTOFF2 = CC_NATIVE_ONLY_CUTOFF;
|
|
|
197
372
|
var compareSemver2 = compareSemver;
|
|
198
373
|
var detectAutoupdaterVar2 = detectAutoupdaterVar;
|
|
199
374
|
function findPackageRoot() {
|
|
200
|
-
let dir =
|
|
201
|
-
const { root } =
|
|
375
|
+
let dir = path3.dirname(fileURLToPath(import.meta.url));
|
|
376
|
+
const { root } = path3.parse(dir);
|
|
202
377
|
while (dir !== root) {
|
|
203
|
-
if (existsSync2(
|
|
204
|
-
dir =
|
|
378
|
+
if (existsSync2(path3.join(dir, "package.json"))) return dir;
|
|
379
|
+
dir = path3.dirname(dir);
|
|
205
380
|
}
|
|
206
381
|
throw new Error("Cannot find package root");
|
|
207
382
|
}
|
|
208
383
|
function checkBuildIntegrity(pkgRoot) {
|
|
209
384
|
const results = [];
|
|
210
|
-
const tsupConfig =
|
|
385
|
+
const tsupConfig = path3.join(pkgRoot, "tsup.config.ts");
|
|
211
386
|
if (!existsSync2(tsupConfig)) {
|
|
212
387
|
return [{ name: "build/tsup-config", pass: false, detail: "tsup.config.ts not found" }];
|
|
213
388
|
}
|
|
@@ -217,7 +392,7 @@ function checkBuildIntegrity(pkgRoot) {
|
|
|
217
392
|
let total = 0;
|
|
218
393
|
for (const match of entryMatches) {
|
|
219
394
|
const outputKey = match[1];
|
|
220
|
-
const expectedPath =
|
|
395
|
+
const expectedPath = path3.join(pkgRoot, "dist", `${outputKey}.js`);
|
|
221
396
|
total++;
|
|
222
397
|
if (!existsSync2(expectedPath)) {
|
|
223
398
|
missing.push(`dist/${outputKey}.js`);
|
|
@@ -241,7 +416,7 @@ function checkBuildIntegrity(pkgRoot) {
|
|
|
241
416
|
}
|
|
242
417
|
function checkEmbedPipeline(pkgRoot) {
|
|
243
418
|
const results = [];
|
|
244
|
-
const daemonPath =
|
|
419
|
+
const daemonPath = path3.join(pkgRoot, "dist", "lib", "exe-daemon.js");
|
|
245
420
|
if (!existsSync2(daemonPath)) {
|
|
246
421
|
results.push({
|
|
247
422
|
name: "exed/daemon-exists",
|
|
@@ -253,17 +428,17 @@ function checkEmbedPipeline(pkgRoot) {
|
|
|
253
428
|
results.push({ name: "exed/daemon-exists", pass: true, detail: "dist/lib/exe-daemon.js exists" });
|
|
254
429
|
const entryDirs = ["dist/hooks", "dist/bin", "dist/mcp"];
|
|
255
430
|
for (const dir of entryDirs) {
|
|
256
|
-
const fullDir =
|
|
431
|
+
const fullDir = path3.join(pkgRoot, dir);
|
|
257
432
|
if (!existsSync2(fullDir)) continue;
|
|
258
433
|
let walkDir = fullDir;
|
|
259
|
-
const { root } =
|
|
434
|
+
const { root } = path3.parse(walkDir);
|
|
260
435
|
let foundRoot = null;
|
|
261
436
|
while (walkDir !== root) {
|
|
262
|
-
if (existsSync2(
|
|
437
|
+
if (existsSync2(path3.join(walkDir, "package.json"))) {
|
|
263
438
|
foundRoot = walkDir;
|
|
264
439
|
break;
|
|
265
440
|
}
|
|
266
|
-
walkDir =
|
|
441
|
+
walkDir = path3.dirname(walkDir);
|
|
267
442
|
}
|
|
268
443
|
if (!foundRoot) {
|
|
269
444
|
results.push({
|
|
@@ -273,7 +448,7 @@ function checkEmbedPipeline(pkgRoot) {
|
|
|
273
448
|
});
|
|
274
449
|
continue;
|
|
275
450
|
}
|
|
276
|
-
const resolvedDaemon =
|
|
451
|
+
const resolvedDaemon = path3.join(foundRoot, "dist", "lib", "exe-daemon.js");
|
|
277
452
|
const reachable = existsSync2(resolvedDaemon);
|
|
278
453
|
results.push({
|
|
279
454
|
name: `exed/reachable-from-${dir}`,
|
|
@@ -284,8 +459,8 @@ function checkEmbedPipeline(pkgRoot) {
|
|
|
284
459
|
return results;
|
|
285
460
|
}
|
|
286
461
|
function checkDaemonDrift(pkgRoot, opts) {
|
|
287
|
-
const runningScript = resolveRunningDaemonScript(opts?.pidFile ??
|
|
288
|
-
const fallbackScript =
|
|
462
|
+
const runningScript = resolveRunningDaemonScript(opts?.pidFile ?? path3.join(EXE_AI_DIR, "exed.pid"));
|
|
463
|
+
const fallbackScript = path3.join(pkgRoot, "dist", "lib", "exe-daemon.js");
|
|
289
464
|
const result = measureDaemonDrift({
|
|
290
465
|
daemonScript: runningScript ?? (existsSync2(fallbackScript) ? fallbackScript : null),
|
|
291
466
|
referenceRoot: pkgRoot
|
|
@@ -348,7 +523,7 @@ function checkRuntimeDrift(pkgRoot, opts) {
|
|
|
348
523
|
const hookChecks = hookResults.map(
|
|
349
524
|
(result, i) => formatDriftCheck(hookResults.length === 1 ? "exed/runtime-drift-hooks" : `exed/runtime-drift-hooks[${i + 1}]`, result)
|
|
350
525
|
);
|
|
351
|
-
const daemonScript = resolveRunningDaemonScript(opts?.pidFile ??
|
|
526
|
+
const daemonScript = resolveRunningDaemonScript(opts?.pidFile ?? path3.join(EXE_AI_DIR, "exed.pid"));
|
|
352
527
|
const daemonRoot = daemonScript ? checkoutRootFromScript(daemonScript) : null;
|
|
353
528
|
const daemonRunning = daemonRoot ? readBuildIdentity(daemonRoot) : null;
|
|
354
529
|
const daemonResult = compareRuntimeIdentity("daemon", daemonRunning, installed);
|
|
@@ -356,7 +531,7 @@ function checkRuntimeDrift(pkgRoot, opts) {
|
|
|
356
531
|
}
|
|
357
532
|
function checkTaskSystem(pkgRoot) {
|
|
358
533
|
const results = [];
|
|
359
|
-
const scannerPath =
|
|
534
|
+
const scannerPath = path3.join(pkgRoot, "dist", "bin", "scan-tasks.js");
|
|
360
535
|
if (!existsSync2(scannerPath)) {
|
|
361
536
|
results.push({ name: "tasks/scanner", pass: false, detail: "scan-tasks.js not found" });
|
|
362
537
|
return results;
|
|
@@ -379,7 +554,7 @@ function checkTaskSystem(pkgRoot) {
|
|
|
379
554
|
}
|
|
380
555
|
function checkWorkerSpawning(pkgRoot) {
|
|
381
556
|
const results = [];
|
|
382
|
-
const workerPath =
|
|
557
|
+
const workerPath = path3.join(pkgRoot, "dist", "hooks", "ingest-worker.js");
|
|
383
558
|
if (!existsSync2(workerPath)) {
|
|
384
559
|
results.push({ name: "workers/ingest-worker", pass: false, detail: "ingest-worker.js not found" });
|
|
385
560
|
return results;
|
|
@@ -394,14 +569,14 @@ function checkWorkerSpawning(pkgRoot) {
|
|
|
394
569
|
detail: `Parse error: ${err instanceof Error ? err.message.slice(0, 200) : String(err)}`
|
|
395
570
|
});
|
|
396
571
|
}
|
|
397
|
-
const hooksDir =
|
|
572
|
+
const hooksDir = path3.join(pkgRoot, "dist", "hooks");
|
|
398
573
|
if (existsSync2(hooksDir)) {
|
|
399
574
|
const hookFiles = readdirSync(hooksDir).filter((f) => f.endsWith(".js") && !f.endsWith(".js.map"));
|
|
400
575
|
let hooksPassed = 0;
|
|
401
576
|
const hooksFailed = [];
|
|
402
577
|
for (const hook of hookFiles) {
|
|
403
578
|
try {
|
|
404
|
-
execSync(`node --check "${
|
|
579
|
+
execSync(`node --check "${path3.join(hooksDir, hook)}" 2>&1`, { timeout: 1e4, encoding: "utf-8" });
|
|
405
580
|
hooksPassed++;
|
|
406
581
|
} catch {
|
|
407
582
|
hooksFailed.push(hook);
|
|
@@ -425,8 +600,8 @@ function checkWorkerSpawning(pkgRoot) {
|
|
|
425
600
|
}
|
|
426
601
|
function checkMcpTransport() {
|
|
427
602
|
const results = [];
|
|
428
|
-
const pidPath =
|
|
429
|
-
const tokenPath =
|
|
603
|
+
const pidPath = path3.join(EXE_AI_DIR, "exed.pid");
|
|
604
|
+
const tokenPath = path3.join(EXE_AI_DIR, "exed.token");
|
|
430
605
|
let daemonAlive = false;
|
|
431
606
|
if (existsSync2(pidPath)) {
|
|
432
607
|
try {
|
|
@@ -468,6 +643,38 @@ function checkMcpTransport() {
|
|
|
468
643
|
} else if (daemonAlive) {
|
|
469
644
|
results.push({ name: "mcp/http-endpoint", pass: false, detail: "Daemon is alive but exed.token is missing; cannot probe MCP HTTP" });
|
|
470
645
|
}
|
|
646
|
+
if (daemonAlive && existsSync2(tokenPath)) {
|
|
647
|
+
const port = /^\d+$/.test(mcpHttpPort()) ? mcpHttpPort() : "48739";
|
|
648
|
+
try {
|
|
649
|
+
const token = readFileSync2(tokenPath, "utf8").trim();
|
|
650
|
+
const code = execSync(
|
|
651
|
+
`curl -sS -o /dev/null -w "%{http_code}" -m 2 -H "Authorization: Bearer ${token}" http://127.0.0.1:${port}/health`,
|
|
652
|
+
{ encoding: "utf8", timeout: 2500 }
|
|
653
|
+
).trim();
|
|
654
|
+
const answered = /^\d{3}$/.test(code) && code !== "000";
|
|
655
|
+
results.push({
|
|
656
|
+
name: "mcp/serving-probe",
|
|
657
|
+
pass: answered,
|
|
658
|
+
detail: answered ? `Daemon serving /health (HTTP ${code})` : `${stalledMessage()} (curl code ${code} after 2s)`
|
|
659
|
+
});
|
|
660
|
+
if (!answered) {
|
|
661
|
+
captureDaemonStallSync({ state: "stalled", portOpen: true, detail: stalledMessage() });
|
|
662
|
+
}
|
|
663
|
+
} catch (err) {
|
|
664
|
+
const rawMsg = err instanceof Error ? err.message : String(err);
|
|
665
|
+
const msg = redactSecrets(rawMsg).text.slice(0, 180);
|
|
666
|
+
const refused = msg.includes("Failed to connect") || msg.includes("Connection refused");
|
|
667
|
+
const state = classifyServingEvidence(!refused, false);
|
|
668
|
+
results.push({
|
|
669
|
+
name: "mcp/serving-probe",
|
|
670
|
+
pass: false,
|
|
671
|
+
detail: state === "stalled" ? `${stalledMessage()} (probe error: ${msg})` : `Daemon not listening \u2014 connection refused (${msg})`
|
|
672
|
+
});
|
|
673
|
+
if (state === "stalled") {
|
|
674
|
+
captureDaemonStallSync({ state, portOpen: true, detail: stalledMessage() });
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
}
|
|
471
678
|
const events = readMcpHttpEvents(200);
|
|
472
679
|
const summary = summarizeMcpTransport(events);
|
|
473
680
|
results.push({
|
|
@@ -478,7 +685,7 @@ function checkMcpTransport() {
|
|
|
478
685
|
results.push({
|
|
479
686
|
name: "mcp/monitor-summary",
|
|
480
687
|
pass: true,
|
|
481
|
-
detail: `Privacy-safe local monitor summary: ${
|
|
688
|
+
detail: `Privacy-safe local monitor summary: ${path3.join(EXE_AI_DIR, "monitor", "mcp-transport-summary.json")}`
|
|
482
689
|
});
|
|
483
690
|
return results;
|
|
484
691
|
}
|
|
@@ -536,7 +743,7 @@ function checkClaudeCodeInstall() {
|
|
|
536
743
|
detail: "Failed to check claude binary path"
|
|
537
744
|
});
|
|
538
745
|
}
|
|
539
|
-
const versionsDir =
|
|
746
|
+
const versionsDir = path3.join(
|
|
540
747
|
process.env.HOME ?? process.env.USERPROFILE ?? "",
|
|
541
748
|
".local",
|
|
542
749
|
"share",
|
|
@@ -632,13 +839,13 @@ function checkRetrievalHealth() {
|
|
|
632
839
|
const results = [];
|
|
633
840
|
let embedDaemon = "unavailable";
|
|
634
841
|
try {
|
|
635
|
-
const pidPath =
|
|
842
|
+
const pidPath = path3.join(EXE_AI_DIR, "exed.pid");
|
|
636
843
|
if (existsSync2(pidPath)) {
|
|
637
844
|
const pid = parseInt(readFileSync2(pidPath, "utf8").trim(), 10);
|
|
638
845
|
try {
|
|
639
846
|
process.kill(pid, 0);
|
|
640
847
|
try {
|
|
641
|
-
const tokenPath =
|
|
848
|
+
const tokenPath = path3.join(EXE_AI_DIR, "exed.token");
|
|
642
849
|
if (existsSync2(tokenPath)) {
|
|
643
850
|
const token = readFileSync2(tokenPath, "utf8").trim();
|
|
644
851
|
const port = /^\d+$/.test(mcpHttpPort()) ? mcpHttpPort() : "48739";
|
|
@@ -679,7 +886,7 @@ function checkRetrievalHealth() {
|
|
|
679
886
|
});
|
|
680
887
|
let configuredSearchMode = "hybrid";
|
|
681
888
|
try {
|
|
682
|
-
const configPath =
|
|
889
|
+
const configPath = path3.join(EXE_AI_DIR, "config.json");
|
|
683
890
|
if (existsSync2(configPath)) {
|
|
684
891
|
const cfg = JSON.parse(readFileSync2(configPath, "utf8"));
|
|
685
892
|
if (cfg.searchMode) configuredSearchMode = cfg.searchMode;
|
|
@@ -699,7 +906,7 @@ function checkRetrievalHealth() {
|
|
|
699
906
|
}
|
|
700
907
|
let queryRouter = "fallback";
|
|
701
908
|
try {
|
|
702
|
-
const configPath =
|
|
909
|
+
const configPath = path3.join(EXE_AI_DIR, "config.json");
|
|
703
910
|
if (existsSync2(configPath)) {
|
|
704
911
|
const cfg = JSON.parse(readFileSync2(configPath, "utf8"));
|
|
705
912
|
if (cfg.selfQueryRouter === false) {
|
|
@@ -753,7 +960,7 @@ function checkRetrievalHealth() {
|
|
|
753
960
|
detail: queryRouter === "active" ? "\u{1F7E2} Query router: active (LLM-based)" : queryRouter === "disabled" ? "\u2139\uFE0F Query router: disabled by configuration" : `\u2139\uFE0F ${queryRouterDegradation?.message ?? "Query router: fallback (rule-based)"}`
|
|
754
961
|
});
|
|
755
962
|
try {
|
|
756
|
-
const ledgerPath =
|
|
963
|
+
const ledgerPath = path3.join(EXE_AI_DIR, "db-restore-events.json");
|
|
757
964
|
if (existsSync2(ledgerPath)) {
|
|
758
965
|
const raw = JSON.parse(readFileSync2(ledgerPath, "utf8"));
|
|
759
966
|
if (Array.isArray(raw) && raw.length > 0) {
|
|
@@ -859,7 +1066,7 @@ function healthcheckTimeoutMs() {
|
|
|
859
1066
|
}
|
|
860
1067
|
function resolveHealthcheckScript() {
|
|
861
1068
|
try {
|
|
862
|
-
const built =
|
|
1069
|
+
const built = path3.join(findPackageRoot(), "dist", "bin", "exe-healthcheck.js");
|
|
863
1070
|
if (existsSync2(built)) return built;
|
|
864
1071
|
} catch {
|
|
865
1072
|
}
|
|
@@ -950,6 +1157,8 @@ if ((process.argv[1] ?? "").includes("exe-healthcheck")) {
|
|
|
950
1157
|
}
|
|
951
1158
|
|
|
952
1159
|
export {
|
|
1160
|
+
probeDaemonServing,
|
|
1161
|
+
captureDaemonStall,
|
|
953
1162
|
readSupervisionState,
|
|
954
1163
|
CC_NATIVE_ONLY_CUTOFF2 as CC_NATIVE_ONLY_CUTOFF,
|
|
955
1164
|
compareSemver2 as compareSemver,
|
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
} from "./chunk-CBPNZFSU.js";
|
|
4
4
|
import {
|
|
5
5
|
initStore
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-LSHUX7P4.js";
|
|
7
7
|
import {
|
|
8
8
|
getClient,
|
|
9
9
|
isInitialized
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-L5JFVK5T.js";
|
|
11
11
|
|
|
12
12
|
// src/lib/schedules.ts
|
|
13
13
|
import crypto from "crypto";
|
|
@@ -4,14 +4,14 @@ import {
|
|
|
4
4
|
} from "./chunk-EVMOKRBC.js";
|
|
5
5
|
import {
|
|
6
6
|
registerDaemonScopedQueryChokepoint
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-KN5GAVCG.js";
|
|
8
8
|
import {
|
|
9
9
|
orgPartnerModeActive,
|
|
10
10
|
requireOrgPartnerBinding,
|
|
11
11
|
resolveOrgPartnerBindings,
|
|
12
12
|
resolvePartnerIdentities,
|
|
13
13
|
rosterKeyLookupFor
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-CJ6CS2IH.js";
|
|
15
15
|
import {
|
|
16
16
|
createDerivedSeqStore,
|
|
17
17
|
createMailboxOpener,
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
isConsentMacPrimed,
|
|
21
21
|
primeTaskOriginMarkerKey,
|
|
22
22
|
scopedQueryChokepointStatus
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-XQ7BIVLI.js";
|
|
24
24
|
import {
|
|
25
25
|
flushMailboxOutbox
|
|
26
26
|
} from "./chunk-3FGBBJYM.js";
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PLATFORM_PROCEDURE_TITLES
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4CN3EE6U.js";
|
|
4
4
|
import {
|
|
5
5
|
isGhostBehaviorRow
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-KEDZRQI3.js";
|
|
7
7
|
import {
|
|
8
8
|
IdentityConflictError,
|
|
9
9
|
getClient,
|
|
10
10
|
getIdentity,
|
|
11
11
|
listIdentities,
|
|
12
12
|
updateIdentity
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-L5JFVK5T.js";
|
|
14
14
|
import {
|
|
15
15
|
atomicWriteJsonSync
|
|
16
16
|
} from "./chunk-HSGBZSCA.js";
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveAuth,
|
|
3
3
|
resolveEndpoint
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-HA6BIZ6L.js";
|
|
5
5
|
import {
|
|
6
6
|
resolvePartnerIdentities
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-CJ6CS2IH.js";
|
|
8
8
|
import {
|
|
9
9
|
displayFingerprint,
|
|
10
10
|
ed25519PrivateKeyFromSeed
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-MZNLQC6W.js";
|
|
12
12
|
|
|
13
13
|
// src/lib/org-member-key.ts
|
|
14
14
|
import { createHash, sign } from "crypto";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
listBehaviors
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-KEDZRQI3.js";
|
|
4
4
|
import {
|
|
5
5
|
incrementSkillUsage
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-CFFSHBQF.js";
|
|
7
7
|
|
|
8
8
|
// src/lib/behavior-injection.ts
|
|
9
9
|
import { appendFile } from "fs/promises";
|
|
@@ -349,7 +349,7 @@ async function injectBehaviors(opts) {
|
|
|
349
349
|
`[behavior-injection] ${opts.assignedTo} <- ${selected.length}/${behaviors.length} behaviour(s) for "${opts.title.slice(0, 60)}": ` + selected.map((s) => `${s.behavior.id.slice(0, 8)}(${s.score.toFixed(2)})`).join(" ") + "\n"
|
|
350
350
|
);
|
|
351
351
|
await incrementSkillUsage(selected.map((s) => s.behavior));
|
|
352
|
-
const { recordBehaviorsConsulted } = await import("./skill-usage-
|
|
352
|
+
const { recordBehaviorsConsulted } = await import("./skill-usage-2MBTF7Y4.js");
|
|
353
353
|
await recordBehaviorsConsulted(selected.map((s) => s.behavior.id));
|
|
354
354
|
return selected;
|
|
355
355
|
} catch (err) {
|