@askexenow/exe-os 0.9.280 → 0.9.281
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.default +2 -1
- package/deploy/compose/.env.example +1 -1
- package/deploy/compose/docker-compose.yml +74 -13
- package/deploy/compose/erp-nginx/nginx.conf +52 -0
- package/deploy/compose/generate-env.ts +1 -1
- package/deploy/compose/init-db.sql +13 -2
- package/deploy/stack-manifests/v0.9.json +11 -31
- package/dist/active-agent-6ZBHGHXF.js +26 -0
- package/dist/active-agent-E23SCYER.js +27 -0
- package/dist/active-agent-KMZT44S4.js +26 -0
- package/dist/active-agent-LFFTVROM.js +27 -0
- package/dist/agentic-ontology-PCZB5HV5.js +25 -0
- package/dist/agentic-ontology-PGGJN2ES.js +25 -0
- package/dist/assets/tmux.conf +2 -0
- package/dist/backfill-metadata-KQ4FEVUR.js +599 -0
- package/dist/backfill-metadata-Y3YWCHKJ.js +599 -0
- package/dist/behaviors-H4DZECKL.js +39 -0
- package/dist/behaviors-WIUTIJF6.js +39 -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 +4 -4
- package/dist/bin/backfill-responses.js +4 -4
- package/dist/bin/backfill-vectors.js +5 -5
- package/dist/bin/bulk-sync-postgres.js +7 -7
- package/dist/bin/cc-doctor.js +4 -4
- package/dist/bin/cleanup-stale-review-tasks.js +10 -10
- package/dist/bin/cli.js +15 -15
- package/dist/bin/exe-agent-config.js +2 -2
- package/dist/bin/exe-agent.js +4 -4
- package/dist/bin/exe-assign.js +5 -5
- package/dist/bin/exe-boot.js +17 -17
- package/dist/bin/exe-call.js +4 -4
- package/dist/bin/exe-cloud.js +5 -5
- package/dist/bin/exe-dispatch.js +10 -10
- package/dist/bin/exe-doctor.js +1 -1
- 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 +4 -4
- package/dist/bin/exe-heartbeat.js +10 -10
- package/dist/bin/exe-kill.js +13 -13
- package/dist/bin/exe-launch-agent.js +17 -17
- package/dist/bin/exe-new-employee.js +7 -7
- 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 +5 -5
- 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-support.js +2 -2
- package/dist/bin/exe-team.js +3 -3
- package/dist/bin/exe-watchdog.js +17 -2
- package/dist/bin/git-sweep.js +11 -11
- package/dist/bin/graph-backfill.js +4 -4
- package/dist/bin/graph-export.js +5 -5
- package/dist/bin/import-history.js +7 -7
- package/dist/bin/install.js +8 -7
- 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/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 +3 -3
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/capability-cards-F22XWGLB.js +88 -0
- package/dist/capability-cards-KCKITXXZ.js +88 -0
- package/dist/capacity-monitor-CHXGKVEO.js +50 -0
- package/dist/capacity-monitor-L3M5KB6T.js +50 -0
- package/dist/catchup-brief-BVZANLRZ.js +154 -0
- package/dist/catchup-brief-LDUGMC7S.js +154 -0
- package/dist/catchup-brief-NZDLL7SA.js +154 -0
- package/dist/catchup-brief-OOIXVGBA.js +154 -0
- package/dist/catchup-brief-UPXHDYTB.js +154 -0
- package/dist/chunk-2BI3FQKL.js +1876 -0
- package/dist/chunk-2CJUQGHH.js +362 -0
- package/dist/chunk-2EVYBMBJ.js +128 -0
- package/dist/chunk-2NQOZOXG.js +2113 -0
- package/dist/chunk-2QK5E3LB.js +128 -0
- package/dist/chunk-2VTCG4ZU.js +1352 -0
- package/dist/chunk-2YGI36DV.js +1119 -0
- package/dist/chunk-32BQN2QN.js +185 -0
- package/dist/chunk-33JMO4UV.js +157 -0
- package/dist/chunk-3DZAYLXY.js +377 -0
- package/dist/chunk-3MGBE7GR.js +76 -0
- package/dist/chunk-3MTV4FJL.js +271 -0
- package/dist/chunk-3NN7VQ27.js +1352 -0
- package/dist/chunk-4533HNOG.js +70 -0
- package/dist/chunk-456UW3MT.js +731 -0
- package/dist/chunk-4AU56XV2.js +58 -0
- package/dist/chunk-4MRP6EBR.js +280 -0
- package/dist/chunk-4MRWW52U.js +14219 -0
- package/dist/chunk-4WWECNAY.js +50 -0
- package/dist/chunk-4ZJDDR6L.js +171 -0
- package/dist/chunk-522EOPM6.js +382 -0
- package/dist/chunk-52UDAVZE.js +3208 -0
- package/dist/chunk-5FAMUB4X.js +204 -0
- package/dist/chunk-5PGZJQUI.js +58 -0
- package/dist/chunk-67TZJXNZ.js +262 -0
- package/dist/chunk-6FEZ7GN2.js +123 -0
- package/dist/chunk-6MOGND7S.js +14219 -0
- package/dist/chunk-6TRSVY7L.js +181 -0
- package/dist/chunk-6WCS7ZNK.js +85 -0
- package/dist/chunk-6WRYDREW.js +539 -0
- package/dist/chunk-72UA2FB3.js +181 -0
- package/dist/chunk-77DMFEOL.js +30 -0
- package/dist/chunk-7COXVQ5W.js +214 -0
- package/dist/chunk-7HLWBYH7.js +60 -0
- package/dist/chunk-ALSTZCWT.js +204 -0
- package/dist/chunk-ARUTDXZX.js +280 -0
- package/dist/chunk-AU47B4QY.js +129 -0
- package/dist/chunk-AXOREWVL.js +836 -0
- package/dist/chunk-B5MNC54V.js +127 -0
- package/dist/chunk-B74VSMKX.js +1350 -0
- package/dist/chunk-BHWLH44J.js +362 -0
- package/dist/chunk-BUPZ3HD2.js +85 -0
- package/dist/chunk-BWVLMA53.js +2113 -0
- package/dist/chunk-C5WLBKMJ.js +50 -0
- package/dist/chunk-C62T6R2A.js +97 -0
- package/dist/chunk-CV5KBAIK.js +33 -0
- package/dist/chunk-DAYSDWXA.js +1068 -0
- package/dist/chunk-DI4URIUB.js +227 -0
- package/dist/chunk-DNTCYFJ6.js +76 -0
- package/dist/chunk-DPDRRS7T.js +103 -0
- package/dist/chunk-DT3EV6CW.js +103 -0
- package/dist/chunk-DX45HDWY.js +1076 -0
- package/dist/chunk-E72BD6MG.js +284 -0
- package/dist/chunk-EAPUSVKS.js +375 -0
- package/dist/chunk-EFUANRRT.js +85 -0
- package/dist/chunk-EG2SCT5R.js +1352 -0
- package/dist/chunk-EJD2JU77.js +58 -0
- package/dist/chunk-EMXYUAVP.js +81 -0
- package/dist/chunk-ENM2TAAM.js +14219 -0
- package/dist/chunk-EPDRTPVP.js +1876 -0
- package/dist/chunk-EW6XDHID.js +221 -0
- package/dist/chunk-EYEGSAWZ.js +1094 -0
- package/dist/chunk-F6L33PAQ.js +231 -0
- package/dist/chunk-FC2SCTVE.js +38 -0
- package/dist/chunk-FSRKIZGZ.js +630 -0
- package/dist/chunk-FTG7I5CB.js +81 -0
- package/dist/chunk-GVFRLWX7.js +30 -0
- package/dist/chunk-H3XMZOWW.js +1119 -0
- package/dist/chunk-HAKXE6LN.js +123 -0
- package/dist/chunk-HLP3ZDTW.js +448 -0
- package/dist/chunk-HOYWKQAA.js +510 -0
- package/dist/chunk-HWDD64IW.js +712 -0
- package/dist/chunk-HWMCULHY.js +127 -0
- package/dist/chunk-HZZHRZPK.js +210 -0
- package/dist/chunk-ICRWTYNW.js +103 -0
- package/dist/chunk-J5MWPC33.js +167 -0
- package/dist/chunk-JBXANNNB.js +70 -0
- package/dist/chunk-JPBMIYWF.js +1352 -0
- package/dist/chunk-JY6EXBFI.js +373 -0
- package/dist/chunk-JZLIBXI7.js +14219 -0
- package/dist/chunk-JZPTKXJ6.js +668 -0
- package/dist/chunk-KEYMA4ZP.js +510 -0
- package/dist/chunk-KHGNN6GL.js +2078 -0
- package/dist/chunk-KVLB2PD6.js +97 -0
- package/dist/chunk-L3YBRBKL.js +1076 -0
- package/dist/chunk-L7VZ32NA.js +89 -0
- package/dist/chunk-LEHLADW4.js +221 -0
- package/dist/chunk-LPD4HILQ.js +262 -0
- package/dist/chunk-LSJ3ADDI.js +51 -0
- package/dist/chunk-LUMS2MAS.js +58 -0
- package/dist/chunk-LV4SEC6C.js +394 -0
- package/dist/chunk-LXXBEI4A.js +284 -0
- package/dist/chunk-M4NPCAIH.js +456 -0
- package/dist/chunk-MFJ62LQ5.js +157 -0
- package/dist/chunk-MGEZNKOD.js +836 -0
- package/dist/chunk-MJ7X5IBW.js +227 -0
- package/dist/chunk-MLGRWCY4.js +54 -0
- package/dist/chunk-MQZX57IY.js +348 -0
- package/dist/chunk-MY7MFF6J.js +103 -0
- package/dist/chunk-MYA2X5OY.js +185 -0
- package/dist/chunk-MYEABW5Z.js +630 -0
- package/dist/chunk-MZ2TDCAL.js +402 -0
- package/dist/chunk-NF3FRB7Z.js +271 -0
- package/dist/chunk-NXYIFEPV.js +539 -0
- package/dist/chunk-O2GVE5B5.js +58 -0
- package/dist/chunk-O5GUCDR2.js +456 -0
- package/dist/chunk-OBZNRECA.js +128 -0
- package/dist/chunk-OMZ2RLJG.js +214 -0
- package/dist/chunk-ORDHJRWN.js +299 -0
- package/dist/chunk-OSPIJMCD.js +210 -0
- package/dist/chunk-OUGWEH4J.js +240 -0
- package/dist/chunk-OV5MJQGC.js +1876 -0
- package/dist/chunk-PC635OAG.js +4318 -0
- package/dist/chunk-PH46R4J6.js +348 -0
- package/dist/chunk-PJP2EP7P.js +394 -0
- package/dist/chunk-PODFWH3V.js +333 -0
- package/dist/chunk-PPWH3SHR.js +1068 -0
- package/dist/chunk-PWPJK7KB.js +4318 -0
- package/dist/chunk-PXONZVG4.js +377 -0
- package/dist/chunk-QAOGJRZD.js +369 -0
- package/dist/chunk-QC3LAEI7.js +197 -0
- package/dist/chunk-QDWQDUWI.js +668 -0
- package/dist/chunk-QKJFD6BH.js +1350 -0
- package/dist/chunk-QNYVJGFM.js +345 -0
- package/dist/chunk-QQF3XGQ5.js +14219 -0
- package/dist/chunk-QRPFQNI3.js +150 -0
- package/dist/chunk-QSSU5XWD.js +731 -0
- package/dist/chunk-QXZAGVAV.js +2078 -0
- package/dist/chunk-RA54MW64.js +244 -0
- package/dist/chunk-RF7PUWXI.js +197 -0
- package/dist/chunk-S3INDYSO.js +244 -0
- package/dist/chunk-SLQVTHH5.js +369 -0
- package/dist/chunk-SY2B74KL.js +345 -0
- package/dist/chunk-T6QPXXXW.js +712 -0
- package/dist/chunk-TO5M5YCT.js +41 -0
- package/dist/chunk-TQ4VXUAF.js +129 -0
- package/dist/chunk-UAB7RQC4.js +41 -0
- package/dist/chunk-UMEIBDYW.js +97 -0
- package/dist/chunk-UXW5TB7Y.js +240 -0
- package/dist/chunk-VB2N5WOX.js +150 -0
- package/dist/chunk-VLZEMRG3.js +167 -0
- package/dist/chunk-VM3V6VK7.js +230 -0
- package/dist/chunk-VMCGKBHB.js +1352 -0
- package/dist/chunk-VNIYZAR5.js +128 -0
- package/dist/chunk-VYV4KOD2.js +85 -0
- package/dist/chunk-W4SRJBAT.js +171 -0
- package/dist/chunk-W5W3LZ3Q.js +54 -0
- package/dist/chunk-WDNZEOM3.js +38 -0
- package/dist/chunk-WUKEXVOR.js +3208 -0
- package/dist/chunk-X3Z35Q6L.js +373 -0
- package/dist/chunk-X4VOU6BQ.js +382 -0
- package/dist/chunk-X6EEVSVG.js +290 -0
- package/dist/chunk-XFHGWGNB.js +1094 -0
- package/dist/chunk-XKOLRWYA.js +33 -0
- package/dist/chunk-XMMIL3UD.js +402 -0
- package/dist/chunk-XWILC6VA.js +290 -0
- package/dist/chunk-Y4OQCX4C.js +97 -0
- package/dist/chunk-Y67VYYOA.js +231 -0
- package/dist/chunk-YGQCQTQH.js +230 -0
- package/dist/chunk-YGWFBN5A.js +299 -0
- package/dist/chunk-YMKUXZIG.js +379 -0
- package/dist/chunk-YOMLMT7E.js +230 -0
- package/dist/chunk-YPESIZOB.js +14219 -0
- package/dist/chunk-Z2CGCIU2.js +89 -0
- package/dist/chunk-ZLAWNHQR.js +448 -0
- package/dist/chunk-ZME5UQSN.js +333 -0
- package/dist/co-activation-NUEQYXE5.js +73 -0
- package/dist/co-activation-ZG5HLBCZ.js +73 -0
- package/dist/co-occurrence-7S5KWQB2.js +94 -0
- package/dist/co-occurrence-X5SWDXT2.js +94 -0
- package/dist/core-memory-GOPBRGGZ.js +110 -0
- package/dist/core-memory-XLCU6L5M.js +110 -0
- package/dist/crdt-sync-EPKHPGRZ.js +33 -0
- package/dist/crdt-sync-UIQJ5U7T.js +33 -0
- package/dist/crm-webhook-MKN23JNU.js +10 -0
- package/dist/crm-webhook-SM63BPXO.js +10 -0
- package/dist/cto-delegation-gate-PQY5TOVZ.js +279 -0
- package/dist/cto-delegation-gate-V5VVUR3G.js +279 -0
- package/dist/daemon-orchestration-C7AAS67Q.js +138 -0
- package/dist/daemon-orchestration-OBCAJB2H.js +138 -0
- package/dist/db-backup-F7VP4QRH.js +33 -0
- package/dist/db-backup-KVYC57W7.js +33 -0
- package/dist/doc-graph-extractor-H2ETEINP.js +132 -0
- package/dist/doc-graph-extractor-PCUZEYCH.js +132 -0
- package/dist/dreaming-4OZXSLE3.js +33 -0
- package/dist/dreaming-Z2RYEYNT.js +33 -0
- package/dist/exe-drift-GEWNIK7A.js +69 -0
- package/dist/exe-drift-XCGH7AFO.js +69 -0
- package/dist/exe-export-7DKAU5IP.js +75 -0
- package/dist/exe-export-BCHH6OE6.js +75 -0
- package/dist/exe-import-PDRIZVYF.js +78 -0
- package/dist/exe-import-ZCKUDFKL.js +78 -0
- package/dist/exe-key-FUWLLI3U.js +580 -0
- package/dist/exe-key-RKKNVUMP.js +580 -0
- package/dist/exe-snapshot-G4I5FQMK.js +337 -0
- package/dist/exe-snapshot-GWU7QTZK.js +337 -0
- package/dist/fast-db-init-6QG6YQNT.js +7 -0
- package/dist/fast-db-init-X2QDQUA4.js +7 -0
- package/dist/founder-context-TOMNUBGJ.js +96 -0
- package/dist/founder-context-UU3V6MAS.js +96 -0
- package/dist/gateway/index.js +8 -8
- package/dist/git-staleness-FEPFMZKF.js +111 -0
- package/dist/git-staleness-HYVYLCW3.js +111 -0
- package/dist/git-task-sweep-IRV52JIM.js +41 -0
- package/dist/git-task-sweep-T6BSM3GS.js +41 -0
- package/dist/global-procedures-3AURRMKO.js +21 -0
- package/dist/global-procedures-JPCYBZYC.js +21 -0
- package/dist/graph-auto-extract-OC3AOSMW.js +182 -0
- package/dist/graph-auto-extract-PVDYEJBY.js +182 -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.js +6 -6
- package/dist/hooks/instructions-loaded.js +4 -4
- package/dist/hooks/manifest.json +19 -19
- package/dist/hooks/notification.js +4 -4
- package/dist/hooks/post-compact.js +11 -11
- package/dist/hooks/post-tool-combined.js +5 -5
- package/dist/hooks/pre-compact.js +12 -12
- package/dist/hooks/pre-tool-use.js +15 -15
- package/dist/hooks/prompt-submit.js +22 -22
- package/dist/hooks/session-end.js +16 -16
- package/dist/hooks/session-start.js +10 -10
- package/dist/hooks/stop.js +15 -15
- package/dist/hooks/subagent-stop.js +11 -11
- package/dist/hooks/summary-worker.js +15 -15
- package/dist/index.js +18 -18
- package/dist/installer-72XXLBRP.js +39 -0
- package/dist/installer-HDXG2BZN.js +343 -0
- package/dist/installer-JALMKPCS.js +297 -0
- package/dist/installer-Q46SNNLU.js +39 -0
- package/dist/installer-W7PIPRCX.js +343 -0
- package/dist/installer-Z7WQEOS7.js +297 -0
- package/dist/lib/cloud-sync.js +5 -5
- package/dist/lib/consolidation.js +5 -5
- package/dist/lib/database.js +2 -2
- package/dist/lib/db.js +2 -2
- package/dist/lib/employee-templates.js +4 -4
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon.js +45 -41
- package/dist/lib/hybrid-search.js +5 -5
- package/dist/lib/identity.js +2 -2
- package/dist/lib/license.js +1 -1
- 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/license-gate-7JZCHOAG.js +14 -0
- package/dist/license-gate-OP4SKL4P.js +14 -0
- package/dist/mcp/register-tools.js +58 -58
- package/dist/mcp/server.js +59 -59
- 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-health-VULNT722.js +17 -0
- package/dist/mcp-health-WDOB6XUB.js +19 -0
- package/dist/mcp-http-config-2OZ7N74D.js +28 -0
- package/dist/mcp-http-config-4VXA5K73.js +28 -0
- package/dist/memory-cards-2K6QRZU6.js +179 -0
- package/dist/memory-cards-KSJF5OH2.js +179 -0
- package/dist/memory-graph-extractor-IJD5HWYT.js +21 -0
- package/dist/memory-graph-extractor-O4GAXOK5.js +21 -0
- package/dist/memory-poisoning-defense-2JRPWT5V.js +223 -0
- package/dist/memory-poisoning-defense-DH4A25NU.js +223 -0
- package/dist/memory-reflection-ISY2BBDB.js +243 -0
- package/dist/memory-reflection-Z5AQRR6H.js +243 -0
- package/dist/notifications-2VSWK2UJ.js +46 -0
- package/dist/notifications-4S253VQM.js +46 -0
- package/dist/oauth-server-D7D4574D.js +437 -0
- package/dist/oauth-server-MACN54SJ.js +437 -0
- package/dist/orchestration-events-BGP5RYQI.js +26 -0
- package/dist/orchestration-events-MDXUEVRZ.js +26 -0
- package/dist/orchestrator-DHK7RSSH.js +34 -0
- package/dist/orchestrator-R75WHQVA.js +34 -0
- package/dist/pipeline-router-4WUKQQEC.js +14 -0
- package/dist/pipeline-router-GWB2XK2Q.js +14 -0
- package/dist/plan-limits-NNJRAESF.js +27 -0
- package/dist/plan-limits-YTQW4UR4.js +27 -0
- package/dist/project-boot-46GZJTEX.js +299 -0
- package/dist/project-boot-PPHBBGIF.js +299 -0
- package/dist/projection-worker-UPAWXI7P.js +1034 -0
- package/dist/projection-worker-ZIKDYBW5.js +1034 -0
- package/dist/reranker-5ZBP2RRN.js +19 -0
- package/dist/reranker-E2MQIMJL.js +19 -0
- package/dist/reranker-GLSDJT3V.js +19 -0
- package/dist/reranker-LBBXWNOD.js +19 -0
- package/dist/reranker-XZ2EF4OH.js +19 -0
- package/dist/retrieval-health-JYRKPSII.js +7 -0
- package/dist/retrieval-health-OUV25J6S.js +7 -0
- package/dist/retrieval-health-U73JUAZL.js +7 -0
- package/dist/retrieval-health-WSZ7TYFF.js +7 -0
- package/dist/review-polling-62JV55ZT.js +125 -0
- package/dist/review-polling-CJXLWFWK.js +125 -0
- package/dist/runtime/index.js +12 -12
- package/dist/session-events-2ADD54VI.js +37 -0
- package/dist/session-events-QIJVBSKS.js +37 -0
- package/dist/session-kill-telemetry-HS6HD2YE.js +30 -0
- package/dist/session-kill-telemetry-MRT5FVSM.js +30 -0
- package/dist/session-scope-7ICYPC33.js +87 -0
- package/dist/session-scope-KMXD6EE6.js +87 -0
- package/dist/setup-wizard-B6GIT7YC.js +12 -0
- package/dist/setup-wizard-JUIJ4UZO.js +12 -0
- package/dist/skill-refinement-HIOX4VMC.js +158 -0
- package/dist/skill-refinement-T7JXRYUW.js +158 -0
- package/dist/stack-update-5KE6BZKQ.js +74 -0
- package/dist/stack-update-OP2RHP7N.js +74 -0
- package/dist/stack-update-VGCWDJEE.js +74 -0
- package/dist/steward-gate-L22WE3SY.js +14 -0
- package/dist/steward-gate-YKD2LUWN.js +14 -0
- package/dist/task-enforcement-5AOKXTY4.js +439 -0
- package/dist/task-enforcement-VO3YEGIO.js +439 -0
- package/dist/task-scope-YV2WPKRD.js +36 -0
- package/dist/task-scope-ZSXDZBRE.js +36 -0
- package/dist/tasks-crud-C6KADACT.js +78 -0
- package/dist/tasks-crud-NV6JEWGL.js +78 -0
- package/dist/tasks-notify-E22HSN6O.js +39 -0
- package/dist/tasks-notify-RPSEQ4WV.js +39 -0
- package/dist/tasks-review-V4ZLXOAZ.js +48 -0
- package/dist/tasks-review-ZVRI73JE.js +48 -0
- package/dist/telemetry-upload-LXUH7SKI.js +740 -0
- package/dist/telemetry-upload-TCDAZTUQ.js +740 -0
- package/dist/token-budget-OFBEZJTA.js +85 -0
- package/dist/token-budget-WAN57V6S.js +85 -0
- package/dist/tool-telemetry-UA3N32PK.js +17 -0
- package/dist/tool-telemetry-XXZJ35RR.js +17 -0
- package/dist/tui/App.js +17 -17
- package/dist/tui-data-46QLCJUE.js +259 -0
- package/dist/tui-data-ZDB7BLP2.js +259 -0
- package/dist/wiki-acl-HHSIBPF3.js +111 -0
- package/dist/wiki-acl-O65GZ2ZF.js +111 -0
- package/dist/worker-gate-27I4GAEZ.js +21 -0
- package/dist/worker-gate-DXU4HEPY.js +21 -0
- package/dist/workflow-engine-63EOEJ5Q.js +28 -0
- package/dist/workflow-engine-C6F2RMPN.js +28 -0
- package/dist/worktree-SFKKOMFD.js +27 -0
- package/dist/worktree-SVCE3S7X.js +27 -0
- package/dist/worktree-sweep-S3JHJTVP.js +20 -0
- package/dist/worktree-sweep-U3TIQ7WL.js +20 -0
- package/package.json +1 -1
- package/release-notes.json +88 -26
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getClient
|
|
3
|
+
} from "./chunk-52UDAVZE.js";
|
|
4
|
+
|
|
5
|
+
// src/lib/token-spend.ts
|
|
6
|
+
import { readdir, stat } from "fs/promises";
|
|
7
|
+
import { createReadStream } from "fs";
|
|
8
|
+
import { createInterface } from "readline";
|
|
9
|
+
import path from "path";
|
|
10
|
+
import os from "os";
|
|
11
|
+
var MODEL_PRICING = {
|
|
12
|
+
// Opus 4.5+ ($5/$25 — Anthropic price drop from original Opus 4)
|
|
13
|
+
"claude-opus-4-7": { input: 5 / 1e6, output: 25 / 1e6, cacheRead: 0.5 / 1e6, cacheWrite: 6.25 / 1e6 },
|
|
14
|
+
"claude-opus-4-6": { input: 5 / 1e6, output: 25 / 1e6, cacheRead: 0.5 / 1e6, cacheWrite: 6.25 / 1e6 },
|
|
15
|
+
"claude-opus-4-5": { input: 5 / 1e6, output: 25 / 1e6, cacheRead: 0.5 / 1e6, cacheWrite: 6.25 / 1e6 },
|
|
16
|
+
// Opus 4.0/4.1 (legacy $15/$75)
|
|
17
|
+
"claude-opus-4-1": { input: 15 / 1e6, output: 75 / 1e6, cacheRead: 1.5 / 1e6, cacheWrite: 18.75 / 1e6 },
|
|
18
|
+
"claude-opus-4": { input: 15 / 1e6, output: 75 / 1e6, cacheRead: 1.5 / 1e6, cacheWrite: 18.75 / 1e6 },
|
|
19
|
+
// Sonnet 4.x
|
|
20
|
+
"claude-sonnet-4": { input: 3 / 1e6, output: 15 / 1e6, cacheRead: 0.3 / 1e6, cacheWrite: 3.75 / 1e6 },
|
|
21
|
+
// Sonnet 3.7/3.5
|
|
22
|
+
"claude-3-7-sonnet": { input: 3 / 1e6, output: 15 / 1e6, cacheRead: 0.3 / 1e6, cacheWrite: 3.75 / 1e6 },
|
|
23
|
+
"claude-3-5-sonnet": { input: 3 / 1e6, output: 15 / 1e6, cacheRead: 0.3 / 1e6, cacheWrite: 3.75 / 1e6 },
|
|
24
|
+
// Haiku 4.5
|
|
25
|
+
"claude-haiku-4-5": { input: 1 / 1e6, output: 5 / 1e6, cacheRead: 0.1 / 1e6, cacheWrite: 1.25 / 1e6 },
|
|
26
|
+
// Haiku 3.5
|
|
27
|
+
"claude-3-5-haiku": { input: 0.8 / 1e6, output: 4 / 1e6, cacheRead: 0.08 / 1e6, cacheWrite: 1 / 1e6 },
|
|
28
|
+
// Opus 3
|
|
29
|
+
"claude-3-opus": { input: 15 / 1e6, output: 75 / 1e6, cacheRead: 1.5 / 1e6, cacheWrite: 18.75 / 1e6 },
|
|
30
|
+
// Sonnet 3
|
|
31
|
+
"claude-3-sonnet": { input: 3 / 1e6, output: 15 / 1e6, cacheRead: 0.3 / 1e6, cacheWrite: 3.75 / 1e6 },
|
|
32
|
+
// Haiku 3
|
|
33
|
+
"claude-3-haiku": { input: 0.25 / 1e6, output: 1.25 / 1e6, cacheRead: 0.03 / 1e6, cacheWrite: 0.3 / 1e6 }
|
|
34
|
+
};
|
|
35
|
+
var DEFAULT_PRICING = MODEL_PRICING["claude-sonnet-4"];
|
|
36
|
+
var CACHE_TTL_MS = 5 * 60 * 1e3;
|
|
37
|
+
var JSONL_INDEX_TTL_MS = 5 * 60 * 1e3;
|
|
38
|
+
var USAGE_CACHE_MAX_ENTRIES = 1e4;
|
|
39
|
+
var _spendCache = /* @__PURE__ */ new Map();
|
|
40
|
+
var _spendInFlight = /* @__PURE__ */ new Map();
|
|
41
|
+
var _usageCache = /* @__PURE__ */ new Map();
|
|
42
|
+
var _usageInFlight = /* @__PURE__ */ new Map();
|
|
43
|
+
var _jsonlPathIndex = null;
|
|
44
|
+
function yieldToEventLoop() {
|
|
45
|
+
return new Promise((resolve) => setImmediate(resolve));
|
|
46
|
+
}
|
|
47
|
+
function getPricing(model) {
|
|
48
|
+
if (MODEL_PRICING[model]) return MODEL_PRICING[model];
|
|
49
|
+
const stripped = model.replace(/-\d{8}$/, "");
|
|
50
|
+
if (MODEL_PRICING[stripped]) return MODEL_PRICING[stripped];
|
|
51
|
+
const sortedKeys = Object.keys(MODEL_PRICING).sort((a, b) => b.length - a.length);
|
|
52
|
+
for (const key of sortedKeys) {
|
|
53
|
+
if (model.includes(key)) return MODEL_PRICING[key];
|
|
54
|
+
}
|
|
55
|
+
return DEFAULT_PRICING;
|
|
56
|
+
}
|
|
57
|
+
async function getAgentSpend(period = "7d") {
|
|
58
|
+
const cached = _spendCache.get(period);
|
|
59
|
+
if (cached && Date.now() < cached.expires) {
|
|
60
|
+
return cached.result;
|
|
61
|
+
}
|
|
62
|
+
const inFlight = _spendInFlight.get(period);
|
|
63
|
+
if (inFlight) return inFlight;
|
|
64
|
+
const promise = computeAgentSpend(period).finally(() => _spendInFlight.delete(period));
|
|
65
|
+
_spendInFlight.set(period, promise);
|
|
66
|
+
return promise;
|
|
67
|
+
}
|
|
68
|
+
async function computeAgentSpend(period) {
|
|
69
|
+
const cutoff = periodToCutoff(period);
|
|
70
|
+
const client = getClient();
|
|
71
|
+
const dbResult = await client.execute({
|
|
72
|
+
sql: `SELECT session_uuid, agent_id FROM session_agent_map WHERE started_at >= ?`,
|
|
73
|
+
args: [cutoff]
|
|
74
|
+
});
|
|
75
|
+
if (dbResult.rows.length === 0) return [];
|
|
76
|
+
const sessionAgent = /* @__PURE__ */ new Map();
|
|
77
|
+
for (const row of dbResult.rows) {
|
|
78
|
+
sessionAgent.set(row.session_uuid, row.agent_id);
|
|
79
|
+
}
|
|
80
|
+
const jsonlPaths = await getClaudeSessionJsonlIndex();
|
|
81
|
+
if (jsonlPaths.size === 0) return [];
|
|
82
|
+
const agentTotals = /* @__PURE__ */ new Map();
|
|
83
|
+
let processed = 0;
|
|
84
|
+
for (const [sessionUuid, agentId] of sessionAgent) {
|
|
85
|
+
const jsonlPath = jsonlPaths.get(sessionUuid);
|
|
86
|
+
if (!jsonlPath) continue;
|
|
87
|
+
try {
|
|
88
|
+
const usage = await extractSessionUsageCached(jsonlPath);
|
|
89
|
+
if (usage.input === 0 && usage.output === 0) continue;
|
|
90
|
+
const totals = agentTotals.get(agentId) ?? {
|
|
91
|
+
input: 0,
|
|
92
|
+
output: 0,
|
|
93
|
+
cacheRead: 0,
|
|
94
|
+
cacheCreate: 0,
|
|
95
|
+
costUSD: 0,
|
|
96
|
+
sessions: /* @__PURE__ */ new Set()
|
|
97
|
+
};
|
|
98
|
+
totals.input += usage.input;
|
|
99
|
+
totals.output += usage.output;
|
|
100
|
+
totals.cacheRead += usage.cacheRead;
|
|
101
|
+
totals.cacheCreate += usage.cacheCreate;
|
|
102
|
+
totals.costUSD += usage.costUSD;
|
|
103
|
+
totals.sessions.add(sessionUuid);
|
|
104
|
+
agentTotals.set(agentId, totals);
|
|
105
|
+
} catch {
|
|
106
|
+
}
|
|
107
|
+
processed++;
|
|
108
|
+
if (processed % 25 === 0) await yieldToEventLoop();
|
|
109
|
+
}
|
|
110
|
+
const result = Array.from(agentTotals.entries()).map(([agentId, t]) => ({
|
|
111
|
+
agentId,
|
|
112
|
+
inputTokens: t.input,
|
|
113
|
+
outputTokens: t.output,
|
|
114
|
+
cacheReadTokens: t.cacheRead,
|
|
115
|
+
cacheCreationTokens: t.cacheCreate,
|
|
116
|
+
costUSD: t.costUSD,
|
|
117
|
+
sessions: t.sessions.size,
|
|
118
|
+
period
|
|
119
|
+
})).sort((a, b) => b.costUSD - a.costUSD);
|
|
120
|
+
_spendCache.set(period, { result, expires: Date.now() + CACHE_TTL_MS });
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
async function getClaudeSessionJsonlIndex() {
|
|
124
|
+
if (_jsonlPathIndex && Date.now() < _jsonlPathIndex.expires) {
|
|
125
|
+
return _jsonlPathIndex.paths;
|
|
126
|
+
}
|
|
127
|
+
const claudeDir = path.join(os.homedir(), ".claude", "projects");
|
|
128
|
+
const paths = /* @__PURE__ */ new Map();
|
|
129
|
+
let projectDirs = [];
|
|
130
|
+
try {
|
|
131
|
+
const entries = await readdir(claudeDir, { withFileTypes: true });
|
|
132
|
+
projectDirs = entries.filter((entry) => entry.isDirectory()).map((entry) => path.join(claudeDir, entry.name));
|
|
133
|
+
} catch {
|
|
134
|
+
_jsonlPathIndex = { expires: Date.now() + JSONL_INDEX_TTL_MS, paths };
|
|
135
|
+
return paths;
|
|
136
|
+
}
|
|
137
|
+
let scanned = 0;
|
|
138
|
+
for (const dir of projectDirs) {
|
|
139
|
+
try {
|
|
140
|
+
const files = await readdir(dir);
|
|
141
|
+
for (const file of files) {
|
|
142
|
+
if (!file.endsWith(".jsonl")) continue;
|
|
143
|
+
paths.set(file.slice(0, -".jsonl".length), path.join(dir, file));
|
|
144
|
+
}
|
|
145
|
+
} catch {
|
|
146
|
+
}
|
|
147
|
+
scanned++;
|
|
148
|
+
if (scanned % 25 === 0) await yieldToEventLoop();
|
|
149
|
+
}
|
|
150
|
+
_jsonlPathIndex = { expires: Date.now() + JSONL_INDEX_TTL_MS, paths };
|
|
151
|
+
return paths;
|
|
152
|
+
}
|
|
153
|
+
async function extractSessionUsageCached(jsonlPath) {
|
|
154
|
+
const st = await stat(jsonlPath);
|
|
155
|
+
const cached = _usageCache.get(jsonlPath);
|
|
156
|
+
if (cached && cached.mtimeMs === st.mtimeMs && cached.size === st.size) {
|
|
157
|
+
return cached.usage;
|
|
158
|
+
}
|
|
159
|
+
const existing = _usageInFlight.get(jsonlPath);
|
|
160
|
+
if (existing) return existing;
|
|
161
|
+
const promise = extractSessionUsage(jsonlPath).then((usage) => {
|
|
162
|
+
_usageCache.set(jsonlPath, { mtimeMs: st.mtimeMs, size: st.size, usage });
|
|
163
|
+
pruneUsageCache();
|
|
164
|
+
return usage;
|
|
165
|
+
}).finally(() => _usageInFlight.delete(jsonlPath));
|
|
166
|
+
_usageInFlight.set(jsonlPath, promise);
|
|
167
|
+
return promise;
|
|
168
|
+
}
|
|
169
|
+
function pruneUsageCache() {
|
|
170
|
+
if (_usageCache.size <= USAGE_CACHE_MAX_ENTRIES) return;
|
|
171
|
+
const overflow = _usageCache.size - USAGE_CACHE_MAX_ENTRIES;
|
|
172
|
+
let removed = 0;
|
|
173
|
+
for (const key of _usageCache.keys()) {
|
|
174
|
+
_usageCache.delete(key);
|
|
175
|
+
removed++;
|
|
176
|
+
if (removed >= overflow) break;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function extractSessionUsage(jsonlPath) {
|
|
180
|
+
let input = 0;
|
|
181
|
+
let output = 0;
|
|
182
|
+
let cacheRead = 0;
|
|
183
|
+
let cacheCreate = 0;
|
|
184
|
+
let costUSD = 0;
|
|
185
|
+
const seenMessageIds = /* @__PURE__ */ new Set();
|
|
186
|
+
const rl = createInterface({
|
|
187
|
+
input: createReadStream(jsonlPath, { encoding: "utf8" }),
|
|
188
|
+
crlfDelay: Infinity
|
|
189
|
+
});
|
|
190
|
+
for await (const line of rl) {
|
|
191
|
+
if (!line.includes('"type":"assistant"')) continue;
|
|
192
|
+
try {
|
|
193
|
+
const record = JSON.parse(line);
|
|
194
|
+
if (record.type !== "assistant") continue;
|
|
195
|
+
const messageId = record.message?.id;
|
|
196
|
+
if (messageId) {
|
|
197
|
+
if (seenMessageIds.has(messageId)) continue;
|
|
198
|
+
seenMessageIds.add(messageId);
|
|
199
|
+
}
|
|
200
|
+
const usage = record.message?.usage;
|
|
201
|
+
if (!usage) continue;
|
|
202
|
+
const model = record.message?.model ?? "";
|
|
203
|
+
const pricing = getPricing(model);
|
|
204
|
+
const inp = usage.input_tokens ?? 0;
|
|
205
|
+
const out = usage.output_tokens ?? 0;
|
|
206
|
+
const cr = usage.cache_read_input_tokens ?? 0;
|
|
207
|
+
const cc = usage.cache_creation_input_tokens ?? 0;
|
|
208
|
+
input += inp;
|
|
209
|
+
output += out;
|
|
210
|
+
cacheRead += cr;
|
|
211
|
+
cacheCreate += cc;
|
|
212
|
+
if (pricing) {
|
|
213
|
+
costUSD += inp * pricing.input + out * pricing.output + cr * pricing.cacheRead + cc * pricing.cacheWrite;
|
|
214
|
+
}
|
|
215
|
+
} catch {
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return { input, output, cacheRead, cacheCreate, costUSD };
|
|
219
|
+
}
|
|
220
|
+
function periodToCutoff(period) {
|
|
221
|
+
const ms = { "24h": 864e5, "7d": 6048e5, "30d": 2592e6 }[period];
|
|
222
|
+
return new Date(Date.now() - ms).toISOString();
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export {
|
|
226
|
+
getAgentSpend
|
|
227
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import {
|
|
2
|
+
processCRMEvent
|
|
3
|
+
} from "./chunk-X4VOU6BQ.js";
|
|
4
|
+
|
|
5
|
+
// src/gateway/adapters/crm-webhook.ts
|
|
6
|
+
function parseTwentyWebhook(payload) {
|
|
7
|
+
if (!payload || typeof payload !== "object") return null;
|
|
8
|
+
const p = payload;
|
|
9
|
+
const eventName = p.eventName;
|
|
10
|
+
if (!eventName || typeof eventName !== "string") return null;
|
|
11
|
+
const dotIndex = eventName.indexOf(".");
|
|
12
|
+
if (dotIndex === -1) return null;
|
|
13
|
+
const objectType = eventName.slice(0, dotIndex);
|
|
14
|
+
const eventType = eventName.slice(dotIndex + 1);
|
|
15
|
+
if (!objectType || !eventType) return null;
|
|
16
|
+
const normalizedObjectType = objectType.charAt(0).toUpperCase() + objectType.slice(1);
|
|
17
|
+
const record = p.record ?? {};
|
|
18
|
+
if (typeof record !== "object") return null;
|
|
19
|
+
return {
|
|
20
|
+
eventType,
|
|
21
|
+
objectType: normalizedObjectType,
|
|
22
|
+
record
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function createCRMWebhookHandler(options) {
|
|
26
|
+
return async (body) => {
|
|
27
|
+
const event = parseTwentyWebhook(body);
|
|
28
|
+
if (!event) {
|
|
29
|
+
console.warn(
|
|
30
|
+
"[crm-webhook] Malformed CRM webhook payload \u2014 skipping"
|
|
31
|
+
);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
console.log(
|
|
35
|
+
`[crm-webhook] ${event.objectType}.${event.eventType} received`
|
|
36
|
+
);
|
|
37
|
+
try {
|
|
38
|
+
const logs = await processCRMEvent(event, options?.executor, options?.triggers);
|
|
39
|
+
if (logs.length > 0 && options?.onFired) {
|
|
40
|
+
options.onFired(logs);
|
|
41
|
+
}
|
|
42
|
+
} catch (err) {
|
|
43
|
+
console.error(
|
|
44
|
+
"[crm-webhook] Error processing CRM event:",
|
|
45
|
+
err instanceof Error ? err.message : err
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export {
|
|
52
|
+
parseTwentyWebhook,
|
|
53
|
+
createCRMWebhookHandler
|
|
54
|
+
};
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getIdentity,
|
|
3
|
+
loadEmployeesSync
|
|
4
|
+
} from "./chunk-WUKEXVOR.js";
|
|
5
|
+
|
|
6
|
+
// src/lib/drift-probes.ts
|
|
7
|
+
var DRIFT_THRESHOLD = 80;
|
|
8
|
+
async function getRecentMemories(agentId, limit) {
|
|
9
|
+
try {
|
|
10
|
+
const { getClient, isInitialized } = await import("./lib/database.js");
|
|
11
|
+
if (!isInitialized()) return { count: 0, texts: [] };
|
|
12
|
+
const client = getClient();
|
|
13
|
+
const result = await client.execute({
|
|
14
|
+
sql: `SELECT text FROM memories WHERE agent_id = ? ORDER BY created_at DESC LIMIT ?`,
|
|
15
|
+
args: [agentId, limit]
|
|
16
|
+
});
|
|
17
|
+
const texts = result.rows.map((r) => String(r.text ?? ""));
|
|
18
|
+
return { count: texts.length, texts };
|
|
19
|
+
} catch {
|
|
20
|
+
return { count: 0, texts: [] };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async function getDecisionCount(agentId) {
|
|
24
|
+
try {
|
|
25
|
+
const { getClient, isInitialized } = await import("./lib/database.js");
|
|
26
|
+
if (!isInitialized()) return 0;
|
|
27
|
+
const client = getClient();
|
|
28
|
+
const result = await client.execute({
|
|
29
|
+
sql: `SELECT COUNT(*) as cnt FROM memories WHERE agent_id = ? AND memory_type = 'decision'`,
|
|
30
|
+
args: [agentId]
|
|
31
|
+
});
|
|
32
|
+
return Number(result.rows[0]?.cnt ?? 0);
|
|
33
|
+
} catch {
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function probeContinuity(ctx) {
|
|
38
|
+
const memCount = ctx.recentMemoryCount;
|
|
39
|
+
let score;
|
|
40
|
+
let detail;
|
|
41
|
+
if (memCount >= 20) {
|
|
42
|
+
score = 95;
|
|
43
|
+
detail = `${memCount} recent memories \u2014 strong continuity`;
|
|
44
|
+
} else if (memCount >= 10) {
|
|
45
|
+
score = 85;
|
|
46
|
+
detail = `${memCount} recent memories \u2014 adequate continuity`;
|
|
47
|
+
} else if (memCount >= 3) {
|
|
48
|
+
score = 70;
|
|
49
|
+
detail = `${memCount} recent memories \u2014 limited continuity`;
|
|
50
|
+
} else if (memCount >= 1) {
|
|
51
|
+
score = 50;
|
|
52
|
+
detail = `${memCount} recent memories \u2014 weak continuity`;
|
|
53
|
+
} else {
|
|
54
|
+
score = 30;
|
|
55
|
+
detail = "No recent memories \u2014 agent may lack session context";
|
|
56
|
+
}
|
|
57
|
+
if (ctx.storedDecisionCount > 0) {
|
|
58
|
+
score = Math.min(100, score + 5);
|
|
59
|
+
detail += ` (+${ctx.storedDecisionCount} decisions)`;
|
|
60
|
+
}
|
|
61
|
+
return { axis: "continuity", score, detail };
|
|
62
|
+
}
|
|
63
|
+
function probeConsistency(ctx) {
|
|
64
|
+
if (!ctx.identityBody || ctx.recentMemoryTexts.length === 0) {
|
|
65
|
+
return {
|
|
66
|
+
axis: "consistency",
|
|
67
|
+
score: ctx.identityBody ? 80 : 50,
|
|
68
|
+
detail: ctx.identityBody ? "No memories to check against identity" : "No identity file \u2014 cannot assess consistency"
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const identityTerms = extractKeyTerms(ctx.identityBody);
|
|
72
|
+
if (identityTerms.length === 0) {
|
|
73
|
+
return { axis: "consistency", score: 75, detail: "Identity has no extractable key terms" };
|
|
74
|
+
}
|
|
75
|
+
const memoryText = ctx.recentMemoryTexts.join(" ").toLowerCase();
|
|
76
|
+
let matched = 0;
|
|
77
|
+
for (const term of identityTerms) {
|
|
78
|
+
if (memoryText.includes(term.toLowerCase())) matched++;
|
|
79
|
+
}
|
|
80
|
+
const ratio = matched / identityTerms.length;
|
|
81
|
+
const score = Math.round(50 + ratio * 50);
|
|
82
|
+
const detail = `${matched}/${identityTerms.length} identity terms found in recent memories`;
|
|
83
|
+
return { axis: "consistency", score, detail };
|
|
84
|
+
}
|
|
85
|
+
function probeRoleFidelity(ctx) {
|
|
86
|
+
const flags = [];
|
|
87
|
+
if (!ctx.identityBody) {
|
|
88
|
+
return {
|
|
89
|
+
axis: "role-fidelity",
|
|
90
|
+
score: 40,
|
|
91
|
+
detail: `No identity file for ${ctx.agent.name}`
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
let score = 100;
|
|
95
|
+
const identityLower = ctx.identityBody.toLowerCase();
|
|
96
|
+
const rosterRole = ctx.agent.role.toLowerCase();
|
|
97
|
+
if (!identityLower.includes(rosterRole)) {
|
|
98
|
+
score -= 15;
|
|
99
|
+
flags.push(`Identity does not mention role "${ctx.agent.role}"`);
|
|
100
|
+
}
|
|
101
|
+
if (!identityLower.includes(ctx.agent.name.toLowerCase())) {
|
|
102
|
+
score -= 10;
|
|
103
|
+
flags.push(`Identity does not mention agent name "${ctx.agent.name}"`);
|
|
104
|
+
}
|
|
105
|
+
const hasScopeBoundary = identityLower.includes("do not") || identityLower.includes("don't") || identityLower.includes("not your") || identityLower.includes("outside your") || identityLower.includes("you do not");
|
|
106
|
+
if (!hasScopeBoundary) {
|
|
107
|
+
score -= 10;
|
|
108
|
+
flags.push("Identity lacks explicit scope boundaries (what NOT to do)");
|
|
109
|
+
}
|
|
110
|
+
if (ctx.agent.systemPrompt) {
|
|
111
|
+
const promptTerms = extractKeyTerms(ctx.agent.systemPrompt);
|
|
112
|
+
const identityText = ctx.identityBody.toLowerCase();
|
|
113
|
+
let promptMatched = 0;
|
|
114
|
+
for (const term of promptTerms.slice(0, 20)) {
|
|
115
|
+
if (identityText.includes(term.toLowerCase())) promptMatched++;
|
|
116
|
+
}
|
|
117
|
+
const promptRatio = promptTerms.length > 0 ? promptMatched / Math.min(promptTerms.length, 20) : 1;
|
|
118
|
+
if (promptRatio < 0.3) {
|
|
119
|
+
score -= 15;
|
|
120
|
+
flags.push("Identity content diverges significantly from roster systemPrompt");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (ctx.recentMemoryTexts.length > 5) {
|
|
124
|
+
const roleKeywords = extractRoleKeywords(ctx.agent.role);
|
|
125
|
+
const memoryText = ctx.recentMemoryTexts.join(" ").toLowerCase();
|
|
126
|
+
let domainHits = 0;
|
|
127
|
+
for (const kw of roleKeywords) {
|
|
128
|
+
if (memoryText.includes(kw)) domainHits++;
|
|
129
|
+
}
|
|
130
|
+
const domainRatio = roleKeywords.length > 0 ? domainHits / roleKeywords.length : 1;
|
|
131
|
+
if (domainRatio < 0.2) {
|
|
132
|
+
score -= 10;
|
|
133
|
+
flags.push(`Recent work shows little overlap with ${ctx.agent.role} domain keywords`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
score = Math.max(0, Math.min(100, score));
|
|
137
|
+
const detail = flags.length > 0 ? flags.join("; ") : "Identity aligns with roster definition";
|
|
138
|
+
return { axis: "role-fidelity", score, detail };
|
|
139
|
+
}
|
|
140
|
+
function probeWorldModel(ctx) {
|
|
141
|
+
if (!ctx.identityBody) {
|
|
142
|
+
return {
|
|
143
|
+
axis: "world-model",
|
|
144
|
+
score: 50,
|
|
145
|
+
detail: "No identity file \u2014 cannot assess org awareness"
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const identityLower = ctx.identityBody.toLowerCase();
|
|
149
|
+
const flags = [];
|
|
150
|
+
let score = 100;
|
|
151
|
+
const otherAgents = ctx.allEmployees.filter((e) => e.name !== ctx.agent.name);
|
|
152
|
+
let mentionedAgents = 0;
|
|
153
|
+
for (const other of otherAgents) {
|
|
154
|
+
if (identityLower.includes(other.name.toLowerCase())) mentionedAgents++;
|
|
155
|
+
}
|
|
156
|
+
if (otherAgents.length > 0) {
|
|
157
|
+
const mentionRatio = mentionedAgents / otherAgents.length;
|
|
158
|
+
if (mentionRatio < 0.3) {
|
|
159
|
+
score -= 15;
|
|
160
|
+
flags.push(`Identity mentions ${mentionedAgents}/${otherAgents.length} team members`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const hasReportingChain = identityLower.includes("report") || identityLower.includes("manager") || identityLower.includes("coo") || identityLower.includes("coordinator");
|
|
164
|
+
if (!hasReportingChain) {
|
|
165
|
+
score -= 10;
|
|
166
|
+
flags.push("Identity does not reference reporting chain");
|
|
167
|
+
}
|
|
168
|
+
const orgTerms = ["exe-os", "exe-wiki", "exe-crm", "askexe"];
|
|
169
|
+
let orgMentions = 0;
|
|
170
|
+
for (const term of orgTerms) {
|
|
171
|
+
if (identityLower.includes(term)) orgMentions++;
|
|
172
|
+
}
|
|
173
|
+
if (orgMentions === 0) {
|
|
174
|
+
score -= 5;
|
|
175
|
+
flags.push("Identity does not reference any org products");
|
|
176
|
+
}
|
|
177
|
+
score = Math.max(0, Math.min(100, score));
|
|
178
|
+
const detail = flags.length > 0 ? flags.join("; ") : "Identity reflects org structure";
|
|
179
|
+
return { axis: "world-model", score, detail };
|
|
180
|
+
}
|
|
181
|
+
function extractKeyTerms(text) {
|
|
182
|
+
const stopwords = /* @__PURE__ */ new Set([
|
|
183
|
+
"the",
|
|
184
|
+
"and",
|
|
185
|
+
"for",
|
|
186
|
+
"are",
|
|
187
|
+
"but",
|
|
188
|
+
"not",
|
|
189
|
+
"you",
|
|
190
|
+
"all",
|
|
191
|
+
"any",
|
|
192
|
+
"can",
|
|
193
|
+
"had",
|
|
194
|
+
"her",
|
|
195
|
+
"was",
|
|
196
|
+
"one",
|
|
197
|
+
"our",
|
|
198
|
+
"out",
|
|
199
|
+
"has",
|
|
200
|
+
"his",
|
|
201
|
+
"how",
|
|
202
|
+
"its",
|
|
203
|
+
"may",
|
|
204
|
+
"new",
|
|
205
|
+
"now",
|
|
206
|
+
"old",
|
|
207
|
+
"see",
|
|
208
|
+
"way",
|
|
209
|
+
"who",
|
|
210
|
+
"did",
|
|
211
|
+
"get",
|
|
212
|
+
"got",
|
|
213
|
+
"let",
|
|
214
|
+
"say",
|
|
215
|
+
"she",
|
|
216
|
+
"too",
|
|
217
|
+
"use",
|
|
218
|
+
"with",
|
|
219
|
+
"this",
|
|
220
|
+
"that",
|
|
221
|
+
"from",
|
|
222
|
+
"they",
|
|
223
|
+
"been",
|
|
224
|
+
"have",
|
|
225
|
+
"will",
|
|
226
|
+
"your",
|
|
227
|
+
"what",
|
|
228
|
+
"when",
|
|
229
|
+
"make",
|
|
230
|
+
"like",
|
|
231
|
+
"just",
|
|
232
|
+
"over",
|
|
233
|
+
"such",
|
|
234
|
+
"take",
|
|
235
|
+
"than",
|
|
236
|
+
"them",
|
|
237
|
+
"very",
|
|
238
|
+
"some",
|
|
239
|
+
"could",
|
|
240
|
+
"into",
|
|
241
|
+
"then",
|
|
242
|
+
"more",
|
|
243
|
+
"also",
|
|
244
|
+
"after",
|
|
245
|
+
"should",
|
|
246
|
+
"would",
|
|
247
|
+
"about",
|
|
248
|
+
"their",
|
|
249
|
+
"which",
|
|
250
|
+
"these",
|
|
251
|
+
"other",
|
|
252
|
+
"every",
|
|
253
|
+
"does",
|
|
254
|
+
"being",
|
|
255
|
+
"those",
|
|
256
|
+
"never",
|
|
257
|
+
"before",
|
|
258
|
+
"through"
|
|
259
|
+
]);
|
|
260
|
+
const words = text.replace(/[^\w\s-]/g, " ").split(/\s+/).filter((w) => w.length > 3 && !stopwords.has(w.toLowerCase()));
|
|
261
|
+
return [...new Set(words.map((w) => w.toLowerCase()))].slice(0, 50);
|
|
262
|
+
}
|
|
263
|
+
function extractRoleKeywords(role) {
|
|
264
|
+
const roleKeywordMap = {
|
|
265
|
+
"coo": ["coordinate", "review", "status", "team", "task", "priority", "dispatch"],
|
|
266
|
+
"cto": ["architecture", "code", "technical", "system", "design", "review", "security"],
|
|
267
|
+
"cmo": ["marketing", "brand", "content", "design", "seo", "social", "campaign"],
|
|
268
|
+
"principal engineer": ["code", "implement", "test", "fix", "feature", "refactor", "build"],
|
|
269
|
+
"staff code reviewer": ["review", "code", "quality", "issue", "fix", "pattern"],
|
|
270
|
+
"content production specialist": ["video", "image", "render", "content", "produce", "media"],
|
|
271
|
+
"ai product lead": ["competitive", "analysis", "feature", "product", "research", "repo"]
|
|
272
|
+
};
|
|
273
|
+
const normalized = role.toLowerCase();
|
|
274
|
+
return roleKeywordMap[normalized] ?? normalized.split(/\s+/).filter((w) => w.length > 2);
|
|
275
|
+
}
|
|
276
|
+
async function runDriftProbes(options = {}) {
|
|
277
|
+
const employees = loadEmployeesSync();
|
|
278
|
+
const targetAgents = options.agentId ? employees.filter((e) => e.name === options.agentId) : employees;
|
|
279
|
+
if (targetAgents.length === 0) {
|
|
280
|
+
return [];
|
|
281
|
+
}
|
|
282
|
+
const axes = options.axes ?? ["continuity", "consistency", "role-fidelity", "world-model"];
|
|
283
|
+
const results = [];
|
|
284
|
+
for (const agent of targetAgents) {
|
|
285
|
+
const identity = getIdentity(agent.name);
|
|
286
|
+
const { count: memCount, texts: memTexts } = await getRecentMemories(agent.name, 50);
|
|
287
|
+
const decisionCount = await getDecisionCount(agent.name);
|
|
288
|
+
const ctx = {
|
|
289
|
+
agent,
|
|
290
|
+
identityBody: identity?.body ?? null,
|
|
291
|
+
identityRole: identity?.frontmatter.role ?? null,
|
|
292
|
+
recentMemoryCount: memCount,
|
|
293
|
+
recentMemoryTexts: memTexts,
|
|
294
|
+
storedDecisionCount: decisionCount,
|
|
295
|
+
allEmployees: employees
|
|
296
|
+
};
|
|
297
|
+
const probes = [];
|
|
298
|
+
const probeFns = {
|
|
299
|
+
continuity: probeContinuity,
|
|
300
|
+
consistency: probeConsistency,
|
|
301
|
+
"role-fidelity": probeRoleFidelity,
|
|
302
|
+
"world-model": probeWorldModel
|
|
303
|
+
};
|
|
304
|
+
for (const axis of axes) {
|
|
305
|
+
probes.push(probeFns[axis](ctx));
|
|
306
|
+
}
|
|
307
|
+
const scores = {
|
|
308
|
+
continuity: 0,
|
|
309
|
+
consistency: 0,
|
|
310
|
+
"role-fidelity": 0,
|
|
311
|
+
"world-model": 0
|
|
312
|
+
};
|
|
313
|
+
for (const probe of probes) {
|
|
314
|
+
scores[probe.axis] = probe.score;
|
|
315
|
+
}
|
|
316
|
+
const weights = {
|
|
317
|
+
continuity: 0.2,
|
|
318
|
+
consistency: 0.2,
|
|
319
|
+
"role-fidelity": 0.35,
|
|
320
|
+
"world-model": 0.25
|
|
321
|
+
};
|
|
322
|
+
let weightedSum = 0;
|
|
323
|
+
let weightTotal = 0;
|
|
324
|
+
for (const axis of axes) {
|
|
325
|
+
weightedSum += scores[axis] * weights[axis];
|
|
326
|
+
weightTotal += weights[axis];
|
|
327
|
+
}
|
|
328
|
+
const overall = Math.round(weightTotal > 0 ? weightedSum / weightTotal : 0);
|
|
329
|
+
const flags = [];
|
|
330
|
+
for (const probe of probes) {
|
|
331
|
+
if (probe.score < DRIFT_THRESHOLD) {
|
|
332
|
+
flags.push(`${probe.axis} at ${probe.score}% \u2014 ${probe.detail}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
results.push({
|
|
336
|
+
agent: agent.name,
|
|
337
|
+
scores,
|
|
338
|
+
overall,
|
|
339
|
+
drifting: flags.length > 0,
|
|
340
|
+
flags
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return results;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
export {
|
|
347
|
+
runDriftProbes
|
|
348
|
+
};
|