@askexenow/exe-os 0.9.280 → 0.9.282
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 +175 -57
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cleanupGraphLinksForMemories
|
|
3
|
+
} from "./chunk-I7GRBEFS.js";
|
|
4
|
+
import {
|
|
5
|
+
vectorToBlob
|
|
6
|
+
} from "./chunk-MGEZNKOD.js";
|
|
7
|
+
import {
|
|
8
|
+
extractKeywords,
|
|
9
|
+
keywordsToString
|
|
10
|
+
} from "./chunk-CHCA3ZM2.js";
|
|
11
|
+
import {
|
|
12
|
+
isCoordinatorName
|
|
13
|
+
} from "./chunk-52UDAVZE.js";
|
|
14
|
+
|
|
15
|
+
// src/lib/consolidation.ts
|
|
16
|
+
import { randomUUID } from "crypto";
|
|
17
|
+
async function selectUnconsolidated(client, limit = 200) {
|
|
18
|
+
const result = await client.execute({
|
|
19
|
+
sql: `SELECT id, agent_id, project_name, tool_name, raw_text, timestamp, memory_type, session_scope
|
|
20
|
+
FROM memories
|
|
21
|
+
WHERE consolidated = 0
|
|
22
|
+
AND COALESCE(memory_type, 'raw') != 'procedure'
|
|
23
|
+
ORDER BY timestamp DESC
|
|
24
|
+
LIMIT ?`,
|
|
25
|
+
args: [limit]
|
|
26
|
+
});
|
|
27
|
+
return result.rows.map((row) => ({
|
|
28
|
+
id: row.id,
|
|
29
|
+
agent_id: row.agent_id,
|
|
30
|
+
project_name: row.project_name,
|
|
31
|
+
tool_name: row.tool_name,
|
|
32
|
+
raw_text: row.raw_text,
|
|
33
|
+
timestamp: row.timestamp,
|
|
34
|
+
memory_type: row.memory_type ?? null,
|
|
35
|
+
session_scope: row.session_scope ?? null
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
function dominantMemoryType(memories) {
|
|
39
|
+
const counts = /* @__PURE__ */ new Map();
|
|
40
|
+
for (const m of memories) {
|
|
41
|
+
const type = m.memory_type ?? "raw";
|
|
42
|
+
counts.set(type, (counts.get(type) ?? 0) + 1);
|
|
43
|
+
}
|
|
44
|
+
let best = "observation";
|
|
45
|
+
let bestCount = 0;
|
|
46
|
+
for (const [type, count] of counts) {
|
|
47
|
+
if (count > bestCount || count === bestCount && type !== "raw") {
|
|
48
|
+
best = type;
|
|
49
|
+
bestCount = count;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return best;
|
|
53
|
+
}
|
|
54
|
+
function groupMemories(memories) {
|
|
55
|
+
const byProject = /* @__PURE__ */ new Map();
|
|
56
|
+
for (const mem of memories) {
|
|
57
|
+
const key = `${mem.agent_id}::${mem.project_name}`;
|
|
58
|
+
const list = byProject.get(key) ?? [];
|
|
59
|
+
list.push(mem);
|
|
60
|
+
byProject.set(key, list);
|
|
61
|
+
}
|
|
62
|
+
const clusters = [];
|
|
63
|
+
for (const [key, projectMemories] of byProject) {
|
|
64
|
+
const [agentId, projectName] = key.split("::");
|
|
65
|
+
const byDay = /* @__PURE__ */ new Map();
|
|
66
|
+
for (const mem of projectMemories) {
|
|
67
|
+
const day = mem.timestamp.slice(0, 10);
|
|
68
|
+
const list = byDay.get(day) ?? [];
|
|
69
|
+
list.push(mem);
|
|
70
|
+
byDay.set(day, list);
|
|
71
|
+
}
|
|
72
|
+
for (const [day, dayMemories] of byDay) {
|
|
73
|
+
if (dayMemories.length < 3) continue;
|
|
74
|
+
if (dayMemories.length <= 15) {
|
|
75
|
+
clusters.push({
|
|
76
|
+
agentId,
|
|
77
|
+
projectName,
|
|
78
|
+
dateRange: day,
|
|
79
|
+
memories: dayMemories
|
|
80
|
+
});
|
|
81
|
+
} else {
|
|
82
|
+
for (let i = 0; i < dayMemories.length; i += 12) {
|
|
83
|
+
const chunk = dayMemories.slice(i, i + 12);
|
|
84
|
+
clusters.push({
|
|
85
|
+
agentId,
|
|
86
|
+
projectName,
|
|
87
|
+
dateRange: day,
|
|
88
|
+
memories: chunk
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return clusters;
|
|
95
|
+
}
|
|
96
|
+
var ROLE_PROMPTS = {
|
|
97
|
+
"COO": `Extract EXACTLY THREE types of insights:
|
|
98
|
+
1. KEY DECISIONS \u2014 choices that were made and why (at most 3)
|
|
99
|
+
2. RECURRING PATTERNS \u2014 actions or approaches that repeated (at most 3)
|
|
100
|
+
3. OPEN QUESTIONS \u2014 things that seem unresolved or risky (at most 2)`,
|
|
101
|
+
"CTO": `Extract EXACTLY THREE types of insights:
|
|
102
|
+
1. ARCHITECTURE DECISIONS \u2014 design choices, tradeoffs, delegation patterns (at most 3)
|
|
103
|
+
2. REVIEW OUTCOMES \u2014 what was approved, rejected, or flagged during code review (at most 3)
|
|
104
|
+
3. TECHNICAL DEBT \u2014 unresolved issues, deferred work, risks identified (at most 2)`,
|
|
105
|
+
"Principal Engineer": `Extract EXACTLY THREE types of insights:
|
|
106
|
+
1. CODE DECISIONS \u2014 implementation choices, patterns used, bugs fixed (at most 3)
|
|
107
|
+
2. FILE CHANGES \u2014 key files modified and why (at most 3)
|
|
108
|
+
3. BLOCKERS \u2014 things that slowed down or prevented progress (at most 2)`,
|
|
109
|
+
"Staff Code Reviewer": `Extract EXACTLY THREE types of insights:
|
|
110
|
+
1. AUDIT FINDINGS \u2014 issues found, severity, fix status (at most 3)
|
|
111
|
+
2. RECURRING ISSUES \u2014 patterns that keep appearing across reviews (at most 3)
|
|
112
|
+
3. QUALITY SIGNALS \u2014 areas of the codebase that are strong or weak (at most 2)`,
|
|
113
|
+
"CMO": `Extract EXACTLY THREE types of insights:
|
|
114
|
+
1. DESIGN DECISIONS \u2014 brand, layout, typography, or content choices made (at most 3)
|
|
115
|
+
2. CONTENT STRATEGY \u2014 messaging, SEO, platform-specific decisions (at most 3)
|
|
116
|
+
3. BRAND ALIGNMENT \u2014 consistency issues or guidelines established (at most 2)`,
|
|
117
|
+
"AI Product Lead": `Extract EXACTLY THREE types of insights:
|
|
118
|
+
1. RESEARCH FINDINGS \u2014 tools, repos, or models evaluated with conclusions (at most 3)
|
|
119
|
+
2. COMPETITIVE GAPS \u2014 features or patterns worth adopting from competitors (at most 3)
|
|
120
|
+
3. BUILD RECOMMENDATIONS \u2014 what to build, skip, or watch (at most 2)`
|
|
121
|
+
};
|
|
122
|
+
var DEFAULT_ROLE_PROMPT = `Extract EXACTLY THREE types of insights:
|
|
123
|
+
1. KEY DECISIONS \u2014 choices that were made and why (at most 3)
|
|
124
|
+
2. RECURRING PATTERNS \u2014 actions or approaches that repeated (at most 3)
|
|
125
|
+
3. OPEN QUESTIONS \u2014 things that seem unresolved or risky (at most 2)`;
|
|
126
|
+
function buildConsolidationPrompt(cluster, agentRole) {
|
|
127
|
+
const snippets = cluster.memories.map((m, i) => {
|
|
128
|
+
return `${i + 1}. [${m.tool_name}] ${m.raw_text}`;
|
|
129
|
+
}).join("\n");
|
|
130
|
+
const rolePrompt = agentRole && ROLE_PROMPTS[agentRole] || DEFAULT_ROLE_PROMPT;
|
|
131
|
+
return `You are reviewing a set of work memories from an AI coding agent.
|
|
132
|
+
These are raw tool call records from ${cluster.dateRange}.
|
|
133
|
+
|
|
134
|
+
Agent: ${cluster.agentId} | Project: ${cluster.projectName} | Date: ${cluster.dateRange}
|
|
135
|
+
|
|
136
|
+
MEMORIES:
|
|
137
|
+
${snippets}
|
|
138
|
+
|
|
139
|
+
${rolePrompt}
|
|
140
|
+
|
|
141
|
+
IMPORTANT: Preserve all specific names, file paths, technical terms, and proper nouns exactly as they appear. Front-load the most important terms in the first sentence of your summary. Never replace specific terms with generic descriptions (e.g. write "hybrid-search.ts" not "the search file", write "extractKeywords" not "the extraction function").
|
|
142
|
+
|
|
143
|
+
Format each as a single sentence. Be specific \u2014 include file names,
|
|
144
|
+
function names, and concrete details. Skip if no insight for a category.`;
|
|
145
|
+
}
|
|
146
|
+
async function consolidateCluster(cluster, model, agentRole) {
|
|
147
|
+
const Anthropic = (await import("@anthropic-ai/sdk")).default;
|
|
148
|
+
const client = new Anthropic();
|
|
149
|
+
const prompt = buildConsolidationPrompt(cluster, agentRole);
|
|
150
|
+
const response = await client.messages.create({
|
|
151
|
+
model,
|
|
152
|
+
max_tokens: 300,
|
|
153
|
+
messages: [{ role: "user", content: prompt }]
|
|
154
|
+
});
|
|
155
|
+
const textBlock = response.content.find((b) => b.type === "text");
|
|
156
|
+
return textBlock?.text ?? "";
|
|
157
|
+
}
|
|
158
|
+
async function storeConsolidation(client, cluster, synthesisText, embedFn) {
|
|
159
|
+
const consolidatedId = randomUUID();
|
|
160
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
161
|
+
const rawText = `CONSOLIDATION [${cluster.dateRange}, ${cluster.projectName}]:
|
|
162
|
+
|
|
163
|
+
${synthesisText}`;
|
|
164
|
+
let vector = null;
|
|
165
|
+
if (embedFn) {
|
|
166
|
+
try {
|
|
167
|
+
vector = await embedFn(rawText);
|
|
168
|
+
} catch {
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const memoryType = dominantMemoryType(cluster.memories);
|
|
172
|
+
const scopes = new Set(cluster.memories.map((m) => m.session_scope ?? null));
|
|
173
|
+
const sessionScope = scopes.size === 1 ? cluster.memories[0]?.session_scope ?? null : null;
|
|
174
|
+
const keywords = keywordsToString(extractKeywords(rawText));
|
|
175
|
+
const insertSql = vector ? `INSERT INTO memories
|
|
176
|
+
(id, agent_id, agent_role, session_id, timestamp,
|
|
177
|
+
tool_name, project_name, has_error, raw_text, vector, version, consolidated, importance, memory_type, session_scope, keywords)
|
|
178
|
+
VALUES (?, ?, 'consolidation', 'daemon-consolidation', ?, 'consolidation', ?, 0, ?, vector32(?), 0, 1, 9, ?, ?, ?)` : `INSERT INTO memories
|
|
179
|
+
(id, agent_id, agent_role, session_id, timestamp,
|
|
180
|
+
tool_name, project_name, has_error, raw_text, vector, version, consolidated, importance, memory_type, session_scope, keywords)
|
|
181
|
+
VALUES (?, ?, 'consolidation', 'daemon-consolidation', ?, 'consolidation', ?, 0, ?, NULL, 0, 1, 9, ?, ?, ?)`;
|
|
182
|
+
const insertArgs = vector ? [consolidatedId, cluster.agentId, now, cluster.projectName, rawText, vectorToBlob(vector), memoryType, sessionScope, keywords] : [consolidatedId, cluster.agentId, now, cluster.projectName, rawText, memoryType, sessionScope, keywords];
|
|
183
|
+
await client.execute({ sql: insertSql, args: insertArgs });
|
|
184
|
+
const sourceIds = cluster.memories.map((m) => m.id);
|
|
185
|
+
const linkStmts = sourceIds.map((sourceId) => ({
|
|
186
|
+
sql: `INSERT INTO consolidations (id, consolidated_memory_id, source_memory_id, created_at)
|
|
187
|
+
VALUES (?, ?, ?, ?)`,
|
|
188
|
+
args: [randomUUID(), consolidatedId, sourceId, now]
|
|
189
|
+
}));
|
|
190
|
+
const placeholders = sourceIds.map(() => "?").join(",");
|
|
191
|
+
const markStmt = {
|
|
192
|
+
sql: `UPDATE memories SET consolidated = 1, status = 'archived' WHERE id IN (${placeholders})`,
|
|
193
|
+
args: sourceIds
|
|
194
|
+
};
|
|
195
|
+
await client.batch([...linkStmts, markStmt], "write");
|
|
196
|
+
return { consolidatedMemoryId: consolidatedId, sourceIds, rawText };
|
|
197
|
+
}
|
|
198
|
+
var WIKI_FETCH_TIMEOUT_MS = 1e4;
|
|
199
|
+
async function pushToWiki(consolidation, config) {
|
|
200
|
+
if (!config.wikiEnabled || !config.wikiAutoUpdate) {
|
|
201
|
+
return { updated: false };
|
|
202
|
+
}
|
|
203
|
+
const apiUrl = config.wikiUrl || process.env.EXE_WIKI_API_URL;
|
|
204
|
+
const apiKey = config.wikiApiKey || process.env.EXE_WIKI_API_KEY;
|
|
205
|
+
if (!apiUrl || !apiKey) {
|
|
206
|
+
return { updated: false };
|
|
207
|
+
}
|
|
208
|
+
const workspace = config.wikiWorkspaceMapping[consolidation.projectName] ?? consolidation.projectName;
|
|
209
|
+
try {
|
|
210
|
+
const listRes = await fetch(
|
|
211
|
+
`${apiUrl}/v1/workspace/${encodeURIComponent(workspace)}/documents`,
|
|
212
|
+
{
|
|
213
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
214
|
+
signal: AbortSignal.timeout(WIKI_FETCH_TIMEOUT_MS)
|
|
215
|
+
}
|
|
216
|
+
);
|
|
217
|
+
if (!listRes.ok) {
|
|
218
|
+
return { updated: false, error: `Workspace "${workspace}" not accessible (${listRes.status})` };
|
|
219
|
+
}
|
|
220
|
+
const listJson = await listRes.json();
|
|
221
|
+
const docs = listJson.documents ?? listJson.localFiles?.items ?? [];
|
|
222
|
+
const contentLines = consolidation.rawText.split("\n").filter((l) => l.trim() && !l.startsWith("CONSOLIDATION") && !l.match(/^[A-Z\s]+:$/)).join(" ");
|
|
223
|
+
const keywords = contentLines.toLowerCase().replace(/[^a-z0-9\s]/g, "").split(/\s+/).filter((w) => w.length > 3);
|
|
224
|
+
let bestMatch = null;
|
|
225
|
+
for (const doc of docs) {
|
|
226
|
+
if (!doc.id || !doc.title) continue;
|
|
227
|
+
const titleWords = doc.title.toLowerCase().replace(/[^a-z0-9\s]/g, "").split(/\s+/).filter((w) => w.length > 3);
|
|
228
|
+
if (titleWords.length === 0) continue;
|
|
229
|
+
const matchCount = titleWords.filter(
|
|
230
|
+
(tw) => keywords.some((k) => k.includes(tw) || tw.includes(k))
|
|
231
|
+
).length;
|
|
232
|
+
const score = matchCount / titleWords.length;
|
|
233
|
+
if (score > (bestMatch?.score ?? 0)) {
|
|
234
|
+
bestMatch = { id: doc.id, title: doc.title, score };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (bestMatch && bestMatch.score >= config.wikiAutoUpdateThreshold) {
|
|
238
|
+
const updateRes = await fetch(`${apiUrl}/v1/document/raw-text`, {
|
|
239
|
+
method: "POST",
|
|
240
|
+
headers: {
|
|
241
|
+
"Content-Type": "application/json",
|
|
242
|
+
Authorization: `Bearer ${apiKey}`
|
|
243
|
+
},
|
|
244
|
+
body: JSON.stringify({
|
|
245
|
+
textContent: consolidation.rawText,
|
|
246
|
+
metadata: { title: bestMatch.title, appendTo: bestMatch.id },
|
|
247
|
+
workspaceSlugs: [workspace]
|
|
248
|
+
}),
|
|
249
|
+
signal: AbortSignal.timeout(WIKI_FETCH_TIMEOUT_MS)
|
|
250
|
+
});
|
|
251
|
+
if (updateRes.ok) {
|
|
252
|
+
process.stderr.write(
|
|
253
|
+
`[consolidation] Wiki auto-updated: ${workspace}/${bestMatch.title}
|
|
254
|
+
`
|
|
255
|
+
);
|
|
256
|
+
return { updated: true, action: "updated", page: bestMatch.title };
|
|
257
|
+
}
|
|
258
|
+
return { updated: false, error: `Update failed (${updateRes.status})` };
|
|
259
|
+
}
|
|
260
|
+
if (config.wikiAutoUpdateCreateNew) {
|
|
261
|
+
const title = `Consolidated Insights \u2014 ${consolidation.projectName} (${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)})`;
|
|
262
|
+
const createRes = await fetch(`${apiUrl}/v1/document/raw-text`, {
|
|
263
|
+
method: "POST",
|
|
264
|
+
headers: {
|
|
265
|
+
"Content-Type": "application/json",
|
|
266
|
+
Authorization: `Bearer ${apiKey}`
|
|
267
|
+
},
|
|
268
|
+
body: JSON.stringify({
|
|
269
|
+
textContent: consolidation.rawText,
|
|
270
|
+
metadata: { title },
|
|
271
|
+
workspaceSlugs: [workspace]
|
|
272
|
+
}),
|
|
273
|
+
signal: AbortSignal.timeout(WIKI_FETCH_TIMEOUT_MS)
|
|
274
|
+
});
|
|
275
|
+
if (createRes.ok) {
|
|
276
|
+
process.stderr.write(
|
|
277
|
+
`[consolidation] Wiki page created: ${workspace}/${title}
|
|
278
|
+
`
|
|
279
|
+
);
|
|
280
|
+
return { updated: true, action: "created", page: title };
|
|
281
|
+
}
|
|
282
|
+
return { updated: false, error: `Create failed (${createRes.status})` };
|
|
283
|
+
}
|
|
284
|
+
return { updated: false };
|
|
285
|
+
} catch (err) {
|
|
286
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
287
|
+
process.stderr.write(`[consolidation] Wiki push failed: ${msg}
|
|
288
|
+
`);
|
|
289
|
+
return { updated: false, error: msg };
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
async function runConsolidation(client, options) {
|
|
293
|
+
const memories = await selectUnconsolidated(client);
|
|
294
|
+
if (memories.length < 20) {
|
|
295
|
+
return { clustersProcessed: 0, memoriesConsolidated: 0 };
|
|
296
|
+
}
|
|
297
|
+
const roleMap = {};
|
|
298
|
+
try {
|
|
299
|
+
const { loadEmployeesSync } = await import("./lib/employees.js");
|
|
300
|
+
const employees = loadEmployeesSync();
|
|
301
|
+
for (const e of employees) {
|
|
302
|
+
roleMap[e.name] = e.role;
|
|
303
|
+
}
|
|
304
|
+
} catch {
|
|
305
|
+
}
|
|
306
|
+
const clusters = groupMemories(memories);
|
|
307
|
+
let clustersProcessed = 0;
|
|
308
|
+
let memoriesConsolidated = 0;
|
|
309
|
+
for (const cluster of clusters) {
|
|
310
|
+
if (clustersProcessed >= options.maxCalls) break;
|
|
311
|
+
if (cluster.memories.length < 3) continue;
|
|
312
|
+
try {
|
|
313
|
+
const isCoordinator = isCoordinatorName(cluster.agentId);
|
|
314
|
+
const agentRole = roleMap[cluster.agentId];
|
|
315
|
+
const dedupCount = await dedupCluster(client, cluster, options.embedFn);
|
|
316
|
+
memoriesConsolidated += dedupCount;
|
|
317
|
+
const synthesis = await consolidateCluster(cluster, options.model, agentRole);
|
|
318
|
+
if (!synthesis.trim()) {
|
|
319
|
+
if (dedupCount > 0) clustersProcessed++;
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
const result = await storeConsolidation(client, cluster, synthesis, options.embedFn);
|
|
323
|
+
if (isCoordinator && options.wikiConfig) {
|
|
324
|
+
await pushToWiki(
|
|
325
|
+
{ ...result, projectName: cluster.projectName },
|
|
326
|
+
options.wikiConfig
|
|
327
|
+
).catch((err) => {
|
|
328
|
+
process.stderr.write(
|
|
329
|
+
`[consolidation] Wiki push error (non-fatal): ${err instanceof Error ? err.message : String(err)}
|
|
330
|
+
`
|
|
331
|
+
);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
if (isCoordinator) {
|
|
335
|
+
const sourceIds = result.sourceIds;
|
|
336
|
+
if (sourceIds.length > 0) {
|
|
337
|
+
const placeholders = sourceIds.map(() => "?").join(",");
|
|
338
|
+
await client.execute({
|
|
339
|
+
sql: `UPDATE memories SET status = 'archived' WHERE id IN (${placeholders})`,
|
|
340
|
+
args: sourceIds
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
clustersProcessed++;
|
|
345
|
+
memoriesConsolidated += cluster.memories.length;
|
|
346
|
+
} catch (err) {
|
|
347
|
+
process.stderr.write(
|
|
348
|
+
`[consolidation] Cluster failed (${cluster.projectName}/${cluster.dateRange}): ${err instanceof Error ? err.message : String(err)}
|
|
349
|
+
`
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return { clustersProcessed, memoriesConsolidated };
|
|
354
|
+
}
|
|
355
|
+
async function dedupCluster(client, cluster, embedFn) {
|
|
356
|
+
if (!embedFn || cluster.memories.length < 2) return 0;
|
|
357
|
+
const vectors = [];
|
|
358
|
+
for (const mem of cluster.memories) {
|
|
359
|
+
try {
|
|
360
|
+
const v = await embedFn(mem.raw_text);
|
|
361
|
+
vectors.push({ id: mem.id, vector: v });
|
|
362
|
+
} catch {
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
if (vectors.length < 2) return 0;
|
|
366
|
+
const toArchive = /* @__PURE__ */ new Set();
|
|
367
|
+
for (let i = 0; i < vectors.length; i++) {
|
|
368
|
+
if (toArchive.has(vectors[i].id)) continue;
|
|
369
|
+
for (let j = i + 1; j < vectors.length; j++) {
|
|
370
|
+
if (toArchive.has(vectors[j].id)) continue;
|
|
371
|
+
const sim = cosineSimilarity(vectors[i].vector, vectors[j].vector);
|
|
372
|
+
if (sim > 0.95) {
|
|
373
|
+
toArchive.add(vectors[j].id);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
if (toArchive.size === 0) return 0;
|
|
378
|
+
const ids = [...toArchive];
|
|
379
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
380
|
+
await client.execute({
|
|
381
|
+
sql: `UPDATE memories SET status = 'archived', consolidated = 1 WHERE id IN (${placeholders})`,
|
|
382
|
+
args: ids
|
|
383
|
+
});
|
|
384
|
+
const survivors = vectors.filter((v) => !toArchive.has(v.id)).map((v) => v.id);
|
|
385
|
+
if (survivors.length > 0) {
|
|
386
|
+
const survivorPlaceholders = survivors.map(() => "?").join(",");
|
|
387
|
+
await client.execute({
|
|
388
|
+
sql: `UPDATE memories SET confidence = MIN(1.0, COALESCE(confidence, 0.7) + 0.1) WHERE id IN (${survivorPlaceholders})`,
|
|
389
|
+
args: survivors
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
return ids.length;
|
|
393
|
+
}
|
|
394
|
+
function cosineSimilarity(a, b) {
|
|
395
|
+
let dot = 0, normA = 0, normB = 0;
|
|
396
|
+
for (let i = 0; i < a.length; i++) {
|
|
397
|
+
dot += a[i] * b[i];
|
|
398
|
+
normA += a[i] * a[i];
|
|
399
|
+
normB += b[i] * b[i];
|
|
400
|
+
}
|
|
401
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
402
|
+
return denom === 0 ? 0 : dot / denom;
|
|
403
|
+
}
|
|
404
|
+
async function isUserIdle(client, idleMinutes = 30) {
|
|
405
|
+
const result = await client.execute({
|
|
406
|
+
sql: `SELECT MAX(timestamp) as last_activity
|
|
407
|
+
FROM memories
|
|
408
|
+
WHERE tool_name != 'consolidation'
|
|
409
|
+
AND timestamp >= datetime('now', '-1 day')`,
|
|
410
|
+
args: []
|
|
411
|
+
});
|
|
412
|
+
const lastActivity = result.rows[0]?.last_activity;
|
|
413
|
+
if (!lastActivity) return true;
|
|
414
|
+
const lastMs = new Date(lastActivity).getTime();
|
|
415
|
+
const now = Date.now();
|
|
416
|
+
return now - lastMs >= idleMinutes * 60 * 1e3;
|
|
417
|
+
}
|
|
418
|
+
async function countUnconsolidated(client) {
|
|
419
|
+
const result = await client.execute({
|
|
420
|
+
sql: `SELECT COUNT(*) as cnt FROM memories
|
|
421
|
+
WHERE consolidated = 0
|
|
422
|
+
AND COALESCE(memory_type, 'raw') != 'procedure'`,
|
|
423
|
+
args: []
|
|
424
|
+
});
|
|
425
|
+
return Number(result.rows[0]?.cnt ?? 0);
|
|
426
|
+
}
|
|
427
|
+
var INTERCOM_NOISE_PATTERNS = [
|
|
428
|
+
/^\/exe-intercom\b/i,
|
|
429
|
+
/^You have pending notifications\.\s*Run list_tasks/i,
|
|
430
|
+
/^You have open tasks\.\s*Run list_tasks/i,
|
|
431
|
+
/^You have a new P\d+ task/i,
|
|
432
|
+
/^You have more open tasks to dispatch/i,
|
|
433
|
+
/^No new tasks\.\s*(Standing by|Idle|Dashboard)/i,
|
|
434
|
+
/^You have pending tasks\.\s*Start your/i
|
|
435
|
+
];
|
|
436
|
+
async function deduplicateIntercomMemories(client) {
|
|
437
|
+
const noiseResult = await client.execute({
|
|
438
|
+
sql: `SELECT id, raw_text FROM memories
|
|
439
|
+
WHERE COALESCE(status, 'active') = 'active'
|
|
440
|
+
AND (
|
|
441
|
+
raw_text LIKE '/exe-intercom%'
|
|
442
|
+
OR raw_text LIKE 'You have pending notifications.%'
|
|
443
|
+
OR raw_text LIKE 'You have open tasks.%'
|
|
444
|
+
OR raw_text LIKE 'You have a new P_ task%'
|
|
445
|
+
OR raw_text LIKE 'You have more open tasks to dispatch%'
|
|
446
|
+
OR raw_text LIKE 'No new tasks.%'
|
|
447
|
+
OR raw_text LIKE 'You have pending tasks.%'
|
|
448
|
+
)`,
|
|
449
|
+
args: []
|
|
450
|
+
});
|
|
451
|
+
const toArchive = [];
|
|
452
|
+
for (const row of noiseResult.rows) {
|
|
453
|
+
const text = row.raw_text.trim();
|
|
454
|
+
if (INTERCOM_NOISE_PATTERNS.some((p) => p.test(text))) {
|
|
455
|
+
toArchive.push(row.id);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (toArchive.length === 0) return 0;
|
|
459
|
+
const BATCH = 500;
|
|
460
|
+
for (let i = 0; i < toArchive.length; i += BATCH) {
|
|
461
|
+
const batch = toArchive.slice(i, i + BATCH);
|
|
462
|
+
const placeholders = batch.map(() => "?").join(",");
|
|
463
|
+
await client.execute({
|
|
464
|
+
sql: `UPDATE memories SET status = 'archived'
|
|
465
|
+
WHERE id IN (${placeholders})
|
|
466
|
+
AND COALESCE(status, 'active') = 'active'`,
|
|
467
|
+
args: batch
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
return toArchive.length;
|
|
471
|
+
}
|
|
472
|
+
var TRACE_TOOLS = ["Bash", "Read", "Edit", "Grep", "Write", "Glob", "apply_patch"];
|
|
473
|
+
async function sweepExpiredTraces(client) {
|
|
474
|
+
const placeholders = TRACE_TOOLS.map(() => "?").join(",");
|
|
475
|
+
const idsResult = await client.execute({
|
|
476
|
+
sql: `SELECT id FROM memories
|
|
477
|
+
WHERE tool_name IN (${placeholders})
|
|
478
|
+
AND COALESCE(memory_type, 'raw') = 'raw'
|
|
479
|
+
AND timestamp < datetime('now', '-7 days')
|
|
480
|
+
AND COALESCE(importance, 0) < 7`,
|
|
481
|
+
args: TRACE_TOOLS
|
|
482
|
+
});
|
|
483
|
+
const memoryIds = idsResult.rows.map((r) => String(r.id)).filter(Boolean);
|
|
484
|
+
if (memoryIds.length > 0) {
|
|
485
|
+
await cleanupGraphLinksForMemories(client, memoryIds);
|
|
486
|
+
}
|
|
487
|
+
const result = await client.execute({
|
|
488
|
+
sql: `DELETE FROM memories
|
|
489
|
+
WHERE tool_name IN (${placeholders})
|
|
490
|
+
AND COALESCE(memory_type, 'raw') = 'raw'
|
|
491
|
+
AND timestamp < datetime('now', '-7 days')
|
|
492
|
+
AND COALESCE(importance, 0) < 7`,
|
|
493
|
+
args: TRACE_TOOLS
|
|
494
|
+
});
|
|
495
|
+
return result.rowsAffected;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
export {
|
|
499
|
+
selectUnconsolidated,
|
|
500
|
+
groupMemories,
|
|
501
|
+
buildConsolidationPrompt,
|
|
502
|
+
consolidateCluster,
|
|
503
|
+
storeConsolidation,
|
|
504
|
+
pushToWiki,
|
|
505
|
+
runConsolidation,
|
|
506
|
+
isUserIdle,
|
|
507
|
+
countUnconsolidated,
|
|
508
|
+
deduplicateIntercomMemories,
|
|
509
|
+
sweepExpiredTraces
|
|
510
|
+
};
|