@askexenow/exe-os 0.9.127 → 0.9.129
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/dist/active-agent-3FDJYREJ.js +22 -0
- package/dist/active-agent-WC7YK3L5.js +23 -0
- package/dist/agent-context-CDWUZEXY.js +11 -0
- package/dist/agent-loop-G4VUR5ME.js +10 -0
- package/dist/agentic-ontology-2VYNTMNO.js +25 -0
- package/dist/backfill-metadata-OJWOCLSZ.js +601 -0
- package/dist/background-jobs-LGRDXGXC.js +25 -0
- package/dist/bash-Y5PEW5UQ.js +8 -0
- package/dist/behaviors-CSB2YLDT.js +22 -0
- package/dist/bin/age-ontology-load.js +10 -258
- package/dist/bin/agentic-ontology-backfill.js +23 -5296
- package/dist/bin/agentic-reflection-backfill.js +19 -4739
- package/dist/bin/agentic-semantic-label.js +28 -4723
- package/dist/bin/backfill-conversations.js +42 -5543
- package/dist/bin/backfill-responses.js +41 -5542
- package/dist/bin/backfill-vectors.js +43 -4795
- package/dist/bin/bulk-sync-postgres.js +22 -5313
- package/dist/bin/cc-doctor.js +10 -602
- package/dist/bin/cleanup-stale-review-tasks.js +32 -6803
- package/dist/bin/cli.js +169 -38993
- package/dist/bin/exe-agent-config.js +21 -253
- package/dist/bin/exe-agent.js +63 -2429
- package/dist/bin/exe-assign.js +34 -5810
- package/dist/bin/exe-boot.js +180 -12726
- package/dist/bin/exe-call.js +48 -1409
- package/dist/bin/exe-cloud.js +64 -8516
- package/dist/bin/exe-dispatch.js +35 -10818
- package/dist/bin/exe-doctor.js +24 -7537
- package/dist/bin/exe-export-behaviors.js +18 -6122
- package/dist/bin/exe-forget.js +22 -6274
- package/dist/bin/exe-gateway.js +62 -15286
- package/dist/bin/exe-healthcheck.js +9 -602
- package/dist/bin/exe-heartbeat.js +51 -6898
- package/dist/bin/exe-kill.js +30 -5961
- package/dist/bin/exe-launch-agent.js +101 -6788
- package/dist/bin/exe-new-employee.js +42 -3774
- package/dist/bin/exe-pending-messages.js +28 -6833
- package/dist/bin/exe-pending-notifications.js +31 -6869
- package/dist/bin/exe-pending-reviews.js +38 -6910
- package/dist/bin/exe-rename.js +57 -5766
- package/dist/bin/exe-review.js +29 -5948
- package/dist/bin/exe-search.js +22 -7692
- package/dist/bin/exe-session-cleanup.js +52 -11147
- package/dist/bin/exe-settings.js +35 -524
- package/dist/bin/exe-start-codex.js +70 -6641
- package/dist/bin/exe-start-opencode.js +54 -6584
- package/dist/bin/exe-status.js +26 -7081
- package/dist/bin/exe-support.js +10 -546
- package/dist/bin/exe-team.js +18 -5942
- package/dist/bin/git-sweep.js +26 -10909
- package/dist/bin/graph-backfill.js +24 -5979
- package/dist/bin/graph-export.js +31 -6128
- package/dist/bin/graph-layer-benchmark.js +4 -8
- package/dist/bin/install.js +47 -2322
- package/dist/bin/intercom-check.js +25 -11501
- package/dist/bin/list-providers.js +4 -18
- package/dist/bin/postgres-agentic-reflection-backfill.js +14 -357
- package/dist/bin/postgres-agentic-semantic-backfill.js +14 -404
- package/dist/bin/pre-publish.js +4 -298
- package/dist/bin/registry-proxy.js +8 -172
- package/dist/bin/scan-tasks.js +47 -10881
- package/dist/bin/setup.js +6 -9492
- package/dist/bin/shard-migrate.js +30 -5149
- package/dist/bin/stack-update.js +75 -203
- package/dist/bin/update.js +20 -654
- package/dist/capacity-monitor-3GZIHLB4.js +46 -0
- package/dist/catchup-brief-67QDCINS.js +148 -0
- package/dist/chunk-2QD7KBJN.js +664 -0
- package/dist/chunk-2WGSIVI4.js +149 -0
- package/dist/chunk-35TVNLJI.js +57 -0
- package/dist/chunk-3SYV36U5.js +47 -0
- package/dist/chunk-46SQTBQW.js +207 -0
- package/dist/chunk-4CMVLKEI.js +171 -0
- package/dist/chunk-4FLUOZTR.js +116 -0
- package/dist/chunk-4NYQAS33.js +17 -0
- package/dist/chunk-4QNPADWL.js +902 -0
- package/dist/chunk-4Y6QZBEO.js +58 -0
- package/dist/chunk-557C2IGL.js +0 -0
- package/dist/chunk-55S56YDO.js +305 -0
- package/dist/chunk-5BS5ELMC.js +85 -0
- package/dist/chunk-5DHM77JE.js +256 -0
- package/dist/chunk-5QTWQKNF.js +137 -0
- package/dist/chunk-6A7P74QV.js +53 -0
- package/dist/chunk-6BFIFI5F.js +45 -0
- package/dist/chunk-6KFICEAT.js +20 -0
- package/dist/chunk-6LKDJ5WX.js +317 -0
- package/dist/chunk-6M5II4EV.js +148 -0
- package/dist/chunk-6QEFN3DV.js +302 -0
- package/dist/chunk-6WTMJAG3.js +171 -0
- package/dist/chunk-6Y4B3QF6.js +19 -0
- package/dist/chunk-7RK3AYJE.js +163 -0
- package/dist/chunk-7TCP2XTP.js +390 -0
- package/dist/chunk-A2NZP64U.js +2307 -0
- package/dist/chunk-AFYIYM2K.js +322 -0
- package/dist/chunk-AJWFPKQS.js +573 -0
- package/dist/chunk-AVE2B4DQ.js +140 -0
- package/dist/chunk-B4TT2QQA.js +87 -0
- package/dist/chunk-BCMOO4OQ.js +1066 -0
- package/dist/chunk-BU3ID2WT.js +432 -0
- package/dist/chunk-CFIM43JH.js +862 -0
- package/dist/chunk-CURJUF3W.js +66 -0
- package/dist/chunk-DC4ZD76Y.js +288 -0
- package/dist/chunk-DL52JPGF.js +706 -0
- package/dist/chunk-DRSC6ZRA.js +36 -0
- package/dist/chunk-E2Q4Y22A.js +86 -0
- package/dist/chunk-ECGTESAP.js +236 -0
- package/dist/chunk-EHOJUXYG.js +365 -0
- package/dist/chunk-EIT6J37V.js +119 -0
- package/dist/chunk-ELE2C7L4.js +31 -0
- package/dist/chunk-EQSQ4HBW.js +9 -0
- package/dist/chunk-FWFFZGSC.js +94 -0
- package/dist/chunk-GCNWCYJI.js +249 -0
- package/dist/chunk-GGTUUI7J.js +6 -0
- package/dist/chunk-GU56L7OY.js +223 -0
- package/dist/chunk-HF25XPZE.js +83 -0
- package/dist/chunk-HOKOOBDL.js +52 -0
- package/dist/chunk-HP43GLZ6.js +89 -0
- package/dist/chunk-HSRM6PNM.js +682 -0
- package/dist/chunk-HVRTW3OP.js +164 -0
- package/dist/chunk-IHDHL5ML.js +125 -0
- package/dist/chunk-IHF5RXJM.js +168 -0
- package/dist/chunk-IJ73YE73.js +409 -0
- package/dist/chunk-INO4ZD5Y.js +162 -0
- package/dist/chunk-IRQTM7DY.js +475 -0
- package/dist/chunk-JD4FAPYG.js +1208 -0
- package/dist/chunk-JN44LQ53.js +316 -0
- package/dist/chunk-JQ6TLNIV.js +133 -0
- package/dist/chunk-JT76KRZQ.js +35 -0
- package/dist/chunk-K6OEWZTB.js +262 -0
- package/dist/chunk-KCUYRZSX.js +72 -0
- package/dist/chunk-KFQGP6VL.js +33 -0
- package/dist/chunk-KRLOFIPI.js +83 -0
- package/dist/chunk-KVPG5UT6.js +305 -0
- package/dist/chunk-L3TB7CC3.js +170 -0
- package/dist/chunk-L4X5EUHR.js +283 -0
- package/dist/chunk-LAN26C3W.js +655 -0
- package/dist/chunk-LPGBKR4H.js +54 -0
- package/dist/chunk-LVNMOVGD.js +132 -0
- package/dist/chunk-LX5WEEZ7.js +157 -0
- package/dist/chunk-MBH42QNH.js +295 -0
- package/dist/chunk-MFO7MNSD.js +102 -0
- package/dist/chunk-MILTNDZH.js +736 -0
- package/dist/chunk-MJAE4NB7.js +1090 -0
- package/dist/chunk-MLCUPTP7.js +132 -0
- package/dist/chunk-MPURH6JI.js +445 -0
- package/dist/chunk-MVBWW2EO.js +89 -0
- package/dist/chunk-MZIGUUDQ.js +42 -0
- package/dist/chunk-N3DTSVKE.js +157 -0
- package/dist/chunk-N5RRQOAC.js +134 -0
- package/dist/chunk-N7L33TED.js +1664 -0
- package/dist/chunk-NDYSNVI5.js +122 -0
- package/dist/chunk-NEAHEC5G.js +155 -0
- package/dist/chunk-NGVOA6ZQ.js +84 -0
- package/dist/chunk-NHK5KW6Y.js +193 -0
- package/dist/chunk-NMQKGFEP.js +458 -0
- package/dist/chunk-NPT4EHZK.js +352 -0
- package/dist/chunk-NXFJHTED.js +55 -0
- package/dist/chunk-NZLCDI6Y.js +216 -0
- package/dist/chunk-O377P7GM.js +100 -0
- package/dist/chunk-O4VFZRA5.js +33 -0
- package/dist/chunk-O7YD7JYE.js +237 -0
- package/dist/chunk-OFK72LTZ.js +81 -0
- package/dist/chunk-ORCCI2VV.js +140 -0
- package/dist/chunk-OVQR4KMC.js +579 -0
- package/dist/chunk-P3CVUMEH.js +54 -0
- package/dist/chunk-P4HIF72O.js +30 -0
- package/dist/chunk-PEDLSJBL.js +1039 -0
- package/dist/chunk-PFICKZZ5.js +219 -0
- package/dist/chunk-PGW7TIV6.js +142 -0
- package/dist/chunk-PJHHFJAN.js +63 -0
- package/dist/chunk-PP4SNOJ5.js +471 -0
- package/dist/chunk-PRKVT4KN.js +90 -0
- package/dist/chunk-Q2O4VJHH.js +305 -0
- package/dist/chunk-Q36CMZIX.js +38 -0
- package/dist/chunk-Q3V7K4ME.js +149 -0
- package/dist/chunk-QGYPJGHB.js +81 -0
- package/dist/chunk-R23EMFJV.js +198 -0
- package/dist/chunk-R4M6XCMU.js +39 -0
- package/dist/chunk-R4WMF32C.js +81 -0
- package/dist/chunk-RJT7H2KR.js +349 -0
- package/dist/chunk-RJZMRZNV.js +280 -0
- package/dist/chunk-RMFDPCA2.js +72 -0
- package/dist/chunk-RUG3N6P4.js +292 -0
- package/dist/chunk-RWO327FJ.js +84 -0
- package/dist/chunk-SG7EFHQ7.js +108 -0
- package/dist/chunk-SH45SJQW.js +0 -0
- package/dist/chunk-SPKE5ANC.js +42 -0
- package/dist/chunk-SVMFVPBF.js +104 -0
- package/dist/chunk-SVXDCELZ.js +163 -0
- package/dist/chunk-TMEE7AT7.js +72 -0
- package/dist/chunk-TWYEE4FB.js +125 -0
- package/dist/chunk-TYLF4LSW.js +110 -0
- package/dist/chunk-V4TZI6EO.js +60 -0
- package/dist/chunk-VFZTXKQI.js +372 -0
- package/dist/chunk-VQ4K2MLM.js +199 -0
- package/dist/chunk-VU447UAO.js +173 -0
- package/dist/chunk-WMC3TXJF.js +50 -0
- package/dist/chunk-WPOA7XAE.js +84 -0
- package/dist/chunk-WZQ4CPRG.js +64 -0
- package/dist/chunk-X2IMCCM5.js +49 -0
- package/dist/chunk-X2Z5GT3V.js +118 -0
- package/dist/chunk-XEKO37NM.js +43 -0
- package/dist/chunk-XUHFQHGZ.js +505 -0
- package/dist/chunk-YGAAZN3E.js +47 -0
- package/dist/chunk-YKOW7KMK.js +558 -0
- package/dist/chunk-YOQKMB6N.js +145 -0
- package/dist/chunk-YZFZDJWZ.js +107 -0
- package/dist/chunk-ZBY4AUD4.js +10342 -0
- package/dist/chunk-ZOJYPNCM.js +127 -0
- package/dist/chunk-ZS7MGQSD.js +1494 -0
- package/dist/chunk-ZTZQ5A6B.js +191 -0
- package/dist/code-context-index-HXGC4IJL.js +28 -0
- package/dist/content-extractor-UVZXRIPC.js +8 -0
- package/dist/conversation-entity-extractor-HKSNDF4L.js +113 -0
- package/dist/conversation-wiki-populator-NKDAQEZ5.js +105 -0
- package/dist/crdt-sync-T7MHVQCS.js +33 -0
- package/dist/crm-bridge-Q5JBVJ6P.js +19 -0
- package/dist/crm-webhook-OAFTLJYA.js +10 -0
- package/dist/cto-delegation-gate-XWHZCUJH.js +208 -0
- package/dist/daemon-auth-GWUXTUYO.js +15 -0
- package/dist/daemon-orchestration-2C3TVOHO.js +91 -0
- package/dist/daemon-protocol-RLH2XM2K.js +19 -0
- package/dist/db-backup-CH2KG3JY.js +23 -0
- package/dist/devtools-PLJCAU53.js +8 -0
- package/dist/discord-G4BQJ2VX.js +7 -0
- package/dist/email-XMRNMFXR.js +137 -0
- package/dist/entity-boost-IOER4VRR.js +249 -0
- package/dist/exe-drift-2IJFQV43.js +68 -0
- package/dist/exe-export-Y2RFXGNB.js +71 -0
- package/dist/exe-import-LN6PE2YT.js +74 -0
- package/dist/exe-key-DHKBWLIT.js +571 -0
- package/dist/exe-org-F7LZRHFB.js +73 -0
- package/dist/factory-YTD23AW7.js +67 -0
- package/dist/fast-db-init-IIP6EGWT.js +7 -0
- package/dist/file-edit-FJVEO7XZ.js +8 -0
- package/dist/file-read-Q2NH3J35.js +8 -0
- package/dist/file-write-UNSFXNH4.js +8 -0
- package/dist/gateway/index.js +87 -16563
- package/dist/gateway-client-APTYJNCL.js +11 -0
- package/dist/git-staleness-I2BUEDE2.js +111 -0
- package/dist/git-task-sweep-UEOTXRW4.js +35 -0
- package/dist/glob-GRMXLDMB.js +7 -0
- package/dist/global-procedures-MFE5LGRF.js +19 -0
- package/dist/graph-query-657O5JYJ.js +25 -0
- package/dist/graph-rag-ZE5N7C65.js +28 -0
- package/dist/grep-NBV6SKYZ.js +7 -0
- package/dist/hooks/bug-report-worker.js +41 -10823
- package/dist/hooks/codex-stop-task-finalizer.js +38 -9055
- package/dist/hooks/commit-complete.js +32 -10914
- package/dist/hooks/error-recall.js +35 -7955
- package/dist/hooks/exe-heartbeat-hook.js +17 -327
- package/dist/hooks/ingest-worker.js +16 -565
- package/dist/hooks/ingest.js +98 -11436
- package/dist/hooks/instructions-loaded.js +25 -6209
- package/dist/hooks/notification.js +16 -6098
- package/dist/hooks/post-compact.js +34 -7041
- package/dist/hooks/post-tool-combined.js +27 -9751
- package/dist/hooks/pre-compact.js +38 -11130
- package/dist/hooks/pre-tool-use.js +61 -7233
- package/dist/hooks/prompt-submit.js +113 -13358
- package/dist/hooks/session-end.js +57 -11503
- package/dist/hooks/session-start.js +46 -9423
- package/dist/hooks/stop.js +70 -7210
- package/dist/hooks/subagent-stop.js +33 -6897
- package/dist/hooks/summary-worker.js +86 -8629
- package/dist/hooks-KD3N2D7P.js +9 -0
- package/dist/imessage-L7WKA2WD.js +7 -0
- package/dist/index.js +49 -19391
- package/dist/installer-5N24GXFB.js +32 -0
- package/dist/installer-QSD76YRY.js +291 -0
- package/dist/installer-ZPQUKHU5.js +331 -0
- package/dist/intercom-queue-PEEGAJ33.js +19 -0
- package/dist/key-backup-status-57UB74DU.js +41 -0
- package/dist/lib/agent-config.js +19 -224
- package/dist/lib/cloud-sync.js +44 -5398
- package/dist/lib/cloudflare-dns.js +7 -111
- package/dist/lib/config.js +18 -278
- package/dist/lib/consolidation.js +21 -1047
- package/dist/lib/crypto.js +7 -45
- package/dist/lib/database.js +20 -2932
- package/dist/lib/db-daemon-client.js +24 -460
- package/dist/lib/db.js +22 -2932
- package/dist/lib/device-registry.js +20 -2992
- package/dist/lib/embedder.js +14 -822
- package/dist/lib/employee-templates.js +21 -1102
- package/dist/lib/employees.js +30 -497
- package/dist/lib/error-detector.js +9 -149
- package/dist/lib/exe-daemon-client.js +16 -570
- package/dist/lib/exe-daemon.js +509 -18398
- package/dist/lib/file-grep.js +2 -0
- package/dist/lib/hybrid-search.js +18 -7674
- package/dist/lib/identity-templates.js +2 -0
- package/dist/lib/identity.js +13 -309
- package/dist/lib/keychain.js +9 -499
- package/dist/lib/license.js +21 -549
- package/dist/lib/messaging.js +35 -1631
- package/dist/lib/post-tool-memory.js +8 -370
- package/dist/lib/registry-proxy.js +8 -155
- package/dist/lib/reminders.js +11 -231
- package/dist/lib/runtime-table.js +7 -20
- package/dist/lib/schedules.js +16 -4614
- package/dist/lib/session-registry.js +9 -57
- package/dist/lib/session-wrappers.js +3 -127
- package/dist/lib/skill-learning.js +20 -2101
- package/dist/lib/status-brief.js +4 -368
- package/dist/lib/store.js +25 -5593
- package/dist/lib/task-router.js +12 -254
- package/dist/lib/tasks.js +44 -5801
- package/dist/lib/tmux-routing.js +45 -5804
- package/dist/lib/tmux-status.js +16 -248
- package/dist/lib/tmux-transport.js +6 -90
- package/dist/lib/token-spend.js +9 -337
- package/dist/lib/transport.js +8 -134
- package/dist/lib/ws-auth.js +6 -14
- package/dist/lib/ws-client.js +4 -22
- package/dist/license-gate-NXXDOOAQ.js +14 -0
- package/dist/mcp/register-tools.js +90 -32454
- package/dist/mcp/server.js +139 -32625
- package/dist/mcp/tools/complete-reminder.js +10 -237
- package/dist/mcp/tools/create-reminder.js +10 -222
- package/dist/mcp/tools/create-task.js +28 -6730
- package/dist/mcp/tools/deactivate-behavior.js +13 -476
- package/dist/mcp/tools/list-reminders.js +10 -232
- package/dist/mcp/tools/list-tasks.js +28 -1571
- package/dist/mcp/tools/send-message.js +25 -1672
- package/dist/mcp/tools/update-task.js +27 -6123
- package/dist/mcp-diagnostics-OOZ3TDPY.js +200 -0
- package/dist/memory-cards-RIL5BZHK.js +175 -0
- package/dist/memory-queue-JYIJ7TMQ.js +13 -0
- package/dist/memory-queue-client-PE7757HU.js +14 -0
- package/dist/notifications-CJFULBMN.js +42 -0
- package/dist/orchestration-phase-Y2TYNW5H.js +23 -0
- package/dist/orchestrator-RXIPT6PZ.js +29 -0
- package/dist/permission-presets-WI524OSE.js +25 -0
- package/dist/permissions-TYT6YMNZ.js +14 -0
- package/dist/pg-ssl-KFHNJPGO.js +7 -0
- package/dist/plan-limits-5WY5YK6X.js +27 -0
- package/dist/preferences-MW3BYTQ5.js +10 -0
- package/dist/project-name-PL2ZDWNU.js +11 -0
- package/dist/projection-worker-OY4WYZW6.js +661 -0
- package/dist/reranker-LFJ73RRS.js +19 -0
- package/dist/review-gate-E6K7QQE5.js +120 -0
- package/dist/runtime/index.js +82 -13408
- package/dist/self-query-router-IZANO632.js +83 -0
- package/dist/session-events-TQ6S5KQN.js +32 -0
- package/dist/session-kill-telemetry-46YIJWE2.js +30 -0
- package/dist/session-scope-3MYK3YRV.js +34 -0
- package/dist/setup-wizard-ZJ7UCRBP.js +12 -0
- package/dist/shard-manager-RCFZ6RXY.js +29 -0
- package/dist/signal-XN2C7PIG.js +7 -0
- package/dist/slack-Z77TFJCK.js +7 -0
- package/dist/task-enforcement-337DZI3I.js +252 -0
- package/dist/task-scanner-IMIR3T7T.js +11 -0
- package/dist/task-scope-MUU4KXE6.js +32 -0
- package/dist/tasks-crud-PMLK3MM4.js +53 -0
- package/dist/tasks-review-56LVKKNL.js +44 -0
- package/dist/telegram-CRPZO7JT.js +7 -0
- package/dist/telemetry-SPVGPKU7.js +9 -0
- package/dist/tool-capability-index-XNBSDCH3.js +10 -0
- package/dist/tool-gates-LGH6CSY4.js +14 -0
- package/dist/tool-gates-W7SZCYTX.js +13 -0
- package/dist/tool-registry-436LVVLY.js +11 -0
- package/dist/tool-telemetry-L77WNAYT.js +15 -0
- package/dist/tui/App.js +253 -14668
- package/dist/tui-data-SB45REYU.js +161 -0
- package/dist/update-check-LZGZISRJ.js +11 -0
- package/dist/webhook-VVP7KQVC.js +96 -0
- package/dist/whatsapp-J6QNDBGY.js +9 -0
- package/dist/whatsapp-accounts-RTJF3LM6.js +15 -0
- package/dist/wiki-client-EKCIKCVC.js +136 -0
- package/dist/worker-gate-UYNN62GJ.js +19 -0
- package/dist/worktree-4T4BPWPN.js +205 -0
- package/package.json +1 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import {
|
|
2
|
+
init_mcp_prefix,
|
|
3
|
+
isExeMcpTool
|
|
4
|
+
} from "./chunk-6BFIFI5F.js";
|
|
5
|
+
|
|
6
|
+
// src/lib/error-detector.ts
|
|
7
|
+
init_mcp_prefix();
|
|
8
|
+
import crypto from "crypto";
|
|
9
|
+
var ERROR_PATTERNS = [
|
|
10
|
+
/\bError\b/i,
|
|
11
|
+
/\bERR!\b/,
|
|
12
|
+
/\bFAIL(ED|URE)?\b/i,
|
|
13
|
+
/\bException\b/i,
|
|
14
|
+
/\bTraceback\b/,
|
|
15
|
+
/\bpanic\b/,
|
|
16
|
+
/\bSIGSEGV\b/,
|
|
17
|
+
/\bSIGABRT\b/,
|
|
18
|
+
/exit code [1-9]/i,
|
|
19
|
+
/non-zero (exit|status)/i,
|
|
20
|
+
/command not found/i,
|
|
21
|
+
/permission denied/i,
|
|
22
|
+
/ENOENT/,
|
|
23
|
+
/EACCES/,
|
|
24
|
+
/ENOMEM/
|
|
25
|
+
];
|
|
26
|
+
var FILE_CONTENT_TOOLS = /* @__PURE__ */ new Set([
|
|
27
|
+
"Read",
|
|
28
|
+
"Write",
|
|
29
|
+
"Edit",
|
|
30
|
+
"Glob",
|
|
31
|
+
"Grep",
|
|
32
|
+
"NotebookEdit"
|
|
33
|
+
]);
|
|
34
|
+
var STDERR_IGNORE_PATTERNS = [
|
|
35
|
+
/^warning\b/i,
|
|
36
|
+
/\bDeprecationWarning\b/,
|
|
37
|
+
/^hint:/i,
|
|
38
|
+
/^npm warn\b/i,
|
|
39
|
+
/^npm notice\b/i,
|
|
40
|
+
/^\(node:\d+\) \w*Warning:/,
|
|
41
|
+
/^Cloning into/,
|
|
42
|
+
/^Already on/,
|
|
43
|
+
/^Switched to/,
|
|
44
|
+
/^Your branch is/,
|
|
45
|
+
/^Auto-merging/,
|
|
46
|
+
/^\s*$/
|
|
47
|
+
];
|
|
48
|
+
function isRealStderr(stderr) {
|
|
49
|
+
const lines = stderr.trim().split("\n");
|
|
50
|
+
const meaningful = lines.filter(
|
|
51
|
+
(line) => line.trim().length > 0 && !STDERR_IGNORE_PATTERNS.some((p) => p.test(line))
|
|
52
|
+
);
|
|
53
|
+
return meaningful.length > 0;
|
|
54
|
+
}
|
|
55
|
+
function logSuppression(exitCode, stderr, stdout) {
|
|
56
|
+
process.stderr.write(
|
|
57
|
+
`[error-detector] suppressed bash non-zero exit: code=${exitCode} stderr_len=${stderr.length} stdout_len=${stdout.length}
|
|
58
|
+
`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
function detectError(data) {
|
|
62
|
+
const response = data.tool_response;
|
|
63
|
+
if (!response) return false;
|
|
64
|
+
const toolName = data.tool_name ?? "";
|
|
65
|
+
if (FILE_CONTENT_TOOLS.has(toolName)) {
|
|
66
|
+
return response.type === "error" || response.error != null;
|
|
67
|
+
}
|
|
68
|
+
if (toolName === "Bash") {
|
|
69
|
+
const exitCode = typeof response.exitCode === "number" ? response.exitCode : 0;
|
|
70
|
+
const stderr = typeof response.stderr === "string" ? response.stderr : "";
|
|
71
|
+
const stdout = typeof response.stdout === "string" ? response.stdout : "";
|
|
72
|
+
if (exitCode === 141) {
|
|
73
|
+
logSuppression(exitCode, stderr, stdout);
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
if (stderr.trim().length > 0 && isRealStderr(stderr)) return true;
|
|
77
|
+
if (exitCode !== 0 && !isRealStderr(stderr) && stdout.trim().length > 0) {
|
|
78
|
+
logSuppression(exitCode, stderr, stdout);
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
if (exitCode !== 0) return true;
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
if (response.type === "error" || response.error != null || response.isError === true) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
if (typeof response.stderr === "string" && response.stderr.trim().length > 0) {
|
|
88
|
+
if (isRealStderr(response.stderr)) return true;
|
|
89
|
+
}
|
|
90
|
+
const textParts = [];
|
|
91
|
+
if (typeof response.stdout === "string") textParts.push(response.stdout);
|
|
92
|
+
if (typeof response.output === "string") textParts.push(response.output);
|
|
93
|
+
if (typeof response.text === "string") textParts.push(response.text);
|
|
94
|
+
if (typeof response.message === "string") textParts.push(response.message);
|
|
95
|
+
if (textParts.length === 0) return false;
|
|
96
|
+
const text = textParts.join("\n");
|
|
97
|
+
return ERROR_PATTERNS.some((pattern) => pattern.test(text));
|
|
98
|
+
}
|
|
99
|
+
function isExeOsError(data) {
|
|
100
|
+
const toolName = data.tool_name ?? "";
|
|
101
|
+
if (isExeMcpTool(toolName)) return true;
|
|
102
|
+
if (toolName === "Bash") {
|
|
103
|
+
const cmd = String(data.tool_input?.command ?? "");
|
|
104
|
+
if (/\bexe-os\b|exe-boot|exe-healthcheck|scan-tasks|exe-call/.test(cmd)) return true;
|
|
105
|
+
if (/node.*dist\/(bin|hooks|lib)\//.test(cmd)) return true;
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
var USER_ERROR_PATTERNS = [
|
|
110
|
+
/not found:?\s/i,
|
|
111
|
+
/expected \d+ words/i,
|
|
112
|
+
/provide either/i,
|
|
113
|
+
/invalid.*parameter/i,
|
|
114
|
+
/already exists/i,
|
|
115
|
+
/Multiple tasks match/i,
|
|
116
|
+
/Use a more specific identifier/i
|
|
117
|
+
];
|
|
118
|
+
var SYSTEM_BUG_PATTERNS = [
|
|
119
|
+
/SQLITE_ERROR/,
|
|
120
|
+
/Cannot find module/,
|
|
121
|
+
/ERR_MODULE_NOT_FOUND/,
|
|
122
|
+
/TypeError:/,
|
|
123
|
+
/ReferenceError:/,
|
|
124
|
+
/Cannot read propert/,
|
|
125
|
+
/is not a function/,
|
|
126
|
+
/ENOENT.*dist\//,
|
|
127
|
+
/dimension mismatch/i,
|
|
128
|
+
/unhealthy.*model/i,
|
|
129
|
+
/constraint.*violat/i
|
|
130
|
+
];
|
|
131
|
+
function classifyError(errorText) {
|
|
132
|
+
if (USER_ERROR_PATTERNS.some((p) => p.test(errorText))) return "user";
|
|
133
|
+
if (SYSTEM_BUG_PATTERNS.some((p) => p.test(errorText))) return "system";
|
|
134
|
+
if (/at\s+\S+\s+\(.*exe-os.*\)/m.test(errorText)) return "system";
|
|
135
|
+
if (/at\s+\S+\s+\(.*dist\/(lib|bin|hooks|mcp)\//m.test(errorText)) return "system";
|
|
136
|
+
return "unknown";
|
|
137
|
+
}
|
|
138
|
+
function errorFingerprint(toolName, errorText) {
|
|
139
|
+
const normalized = errorText.replace(/\d{4}-\d{2}-\d{2}T[\d:.]+Z/g, "TIMESTAMP").replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, "UUID").replace(/\/Users\/[^\s]+/g, "PATH").replace(/:\d+:\d+/g, ":LINE:COL").slice(0, 200);
|
|
140
|
+
return crypto.createHash("sha256").update(`${toolName}:${normalized}`).digest("hex").slice(0, 16);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export {
|
|
144
|
+
ERROR_PATTERNS,
|
|
145
|
+
detectError,
|
|
146
|
+
isExeOsError,
|
|
147
|
+
classifyError,
|
|
148
|
+
errorFingerprint
|
|
149
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import {
|
|
2
|
+
enqueueMemory
|
|
3
|
+
} from "./chunk-RWO327FJ.js";
|
|
4
|
+
import {
|
|
5
|
+
init_exe_daemon_client,
|
|
6
|
+
isClientConnected,
|
|
7
|
+
sendDaemonRequest
|
|
8
|
+
} from "./chunk-NMQKGFEP.js";
|
|
9
|
+
|
|
10
|
+
// src/lib/memory-queue-client.ts
|
|
11
|
+
init_exe_daemon_client();
|
|
12
|
+
async function writeMemoryViaDaemon(entry) {
|
|
13
|
+
if (process.env.EXE_IS_DAEMON === "1") {
|
|
14
|
+
enqueueMemory(entry);
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if (!isClientConnected()) {
|
|
18
|
+
enqueueMemory(entry);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const response = await sendDaemonRequest({
|
|
23
|
+
type: "write-memory",
|
|
24
|
+
entry
|
|
25
|
+
});
|
|
26
|
+
if (response.ok) return true;
|
|
27
|
+
enqueueMemory(entry);
|
|
28
|
+
return false;
|
|
29
|
+
} catch {
|
|
30
|
+
enqueueMemory(entry);
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function batchWriteMemoryViaDaemon(entries) {
|
|
35
|
+
if (entries.length === 0) return 0;
|
|
36
|
+
if (process.env.EXE_IS_DAEMON === "1" || !isClientConnected()) {
|
|
37
|
+
for (const entry of entries) enqueueMemory(entry);
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const response = await sendDaemonRequest({
|
|
42
|
+
type: "batch-write-memory",
|
|
43
|
+
entries
|
|
44
|
+
});
|
|
45
|
+
if (response.ok) return response.count ?? entries.length;
|
|
46
|
+
for (const entry of entries) enqueueMemory(entry);
|
|
47
|
+
return 0;
|
|
48
|
+
} catch {
|
|
49
|
+
for (const entry of entries) enqueueMemory(entry);
|
|
50
|
+
return 0;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export {
|
|
55
|
+
writeMemoryViaDaemon,
|
|
56
|
+
batchWriteMemoryViaDaemon
|
|
57
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {
|
|
2
|
+
extractSemanticText
|
|
3
|
+
} from "./chunk-R23EMFJV.js";
|
|
4
|
+
import {
|
|
5
|
+
getProjectName,
|
|
6
|
+
init_project_name
|
|
7
|
+
} from "./chunk-LPGBKR4H.js";
|
|
8
|
+
import {
|
|
9
|
+
detectError
|
|
10
|
+
} from "./chunk-2WGSIVI4.js";
|
|
11
|
+
|
|
12
|
+
// src/lib/post-tool-memory.ts
|
|
13
|
+
init_project_name();
|
|
14
|
+
function buildPostToolMemoryEntry(data, agent) {
|
|
15
|
+
let rawText = extractSemanticText(data.tool_name, data.tool_input, data.tool_response);
|
|
16
|
+
if (rawText.trim().length < 10) {
|
|
17
|
+
const inputPreview = JSON.stringify(data.tool_input ?? "").slice(0, 500);
|
|
18
|
+
const outputPreview = JSON.stringify(data.tool_response ?? "").slice(0, 500);
|
|
19
|
+
rawText = `Tool call: ${data.tool_name}
|
|
20
|
+
Input: ${inputPreview}
|
|
21
|
+
Output: ${outputPreview}`;
|
|
22
|
+
}
|
|
23
|
+
if (rawText.trim().length < 10) return null;
|
|
24
|
+
const hasError = detectError(data);
|
|
25
|
+
const toolInputStr = JSON.stringify(data.tool_input ?? "").slice(0, 200);
|
|
26
|
+
const toolOutputStr = JSON.stringify(data.tool_response ?? "").slice(0, 200);
|
|
27
|
+
return {
|
|
28
|
+
raw_text: rawText,
|
|
29
|
+
agent_id: agent.agentId,
|
|
30
|
+
agent_role: agent.agentRole,
|
|
31
|
+
tool_name: data.tool_name,
|
|
32
|
+
project_name: getProjectName(data.cwd ?? process.cwd()),
|
|
33
|
+
session_id: data.session_id,
|
|
34
|
+
has_error: hasError,
|
|
35
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
36
|
+
trajectory: JSON.stringify({
|
|
37
|
+
input: toolInputStr,
|
|
38
|
+
tool: data.tool_name,
|
|
39
|
+
output: toolOutputStr,
|
|
40
|
+
result_type: hasError ? "error" : "success"
|
|
41
|
+
})
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export {
|
|
46
|
+
buildPostToolMemoryEntry
|
|
47
|
+
};
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// src/lib/graph-export.ts
|
|
2
|
+
async function loadGraphData(client) {
|
|
3
|
+
const entityResult = await client.execute(`
|
|
4
|
+
SELECT e.id, e.name, e.type,
|
|
5
|
+
(SELECT COUNT(*) FROM relationships r WHERE r.source_entity_id = e.id OR r.target_entity_id = e.id) as degree
|
|
6
|
+
FROM entities e
|
|
7
|
+
ORDER BY degree DESC
|
|
8
|
+
`);
|
|
9
|
+
const nodes = entityResult.rows.map((row) => ({
|
|
10
|
+
id: String(row.id),
|
|
11
|
+
label: String(row.name),
|
|
12
|
+
type: String(row.type),
|
|
13
|
+
degree: Number(row.degree ?? 0)
|
|
14
|
+
}));
|
|
15
|
+
const relResult = await client.execute(`
|
|
16
|
+
SELECT source_entity_id, target_entity_id, type, weight,
|
|
17
|
+
COALESCE(confidence, 1.0) as confidence,
|
|
18
|
+
COALESCE(confidence_label, 'extracted') as confidence_label
|
|
19
|
+
FROM relationships
|
|
20
|
+
`);
|
|
21
|
+
const edges = relResult.rows.map((row) => ({
|
|
22
|
+
from: String(row.source_entity_id),
|
|
23
|
+
to: String(row.target_entity_id),
|
|
24
|
+
label: String(row.type),
|
|
25
|
+
weight: Number(row.weight),
|
|
26
|
+
confidence: Number(row.confidence),
|
|
27
|
+
confidenceLabel: String(row.confidence_label)
|
|
28
|
+
}));
|
|
29
|
+
return { nodes, edges };
|
|
30
|
+
}
|
|
31
|
+
function detectCommunities(nodes, edges) {
|
|
32
|
+
const communities = /* @__PURE__ */ new Map();
|
|
33
|
+
nodes.forEach((n, i) => communities.set(n.id, i));
|
|
34
|
+
const adjacency = /* @__PURE__ */ new Map();
|
|
35
|
+
for (const e of edges) {
|
|
36
|
+
if (!adjacency.has(e.from)) adjacency.set(e.from, []);
|
|
37
|
+
if (!adjacency.has(e.to)) adjacency.set(e.to, []);
|
|
38
|
+
adjacency.get(e.from).push(e.to);
|
|
39
|
+
adjacency.get(e.to).push(e.from);
|
|
40
|
+
}
|
|
41
|
+
for (let iter = 0; iter < 5; iter++) {
|
|
42
|
+
for (const node of nodes) {
|
|
43
|
+
const neighbors = adjacency.get(node.id) ?? [];
|
|
44
|
+
if (neighbors.length === 0) continue;
|
|
45
|
+
const counts = /* @__PURE__ */ new Map();
|
|
46
|
+
for (const n of neighbors) {
|
|
47
|
+
const c = communities.get(n) ?? 0;
|
|
48
|
+
counts.set(c, (counts.get(c) ?? 0) + 1);
|
|
49
|
+
}
|
|
50
|
+
let maxCount = 0;
|
|
51
|
+
let maxCommunity = communities.get(node.id) ?? 0;
|
|
52
|
+
for (const [c, count] of counts) {
|
|
53
|
+
if (count > maxCount) {
|
|
54
|
+
maxCount = count;
|
|
55
|
+
maxCommunity = c;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
communities.set(node.id, maxCommunity);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return communities;
|
|
62
|
+
}
|
|
63
|
+
var TYPE_COLORS = {
|
|
64
|
+
person: "#F5D76E",
|
|
65
|
+
project: "#6B4C9A",
|
|
66
|
+
tool: "#22C55E",
|
|
67
|
+
decision: "#EF4444",
|
|
68
|
+
concept: "#3B82F6",
|
|
69
|
+
file: "#6B7280",
|
|
70
|
+
rationale: "#F97316"
|
|
71
|
+
};
|
|
72
|
+
async function exportGraphHTML(client, projectName) {
|
|
73
|
+
const { nodes, edges } = await loadGraphData(client);
|
|
74
|
+
if (nodes.length === 0) return "<html><body>No graph data.</body></html>";
|
|
75
|
+
const communities = detectCommunities(nodes, edges);
|
|
76
|
+
for (const node of nodes) {
|
|
77
|
+
node.community = communities.get(node.id) ?? 0;
|
|
78
|
+
}
|
|
79
|
+
const visNodes = nodes.map((n) => ({
|
|
80
|
+
id: n.id,
|
|
81
|
+
label: n.label,
|
|
82
|
+
size: Math.max(10, Math.min(50, n.degree * 5)),
|
|
83
|
+
color: TYPE_COLORS[n.type] ?? "#999",
|
|
84
|
+
title: `${n.label} (${n.type})
|
|
85
|
+
Degree: ${n.degree}
|
|
86
|
+
Community: ${n.community}`,
|
|
87
|
+
group: n.type
|
|
88
|
+
}));
|
|
89
|
+
const visEdges = edges.map((e, i) => ({
|
|
90
|
+
id: `e${i}`,
|
|
91
|
+
from: e.from,
|
|
92
|
+
to: e.to,
|
|
93
|
+
label: e.label,
|
|
94
|
+
width: Math.max(1, e.weight),
|
|
95
|
+
color: e.confidenceLabel === "ambiguous" ? "#EF4444" : e.confidenceLabel === "inferred" ? "#F59E0B" : "#6B7280",
|
|
96
|
+
title: `${e.label} (confidence: ${e.confidence.toFixed(1)}, ${e.confidenceLabel})`
|
|
97
|
+
}));
|
|
98
|
+
const title = projectName ? `${projectName} Knowledge Graph` : "exe-os Knowledge Graph";
|
|
99
|
+
return `<!DOCTYPE html>
|
|
100
|
+
<html>
|
|
101
|
+
<head>
|
|
102
|
+
<title>${title}</title>
|
|
103
|
+
<style>
|
|
104
|
+
body { margin: 0; background: #0F0E1A; color: #F0EDE8; font-family: 'Manrope', sans-serif; }
|
|
105
|
+
#graph { width: 100%; height: 80vh; border: 1px solid #3D3660; }
|
|
106
|
+
#sidebar { padding: 16px; background: #1A1830; }
|
|
107
|
+
#search { width: 300px; padding: 8px; background: #2A2840; color: #F0EDE8; border: 1px solid #3D3660; border-radius: 4px; margin: 8px; }
|
|
108
|
+
.stat { color: #6B4C9A; margin: 4px 8px; }
|
|
109
|
+
h1 { color: #F5D76E; margin: 8px; font-size: 1.5em; }
|
|
110
|
+
.legend { display: flex; gap: 12px; margin: 8px; flex-wrap: wrap; }
|
|
111
|
+
.legend-item { display: flex; align-items: center; gap: 4px; font-size: 0.85em; }
|
|
112
|
+
.legend-dot { width: 10px; height: 10px; border-radius: 50%; }
|
|
113
|
+
</style>
|
|
114
|
+
<script src="https://unpkg.com/vis-network@9.1.9/standalone/umd/vis-network.min.js"></script>
|
|
115
|
+
</head>
|
|
116
|
+
<body>
|
|
117
|
+
<div id="sidebar">
|
|
118
|
+
<h1>${title}</h1>
|
|
119
|
+
<input id="search" placeholder="Search entities..." oninput="filterGraph(this.value)">
|
|
120
|
+
<div class="legend">
|
|
121
|
+
${Object.entries(TYPE_COLORS).map(
|
|
122
|
+
([type, color]) => `<span class="legend-item"><span class="legend-dot" style="background:${color}"></span>${type}</span>`
|
|
123
|
+
).join("")}
|
|
124
|
+
</div>
|
|
125
|
+
<span class="stat">${nodes.length} nodes</span>
|
|
126
|
+
<span class="stat">${edges.length} edges</span>
|
|
127
|
+
</div>
|
|
128
|
+
<div id="graph"></div>
|
|
129
|
+
<script>
|
|
130
|
+
var nodes = new vis.DataSet(${JSON.stringify(visNodes)});
|
|
131
|
+
var edges = new vis.DataSet(${JSON.stringify(visEdges)});
|
|
132
|
+
var container = document.getElementById('graph');
|
|
133
|
+
var network = new vis.Network(container, {nodes: nodes, edges: edges}, {
|
|
134
|
+
physics: { solver: 'forceAtlas2Based', forceAtlas2Based: { gravitationalConstant: -50 } },
|
|
135
|
+
edges: { arrows: 'to', font: { size: 9, color: '#6B4C9A' } },
|
|
136
|
+
nodes: { font: { color: '#F0EDE8' }, shape: 'dot' },
|
|
137
|
+
interaction: { hover: true, tooltipDelay: 100 }
|
|
138
|
+
});
|
|
139
|
+
function filterGraph(query) {
|
|
140
|
+
if (!query) { nodes.forEach(function(n) { nodes.update({id: n.id, hidden: false}); }); return; }
|
|
141
|
+
var q = query.toLowerCase();
|
|
142
|
+
nodes.forEach(function(n) { nodes.update({id: n.id, hidden: !n.label.toLowerCase().includes(q)}); });
|
|
143
|
+
}
|
|
144
|
+
</script>
|
|
145
|
+
</body>
|
|
146
|
+
</html>`;
|
|
147
|
+
}
|
|
148
|
+
async function generateGraphReport(client, projectName) {
|
|
149
|
+
const { nodes, edges } = await loadGraphData(client);
|
|
150
|
+
if (nodes.length === 0) return "# Graph Report\n\nNo graph data yet. Run graph extraction first.";
|
|
151
|
+
const communities = detectCommunities(nodes, edges);
|
|
152
|
+
for (const node of nodes) {
|
|
153
|
+
node.community = communities.get(node.id) ?? 0;
|
|
154
|
+
}
|
|
155
|
+
const godNodes = [...nodes].sort((a, b) => b.degree - a.degree).slice(0, 10);
|
|
156
|
+
const communityMap = /* @__PURE__ */ new Map();
|
|
157
|
+
for (const node of nodes) {
|
|
158
|
+
const c = node.community ?? 0;
|
|
159
|
+
if (!communityMap.has(c)) communityMap.set(c, []);
|
|
160
|
+
communityMap.get(c).push(node);
|
|
161
|
+
}
|
|
162
|
+
const topCommunities = [...communityMap.entries()].sort((a, b) => b[1].length - a[1].length).slice(0, 10);
|
|
163
|
+
const ambiguous = edges.filter((e) => e.confidenceLabel === "ambiguous");
|
|
164
|
+
const crossCommunity = edges.filter((e) => {
|
|
165
|
+
const fromC = communities.get(e.from);
|
|
166
|
+
const toC = communities.get(e.to);
|
|
167
|
+
return fromC !== void 0 && toC !== void 0 && fromC !== toC;
|
|
168
|
+
}).slice(0, 10);
|
|
169
|
+
let hyperedgeCount = 0;
|
|
170
|
+
try {
|
|
171
|
+
const result = await client.execute("SELECT COUNT(*) as cnt FROM hyperedges");
|
|
172
|
+
hyperedgeCount = Number(result.rows[0]?.cnt ?? 0);
|
|
173
|
+
} catch {
|
|
174
|
+
}
|
|
175
|
+
const nodeLabels = new Map(nodes.map((n) => [n.id, n.label]));
|
|
176
|
+
const lines = [
|
|
177
|
+
`# Knowledge Graph Report${projectName ? ` \u2014 ${projectName}` : ""}`,
|
|
178
|
+
"",
|
|
179
|
+
`Generated: ${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}`,
|
|
180
|
+
"",
|
|
181
|
+
"## Stats",
|
|
182
|
+
`- **Nodes:** ${nodes.length}`,
|
|
183
|
+
`- **Edges:** ${edges.length}`,
|
|
184
|
+
`- **Hyperedges:** ${hyperedgeCount}`,
|
|
185
|
+
`- **Communities:** ${communityMap.size}`,
|
|
186
|
+
"",
|
|
187
|
+
"## God Nodes (highest connectivity)",
|
|
188
|
+
...godNodes.map((n) => `- **${n.label}** (${n.type}) \u2014 ${n.degree} connections`),
|
|
189
|
+
"",
|
|
190
|
+
"## Communities",
|
|
191
|
+
...topCommunities.map(
|
|
192
|
+
([id, members]) => `- **Community ${id}** (${members.length} nodes): ${members.slice(0, 8).map((m) => m.label).join(", ")}${members.length > 8 ? "\u2026" : ""}`
|
|
193
|
+
),
|
|
194
|
+
"",
|
|
195
|
+
"## Cross-Community Connections",
|
|
196
|
+
crossCommunity.length > 0 ? crossCommunity.map((e) => `- ${nodeLabels.get(e.from) ?? e.from} \u2192[${e.label}]\u2192 ${nodeLabels.get(e.to) ?? e.to}`).join("\n") : "None detected",
|
|
197
|
+
"",
|
|
198
|
+
"## Open Questions (ambiguous edges)",
|
|
199
|
+
ambiguous.length > 0 ? ambiguous.map((e) => `- [${e.confidence.toFixed(1)}] ${nodeLabels.get(e.from) ?? e.from} \u2192[${e.label}]\u2192 ${nodeLabels.get(e.to) ?? e.to}`).join("\n") : "No ambiguous edges"
|
|
200
|
+
];
|
|
201
|
+
return lines.join("\n");
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export {
|
|
205
|
+
exportGraphHTML,
|
|
206
|
+
generateGraphReport
|
|
207
|
+
};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import {
|
|
2
|
+
writeMemoryViaDaemon
|
|
3
|
+
} from "./chunk-35TVNLJI.js";
|
|
4
|
+
|
|
5
|
+
// src/lib/auto-checkpoint.ts
|
|
6
|
+
var FILE_RE = /(?:^|\s)([\w./-]+\.(?:ts|tsx|js|jsx|json|md|yml|yaml|sql|go|py|css|scss|html|sh))(?:\b|$)/g;
|
|
7
|
+
var DECISION_RE = /\b(decision:|decided:|we decided|founder directive|captured in .*architecture|source of truth)\b/i;
|
|
8
|
+
function asString(value, fallback = "") {
|
|
9
|
+
if (value == null) return fallback;
|
|
10
|
+
return String(value);
|
|
11
|
+
}
|
|
12
|
+
function compactLine(text, max = 220) {
|
|
13
|
+
return text.replace(/\s+/g, " ").trim().slice(0, max);
|
|
14
|
+
}
|
|
15
|
+
function topEntries(counts, limit) {
|
|
16
|
+
return [...counts.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).slice(0, limit).map(([name, count]) => `${name}(${count})`);
|
|
17
|
+
}
|
|
18
|
+
function buildAutoCheckpoint(input) {
|
|
19
|
+
const maxSamples = input.maxSamples ?? 8;
|
|
20
|
+
const projectCounts = /* @__PURE__ */ new Map();
|
|
21
|
+
const toolCounts = /* @__PURE__ */ new Map();
|
|
22
|
+
const files = /* @__PURE__ */ new Set();
|
|
23
|
+
const errors = [];
|
|
24
|
+
const samples = [];
|
|
25
|
+
const decisionTexts = [];
|
|
26
|
+
for (const row of input.memories) {
|
|
27
|
+
const tool = asString(row.tool_name, "unknown");
|
|
28
|
+
const project = asString(row.project_name, input.projectName || "unknown");
|
|
29
|
+
const raw = asString(row.raw_text);
|
|
30
|
+
const hasError = row.has_error === 1 || row.has_error === true;
|
|
31
|
+
toolCounts.set(tool, (toolCounts.get(tool) ?? 0) + 1);
|
|
32
|
+
projectCounts.set(project, (projectCounts.get(project) ?? 0) + 1);
|
|
33
|
+
if (hasError && errors.length < 5) errors.push(compactLine(raw, 180));
|
|
34
|
+
if (samples.length < maxSamples && raw.length > 30) {
|
|
35
|
+
samples.push(`[${tool}] ${compactLine(raw)}`);
|
|
36
|
+
}
|
|
37
|
+
if (DECISION_RE.test(raw) && decisionTexts.length < 5) {
|
|
38
|
+
decisionTexts.push(`AUTO DECISION CANDIDATE [${input.agentId}]: ${compactLine(raw, 500)}`);
|
|
39
|
+
}
|
|
40
|
+
for (const match of raw.matchAll(FILE_RE)) {
|
|
41
|
+
if (match[1]) files.add(match[1]);
|
|
42
|
+
if (files.size >= 20) break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const taskLines = (input.tasks ?? []).slice(0, 10).map((task) => {
|
|
46
|
+
const status = asString(task.status, "unknown");
|
|
47
|
+
const priority = asString(task.priority, "?").toUpperCase();
|
|
48
|
+
const title = asString(task.title, "untitled");
|
|
49
|
+
const taskFile = asString(task.task_file);
|
|
50
|
+
return `- [${status}/${priority}] ${title}${taskFile ? ` (${taskFile})` : ""}`;
|
|
51
|
+
});
|
|
52
|
+
const parts = [
|
|
53
|
+
`CONTEXT CHECKPOINT [auto:${input.reason}]`,
|
|
54
|
+
`Agent: ${input.agentId} (${input.agentRole})`,
|
|
55
|
+
`Session: ${input.sessionId}`,
|
|
56
|
+
`Project: ${input.projectName}`,
|
|
57
|
+
`Time: ${(/* @__PURE__ */ new Date()).toISOString()}`,
|
|
58
|
+
"",
|
|
59
|
+
"## Recent Activity",
|
|
60
|
+
`- Memories scanned: ${input.memories.length}`,
|
|
61
|
+
`- Projects: ${topEntries(projectCounts, 5).join(", ") || input.projectName}`,
|
|
62
|
+
`- Tools: ${topEntries(toolCounts, 8).join(", ") || "none"}`
|
|
63
|
+
];
|
|
64
|
+
if (taskLines.length > 0) {
|
|
65
|
+
parts.push("", "## Open / Active Tasks", ...taskLines);
|
|
66
|
+
}
|
|
67
|
+
if (files.size > 0) {
|
|
68
|
+
parts.push("", "## Files Mentioned", ...[...files].slice(0, 20).map((f) => `- ${f}`));
|
|
69
|
+
}
|
|
70
|
+
if (samples.length > 0) {
|
|
71
|
+
parts.push("", "## Important Recent Traces", ...samples.map((s) => `- ${s}`));
|
|
72
|
+
}
|
|
73
|
+
if (errors.length > 0) {
|
|
74
|
+
parts.push("", "## Errors / Risks", ...errors.map((e) => `- ${e}`));
|
|
75
|
+
}
|
|
76
|
+
if (decisionTexts.length > 0) {
|
|
77
|
+
parts.push("", "## Decision Candidates", ...decisionTexts.map((d) => `- ${d.replace(/^AUTO DECISION CANDIDATE \\[[^\\]]+\\]: /, "")}`));
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
checkpointText: parts.join("\n"),
|
|
81
|
+
decisionTexts
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// src/lib/checkpoint-orchestrator.ts
|
|
86
|
+
function toolNameForReason(reason) {
|
|
87
|
+
switch (reason) {
|
|
88
|
+
case "periodic":
|
|
89
|
+
return "auto-summary";
|
|
90
|
+
case "session-end":
|
|
91
|
+
return "SessionEnd";
|
|
92
|
+
case "pre-compact":
|
|
93
|
+
return "pre-compact-hook";
|
|
94
|
+
case "capacity-signal":
|
|
95
|
+
return "auto-checkpoint";
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function importanceForReason(reason, override) {
|
|
99
|
+
if (override !== void 0) return override;
|
|
100
|
+
switch (reason) {
|
|
101
|
+
case "periodic":
|
|
102
|
+
return 7;
|
|
103
|
+
case "session-end":
|
|
104
|
+
case "pre-compact":
|
|
105
|
+
case "capacity-signal":
|
|
106
|
+
return 8;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function buildContinuityCheckpoint(input) {
|
|
110
|
+
const { checkpointText, decisionTexts } = buildAutoCheckpoint({
|
|
111
|
+
agentId: input.agentId,
|
|
112
|
+
agentRole: input.agentRole,
|
|
113
|
+
sessionId: input.sessionId,
|
|
114
|
+
projectName: input.projectName,
|
|
115
|
+
reason: input.reason,
|
|
116
|
+
memories: input.memories ?? [],
|
|
117
|
+
tasks: input.tasks ?? [],
|
|
118
|
+
maxSamples: input.maxSamples
|
|
119
|
+
});
|
|
120
|
+
const extra = input.extraSections?.filter((section) => section.trim().length > 0) ?? [];
|
|
121
|
+
return {
|
|
122
|
+
checkpointText: extra.length > 0 ? `${checkpointText}
|
|
123
|
+
|
|
124
|
+
${extra.join("\n\n")}` : checkpointText,
|
|
125
|
+
decisionTexts
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
async function writeContinuityCheckpoint(input) {
|
|
129
|
+
const result = buildContinuityCheckpoint(input);
|
|
130
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
131
|
+
await writeMemoryViaDaemon({
|
|
132
|
+
raw_text: result.checkpointText,
|
|
133
|
+
agent_id: input.agentId,
|
|
134
|
+
agent_role: input.agentRole,
|
|
135
|
+
session_id: input.sessionId,
|
|
136
|
+
tool_name: toolNameForReason(input.reason),
|
|
137
|
+
project_name: input.projectName,
|
|
138
|
+
timestamp: now,
|
|
139
|
+
importance: importanceForReason(input.reason, input.importance),
|
|
140
|
+
task_id: input.taskId,
|
|
141
|
+
memory_type: "checkpoint"
|
|
142
|
+
});
|
|
143
|
+
const decisionLimit = input.reason === "periodic" ? 3 : 5;
|
|
144
|
+
for (const decisionText of result.decisionTexts.slice(0, decisionLimit)) {
|
|
145
|
+
await writeMemoryViaDaemon({
|
|
146
|
+
raw_text: decisionText,
|
|
147
|
+
agent_id: input.agentId,
|
|
148
|
+
agent_role: input.agentRole,
|
|
149
|
+
session_id: input.sessionId,
|
|
150
|
+
tool_name: "auto-decision",
|
|
151
|
+
project_name: input.projectName,
|
|
152
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
153
|
+
importance: 8,
|
|
154
|
+
memory_type: "decision"
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
async function checkpointActiveTask(input) {
|
|
160
|
+
const { writeCheckpoint } = await import("./lib/tasks.js");
|
|
161
|
+
await writeCheckpoint({
|
|
162
|
+
taskId: input.taskId,
|
|
163
|
+
step: input.step ?? "pre-compaction-checkpoint",
|
|
164
|
+
contextSummary: `Auto-checkpoint before context compaction. Task: ${input.taskTitle}. Session: ${input.sessionId}. Project: ${input.projectName}.`
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export {
|
|
169
|
+
writeContinuityCheckpoint,
|
|
170
|
+
checkpointActiveTask
|
|
171
|
+
};
|