@askexenow/exe-os 0.9.299 → 0.9.301
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deploy/compose/.env.customer.example +1 -1
- package/deploy/compose/.env.example +1 -1
- package/deploy/compose/docker-compose.yml +31 -5
- package/deploy/compose/erp-nginx/nginx.conf +6 -3
- package/deploy/compose/generate-env.ts +1 -1
- package/deploy/compose/observability/otel-collector-config.yaml +10 -1
- package/deploy/compose/setup.sh +1 -1
- package/dist/active-agent-56J56WW5.js +27 -0
- package/dist/active-agent-UNJO6AJ2.js +27 -0
- package/dist/active-agent-VDWK7TES.js +28 -0
- package/dist/active-agent-Y5LSIMVC.js +28 -0
- package/dist/agentic-ontology-MZ4WHFDE.js +25 -0
- package/dist/agentic-ontology-QEV7GI3T.js +25 -0
- package/dist/assets/com.askexe.exed.plist +6 -5
- package/dist/backfill-metadata-IHKI5GXV.js +600 -0
- package/dist/backfill-metadata-RQZ4BN7G.js +600 -0
- package/dist/backfill-metadata-ZU3SZNBD.js +600 -0
- package/dist/behaviors-A3L5CWMK.js +46 -0
- package/dist/behaviors-G4KWGS24.js +46 -0
- package/dist/behaviors-WO67R6C4.js +46 -0
- package/dist/bin/agentic-ontology-backfill.js +5 -5
- package/dist/bin/agentic-reflection-backfill.js +6 -6
- package/dist/bin/agentic-semantic-label.js +5 -5
- package/dist/bin/backfill-conversations.js +6 -6
- package/dist/bin/backfill-responses.js +6 -6
- package/dist/bin/backfill-vectors.js +8 -8
- package/dist/bin/bulk-sync-postgres.js +13 -7
- package/dist/bin/cc-doctor.js +5 -5
- package/dist/bin/cleanup-stale-review-tasks.js +10 -10
- package/dist/bin/cli.js +16 -16
- package/dist/bin/deferred-daemon-restart.js +1 -1
- package/dist/bin/exe-agent-config.js +2 -2
- package/dist/bin/exe-agent.js +10 -10
- package/dist/bin/exe-assign.js +8 -8
- package/dist/bin/exe-boot.js +36 -21
- package/dist/bin/exe-call.js +4 -4
- package/dist/bin/exe-cloud.js +13 -7
- package/dist/bin/exe-dispatch.js +10 -10
- package/dist/bin/exe-doctor.js +2 -2
- package/dist/bin/exe-export-behaviors.js +7 -7
- package/dist/bin/exe-forget.js +6 -6
- package/dist/bin/exe-gateway.js +7 -7
- package/dist/bin/exe-healthcheck.js +5 -5
- package/dist/bin/exe-heartbeat.js +10 -10
- package/dist/bin/exe-kill.js +13 -13
- package/dist/bin/exe-launch-agent.js +29 -19
- package/dist/bin/exe-new-employee.js +6 -6
- package/dist/bin/exe-pending-messages.js +11 -11
- package/dist/bin/exe-pending-notifications.js +10 -10
- package/dist/bin/exe-pending-reviews.js +10 -10
- package/dist/bin/exe-rename.js +4 -4
- package/dist/bin/exe-review.js +12 -12
- package/dist/bin/exe-search.js +5 -5
- package/dist/bin/exe-session-cleanup.js +15 -15
- package/dist/bin/exe-settings.js +13 -7
- package/dist/bin/exe-start-codex.js +11 -11
- package/dist/bin/exe-start-opencode.js +8 -8
- package/dist/bin/exe-status.js +11 -11
- package/dist/bin/exe-team.js +3 -3
- package/dist/bin/exe-watchdog.js +3 -3
- package/dist/bin/git-sweep.js +11 -11
- package/dist/bin/graph-backfill.js +6 -6
- package/dist/bin/graph-export.js +5 -5
- package/dist/bin/import-history.js +9 -9
- package/dist/bin/install-launchd.js +7 -3
- package/dist/bin/install.js +19 -15
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +4 -4
- 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 +24 -1
- package/dist/bin/scan-tasks.js +10 -10
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +4 -4
- package/dist/bin/stack-update.js +123 -3
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/capability-cards-VTGDTOZ4.js +89 -0
- package/dist/capability-cards-XAQSL26B.js +89 -0
- package/dist/capacity-monitor-6MQLFFQT.js +51 -0
- package/dist/capacity-monitor-BB3LKJLE.js +51 -0
- package/dist/capacity-monitor-G2MAJPRP.js +51 -0
- package/dist/catchup-brief-BQSL5M5S.js +175 -0
- package/dist/catchup-brief-COALBX6L.js +175 -0
- package/dist/catchup-brief-VBGEJQRS.js +175 -0
- package/dist/cc-binary-detect-B5JDCJ5J.js +19 -0
- package/dist/chunk-22LDUTY7.js +14597 -0
- package/dist/chunk-24JVDLQJ.js +345 -0
- package/dist/chunk-24M4AJPG.js +128 -0
- package/dist/chunk-2B7RCTPT.js +85 -0
- package/dist/chunk-2QBA6YE6.js +127 -0
- package/dist/chunk-2RGDEBZC.js +731 -0
- package/dist/chunk-2T3OYZMR.js +1158 -0
- package/dist/chunk-32DBQWR5.js +333 -0
- package/dist/chunk-3ABY3QDX.js +199 -0
- package/dist/chunk-3EOPMTG2.js +128 -0
- package/dist/chunk-3G3ECFB5.js +668 -0
- package/dist/chunk-3LHOFGHT.js +280 -0
- package/dist/chunk-3NS4V4JW.js +382 -0
- package/dist/chunk-3NYY2NZ3.js +836 -0
- package/dist/chunk-3RA62PNQ.js +58 -0
- package/dist/chunk-3ROUD5WA.js +97 -0
- package/dist/chunk-3RY2ARDN.js +129 -0
- package/dist/chunk-3XRS5AVV.js +567 -0
- package/dist/chunk-3Y5IRIRU.js +290 -0
- package/dist/chunk-3YK7X5FD.js +1186 -0
- package/dist/chunk-3ZWWUKBI.js +210 -0
- package/dist/chunk-463G3VAH.js +122 -0
- package/dist/chunk-4L6PVYFE.js +54 -0
- package/dist/chunk-4LC7BFI2.js +76 -0
- package/dist/chunk-4O67LBMK.js +377 -0
- package/dist/chunk-4OIU3N6U.js +167 -0
- package/dist/chunk-4Z3FWLOE.js +836 -0
- package/dist/chunk-5BAU4T5G.js +208 -0
- package/dist/chunk-5FP7YHCG.js +1158 -0
- package/dist/chunk-5SYYMNPE.js +30 -0
- package/dist/chunk-5TO5PH7O.js +304 -0
- package/dist/chunk-5U3JZP62.js +1352 -0
- package/dist/chunk-5VNFXIGF.js +85 -0
- package/dist/chunk-5XD2Y463.js +402 -0
- package/dist/chunk-63AENHJC.js +123 -0
- package/dist/chunk-673IFJYB.js +731 -0
- package/dist/chunk-6UVUJNLY.js +1186 -0
- package/dist/chunk-7AWH47AR.js +448 -0
- package/dist/chunk-7KPWYWYL.js +290 -0
- package/dist/chunk-7P4B6AEP.js +227 -0
- package/dist/chunk-7URNGDEY.js +2145 -0
- package/dist/chunk-7VHOALNC.js +244 -0
- package/dist/chunk-ADZQBZOX.js +122 -0
- package/dist/chunk-APSZAEDO.js +1186 -0
- package/dist/chunk-ASHF6VO4.js +2265 -0
- package/dist/chunk-ASJHCAVL.js +38 -0
- package/dist/chunk-BT2LEHIW.js +448 -0
- package/dist/chunk-BTS5QUWB.js +50 -0
- package/dist/chunk-BWJDJ3BS.js +604 -0
- package/dist/chunk-CME46VWP.js +150 -0
- package/dist/chunk-D3ICCKXY.js +54 -0
- package/dist/chunk-D3IOU3NO.js +377 -0
- package/dist/chunk-DFGXRKI2.js +221 -0
- package/dist/chunk-DICIFTCS.js +150 -0
- package/dist/chunk-DIFI5JDC.js +76 -0
- package/dist/chunk-DO65VHQZ.js +128 -0
- package/dist/chunk-DPOIJ5SM.js +284 -0
- package/dist/chunk-E2OMUBXQ.js +567 -0
- package/dist/chunk-ECMXIV6N.js +97 -0
- package/dist/chunk-EDMVA3PT.js +727 -0
- package/dist/chunk-F5OSXH4A.js +4388 -0
- package/dist/chunk-F5OWHPRG.js +236 -0
- package/dist/chunk-F7MZA3QP.js +199 -0
- package/dist/chunk-FAZNXNA5.js +33 -0
- package/dist/chunk-FCHG5RC4.js +197 -0
- package/dist/chunk-FFKSPZO2.js +157 -0
- package/dist/chunk-FNHYH5U6.js +331 -0
- package/dist/chunk-FRNXQSB4.js +134 -0
- package/dist/chunk-FTAASABV.js +362 -0
- package/dist/chunk-FWPDAQ6Q.js +1350 -0
- package/dist/chunk-FZB73QOI.js +210 -0
- package/dist/chunk-GBL5QSTM.js +197 -0
- package/dist/chunk-GJBR6QLD.js +630 -0
- package/dist/chunk-GRSYAHKI.js +535 -0
- package/dist/chunk-GRXWINOW.js +244 -0
- package/dist/chunk-GUPNVUG5.js +348 -0
- package/dist/chunk-GY66UPMX.js +167 -0
- package/dist/chunk-HCCG67BY.js +43 -0
- package/dist/chunk-HCSZZXZZ.js +197 -0
- package/dist/chunk-HNGNZU62.js +240 -0
- package/dist/chunk-HP2D5LIE.js +214 -0
- package/dist/chunk-HUABQHDC.js +1352 -0
- package/dist/chunk-HYKO2LNW.js +157 -0
- package/dist/chunk-IFL6DG2K.js +181 -0
- package/dist/chunk-IKPQRHVQ.js +304 -0
- package/dist/chunk-J5HFRVNW.js +362 -0
- package/dist/chunk-J6SD7LT2.js +171 -0
- package/dist/chunk-JCWA3X6A.js +402 -0
- package/dist/chunk-JHPK33IP.js +2162 -0
- package/dist/chunk-JURL2S27.js +128 -0
- package/dist/chunk-JWGDH5I2.js +127 -0
- package/dist/chunk-KBXQFXYM.js +567 -0
- package/dist/chunk-KGY5QIOJ.js +1350 -0
- package/dist/chunk-KLES22FB.js +1094 -0
- package/dist/chunk-KPUYYOFS.js +122 -0
- package/dist/chunk-KY43UELJ.js +331 -0
- package/dist/chunk-L32V4O5Z.js +58 -0
- package/dist/chunk-LAFARYU5.js +456 -0
- package/dist/chunk-LC7ETNTJ.js +1350 -0
- package/dist/chunk-LEJ5FKIK.js +55 -0
- package/dist/chunk-LNLLCAI4.js +377 -0
- package/dist/chunk-LQWZYMNU.js +448 -0
- package/dist/chunk-LSDXEHKL.js +381 -0
- package/dist/chunk-LY3SOO73.js +76 -0
- package/dist/chunk-M6CIHXXB.js +159 -0
- package/dist/chunk-MJOQ35DX.js +427 -0
- package/dist/chunk-MO5HER5Y.js +345 -0
- package/dist/chunk-MS2EOZJQ.js +290 -0
- package/dist/chunk-MUIMJGSQ.js +128 -0
- package/dist/chunk-MY4TGLT6.js +284 -0
- package/dist/chunk-N3ARGCVG.js +345 -0
- package/dist/chunk-N4XG2M2U.js +735 -0
- package/dist/chunk-N72JNFJ4.js +535 -0
- package/dist/chunk-NJMPNYBS.js +427 -0
- package/dist/chunk-NM3AUMFE.js +2145 -0
- package/dist/chunk-NPPQ3TR4.js +735 -0
- package/dist/chunk-NTWF4DAF.js +581 -0
- package/dist/chunk-NXL3VKXM.js +331 -0
- package/dist/chunk-OJACH2JF.js +128 -0
- package/dist/chunk-OMSLHEEF.js +456 -0
- package/dist/chunk-OO4IFABD.js +382 -0
- package/dist/chunk-OYIP3QVN.js +167 -0
- package/dist/chunk-P2IOW54H.js +668 -0
- package/dist/chunk-P5KXQ3RN.js +731 -0
- package/dist/chunk-P5UXP53T.js +81 -0
- package/dist/chunk-PH6VRRFR.js +395 -0
- package/dist/chunk-Q3GKOF7Z.js +85 -0
- package/dist/chunk-Q65NCNL4.js +1352 -0
- package/dist/chunk-QIGS2LRT.js +735 -0
- package/dist/chunk-QKBN3CY2.js +381 -0
- package/dist/chunk-QNNAVMQH.js +1094 -0
- package/dist/chunk-QODDW4YI.js +171 -0
- package/dist/chunk-QPAYPTSH.js +2162 -0
- package/dist/chunk-QRWDJ5RI.js +381 -0
- package/dist/chunk-RBFZCHVB.js +105 -0
- package/dist/chunk-RCEULTPF.js +185 -0
- package/dist/chunk-RCGHXBCX.js +630 -0
- package/dist/chunk-ROSCLRTH.js +204 -0
- package/dist/chunk-RYAOSGUW.js +227 -0
- package/dist/chunk-S2SPGHPY.js +38 -0
- package/dist/chunk-S73ZAJ2S.js +262 -0
- package/dist/chunk-SBPEWD7Z.js +171 -0
- package/dist/chunk-SDPUWZP5.js +333 -0
- package/dist/chunk-SJ4UF7YK.js +1094 -0
- package/dist/chunk-SOZ7D77I.js +204 -0
- package/dist/chunk-SVLSHDNL.js +54 -0
- package/dist/chunk-SVUYBT5N.js +262 -0
- package/dist/chunk-T7PTLVJV.js +284 -0
- package/dist/chunk-TDX2LK2M.js +240 -0
- package/dist/chunk-TGUSLO4B.js +50 -0
- package/dist/chunk-TPJH6PE6.js +1158 -0
- package/dist/chunk-TVW7EDOJ.js +382 -0
- package/dist/chunk-TYRUIE6P.js +58 -0
- package/dist/chunk-U5RKGLV6.js +50 -0
- package/dist/chunk-UFGTHBHP.js +127 -0
- package/dist/chunk-ULCYWCPI.js +1079 -0
- package/dist/chunk-UN5EPVBN.js +14597 -0
- package/dist/chunk-URLH7ZVR.js +70 -0
- package/dist/chunk-USYRTGR7.js +402 -0
- package/dist/chunk-V4ABCEHM.js +30 -0
- package/dist/chunk-V6LOEOXG.js +3372 -0
- package/dist/chunk-VAZOVAW4.js +2162 -0
- package/dist/chunk-VEUQVKKT.js +185 -0
- package/dist/chunk-VIDDJ5RF.js +214 -0
- package/dist/chunk-VKCNXOQ6.js +214 -0
- package/dist/chunk-VNB4ROYG.js +348 -0
- package/dist/chunk-VWUQFZFB.js +395 -0
- package/dist/chunk-W77GRCNA.js +85 -0
- package/dist/chunk-WB2B25UM.js +230 -0
- package/dist/chunk-WCUZX7F7.js +204 -0
- package/dist/chunk-WL5RMOZQ.js +362 -0
- package/dist/chunk-WPAXAOHD.js +1079 -0
- package/dist/chunk-WVMG4ZRH.js +14597 -0
- package/dist/chunk-WYVOTRRZ.js +129 -0
- package/dist/chunk-XABJRAUW.js +3346 -0
- package/dist/chunk-XQQ7D4I4.js +85 -0
- package/dist/chunk-YDFY6YCH.js +280 -0
- package/dist/chunk-YGUMRYCN.js +33 -0
- package/dist/chunk-YHJPTIPR.js +836 -0
- package/dist/chunk-YJSP5PPG.js +128 -0
- package/dist/chunk-YLKS7KKC.js +2145 -0
- package/dist/chunk-YOMETWOJ.js +4388 -0
- package/dist/chunk-YU3KEVCO.js +333 -0
- package/dist/chunk-Z4FVFSE3.js +81 -0
- package/dist/chunk-Z4TLSNUW.js +244 -0
- package/dist/chunk-ZDPU3JTF.js +221 -0
- package/dist/chunk-ZDY4LYAJ.js +81 -0
- package/dist/chunk-ZG33AACD.js +70 -0
- package/dist/chunk-ZKHPZ6KN.js +181 -0
- package/dist/chunk-ZO2TM5N5.js +97 -0
- package/dist/chunk-ZP6T5K6I.js +535 -0
- package/dist/chunk-ZR6ZJT32.js +123 -0
- package/dist/chunk-ZSUACDQC.js +4388 -0
- package/dist/co-activation-JGF5YIDU.js +74 -0
- package/dist/co-activation-XM25BLZM.js +74 -0
- package/dist/co-occurrence-CKEMDPWO.js +95 -0
- package/dist/co-occurrence-HLLC6GT2.js +95 -0
- package/dist/co-occurrence-W2LIAPHI.js +95 -0
- package/dist/code-context-index-FCL47WKE.js +30 -0
- package/dist/conversation-entity-extractor-WC2RU6RS.js +114 -0
- package/dist/core-memory-CRSR2PSL.js +110 -0
- package/dist/core-memory-VSKFRMEV.js +110 -0
- package/dist/core-memory-ZDA76EU3.js +110 -0
- package/dist/crdt-sync-6VH2YDVY.js +33 -0
- package/dist/crdt-sync-BJKZB6T6.js +33 -0
- package/dist/crm-webhook-E5PAFAUN.js +10 -0
- package/dist/crm-webhook-RXFPZJXP.js +10 -0
- package/dist/crm-webhook-Z26LEFKG.js +10 -0
- package/dist/cto-delegation-gate-45IBLPTK.js +280 -0
- package/dist/cto-delegation-gate-EMY6ZZ2F.js +280 -0
- package/dist/cto-delegation-gate-SF4EUB2Q.js +280 -0
- package/dist/daemon-orchestration-VB3BLYIT.js +143 -0
- package/dist/daemon-orchestration-W66UYGUD.js +143 -0
- package/dist/daemon-orchestration-Y5Y6YNE3.js +143 -0
- package/dist/db-backup-HFJ53IBU.js +43 -0
- package/dist/db-backup-NVUTS7L5.js +43 -0
- package/dist/doc-graph-extractor-ID45AQ2P.js +133 -0
- package/dist/doc-graph-extractor-MLYQYT4B.js +133 -0
- package/dist/doc-graph-extractor-SVFSXKL6.js +133 -0
- package/dist/dreaming-AZYRAGKA.js +34 -0
- package/dist/dreaming-N6B7KBIE.js +34 -0
- package/dist/dreaming-WG5CDUHX.js +34 -0
- package/dist/entity-boost-XAFCDDB6.js +375 -0
- package/dist/exe-drift-3SGA53CL.js +70 -0
- package/dist/exe-drift-CPUEAPIU.js +70 -0
- package/dist/exe-export-4RTGDV53.js +77 -0
- package/dist/exe-export-APUNLKWF.js +77 -0
- package/dist/exe-export-NM4SXB3P.js +77 -0
- package/dist/exe-import-6GLNCP62.js +80 -0
- package/dist/exe-import-AZMIF34Z.js +80 -0
- package/dist/exe-import-U4H4ES3Z.js +80 -0
- package/dist/exe-key-FIPXUTMF.js +673 -0
- package/dist/exe-key-LJV23AJI.js +673 -0
- package/dist/exe-key-WTLCMOYJ.js +673 -0
- package/dist/exe-snapshot-ILO3WSEC.js +338 -0
- package/dist/exe-snapshot-IODRQLBX.js +338 -0
- package/dist/exe-snapshot-ZOZBW7V6.js +338 -0
- package/dist/fast-db-init-7LYYUCSJ.js +7 -0
- package/dist/fast-db-init-ATRZGHOL.js +7 -0
- package/dist/fast-db-init-IU7GYFWB.js +7 -0
- package/dist/gateway/index.js +11 -11
- package/dist/git-staleness-GGCFPHQ5.js +112 -0
- package/dist/git-staleness-XNOKI4D3.js +112 -0
- package/dist/git-task-sweep-3MO4OVND.js +42 -0
- package/dist/git-task-sweep-M3SWXFKJ.js +42 -0
- package/dist/git-task-sweep-Y6KNWB67.js +42 -0
- package/dist/global-procedures-626WAU3I.js +22 -0
- package/dist/global-procedures-EBAPPWGZ.js +22 -0
- package/dist/graph-auto-extract-TKHQ4OR3.js +183 -0
- package/dist/graph-auto-extract-VGFEWFZX.js +183 -0
- package/dist/graph-auto-extract-VJOUQBPK.js +183 -0
- package/dist/graph-rag-KECA5TE4.js +35 -0
- package/dist/hooks/bug-report-worker.js +12 -12
- package/dist/hooks/codex-stop-task-finalizer.js +12 -12
- package/dist/hooks/commit-complete.js +12 -12
- package/dist/hooks/error-recall.js +6 -6
- package/dist/hooks/exe-heartbeat-hook.js +3 -3
- package/dist/hooks/ingest-worker.js +3 -3
- package/dist/hooks/ingest.js +6 -6
- package/dist/hooks/instructions-loaded.js +4 -4
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +4 -4
- package/dist/hooks/post-compact.js +12 -12
- package/dist/hooks/post-tool-combined.js +6 -6
- package/dist/hooks/pre-compact.js +16 -16
- package/dist/hooks/pre-tool-use.js +15 -15
- package/dist/hooks/prompt-submit.js +28 -26
- package/dist/hooks/session-end.js +20 -20
- package/dist/hooks/session-start.js +12 -12
- package/dist/hooks/stop.js +18 -18
- package/dist/hooks/subagent-stop.js +11 -11
- package/dist/hooks/summary-worker.js +18 -18
- package/dist/index.js +20 -20
- package/dist/installer-37KFNAWE.js +344 -0
- package/dist/installer-3FB5EMPB.js +40 -0
- package/dist/installer-BRQ42CPB.js +344 -0
- package/dist/installer-F55NR4E2.js +298 -0
- package/dist/installer-KOYBUS4J.js +40 -0
- package/dist/installer-PXZJG256.js +298 -0
- package/dist/lib/cloud-sync.js +13 -7
- package/dist/lib/consolidation.js +7 -7
- package/dist/lib/database.js +6 -4
- package/dist/lib/db-daemon-client.js +11 -202
- package/dist/lib/db.js +6 -4
- package/dist/lib/embedder.js +3 -3
- package/dist/lib/employee-templates.js +4 -4
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon-client.js +2 -2
- package/dist/lib/exe-daemon.js +53 -51
- package/dist/lib/hybrid-search.js +5 -5
- package/dist/lib/identity.js +2 -2
- package/dist/lib/messaging.js +10 -10
- package/dist/lib/reminders.js +3 -3
- package/dist/lib/schedules.js +5 -5
- package/dist/lib/session-registry.js +4 -4
- package/dist/lib/skill-learning.js +6 -6
- package/dist/lib/store.js +4 -4
- package/dist/lib/task-router.js +3 -3
- package/dist/lib/tasks.js +11 -11
- package/dist/lib/tmux-routing.js +9 -9
- package/dist/lib/token-spend.js +3 -3
- package/dist/mcp/register-tools.js +65 -63
- package/dist/mcp/server.js +66 -64
- package/dist/mcp/tools/complete-reminder.js +4 -4
- package/dist/mcp/tools/create-reminder.js +4 -4
- package/dist/mcp/tools/create-task.js +13 -13
- package/dist/mcp/tools/deactivate-behavior.js +7 -7
- package/dist/mcp/tools/list-reminders.js +4 -4
- package/dist/mcp/tools/list-tasks.js +13 -13
- package/dist/mcp/tools/send-message.js +12 -12
- package/dist/mcp/tools/update-task.js +12 -12
- package/dist/mcp-http-config-7KJZI7UD.js +31 -0
- package/dist/mcp-http-config-OF3MB7M5.js +31 -0
- package/dist/memory-cards-CPIZVXWI.js +180 -0
- package/dist/memory-cards-ZIT7ZKL5.js +180 -0
- package/dist/memory-graph-extractor-JIYWLBFF.js +22 -0
- package/dist/memory-graph-extractor-LY2VORZT.js +22 -0
- package/dist/memory-graph-extractor-MDPSLZDM.js +22 -0
- package/dist/memory-poisoning-defense-5UZT3WWA.js +224 -0
- package/dist/memory-poisoning-defense-SEM25TY5.js +224 -0
- package/dist/memory-queue-client-WKWRFERJ.js +16 -0
- package/dist/memory-reflection-J2W7CJ7C.js +244 -0
- package/dist/memory-reflection-TA2VQYPH.js +244 -0
- package/dist/message-queue-client-IFQQ2HI7.js +92 -0
- package/dist/notifications-CZBQ3H5T.js +47 -0
- package/dist/notifications-EIIL2EQV.js +47 -0
- package/dist/notifications-RLMSI4YE.js +47 -0
- package/dist/orchestration-events-TGQYA72K.js +27 -0
- package/dist/orchestration-events-VUYR6MXE.js +27 -0
- package/dist/orchestrator-JQD5G3CW.js +35 -0
- package/dist/orchestrator-MAMR4C37.js +35 -0
- package/dist/orchestrator-VE5WHEJH.js +35 -0
- package/dist/pipeline-router-3Q3YBYSM.js +15 -0
- package/dist/pipeline-router-DKXD6DJO.js +15 -0
- package/dist/pipeline-router-YNW63BY5.js +15 -0
- package/dist/plan-limits-YGXTYCW4.js +28 -0
- package/dist/plan-limits-ZM4MNZKY.js +28 -0
- package/dist/project-boot-E2TWYTAC.js +299 -0
- package/dist/project-boot-TDOZKKDR.js +299 -0
- package/dist/projection-worker-TMKUSVGD.js +1084 -0
- package/dist/projection-worker-WFPRM4AI.js +1084 -0
- package/dist/projection-worker-YKV3PFCV.js +1084 -0
- package/dist/prospective-memory-CNJDBNWF.js +232 -0
- package/dist/prospective-memory-OAFZUODU.js +232 -0
- package/dist/reranker-AFU75HEX.js +19 -0
- package/dist/reranker-RYNSJNDF.js +19 -0
- package/dist/reranker-YQIRNGDM.js +19 -0
- package/dist/retrieval-health-M5BVB7EV.js +12 -0
- package/dist/retrieval-health-RSQEIYIB.js +12 -0
- package/dist/review-polling-LGX7DUNT.js +126 -0
- package/dist/review-polling-MJBCYV4I.js +126 -0
- package/dist/review-polling-ZMB3OBPC.js +126 -0
- package/dist/runtime/index.js +16 -16
- package/dist/services/codex-reviewd/index.js +855 -0
- package/dist/session-events-5N47BRFK.js +38 -0
- package/dist/session-events-PT6SVS2P.js +38 -0
- package/dist/session-events-UTMCKDIN.js +38 -0
- package/dist/session-kill-telemetry-FRQA5MVD.js +31 -0
- package/dist/session-kill-telemetry-HKL2NQMR.js +31 -0
- package/dist/session-scope-2BD6QLNI.js +88 -0
- package/dist/session-scope-GQNCM6UQ.js +88 -0
- package/dist/session-scope-MMGM232A.js +88 -0
- package/dist/setup-wizard-SELXXVLD.js +12 -0
- package/dist/setup-wizard-W64I6SHC.js +12 -0
- package/dist/setup-wizard-X7YSRDNQ.js +12 -0
- package/dist/skill-refinement-CCP4ULZ3.js +159 -0
- package/dist/skill-refinement-FXCXTUS2.js +159 -0
- package/dist/skill-refinement-WCPDNHZ5.js +159 -0
- package/dist/stack-update-5VSGG36W.js +84 -0
- package/dist/steward-gate-JDR3SLH3.js +15 -0
- package/dist/steward-gate-PIXNK4BK.js +15 -0
- package/dist/task-enforcement-LEBWCYZT.js +506 -0
- package/dist/task-enforcement-VOSQRAQB.js +506 -0
- package/dist/task-enforcement-WCEA4FZI.js +506 -0
- package/dist/task-scope-CQZ33PRU.js +37 -0
- package/dist/task-scope-JTTEZKDU.js +37 -0
- package/dist/task-scope-L5GDL2AV.js +37 -0
- package/dist/tasks-crud-DC4GCXQQ.js +79 -0
- package/dist/tasks-crud-S36AFYYM.js +79 -0
- package/dist/tasks-crud-T32IRPXF.js +79 -0
- package/dist/tasks-notify-OBFVHJDP.js +40 -0
- package/dist/tasks-notify-OUQWUM6W.js +40 -0
- package/dist/tasks-notify-W2W2BJRB.js +40 -0
- package/dist/tasks-review-34WV7BX2.js +49 -0
- package/dist/tasks-review-N33MTHWJ.js +49 -0
- package/dist/tasks-review-OSBG2YN2.js +49 -0
- package/dist/telemetry-upload-3CSVO3J7.js +741 -0
- package/dist/telemetry-upload-EYHEWTKG.js +741 -0
- package/dist/telemetry-upload-XLBW4DRP.js +741 -0
- package/dist/token-budget-I6FMMDFX.js +86 -0
- package/dist/token-budget-ZG2MQ5GD.js +86 -0
- package/dist/tool-capability-index-IWQBQKM7.js +10 -0
- package/dist/tool-telemetry-2E3Z7CRV.js +17 -0
- package/dist/tool-telemetry-ODL4F2CW.js +17 -0
- package/dist/tui/App.js +17 -17
- package/dist/tui-data-VWT4Q5UT.js +260 -0
- package/dist/tui-data-XFBFBSBE.js +260 -0
- package/dist/tui-data-Z5UF7KEI.js +260 -0
- package/dist/wiki-acl-EUOPNUIQ.js +111 -0
- package/dist/wiki-acl-SZFHCEC4.js +111 -0
- package/dist/worker-gate-OOO6BWZ6.js +21 -0
- package/dist/worker-gate-OQMKAMP7.js +21 -0
- package/dist/worker-gate-ZPP3SZK6.js +21 -0
- package/dist/workflow-engine-P7WYJP2B.js +28 -0
- package/dist/workflow-engine-QY3IFFR2.js +28 -0
- package/dist/workflow-engine-UYNB5RTB.js +28 -0
- package/dist/worktree-CNOQZBNT.js +28 -0
- package/dist/worktree-H5C4LMQR.js +28 -0
- package/dist/worktree-sweep-KFWF3XZD.js +21 -0
- package/dist/worktree-sweep-SE7ITXC4.js +21 -0
- package/package.json +1 -1
- package/release-notes.json +117 -191
- package/src/commands/exe.md +18 -1
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import {
|
|
2
|
+
employeeSessionName,
|
|
3
|
+
isEmployeeAlive,
|
|
4
|
+
resolveExeSession,
|
|
5
|
+
sendIntercom,
|
|
6
|
+
strictSessionScopeFilter
|
|
7
|
+
} from "./chunk-F5OSXH4A.js";
|
|
8
|
+
import {
|
|
9
|
+
parseMessage,
|
|
10
|
+
serializeMessage
|
|
11
|
+
} from "./chunk-4JERP7NT.js";
|
|
12
|
+
import {
|
|
13
|
+
recordOrchestrationEventBestEffort
|
|
14
|
+
} from "./chunk-RCGHXBCX.js";
|
|
15
|
+
import {
|
|
16
|
+
getClient
|
|
17
|
+
} from "./chunk-XABJRAUW.js";
|
|
18
|
+
|
|
19
|
+
// src/lib/messaging.ts
|
|
20
|
+
import crypto from "crypto";
|
|
21
|
+
function generateUlid() {
|
|
22
|
+
const timestamp = Date.now().toString(36).padStart(10, "0");
|
|
23
|
+
const random = crypto.randomBytes(10).toString("hex").slice(0, 16);
|
|
24
|
+
return (timestamp + random).toUpperCase();
|
|
25
|
+
}
|
|
26
|
+
function rowToMessage(row) {
|
|
27
|
+
return {
|
|
28
|
+
id: row.id,
|
|
29
|
+
fromAgent: row.from_agent,
|
|
30
|
+
fromDevice: row.from_device,
|
|
31
|
+
targetAgent: row.target_agent,
|
|
32
|
+
targetProject: row.target_project ?? null,
|
|
33
|
+
targetDevice: row.target_device,
|
|
34
|
+
sessionScope: row.session_scope ?? null,
|
|
35
|
+
content: row.content,
|
|
36
|
+
priority: row.priority ?? "normal",
|
|
37
|
+
status: row.status ?? "pending",
|
|
38
|
+
serverSeq: row.server_seq != null ? Number(row.server_seq) : null,
|
|
39
|
+
retryCount: Number(row.retry_count ?? 0),
|
|
40
|
+
createdAt: row.created_at,
|
|
41
|
+
deliveredAt: row.delivered_at ?? null,
|
|
42
|
+
processedAt: row.processed_at ?? null,
|
|
43
|
+
failedAt: row.failed_at ?? null,
|
|
44
|
+
failureReason: row.failure_reason ?? null
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
var MAX_RETRIES = 10;
|
|
48
|
+
async function countUnreadMessages(targetAgent, sessionScope) {
|
|
49
|
+
const client = getClient();
|
|
50
|
+
const scope = strictSessionScopeFilter(sessionScope);
|
|
51
|
+
const result = await client.execute({
|
|
52
|
+
sql: `SELECT COUNT(*) AS count FROM messages
|
|
53
|
+
WHERE target_agent = ? AND status IN ('pending', 'delivered')${scope.sql}`,
|
|
54
|
+
args: [targetAgent, ...scope.args]
|
|
55
|
+
});
|
|
56
|
+
return Number(result.rows[0]?.count ?? 0);
|
|
57
|
+
}
|
|
58
|
+
async function sendMessage(input) {
|
|
59
|
+
const client = getClient();
|
|
60
|
+
const id = generateUlid();
|
|
61
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
62
|
+
const targetDevice = input.targetDevice ?? "local";
|
|
63
|
+
const sessionScope = input.sessionScope === void 0 ? resolveExeSession() : input.sessionScope;
|
|
64
|
+
await client.execute({
|
|
65
|
+
sql: `INSERT INTO messages (id, from_agent, from_device, target_agent, target_project, target_device, session_scope, content, priority, status, founder_id, created_at)
|
|
66
|
+
VALUES (?, ?, 'local', ?, ?, ?, ?, ?, ?, 'pending', ?, ?)`,
|
|
67
|
+
args: [
|
|
68
|
+
id,
|
|
69
|
+
input.fromAgent,
|
|
70
|
+
input.targetAgent,
|
|
71
|
+
input.targetProject ?? null,
|
|
72
|
+
targetDevice,
|
|
73
|
+
sessionScope,
|
|
74
|
+
input.content,
|
|
75
|
+
input.priority ?? "normal",
|
|
76
|
+
input.founderId ?? null,
|
|
77
|
+
now
|
|
78
|
+
]
|
|
79
|
+
});
|
|
80
|
+
recordOrchestrationEventBestEffort({
|
|
81
|
+
eventType: "message.sent",
|
|
82
|
+
source: "messaging.sendMessage",
|
|
83
|
+
agentId: input.fromAgent,
|
|
84
|
+
payload: { targetAgent: input.targetAgent, priority: input.priority ?? "normal", targetDevice },
|
|
85
|
+
sessionScope: sessionScope ?? null
|
|
86
|
+
});
|
|
87
|
+
try {
|
|
88
|
+
if (targetDevice !== "local") {
|
|
89
|
+
await deliverCrossMachineMessage(id, targetDevice);
|
|
90
|
+
} else {
|
|
91
|
+
await deliverLocalMessage(id);
|
|
92
|
+
}
|
|
93
|
+
} catch {
|
|
94
|
+
}
|
|
95
|
+
const sentScope = strictSessionScopeFilter(sessionScope);
|
|
96
|
+
const result = await client.execute({
|
|
97
|
+
sql: `SELECT * FROM messages WHERE id = ?${sentScope.sql}`,
|
|
98
|
+
args: [id, ...sentScope.args]
|
|
99
|
+
});
|
|
100
|
+
return rowToMessage(result.rows[0]);
|
|
101
|
+
}
|
|
102
|
+
var _wsClientSend = null;
|
|
103
|
+
function setWsClientSend(fn) {
|
|
104
|
+
_wsClientSend = fn;
|
|
105
|
+
}
|
|
106
|
+
async function deliverCrossMachineMessage(messageId, targetDevice) {
|
|
107
|
+
const client = getClient();
|
|
108
|
+
const result = await client.execute({
|
|
109
|
+
sql: "SELECT * FROM messages WHERE id = ?",
|
|
110
|
+
args: [messageId]
|
|
111
|
+
});
|
|
112
|
+
if (result.rows.length === 0) return false;
|
|
113
|
+
const msg = rowToMessage(result.rows[0]);
|
|
114
|
+
if (msg.status !== "pending") return false;
|
|
115
|
+
if (!_wsClientSend) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
const payload = JSON.stringify({
|
|
119
|
+
id: msg.id,
|
|
120
|
+
fromAgent: msg.fromAgent,
|
|
121
|
+
targetAgent: msg.targetAgent,
|
|
122
|
+
targetProject: msg.targetProject,
|
|
123
|
+
sessionScope: msg.sessionScope,
|
|
124
|
+
content: msg.content,
|
|
125
|
+
priority: msg.priority,
|
|
126
|
+
createdAt: msg.createdAt
|
|
127
|
+
});
|
|
128
|
+
const sent = _wsClientSend(targetDevice, payload);
|
|
129
|
+
if (sent) {
|
|
130
|
+
await client.execute({
|
|
131
|
+
sql: "UPDATE messages SET status = 'synced' WHERE id = ?",
|
|
132
|
+
args: [messageId]
|
|
133
|
+
});
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
async function deliverLocalMessage(messageId) {
|
|
139
|
+
const client = getClient();
|
|
140
|
+
const result = await client.execute({
|
|
141
|
+
sql: "SELECT * FROM messages WHERE id = ?",
|
|
142
|
+
args: [messageId]
|
|
143
|
+
});
|
|
144
|
+
if (result.rows.length === 0) return false;
|
|
145
|
+
const msg = rowToMessage(result.rows[0]);
|
|
146
|
+
if (msg.status !== "pending") return false;
|
|
147
|
+
const targetAgent = msg.targetAgent;
|
|
148
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
149
|
+
try {
|
|
150
|
+
const exeSession = resolveExeSession();
|
|
151
|
+
if (!exeSession) {
|
|
152
|
+
throw new Error("No coordinator session found");
|
|
153
|
+
}
|
|
154
|
+
process.stderr.write(`[messaging] ENTER deliverLocal: target=${targetAgent} exeSession=${exeSession}
|
|
155
|
+
`);
|
|
156
|
+
const { isCoordinatorName: isCoord } = await import("./lib/employees.js");
|
|
157
|
+
const isCOO = isCoord(targetAgent);
|
|
158
|
+
process.stderr.write(`[messaging] COO check: targetAgent="${targetAgent}" isCOO=${isCOO}
|
|
159
|
+
`);
|
|
160
|
+
const sessionName = isCOO ? exeSession : employeeSessionName(targetAgent, exeSession);
|
|
161
|
+
process.stderr.write(`[messaging] delivery attempt: target=${targetAgent} session=${sessionName} isCOO=${isCOO}
|
|
162
|
+
`);
|
|
163
|
+
if (!isCOO && !isEmployeeAlive(sessionName)) {
|
|
164
|
+
throw new Error("Session not running \u2014 message stays queued");
|
|
165
|
+
}
|
|
166
|
+
const unreadCount = await countUnreadMessages(targetAgent, msg.sessionScope);
|
|
167
|
+
if (unreadCount <= 0) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
const intercomResult = sendIntercom(sessionName, { force: true, reason: "message" });
|
|
171
|
+
process.stderr.write(`[messaging] intercom result for ${sessionName}: ${intercomResult}
|
|
172
|
+
`);
|
|
173
|
+
await client.execute({
|
|
174
|
+
sql: "UPDATE messages SET status = 'delivered', delivered_at = ? WHERE id = ?",
|
|
175
|
+
args: [now, messageId]
|
|
176
|
+
});
|
|
177
|
+
recordOrchestrationEventBestEffort({
|
|
178
|
+
eventType: "message.delivered",
|
|
179
|
+
source: "messaging.deliverLocalMessage",
|
|
180
|
+
agentId: msg.targetAgent,
|
|
181
|
+
payload: { fromAgent: msg.fromAgent, priority: msg.priority }
|
|
182
|
+
});
|
|
183
|
+
return true;
|
|
184
|
+
} catch (err) {
|
|
185
|
+
process.stderr.write(
|
|
186
|
+
`[messaging] delivery failed for message ${messageId}: ${err instanceof Error ? err.message : String(err)}
|
|
187
|
+
`
|
|
188
|
+
);
|
|
189
|
+
const newRetryCount = msg.retryCount + 1;
|
|
190
|
+
if (newRetryCount >= MAX_RETRIES) {
|
|
191
|
+
await markFailed(messageId, "session unavailable after 10 retries", msg.sessionScope);
|
|
192
|
+
} else {
|
|
193
|
+
await client.execute({
|
|
194
|
+
sql: "UPDATE messages SET retry_count = ? WHERE id = ?",
|
|
195
|
+
args: [newRetryCount, messageId]
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async function getPendingMessages(targetAgent, sessionScope) {
|
|
202
|
+
const client = getClient();
|
|
203
|
+
const scope = strictSessionScopeFilter(sessionScope);
|
|
204
|
+
const result = await client.execute({
|
|
205
|
+
sql: `SELECT * FROM messages
|
|
206
|
+
WHERE target_agent = ? AND status IN ('pending', 'delivered')${scope.sql}
|
|
207
|
+
ORDER BY id`,
|
|
208
|
+
args: [targetAgent, ...scope.args]
|
|
209
|
+
});
|
|
210
|
+
return result.rows.map((row) => rowToMessage(row));
|
|
211
|
+
}
|
|
212
|
+
async function markRead(messageId, sessionScope) {
|
|
213
|
+
const client = getClient();
|
|
214
|
+
const scope = strictSessionScopeFilter(sessionScope);
|
|
215
|
+
await client.execute({
|
|
216
|
+
sql: `UPDATE messages SET status = 'read'
|
|
217
|
+
WHERE id = ? AND status IN ('pending', 'delivered')${scope.sql}`,
|
|
218
|
+
args: [messageId, ...scope.args]
|
|
219
|
+
});
|
|
220
|
+
recordOrchestrationEventBestEffort({
|
|
221
|
+
eventType: "message.read",
|
|
222
|
+
source: "messaging.markRead",
|
|
223
|
+
payload: { messageId }
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
async function markAcknowledged(messageId, sessionScope) {
|
|
227
|
+
const client = getClient();
|
|
228
|
+
const scope = strictSessionScopeFilter(sessionScope);
|
|
229
|
+
await client.execute({
|
|
230
|
+
sql: `UPDATE messages SET status = 'acknowledged', processed_at = ?
|
|
231
|
+
WHERE id = ? AND status = 'read'${scope.sql}`,
|
|
232
|
+
args: [(/* @__PURE__ */ new Date()).toISOString(), messageId, ...scope.args]
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
async function markProcessed(messageId, sessionScope) {
|
|
236
|
+
const client = getClient();
|
|
237
|
+
const scope = strictSessionScopeFilter(sessionScope);
|
|
238
|
+
await client.execute({
|
|
239
|
+
sql: `UPDATE messages SET status = 'processed', processed_at = ?
|
|
240
|
+
WHERE id = ?${scope.sql}`,
|
|
241
|
+
args: [(/* @__PURE__ */ new Date()).toISOString(), messageId, ...scope.args]
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
async function getMessageStatus(messageId, sessionScope) {
|
|
245
|
+
const client = getClient();
|
|
246
|
+
const scope = strictSessionScopeFilter(sessionScope);
|
|
247
|
+
const result = await client.execute({
|
|
248
|
+
sql: `SELECT status FROM messages WHERE id = ?${scope.sql}`,
|
|
249
|
+
args: [messageId, ...scope.args]
|
|
250
|
+
});
|
|
251
|
+
return result.rows[0]?.status ?? null;
|
|
252
|
+
}
|
|
253
|
+
async function getUnacknowledgedMessages(targetAgent, sessionScope) {
|
|
254
|
+
const client = getClient();
|
|
255
|
+
const scope = strictSessionScopeFilter(sessionScope);
|
|
256
|
+
const result = await client.execute({
|
|
257
|
+
sql: `SELECT * FROM messages
|
|
258
|
+
WHERE target_agent = ? AND status IN ('pending', 'delivered', 'read')${scope.sql}
|
|
259
|
+
ORDER BY id`,
|
|
260
|
+
args: [targetAgent, ...scope.args]
|
|
261
|
+
});
|
|
262
|
+
return result.rows.map((row) => rowToMessage(row));
|
|
263
|
+
}
|
|
264
|
+
async function getReadMessages(targetAgent, sessionScope) {
|
|
265
|
+
const client = getClient();
|
|
266
|
+
const scope = strictSessionScopeFilter(sessionScope);
|
|
267
|
+
const result = await client.execute({
|
|
268
|
+
sql: `SELECT * FROM messages
|
|
269
|
+
WHERE target_agent = ? AND status = 'read'${scope.sql}
|
|
270
|
+
ORDER BY id`,
|
|
271
|
+
args: [targetAgent, ...scope.args]
|
|
272
|
+
});
|
|
273
|
+
return result.rows.map((row) => rowToMessage(row));
|
|
274
|
+
}
|
|
275
|
+
async function markFailed(messageId, reason, sessionScope) {
|
|
276
|
+
const client = getClient();
|
|
277
|
+
const scope = strictSessionScopeFilter(sessionScope);
|
|
278
|
+
await client.execute({
|
|
279
|
+
sql: `UPDATE messages SET status = 'failed', failed_at = ?, failure_reason = ?
|
|
280
|
+
WHERE id = ?${scope.sql}`,
|
|
281
|
+
args: [(/* @__PURE__ */ new Date()).toISOString(), reason, messageId, ...scope.args]
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
async function getFailedMessages(sessionScope) {
|
|
285
|
+
const client = getClient();
|
|
286
|
+
const scope = strictSessionScopeFilter(sessionScope);
|
|
287
|
+
const result = await client.execute({
|
|
288
|
+
sql: `SELECT * FROM messages WHERE status = 'failed'${scope.sql} ORDER BY created_at DESC`,
|
|
289
|
+
args: [...scope.args]
|
|
290
|
+
});
|
|
291
|
+
return result.rows.map((row) => rowToMessage(row));
|
|
292
|
+
}
|
|
293
|
+
async function retryPendingMessages(sessionScope) {
|
|
294
|
+
const client = getClient();
|
|
295
|
+
const scope = strictSessionScopeFilter(sessionScope);
|
|
296
|
+
const result = await client.execute({
|
|
297
|
+
sql: `SELECT * FROM messages
|
|
298
|
+
WHERE status = 'pending' AND retry_count < ?${scope.sql}
|
|
299
|
+
ORDER BY id`,
|
|
300
|
+
args: [MAX_RETRIES, ...scope.args]
|
|
301
|
+
});
|
|
302
|
+
let delivered = 0;
|
|
303
|
+
for (const row of result.rows) {
|
|
304
|
+
const msg = rowToMessage(row);
|
|
305
|
+
try {
|
|
306
|
+
const success = await deliverLocalMessage(msg.id);
|
|
307
|
+
if (success) delivered++;
|
|
308
|
+
} catch {
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return delivered;
|
|
312
|
+
}
|
|
313
|
+
async function sendTypedMessage(envelope, targetAgent, opts) {
|
|
314
|
+
return sendMessage({
|
|
315
|
+
fromAgent: envelope.from,
|
|
316
|
+
targetAgent,
|
|
317
|
+
targetProject: opts?.targetProject,
|
|
318
|
+
targetDevice: opts?.targetDevice,
|
|
319
|
+
content: serializeMessage(envelope),
|
|
320
|
+
priority: opts?.priority,
|
|
321
|
+
sessionScope: opts?.sessionScope
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
function parseIncomingMessage(content) {
|
|
325
|
+
return parseMessage(content);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
export {
|
|
329
|
+
countUnreadMessages,
|
|
330
|
+
sendMessage,
|
|
331
|
+
setWsClientSend,
|
|
332
|
+
deliverLocalMessage,
|
|
333
|
+
getPendingMessages,
|
|
334
|
+
markRead,
|
|
335
|
+
markAcknowledged,
|
|
336
|
+
markProcessed,
|
|
337
|
+
getMessageStatus,
|
|
338
|
+
getUnacknowledgedMessages,
|
|
339
|
+
getReadMessages,
|
|
340
|
+
markFailed,
|
|
341
|
+
getFailedMessages,
|
|
342
|
+
retryPendingMessages,
|
|
343
|
+
sendTypedMessage,
|
|
344
|
+
parseIncomingMessage
|
|
345
|
+
};
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import {
|
|
2
|
+
storeBehavior
|
|
3
|
+
} from "./chunk-FNHYH5U6.js";
|
|
4
|
+
import {
|
|
5
|
+
getClient
|
|
6
|
+
} from "./chunk-V6LOEOXG.js";
|
|
7
|
+
import {
|
|
8
|
+
loadConfig
|
|
9
|
+
} from "./chunk-R36FAN53.js";
|
|
10
|
+
|
|
11
|
+
// src/lib/skill-learning.ts
|
|
12
|
+
import crypto from "crypto";
|
|
13
|
+
var DEFAULT_SKILL_THRESHOLD = 3;
|
|
14
|
+
async function extractTrajectory(taskId, agentId) {
|
|
15
|
+
const client = getClient();
|
|
16
|
+
const result = await client.execute({
|
|
17
|
+
sql: `SELECT tool_name, raw_text
|
|
18
|
+
FROM memories
|
|
19
|
+
WHERE task_id = ? AND agent_id = ?
|
|
20
|
+
ORDER BY timestamp ASC`,
|
|
21
|
+
args: [taskId, agentId]
|
|
22
|
+
});
|
|
23
|
+
if (result.rows.length === 0) return [];
|
|
24
|
+
const rawTools = result.rows.map((r) => {
|
|
25
|
+
const toolName = String(r.tool_name);
|
|
26
|
+
if (toolName === "Bash") {
|
|
27
|
+
const text = String(r.raw_text);
|
|
28
|
+
const cmdMatch = text.match(/(?:command|Command).*?[:\s]+"?(\w+)/);
|
|
29
|
+
return cmdMatch ? `Bash:${cmdMatch[1]}` : "Bash";
|
|
30
|
+
}
|
|
31
|
+
return toolName;
|
|
32
|
+
});
|
|
33
|
+
const signature = [];
|
|
34
|
+
for (const tool of rawTools) {
|
|
35
|
+
if (signature.length === 0 || signature[signature.length - 1] !== tool) {
|
|
36
|
+
signature.push(tool);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return signature;
|
|
40
|
+
}
|
|
41
|
+
function hashSignature(signature) {
|
|
42
|
+
return crypto.createHash("sha256").update(signature.join("|")).digest("hex").slice(0, 16);
|
|
43
|
+
}
|
|
44
|
+
async function storeTrajectory(opts) {
|
|
45
|
+
const client = getClient();
|
|
46
|
+
const id = crypto.randomUUID();
|
|
47
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
48
|
+
const signatureHash = hashSignature(opts.signature);
|
|
49
|
+
await client.execute({
|
|
50
|
+
sql: `INSERT INTO trajectories (id, task_id, agent_id, project_name, task_title, signature, signature_hash, tool_count, created_at)
|
|
51
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
52
|
+
args: [
|
|
53
|
+
id,
|
|
54
|
+
opts.taskId,
|
|
55
|
+
opts.agentId,
|
|
56
|
+
opts.projectName,
|
|
57
|
+
opts.taskTitle,
|
|
58
|
+
JSON.stringify(opts.signature),
|
|
59
|
+
signatureHash,
|
|
60
|
+
opts.signature.length,
|
|
61
|
+
now
|
|
62
|
+
]
|
|
63
|
+
});
|
|
64
|
+
return id;
|
|
65
|
+
}
|
|
66
|
+
async function findSimilarTrajectories(signature, threshold = DEFAULT_SKILL_THRESHOLD) {
|
|
67
|
+
const client = getClient();
|
|
68
|
+
const hash = hashSignature(signature);
|
|
69
|
+
const result = await client.execute({
|
|
70
|
+
sql: `SELECT id, task_id, agent_id, project_name, task_title, signature, signature_hash, tool_count, skill_id, created_at
|
|
71
|
+
FROM trajectories
|
|
72
|
+
WHERE signature_hash = ?
|
|
73
|
+
ORDER BY created_at DESC
|
|
74
|
+
LIMIT 20`,
|
|
75
|
+
args: [hash]
|
|
76
|
+
});
|
|
77
|
+
const mapRow = (r) => ({
|
|
78
|
+
id: String(r.id),
|
|
79
|
+
taskId: String(r.task_id),
|
|
80
|
+
agentId: String(r.agent_id),
|
|
81
|
+
projectName: String(r.project_name),
|
|
82
|
+
taskTitle: String(r.task_title),
|
|
83
|
+
signature: JSON.parse(String(r.signature)),
|
|
84
|
+
signatureHash: String(r.signature_hash),
|
|
85
|
+
toolCount: Number(r.tool_count),
|
|
86
|
+
skillId: r.skill_id ? String(r.skill_id) : null,
|
|
87
|
+
createdAt: String(r.created_at)
|
|
88
|
+
});
|
|
89
|
+
const matches = result.rows.map(mapRow);
|
|
90
|
+
if (matches.length >= threshold) return matches;
|
|
91
|
+
const nearResult = await client.execute({
|
|
92
|
+
sql: `SELECT id, task_id, agent_id, project_name, task_title, signature, signature_hash, tool_count, skill_id, created_at
|
|
93
|
+
FROM trajectories
|
|
94
|
+
WHERE tool_count BETWEEN ? AND ?
|
|
95
|
+
AND signature_hash != ?
|
|
96
|
+
ORDER BY created_at DESC
|
|
97
|
+
LIMIT 50`,
|
|
98
|
+
args: [
|
|
99
|
+
Math.max(1, signature.length - 3),
|
|
100
|
+
signature.length + 3,
|
|
101
|
+
hash
|
|
102
|
+
]
|
|
103
|
+
});
|
|
104
|
+
for (const r of nearResult.rows) {
|
|
105
|
+
const candidateSig = JSON.parse(String(r.signature));
|
|
106
|
+
if (editDistance(signature, candidateSig) <= 2) {
|
|
107
|
+
matches.push(mapRow(r));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return matches;
|
|
111
|
+
}
|
|
112
|
+
async function captureTrajectory(opts) {
|
|
113
|
+
const signature = await extractTrajectory(opts.taskId, opts.agentId);
|
|
114
|
+
if (signature.length < 3) {
|
|
115
|
+
return { trajectoryId: "", similarCount: 0, similar: [] };
|
|
116
|
+
}
|
|
117
|
+
const trajectoryId = await storeTrajectory({
|
|
118
|
+
taskId: opts.taskId,
|
|
119
|
+
agentId: opts.agentId,
|
|
120
|
+
projectName: opts.projectName,
|
|
121
|
+
taskTitle: opts.taskTitle,
|
|
122
|
+
signature
|
|
123
|
+
});
|
|
124
|
+
const similar = await findSimilarTrajectories(
|
|
125
|
+
signature,
|
|
126
|
+
opts.skillThreshold ?? DEFAULT_SKILL_THRESHOLD
|
|
127
|
+
);
|
|
128
|
+
return { trajectoryId, similarCount: similar.length, similar };
|
|
129
|
+
}
|
|
130
|
+
function buildExtractionPrompt(trajectories) {
|
|
131
|
+
const items = trajectories.map((t, i) => {
|
|
132
|
+
const sig = t.signature.join(" \u2192 ");
|
|
133
|
+
return `Task ${i + 1}: "${t.taskTitle}" (${t.agentId}, ${t.projectName}) \u2014 ${t.toolCount} tool calls
|
|
134
|
+
Signature: ${sig}`;
|
|
135
|
+
}).join("\n\n");
|
|
136
|
+
return `You are analyzing ${trajectories.length} completed tasks that followed similar procedures:
|
|
137
|
+
|
|
138
|
+
${items}
|
|
139
|
+
|
|
140
|
+
Extract the reusable procedure. Format your response EXACTLY like this:
|
|
141
|
+
|
|
142
|
+
SKILL: {name \u2014 short, descriptive}
|
|
143
|
+
TRIGGER: {when to use this \u2014 one sentence}
|
|
144
|
+
STEPS:
|
|
145
|
+
1. ...
|
|
146
|
+
2. ...
|
|
147
|
+
PITFALLS: {common mistakes to avoid}
|
|
148
|
+
|
|
149
|
+
Be specific and actionable. Include tool names, file patterns, and concrete commands where applicable.`;
|
|
150
|
+
}
|
|
151
|
+
async function extractSkill(trajectories, model) {
|
|
152
|
+
if (trajectories.length === 0) return null;
|
|
153
|
+
const config = await loadConfig();
|
|
154
|
+
const skillModel = model ?? config.skillModel;
|
|
155
|
+
const Anthropic = (await import("@anthropic-ai/sdk")).default;
|
|
156
|
+
const client = new Anthropic();
|
|
157
|
+
const prompt = buildExtractionPrompt(trajectories);
|
|
158
|
+
const response = await client.messages.create({
|
|
159
|
+
model: skillModel,
|
|
160
|
+
max_tokens: 500,
|
|
161
|
+
messages: [{ role: "user", content: prompt }]
|
|
162
|
+
});
|
|
163
|
+
const textBlock = response.content.find((b) => b.type === "text");
|
|
164
|
+
const skillText = textBlock?.text;
|
|
165
|
+
if (!skillText) return null;
|
|
166
|
+
const agentId = trajectories[0].agentId;
|
|
167
|
+
const projectName = trajectories[0].projectName;
|
|
168
|
+
const skillId = await storeBehavior({
|
|
169
|
+
agentId,
|
|
170
|
+
content: skillText,
|
|
171
|
+
domain: "skill",
|
|
172
|
+
projectName
|
|
173
|
+
});
|
|
174
|
+
const dbClient = getClient();
|
|
175
|
+
for (const t of trajectories) {
|
|
176
|
+
await dbClient.execute({
|
|
177
|
+
sql: "UPDATE trajectories SET skill_id = ? WHERE id = ?",
|
|
178
|
+
args: [skillId, t.id]
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
process.stderr.write(
|
|
182
|
+
`[skill-learning] Skill extracted from ${trajectories.length} trajectories \u2192 behavior ${skillId}
|
|
183
|
+
`
|
|
184
|
+
);
|
|
185
|
+
return skillId;
|
|
186
|
+
}
|
|
187
|
+
async function captureAndLearn(opts) {
|
|
188
|
+
try {
|
|
189
|
+
const config = await loadConfig();
|
|
190
|
+
if (!config.skillLearning) return;
|
|
191
|
+
const { trajectoryId, similarCount, similar } = await captureTrajectory({
|
|
192
|
+
...opts,
|
|
193
|
+
skillThreshold: config.skillThreshold
|
|
194
|
+
});
|
|
195
|
+
if (!trajectoryId) return;
|
|
196
|
+
if (similarCount >= config.skillThreshold) {
|
|
197
|
+
const unprocessed = similar.filter((t) => !t.skillId);
|
|
198
|
+
if (unprocessed.length >= config.skillThreshold) {
|
|
199
|
+
extractSkill(unprocessed, config.skillModel).catch((err) => {
|
|
200
|
+
process.stderr.write(
|
|
201
|
+
`[skill-learning] Extraction failed: ${err instanceof Error ? err.message : String(err)}
|
|
202
|
+
`
|
|
203
|
+
);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
} catch (err) {
|
|
208
|
+
process.stderr.write(
|
|
209
|
+
`[skill-learning] captureAndLearn failed: ${err instanceof Error ? err.message : String(err)}
|
|
210
|
+
`
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async function sweepTrajectories(threshold, model) {
|
|
215
|
+
const config = await loadConfig();
|
|
216
|
+
if (!config.skillLearning) return { clustersProcessed: 0, skillsExtracted: 0 };
|
|
217
|
+
const t = threshold ?? config.skillThreshold;
|
|
218
|
+
const client = getClient();
|
|
219
|
+
const result = await client.execute({
|
|
220
|
+
sql: `SELECT signature_hash, COUNT(*) as cnt
|
|
221
|
+
FROM trajectories
|
|
222
|
+
WHERE skill_id IS NULL
|
|
223
|
+
GROUP BY signature_hash
|
|
224
|
+
HAVING cnt >= ?
|
|
225
|
+
ORDER BY cnt DESC
|
|
226
|
+
LIMIT 10`,
|
|
227
|
+
args: [t]
|
|
228
|
+
});
|
|
229
|
+
let clustersProcessed = 0;
|
|
230
|
+
let skillsExtracted = 0;
|
|
231
|
+
for (const row of result.rows) {
|
|
232
|
+
const hash = String(row.signature_hash);
|
|
233
|
+
const trajResult = await client.execute({
|
|
234
|
+
sql: `SELECT id, task_id, agent_id, project_name, task_title, signature, signature_hash, tool_count, created_at
|
|
235
|
+
FROM trajectories
|
|
236
|
+
WHERE signature_hash = ? AND skill_id IS NULL
|
|
237
|
+
ORDER BY created_at DESC
|
|
238
|
+
LIMIT 10`,
|
|
239
|
+
args: [hash]
|
|
240
|
+
});
|
|
241
|
+
const trajectories = trajResult.rows.map((r) => ({
|
|
242
|
+
id: String(r.id),
|
|
243
|
+
taskId: String(r.task_id),
|
|
244
|
+
agentId: String(r.agent_id),
|
|
245
|
+
projectName: String(r.project_name),
|
|
246
|
+
taskTitle: String(r.task_title),
|
|
247
|
+
signature: JSON.parse(String(r.signature)),
|
|
248
|
+
signatureHash: String(r.signature_hash),
|
|
249
|
+
toolCount: Number(r.tool_count),
|
|
250
|
+
skillId: null,
|
|
251
|
+
createdAt: String(r.created_at)
|
|
252
|
+
}));
|
|
253
|
+
if (trajectories.length >= t) {
|
|
254
|
+
clustersProcessed++;
|
|
255
|
+
const skillId = await extractSkill(trajectories, model ?? config.skillModel);
|
|
256
|
+
if (skillId) skillsExtracted++;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return { clustersProcessed, skillsExtracted };
|
|
260
|
+
}
|
|
261
|
+
function editDistance(a, b) {
|
|
262
|
+
const m = a.length;
|
|
263
|
+
const n = b.length;
|
|
264
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
265
|
+
for (let i = 0; i <= m; i++) dp[i][0] = i;
|
|
266
|
+
for (let j = 0; j <= n; j++) dp[0][j] = j;
|
|
267
|
+
for (let i = 1; i <= m; i++) {
|
|
268
|
+
for (let j = 1; j <= n; j++) {
|
|
269
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
270
|
+
dp[i][j] = Math.min(
|
|
271
|
+
dp[i - 1][j] + 1,
|
|
272
|
+
dp[i][j - 1] + 1,
|
|
273
|
+
dp[i - 1][j - 1] + cost
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return dp[m][n];
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export {
|
|
281
|
+
extractTrajectory,
|
|
282
|
+
hashSignature,
|
|
283
|
+
storeTrajectory,
|
|
284
|
+
findSimilarTrajectories,
|
|
285
|
+
captureTrajectory,
|
|
286
|
+
extractSkill,
|
|
287
|
+
captureAndLearn,
|
|
288
|
+
sweepTrajectories,
|
|
289
|
+
editDistance
|
|
290
|
+
};
|