@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,157 @@
|
|
|
1
|
+
import {
|
|
2
|
+
clean,
|
|
3
|
+
stableId
|
|
4
|
+
} from "./chunk-S73ZAJ2S.js";
|
|
5
|
+
|
|
6
|
+
// src/lib/reflection-checkpoints.ts
|
|
7
|
+
function parsePayload(payload) {
|
|
8
|
+
if (!payload) return {};
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(payload);
|
|
11
|
+
} catch {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function semanticArray(event, key) {
|
|
16
|
+
const payload = parsePayload(event.payload);
|
|
17
|
+
const semantic = payload.semantic;
|
|
18
|
+
const value = semantic?.[key];
|
|
19
|
+
return Array.isArray(value) ? value.map(String).filter(Boolean) : [];
|
|
20
|
+
}
|
|
21
|
+
function buildReflectionCheckpoint(events) {
|
|
22
|
+
if (!events.length) return null;
|
|
23
|
+
const sorted = [...events].sort((a, b) => a.occurred_at.localeCompare(b.occurred_at));
|
|
24
|
+
const first = sorted[0];
|
|
25
|
+
const last = sorted[sorted.length - 1];
|
|
26
|
+
const goals = /* @__PURE__ */ new Set();
|
|
27
|
+
const successes = [];
|
|
28
|
+
const failures = [];
|
|
29
|
+
const risks = [];
|
|
30
|
+
const nextActions = [];
|
|
31
|
+
const decisions = [];
|
|
32
|
+
for (const event of sorted) {
|
|
33
|
+
for (const goal of semanticArray(event, "goals")) goals.add(goal);
|
|
34
|
+
for (const item of semanticArray(event, "successSignals")) successes.push(item);
|
|
35
|
+
for (const item of semanticArray(event, "failureSignals")) failures.push(item);
|
|
36
|
+
for (const item of semanticArray(event, "nextActions")) nextActions.push(item);
|
|
37
|
+
for (const item of semanticArray(event, "decisions")) decisions.push(item);
|
|
38
|
+
if (event.impact === "negative" || event.outcome === "failure_signal" || event.event_type === "problem" || event.event_type === "error") {
|
|
39
|
+
failures.push(event.outcome || event.intention || event.event_type);
|
|
40
|
+
}
|
|
41
|
+
if (event.outcome === "risk_signal") risks.push(event.intention || event.outcome);
|
|
42
|
+
if (event.impact === "positive" || event.outcome === "success_signal" || event.event_type === "milestone") {
|
|
43
|
+
successes.push(event.outcome || event.intention || event.event_type);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const uniqueGoals = [...goals].slice(0, 6);
|
|
47
|
+
const uniqueSuccesses = [...new Set(successes.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
|
|
48
|
+
const uniqueFailures = [...new Set(failures.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
|
|
49
|
+
const uniqueRisks = [...new Set(risks.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
|
|
50
|
+
const uniqueNext = [...new Set(nextActions.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
|
|
51
|
+
const uniqueDecisions = [...new Set(decisions.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
|
|
52
|
+
const learnings = [
|
|
53
|
+
uniqueSuccesses.length ? `Working: ${uniqueSuccesses.slice(0, 3).join("; ")}` : "Working: no strong success signal yet",
|
|
54
|
+
uniqueFailures.length ? `Improve: ${uniqueFailures.slice(0, 3).join("; ")}` : "Improve: no strong failure signal in this window",
|
|
55
|
+
uniqueDecisions.length ? `Decision context: ${uniqueDecisions.slice(0, 2).join("; ")}` : "Decision context: no explicit decision signal"
|
|
56
|
+
];
|
|
57
|
+
const summary = clean([
|
|
58
|
+
`Window ${first.occurred_at} \u2192 ${last.occurred_at}`,
|
|
59
|
+
`${sorted.length} events`,
|
|
60
|
+
uniqueGoals.length ? `goals: ${uniqueGoals.join("; ")}` : "goals: inferred from event trajectory",
|
|
61
|
+
uniqueSuccesses.length ? `successes: ${uniqueSuccesses.slice(0, 2).join("; ")}` : "successes: none explicit",
|
|
62
|
+
uniqueFailures.length ? `failures: ${uniqueFailures.slice(0, 2).join("; ")}` : "failures: none explicit"
|
|
63
|
+
].join(". "), 1200);
|
|
64
|
+
return {
|
|
65
|
+
id: stableId("reflection", first.project_name ?? "", first.session_id ?? "", first.occurred_at, last.occurred_at, sorted.length),
|
|
66
|
+
projectName: first.project_name ?? null,
|
|
67
|
+
sessionId: first.session_id ?? null,
|
|
68
|
+
windowStartAt: first.occurred_at,
|
|
69
|
+
windowEndAt: last.occurred_at,
|
|
70
|
+
eventCount: sorted.length,
|
|
71
|
+
goalCount: uniqueGoals.length,
|
|
72
|
+
successCount: uniqueSuccesses.length,
|
|
73
|
+
failureCount: uniqueFailures.length,
|
|
74
|
+
riskCount: uniqueRisks.length,
|
|
75
|
+
summary,
|
|
76
|
+
learnings,
|
|
77
|
+
nextActions: uniqueNext.length ? uniqueNext : ["Continue from latest successful event and resolve highest-impact failure/risk first."],
|
|
78
|
+
evidenceEventIds: sorted.slice(-25).map((e) => e.id),
|
|
79
|
+
confidence: Math.min(0.95, 0.5 + Math.min(sorted.length, 100) / 250 + uniqueGoals.length * 0.03)
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async function resolveClient(client) {
|
|
83
|
+
if (client) return client;
|
|
84
|
+
const { getClient } = await import("./lib/database.js");
|
|
85
|
+
return getClient();
|
|
86
|
+
}
|
|
87
|
+
async function insertReflectionCheckpoint(checkpoint, client) {
|
|
88
|
+
const db = await resolveClient(client);
|
|
89
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
90
|
+
await db.execute({
|
|
91
|
+
sql: `INSERT INTO agent_reflection_checkpoints
|
|
92
|
+
(id, project_name, session_id, window_start_at, window_end_at, event_count, goal_count,
|
|
93
|
+
success_count, failure_count, risk_count, summary, learnings, next_actions, evidence_event_ids,
|
|
94
|
+
confidence, created_at)
|
|
95
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
96
|
+
ON CONFLICT(id) DO UPDATE SET summary = excluded.summary, learnings = excluded.learnings,
|
|
97
|
+
next_actions = excluded.next_actions, confidence = excluded.confidence`,
|
|
98
|
+
args: [
|
|
99
|
+
checkpoint.id,
|
|
100
|
+
checkpoint.projectName,
|
|
101
|
+
checkpoint.sessionId,
|
|
102
|
+
checkpoint.windowStartAt,
|
|
103
|
+
checkpoint.windowEndAt,
|
|
104
|
+
checkpoint.eventCount,
|
|
105
|
+
checkpoint.goalCount,
|
|
106
|
+
checkpoint.successCount,
|
|
107
|
+
checkpoint.failureCount,
|
|
108
|
+
checkpoint.riskCount,
|
|
109
|
+
checkpoint.summary,
|
|
110
|
+
JSON.stringify(checkpoint.learnings),
|
|
111
|
+
JSON.stringify(checkpoint.nextActions),
|
|
112
|
+
JSON.stringify(checkpoint.evidenceEventIds),
|
|
113
|
+
checkpoint.confidence,
|
|
114
|
+
now
|
|
115
|
+
]
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async function generateReflectionCheckpoints(opts = {}) {
|
|
119
|
+
const db = await resolveClient(opts.client);
|
|
120
|
+
const windowSize = opts.windowSize ?? 100;
|
|
121
|
+
const minEvents = opts.minEvents ?? 20;
|
|
122
|
+
const limit = opts.limit ?? 5e3;
|
|
123
|
+
const where = opts.projectName ? "WHERE project_name = ?" : "";
|
|
124
|
+
const args = opts.projectName ? [opts.projectName] : [];
|
|
125
|
+
const result = await db.execute({
|
|
126
|
+
sql: `SELECT id, event_type, occurred_at, actor_agent_id, project_name, session_id, intention, outcome, impact, evidence_memory_id, payload
|
|
127
|
+
FROM agent_events ${where}
|
|
128
|
+
ORDER BY project_name, session_id, occurred_at, sequence_index
|
|
129
|
+
LIMIT ?`,
|
|
130
|
+
args: [...args, limit]
|
|
131
|
+
});
|
|
132
|
+
const groups = /* @__PURE__ */ new Map();
|
|
133
|
+
for (const row of result.rows) {
|
|
134
|
+
const event = row;
|
|
135
|
+
const key = `${event.project_name ?? ""}::${event.session_id ?? ""}`;
|
|
136
|
+
const bucket = groups.get(key) ?? [];
|
|
137
|
+
bucket.push(event);
|
|
138
|
+
groups.set(key, bucket);
|
|
139
|
+
}
|
|
140
|
+
let inserted = 0;
|
|
141
|
+
for (const events of groups.values()) {
|
|
142
|
+
for (let i = 0; i < events.length; i += windowSize) {
|
|
143
|
+
const window = events.slice(i, i + windowSize);
|
|
144
|
+
if (window.length < minEvents) continue;
|
|
145
|
+
const checkpoint = buildReflectionCheckpoint(window);
|
|
146
|
+
if (!checkpoint) continue;
|
|
147
|
+
await insertReflectionCheckpoint(checkpoint, db);
|
|
148
|
+
inserted++;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return inserted;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export {
|
|
155
|
+
buildReflectionCheckpoint,
|
|
156
|
+
generateReflectionCheckpoints
|
|
157
|
+
};
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import {
|
|
2
|
+
vectorToSqlLiteral
|
|
3
|
+
} from "./chunk-YHJPTIPR.js";
|
|
4
|
+
import {
|
|
5
|
+
blobToVector
|
|
6
|
+
} from "./chunk-OTVEIJUQ.js";
|
|
7
|
+
import {
|
|
8
|
+
getClient
|
|
9
|
+
} from "./chunk-V6LOEOXG.js";
|
|
10
|
+
|
|
11
|
+
// src/lib/behaviors.ts
|
|
12
|
+
import crypto from "crypto";
|
|
13
|
+
var GHOST_BEHAVIOR_SQL = "(id IS NULL OR trim(coalesce(content, '')) = '' OR (content = '(empty)' AND coalesce(agent_id, '') = 'unknown'))";
|
|
14
|
+
function isGhostBehaviorRow(row) {
|
|
15
|
+
const id = row.id;
|
|
16
|
+
if (id === null || id === void 0 || String(id).trim() === "") return true;
|
|
17
|
+
const content = typeof row.content === "string" ? row.content : row.content == null ? "" : String(row.content);
|
|
18
|
+
if (content.trim() === "") return true;
|
|
19
|
+
const agent = typeof row.agent_id === "string" ? row.agent_id : row.agent_id == null ? "" : String(row.agent_id);
|
|
20
|
+
if (content === "(empty)" && agent === "unknown") return true;
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
function formatReflexContent(trigger, action) {
|
|
24
|
+
return `\u26A1 REFLEX: When ${trigger} \u2192 ${action}. Decide whether to act.`;
|
|
25
|
+
}
|
|
26
|
+
function isReflexBehavior(behavior) {
|
|
27
|
+
return behavior.domain === "reflex";
|
|
28
|
+
}
|
|
29
|
+
async function storeReflexBehavior(opts) {
|
|
30
|
+
const content = formatReflexContent(opts.trigger, opts.action);
|
|
31
|
+
return storeBehavior({
|
|
32
|
+
agentId: opts.agentId,
|
|
33
|
+
content,
|
|
34
|
+
domain: "reflex",
|
|
35
|
+
projectName: opts.projectName,
|
|
36
|
+
priority: "p0",
|
|
37
|
+
// Always injected — impossible to miss
|
|
38
|
+
deviceScoped: opts.deviceScoped ?? false
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async function storeBehavior(opts) {
|
|
42
|
+
const trimmedContent = (opts.content ?? "").trim();
|
|
43
|
+
if (trimmedContent.length === 0) {
|
|
44
|
+
throw new Error(
|
|
45
|
+
"[behaviors] Refusing to store a behavior with empty content (ghost-row guard)."
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
const trimmedAgent = (opts.agentId ?? "").trim();
|
|
49
|
+
if (trimmedAgent.length === 0) {
|
|
50
|
+
throw new Error(
|
|
51
|
+
"[behaviors] Refusing to store a behavior with empty agent_id (ghost-row guard)."
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const { loadEmployeesSync, baseAgentName } = await import("./lib/employees.js");
|
|
56
|
+
const roster = loadEmployeesSync();
|
|
57
|
+
if (roster.length > 0) {
|
|
58
|
+
const base = baseAgentName(opts.agentId, roster);
|
|
59
|
+
if (!roster.some((e) => e.name === opts.agentId || e.name === base)) {
|
|
60
|
+
process.stderr.write(
|
|
61
|
+
`[behaviors] WARNING: Agent "${opts.agentId}" not found in roster. Storing behavior anyway \u2014 may be orphaned.
|
|
62
|
+
`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
} catch {
|
|
67
|
+
}
|
|
68
|
+
const client = getClient();
|
|
69
|
+
const id = crypto.randomUUID();
|
|
70
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
71
|
+
const duplicate = await client.execute({
|
|
72
|
+
sql: `SELECT id FROM behaviors
|
|
73
|
+
WHERE agent_id = ?
|
|
74
|
+
AND COALESCE(domain, '') = COALESCE(?, '')
|
|
75
|
+
AND COALESCE(project_name, '') = COALESCE(?, '')
|
|
76
|
+
AND active = 1
|
|
77
|
+
AND lower(trim(content)) = lower(trim(?))
|
|
78
|
+
ORDER BY updated_at DESC
|
|
79
|
+
LIMIT 1`,
|
|
80
|
+
args: [trimmedAgent, opts.domain ?? null, opts.projectName ?? null, trimmedContent]
|
|
81
|
+
});
|
|
82
|
+
const existingId = duplicate.rows[0]?.id;
|
|
83
|
+
if (existingId) return String(existingId);
|
|
84
|
+
let vector = null;
|
|
85
|
+
if (!process.env.VITEST) {
|
|
86
|
+
try {
|
|
87
|
+
const { embed } = await import("./lib/embedder.js");
|
|
88
|
+
const vec = await embed(trimmedContent);
|
|
89
|
+
vector = new Float32Array(vec);
|
|
90
|
+
} catch {
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
let createdByDevice = null;
|
|
94
|
+
try {
|
|
95
|
+
const { loadDeviceId } = await import("./lib/license.js");
|
|
96
|
+
createdByDevice = loadDeviceId() ?? null;
|
|
97
|
+
} catch {
|
|
98
|
+
}
|
|
99
|
+
const createdByAgent = process.env.AGENT_ID ?? null;
|
|
100
|
+
const sourceSessionId = process.env.CLAUDE_SESSION_ID ?? process.env.SESSION_ID ?? null;
|
|
101
|
+
let deviceId = null;
|
|
102
|
+
if (opts.deviceScoped) {
|
|
103
|
+
try {
|
|
104
|
+
const { loadDeviceId } = await import("./lib/license.js");
|
|
105
|
+
deviceId = loadDeviceId() ?? null;
|
|
106
|
+
} catch {
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
await client.execute({
|
|
110
|
+
sql: `INSERT INTO behaviors (id, agent_id, project_name, domain, priority, content, active, created_at, updated_at, vector, created_by_agent, created_by_device, source_session_id, device_id)
|
|
111
|
+
VALUES (?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?)`,
|
|
112
|
+
args: [id, trimmedAgent, opts.projectName ?? null, opts.domain ?? null, opts.priority ?? "p1", trimmedContent, now, now, vector ? vectorToSqlLiteral(vector) : null, createdByAgent, createdByDevice, sourceSessionId, deviceId]
|
|
113
|
+
});
|
|
114
|
+
return id;
|
|
115
|
+
}
|
|
116
|
+
async function listBehaviors(agentId, projectName, limit = 30) {
|
|
117
|
+
const client = getClient();
|
|
118
|
+
let currentDeviceId = null;
|
|
119
|
+
try {
|
|
120
|
+
const { loadDeviceId } = await import("./lib/license.js");
|
|
121
|
+
currentDeviceId = loadDeviceId() ?? null;
|
|
122
|
+
} catch {
|
|
123
|
+
}
|
|
124
|
+
const result = await client.execute({
|
|
125
|
+
sql: `SELECT id, agent_id, project_name, domain, priority, content, active, created_at, updated_at, vector, created_by_agent, created_by_device, source_session_id, device_id
|
|
126
|
+
FROM behaviors
|
|
127
|
+
WHERE agent_id = ? AND active = 1
|
|
128
|
+
AND id IS NOT NULL AND trim(coalesce(content, '')) != ''
|
|
129
|
+
AND (project_name IS NULL OR project_name = ?)
|
|
130
|
+
AND (device_id IS NULL OR device_id = ?)
|
|
131
|
+
ORDER BY
|
|
132
|
+
CASE WHEN priority = 'p0' THEN 0
|
|
133
|
+
WHEN priority = 'p1' THEN 1
|
|
134
|
+
ELSE 2 END,
|
|
135
|
+
CASE
|
|
136
|
+
WHEN lower(coalesce(domain, '')) IN ('identity', 'title', 'role') THEN 0
|
|
137
|
+
WHEN lower(content) LIKE '%identity%' THEN 0
|
|
138
|
+
WHEN lower(content) LIKE '%title%' THEN 0
|
|
139
|
+
WHEN lower(content) LIKE '%who are you%' THEN 0
|
|
140
|
+
ELSE 1
|
|
141
|
+
END,
|
|
142
|
+
updated_at DESC
|
|
143
|
+
LIMIT ?`,
|
|
144
|
+
args: [agentId, projectName ?? "", currentDeviceId ?? "", limit]
|
|
145
|
+
});
|
|
146
|
+
return result.rows.map((r) => ({
|
|
147
|
+
id: String(r.id),
|
|
148
|
+
agent_id: String(r.agent_id),
|
|
149
|
+
project_name: r.project_name ? String(r.project_name) : null,
|
|
150
|
+
domain: r.domain ? String(r.domain) : null,
|
|
151
|
+
priority: String(r.priority || "p1"),
|
|
152
|
+
content: String(r.content),
|
|
153
|
+
active: Number(r.active),
|
|
154
|
+
created_at: String(r.created_at),
|
|
155
|
+
updated_at: String(r.updated_at),
|
|
156
|
+
vector: r.vector ? blobToVector(r.vector) : null,
|
|
157
|
+
created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
|
|
158
|
+
created_by_device: r.created_by_device ? String(r.created_by_device) : null,
|
|
159
|
+
source_session_id: r.source_session_id ? String(r.source_session_id) : null,
|
|
160
|
+
device_id: r.device_id ? String(r.device_id) : null
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
async function listBehaviorsByDomain(agentId, domain) {
|
|
164
|
+
const client = getClient();
|
|
165
|
+
const result = await client.execute({
|
|
166
|
+
sql: `SELECT id, agent_id, project_name, domain, priority, content, active, created_at, updated_at, vector
|
|
167
|
+
FROM behaviors
|
|
168
|
+
WHERE agent_id = ? AND domain = ? AND active = 1`,
|
|
169
|
+
args: [agentId, domain]
|
|
170
|
+
});
|
|
171
|
+
return result.rows.map((r) => ({
|
|
172
|
+
id: String(r.id),
|
|
173
|
+
agent_id: String(r.agent_id),
|
|
174
|
+
project_name: r.project_name ? String(r.project_name) : null,
|
|
175
|
+
domain: r.domain ? String(r.domain) : null,
|
|
176
|
+
priority: String(r.priority || "p1"),
|
|
177
|
+
content: String(r.content),
|
|
178
|
+
active: Number(r.active),
|
|
179
|
+
created_at: String(r.created_at),
|
|
180
|
+
updated_at: String(r.updated_at),
|
|
181
|
+
vector: r.vector ? blobToVector(r.vector) : null,
|
|
182
|
+
created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
|
|
183
|
+
created_by_device: r.created_by_device ? String(r.created_by_device) : null,
|
|
184
|
+
source_session_id: r.source_session_id ? String(r.source_session_id) : null,
|
|
185
|
+
device_id: r.device_id ? String(r.device_id) : null
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
async function listBehaviorsSince(agentId, sinceIso, projectName, limit = 15) {
|
|
189
|
+
const client = getClient();
|
|
190
|
+
let currentDeviceId = null;
|
|
191
|
+
try {
|
|
192
|
+
const { loadDeviceId } = await import("./lib/license.js");
|
|
193
|
+
currentDeviceId = loadDeviceId() ?? null;
|
|
194
|
+
} catch {
|
|
195
|
+
}
|
|
196
|
+
const result = await client.execute({
|
|
197
|
+
sql: `SELECT id, agent_id, project_name, domain, priority, content, active, created_at, updated_at, vector, created_by_agent, created_by_device, source_session_id, device_id
|
|
198
|
+
FROM behaviors
|
|
199
|
+
WHERE agent_id = ? AND active = 1
|
|
200
|
+
AND id IS NOT NULL AND trim(coalesce(content, '')) != ''
|
|
201
|
+
AND (project_name IS NULL OR project_name = ?)
|
|
202
|
+
AND (device_id IS NULL OR device_id = ?)
|
|
203
|
+
AND (created_at > ? OR updated_at > ?)
|
|
204
|
+
ORDER BY
|
|
205
|
+
CASE WHEN priority = 'p0' THEN 0
|
|
206
|
+
WHEN priority = 'p1' THEN 1
|
|
207
|
+
ELSE 2 END,
|
|
208
|
+
updated_at DESC
|
|
209
|
+
LIMIT ?`,
|
|
210
|
+
args: [agentId, projectName ?? "", currentDeviceId ?? "", sinceIso, sinceIso, limit]
|
|
211
|
+
});
|
|
212
|
+
return result.rows.map((r) => ({
|
|
213
|
+
id: String(r.id),
|
|
214
|
+
agent_id: String(r.agent_id),
|
|
215
|
+
project_name: r.project_name ? String(r.project_name) : null,
|
|
216
|
+
domain: r.domain ? String(r.domain) : null,
|
|
217
|
+
priority: String(r.priority || "p1"),
|
|
218
|
+
content: String(r.content),
|
|
219
|
+
active: Number(r.active),
|
|
220
|
+
created_at: String(r.created_at),
|
|
221
|
+
updated_at: String(r.updated_at),
|
|
222
|
+
vector: r.vector ? blobToVector(r.vector) : null,
|
|
223
|
+
created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
|
|
224
|
+
created_by_device: r.created_by_device ? String(r.created_by_device) : null,
|
|
225
|
+
source_session_id: r.source_session_id ? String(r.source_session_id) : null,
|
|
226
|
+
device_id: r.device_id ? String(r.device_id) : null
|
|
227
|
+
}));
|
|
228
|
+
}
|
|
229
|
+
async function listSharedSkills(currentAgentId, projectName, limit = 30) {
|
|
230
|
+
const client = getClient();
|
|
231
|
+
let currentDeviceId = null;
|
|
232
|
+
try {
|
|
233
|
+
const { loadDeviceId } = await import("./lib/license.js");
|
|
234
|
+
currentDeviceId = loadDeviceId() ?? null;
|
|
235
|
+
} catch {
|
|
236
|
+
}
|
|
237
|
+
const result = await client.execute({
|
|
238
|
+
sql: `SELECT id, agent_id, project_name, domain, priority, content, active, created_at, updated_at, vector, created_by_agent, created_by_device, source_session_id, device_id
|
|
239
|
+
FROM behaviors
|
|
240
|
+
WHERE domain = 'skill' AND active = 1
|
|
241
|
+
AND id IS NOT NULL AND trim(coalesce(content, '')) != ''
|
|
242
|
+
AND (project_name IS NULL OR project_name = ?)
|
|
243
|
+
AND (device_id IS NULL OR device_id = ?)
|
|
244
|
+
ORDER BY
|
|
245
|
+
CASE WHEN agent_id = ? THEN 0 ELSE 1 END,
|
|
246
|
+
updated_at DESC
|
|
247
|
+
LIMIT ?`,
|
|
248
|
+
args: [projectName ?? "", currentDeviceId ?? "", currentAgentId, limit]
|
|
249
|
+
});
|
|
250
|
+
return result.rows.map((r) => ({
|
|
251
|
+
id: String(r.id),
|
|
252
|
+
agent_id: String(r.agent_id),
|
|
253
|
+
project_name: r.project_name ? String(r.project_name) : null,
|
|
254
|
+
domain: r.domain ? String(r.domain) : null,
|
|
255
|
+
priority: String(r.priority || "p1"),
|
|
256
|
+
content: String(r.content),
|
|
257
|
+
active: Number(r.active),
|
|
258
|
+
created_at: String(r.created_at),
|
|
259
|
+
updated_at: String(r.updated_at),
|
|
260
|
+
vector: r.vector ? blobToVector(r.vector) : null,
|
|
261
|
+
created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
|
|
262
|
+
created_by_device: r.created_by_device ? String(r.created_by_device) : null,
|
|
263
|
+
source_session_id: r.source_session_id ? String(r.source_session_id) : null,
|
|
264
|
+
device_id: r.device_id ? String(r.device_id) : null,
|
|
265
|
+
shared: String(r.agent_id) !== currentAgentId
|
|
266
|
+
}));
|
|
267
|
+
}
|
|
268
|
+
async function bulkPurgeGhostBehaviors(opts) {
|
|
269
|
+
const client = getClient();
|
|
270
|
+
const batchSize = Math.min(Math.max(opts?.batchSize ?? 5e3, 1), 5e4);
|
|
271
|
+
const maxBatches = Math.max(opts?.maxBatches ?? 1e6, 1);
|
|
272
|
+
let deleted = 0;
|
|
273
|
+
let batches = 0;
|
|
274
|
+
while (batches < maxBatches) {
|
|
275
|
+
const res = await client.execute({
|
|
276
|
+
sql: `DELETE FROM behaviors
|
|
277
|
+
WHERE rowid IN (
|
|
278
|
+
SELECT rowid FROM behaviors
|
|
279
|
+
WHERE ${GHOST_BEHAVIOR_SQL}
|
|
280
|
+
LIMIT ?
|
|
281
|
+
)`,
|
|
282
|
+
args: [batchSize]
|
|
283
|
+
});
|
|
284
|
+
const n = res.rowsAffected ?? 0;
|
|
285
|
+
batches += 1;
|
|
286
|
+
deleted += n;
|
|
287
|
+
opts?.onProgress?.(deleted, batches);
|
|
288
|
+
if (n < batchSize) break;
|
|
289
|
+
}
|
|
290
|
+
let vacuumed = false;
|
|
291
|
+
if (opts?.vacuum && deleted > 0) {
|
|
292
|
+
try {
|
|
293
|
+
await client.execute("VACUUM");
|
|
294
|
+
vacuumed = true;
|
|
295
|
+
} catch {
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return { deleted, batches, vacuumed };
|
|
299
|
+
}
|
|
300
|
+
async function deactivateBehavior(id) {
|
|
301
|
+
const client = getClient();
|
|
302
|
+
const result = await client.execute({
|
|
303
|
+
sql: `UPDATE behaviors SET active = 0, updated_at = ? WHERE id = ? AND active = 1`,
|
|
304
|
+
args: [(/* @__PURE__ */ new Date()).toISOString(), id]
|
|
305
|
+
});
|
|
306
|
+
return (result.rowsAffected ?? 0) > 0;
|
|
307
|
+
}
|
|
308
|
+
async function reactivateBehavior(id) {
|
|
309
|
+
const client = getClient();
|
|
310
|
+
const result = await client.execute({
|
|
311
|
+
sql: `UPDATE behaviors SET active = 1, updated_at = ? WHERE id = ? AND active = 0`,
|
|
312
|
+
args: [(/* @__PURE__ */ new Date()).toISOString(), id]
|
|
313
|
+
});
|
|
314
|
+
return (result.rowsAffected ?? 0) > 0;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
export {
|
|
318
|
+
GHOST_BEHAVIOR_SQL,
|
|
319
|
+
isGhostBehaviorRow,
|
|
320
|
+
formatReflexContent,
|
|
321
|
+
isReflexBehavior,
|
|
322
|
+
storeReflexBehavior,
|
|
323
|
+
storeBehavior,
|
|
324
|
+
listBehaviors,
|
|
325
|
+
listBehaviorsByDomain,
|
|
326
|
+
listBehaviorsSince,
|
|
327
|
+
listSharedSkills,
|
|
328
|
+
bulkPurgeGhostBehaviors,
|
|
329
|
+
deactivateBehavior,
|
|
330
|
+
reactivateBehavior
|
|
331
|
+
};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// src/lib/cc-binary-detect.ts
|
|
2
|
+
import { execSync } from "child_process";
|
|
3
|
+
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
var CC_NATIVE_ONLY_CUTOFF = "2.1.119";
|
|
6
|
+
var CC_SAFE_PINNED_VERSION = "2.1.98";
|
|
7
|
+
function detectAutoupdaterVar(varName, homeDir = process.env.HOME ?? process.env.USERPROFILE ?? "", env = process.env) {
|
|
8
|
+
if (env[varName] === "1") {
|
|
9
|
+
return { source: "env" };
|
|
10
|
+
}
|
|
11
|
+
if (homeDir.length === 0) return null;
|
|
12
|
+
const profiles = [
|
|
13
|
+
".zshrc",
|
|
14
|
+
".zprofile",
|
|
15
|
+
".bashrc",
|
|
16
|
+
".bash_profile",
|
|
17
|
+
".profile"
|
|
18
|
+
];
|
|
19
|
+
const pattern = new RegExp(
|
|
20
|
+
`^\\s*(?:export\\s+)?${varName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}=["']?1["']?\\s*$`,
|
|
21
|
+
"m"
|
|
22
|
+
);
|
|
23
|
+
for (const name of profiles) {
|
|
24
|
+
const file = path.join(homeDir, name);
|
|
25
|
+
if (!existsSync(file)) continue;
|
|
26
|
+
try {
|
|
27
|
+
const content = readFileSync(file, "utf8");
|
|
28
|
+
const uncommented = content.split("\n").filter((line) => !/^\s*#/.test(line)).join("\n");
|
|
29
|
+
if (pattern.test(uncommented)) {
|
|
30
|
+
return { source: "profile", profile: name };
|
|
31
|
+
}
|
|
32
|
+
} catch {
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
function isAutoupdaterDisabled(env = process.env, homeDir = env.HOME ?? env.USERPROFILE ?? "") {
|
|
38
|
+
return detectAutoupdaterVar("DISABLE_AUTOUPDATER", homeDir, env) !== null || detectAutoupdaterVar("CLAUDE_CODE_AUTOUPDATER_DISABLED", homeDir, env) !== null;
|
|
39
|
+
}
|
|
40
|
+
function compareSemver(a, b) {
|
|
41
|
+
const pa = a.split(".").map((n) => Number.parseInt(n, 10));
|
|
42
|
+
const pb = b.split(".").map((n) => Number.parseInt(n, 10));
|
|
43
|
+
const len = Math.max(pa.length, pb.length);
|
|
44
|
+
for (let i = 0; i < len; i++) {
|
|
45
|
+
const x = Number.isFinite(pa[i]) ? pa[i] : 0;
|
|
46
|
+
const y = Number.isFinite(pb[i]) ? pb[i] : 0;
|
|
47
|
+
if (x !== y) return x - y;
|
|
48
|
+
}
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
function looksNative(p) {
|
|
52
|
+
return p.includes("bin/claude.exe") || p.includes("bin/claude-native") || p.includes("claude.exe") || p.includes("claude-native") || p.includes("claude/versions/");
|
|
53
|
+
}
|
|
54
|
+
function detectCcNativeBinary(env = process.env) {
|
|
55
|
+
const reasons = [];
|
|
56
|
+
let resolvedPath;
|
|
57
|
+
let version;
|
|
58
|
+
const execPath = (env.CLAUDE_CODE_EXECPATH ?? "").trim();
|
|
59
|
+
if (execPath.length > 0 && looksNative(execPath)) {
|
|
60
|
+
reasons.push(`CLAUDE_CODE_EXECPATH points to native binary: ${execPath}`);
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const claudePath = execSync("which claude 2>/dev/null || true", {
|
|
64
|
+
encoding: "utf8",
|
|
65
|
+
timeout: 5e3
|
|
66
|
+
}).trim();
|
|
67
|
+
if (claudePath) {
|
|
68
|
+
let resolved = claudePath;
|
|
69
|
+
try {
|
|
70
|
+
resolved = execSync(
|
|
71
|
+
`readlink -f "${claudePath}" 2>/dev/null || readlink "${claudePath}" 2>/dev/null || echo "${claudePath}"`,
|
|
72
|
+
{ encoding: "utf8", timeout: 5e3 }
|
|
73
|
+
).trim();
|
|
74
|
+
} catch {
|
|
75
|
+
}
|
|
76
|
+
resolvedPath = resolved;
|
|
77
|
+
if (looksNative(resolved)) {
|
|
78
|
+
reasons.push(`claude resolves to native binary: ${resolved}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
} catch {
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const versionsDir = path.join(
|
|
85
|
+
env.HOME ?? env.USERPROFILE ?? "",
|
|
86
|
+
".local",
|
|
87
|
+
"share",
|
|
88
|
+
"claude",
|
|
89
|
+
"versions"
|
|
90
|
+
);
|
|
91
|
+
if (versionsDir && existsSync(versionsDir)) {
|
|
92
|
+
const entries = readdirSync(versionsDir);
|
|
93
|
+
if (entries.length > 0) {
|
|
94
|
+
reasons.push(
|
|
95
|
+
`${entries.length} cached native CC version(s) in ${versionsDir}`
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
} catch {
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const out = execSync("claude --version 2>/dev/null || echo unknown", {
|
|
103
|
+
encoding: "utf8",
|
|
104
|
+
timeout: 5e3
|
|
105
|
+
}).trim();
|
|
106
|
+
const m = out.match(/(\d+\.\d+\.\d+)/);
|
|
107
|
+
if (m) {
|
|
108
|
+
version = m[1];
|
|
109
|
+
if (compareSemver(version, CC_NATIVE_ONLY_CUTOFF) >= 0) {
|
|
110
|
+
reasons.push(
|
|
111
|
+
`CC version ${version} is \u2265${CC_NATIVE_ONLY_CUTOFF} (native-binary build)`
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
} catch {
|
|
116
|
+
}
|
|
117
|
+
return { detected: reasons.length > 0, reasons, resolvedPath, version };
|
|
118
|
+
}
|
|
119
|
+
function ccNativeBinaryWarningLine(status = detectCcNativeBinary(), env = process.env) {
|
|
120
|
+
if (!status.detected) return null;
|
|
121
|
+
if (isAutoupdaterDisabled(env)) return null;
|
|
122
|
+
const ver = status.version ? ` (v${status.version})` : "";
|
|
123
|
+
return `\u{1F534} Claude Code native binary detected${ver} \u2014 phantom-billing risk. exe-os is tested against cli.js. Mitigate: disable the auto-updater (export DISABLE_AUTOUPDATER=1 and CLAUDE_CODE_AUTOUPDATER_DISABLED=1 in your shell profile) (run \`exe-os healthcheck\` for details). Advisory only.`;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export {
|
|
127
|
+
CC_NATIVE_ONLY_CUTOFF,
|
|
128
|
+
CC_SAFE_PINNED_VERSION,
|
|
129
|
+
detectAutoupdaterVar,
|
|
130
|
+
isAutoupdaterDisabled,
|
|
131
|
+
compareSemver,
|
|
132
|
+
detectCcNativeBinary,
|
|
133
|
+
ccNativeBinaryWarningLine
|
|
134
|
+
};
|