@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,161 @@
|
|
|
1
|
+
import {
|
|
2
|
+
init_task_scope,
|
|
3
|
+
sessionScopeFilter
|
|
4
|
+
} from "./chunk-N7L33TED.js";
|
|
5
|
+
import "./chunk-NEAHEC5G.js";
|
|
6
|
+
import "./chunk-KRLOFIPI.js";
|
|
7
|
+
import "./chunk-R4M6XCMU.js";
|
|
8
|
+
import "./chunk-TYLF4LSW.js";
|
|
9
|
+
import "./chunk-PJHHFJAN.js";
|
|
10
|
+
import "./chunk-YOQKMB6N.js";
|
|
11
|
+
import "./chunk-JT76KRZQ.js";
|
|
12
|
+
import "./chunk-6M5II4EV.js";
|
|
13
|
+
import "./chunk-HP43GLZ6.js";
|
|
14
|
+
import "./chunk-ELE2C7L4.js";
|
|
15
|
+
import "./chunk-WZQ4CPRG.js";
|
|
16
|
+
import {
|
|
17
|
+
getClient,
|
|
18
|
+
init_database
|
|
19
|
+
} from "./chunk-A2NZP64U.js";
|
|
20
|
+
import "./chunk-4NYQAS33.js";
|
|
21
|
+
import "./chunk-OFK72LTZ.js";
|
|
22
|
+
import "./chunk-6BFIFI5F.js";
|
|
23
|
+
import "./chunk-RUG3N6P4.js";
|
|
24
|
+
import "./chunk-IRQTM7DY.js";
|
|
25
|
+
import "./chunk-KVPG5UT6.js";
|
|
26
|
+
import "./chunk-X2IMCCM5.js";
|
|
27
|
+
import "./chunk-KFQGP6VL.js";
|
|
28
|
+
|
|
29
|
+
// src/lib/tui-data.ts
|
|
30
|
+
init_database();
|
|
31
|
+
init_task_scope();
|
|
32
|
+
async function loadMemoryDashboard(limit) {
|
|
33
|
+
const client = getClient();
|
|
34
|
+
const [countResult, recentResult, agentResult] = await Promise.all([
|
|
35
|
+
client.execute("SELECT COUNT(*) as cnt FROM memories"),
|
|
36
|
+
client.execute({
|
|
37
|
+
sql: "SELECT agent_id, tool_name, project_name, raw_text, timestamp FROM memories ORDER BY timestamp DESC LIMIT ?",
|
|
38
|
+
args: [limit]
|
|
39
|
+
}),
|
|
40
|
+
client.execute("SELECT agent_id, COUNT(*) as cnt FROM memories GROUP BY agent_id ORDER BY cnt DESC")
|
|
41
|
+
]);
|
|
42
|
+
return {
|
|
43
|
+
total: Number(countResult.rows[0]?.cnt ?? 0),
|
|
44
|
+
recent: recentResult.rows.map((row) => ({
|
|
45
|
+
agentId: String(row.agent_id ?? "unknown"),
|
|
46
|
+
toolName: String(row.tool_name ?? ""),
|
|
47
|
+
projectName: String(row.project_name ?? ""),
|
|
48
|
+
rawText: String(row.raw_text ?? ""),
|
|
49
|
+
timestamp: String(row.timestamp ?? "")
|
|
50
|
+
})),
|
|
51
|
+
byAgent: agentResult.rows.map((row) => ({
|
|
52
|
+
agentId: String(row.agent_id ?? "unknown"),
|
|
53
|
+
count: Number(row.cnt ?? 0)
|
|
54
|
+
}))
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
async function loadTeamBadgeCounts() {
|
|
58
|
+
const client = getClient();
|
|
59
|
+
const memoryCounts = /* @__PURE__ */ new Map();
|
|
60
|
+
const memResult = await client.execute("SELECT agent_id, COUNT(*) as cnt FROM memories GROUP BY agent_id");
|
|
61
|
+
for (const row of memResult.rows) {
|
|
62
|
+
memoryCounts.set(String(row.agent_id), Number(row.cnt));
|
|
63
|
+
}
|
|
64
|
+
return memoryCounts;
|
|
65
|
+
}
|
|
66
|
+
async function loadTeamDetailMetrics(employeeNames) {
|
|
67
|
+
const client = getClient();
|
|
68
|
+
const projectsByEmployee = /* @__PURE__ */ new Map();
|
|
69
|
+
const currentTaskByEmployee = /* @__PURE__ */ new Map();
|
|
70
|
+
const scope = sessionScopeFilter();
|
|
71
|
+
for (const employeeName of employeeNames) {
|
|
72
|
+
const [projectResult, taskResult] = await Promise.all([
|
|
73
|
+
client.execute({
|
|
74
|
+
sql: `SELECT DISTINCT project_name,
|
|
75
|
+
MAX(CASE WHEN status = 'in_progress' THEN 1 WHEN status = 'open' THEN 2 ELSE 3 END) as urgency
|
|
76
|
+
FROM tasks
|
|
77
|
+
WHERE assigned_to = ? AND status IN ('open','in_progress','done')${scope.sql}
|
|
78
|
+
GROUP BY project_name
|
|
79
|
+
ORDER BY urgency ASC
|
|
80
|
+
LIMIT 5`,
|
|
81
|
+
args: [employeeName, ...scope.args]
|
|
82
|
+
}),
|
|
83
|
+
client.execute({
|
|
84
|
+
sql: `SELECT title FROM tasks
|
|
85
|
+
WHERE assigned_to = ? AND status = 'in_progress'${scope.sql}
|
|
86
|
+
ORDER BY updated_at DESC
|
|
87
|
+
LIMIT 1`,
|
|
88
|
+
args: [employeeName, ...scope.args]
|
|
89
|
+
})
|
|
90
|
+
]);
|
|
91
|
+
const projects = projectResult.rows.map((row) => {
|
|
92
|
+
const urgency = Number(row.urgency);
|
|
93
|
+
return {
|
|
94
|
+
name: String(row.project_name),
|
|
95
|
+
status: urgency === 1 ? "active" : urgency === 2 ? "has_tasks" : "idle"
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
if (projects.length > 0) projectsByEmployee.set(employeeName, projects);
|
|
99
|
+
if (taskResult.rows.length > 0) {
|
|
100
|
+
currentTaskByEmployee.set(employeeName, String(taskResult.rows[0].title));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return { projectsByEmployee, currentTaskByEmployee };
|
|
104
|
+
}
|
|
105
|
+
async function loadTeamMetrics(employeeNames) {
|
|
106
|
+
const [memoryCounts, { projectsByEmployee, currentTaskByEmployee }] = await Promise.all([
|
|
107
|
+
loadTeamBadgeCounts(),
|
|
108
|
+
loadTeamDetailMetrics(employeeNames)
|
|
109
|
+
]);
|
|
110
|
+
return { memoryCounts, projectsByEmployee, currentTaskByEmployee };
|
|
111
|
+
}
|
|
112
|
+
async function loadTaskList() {
|
|
113
|
+
const client = getClient();
|
|
114
|
+
const scope = sessionScopeFilter();
|
|
115
|
+
const result = await client.execute({
|
|
116
|
+
sql: `SELECT id, title, priority, assigned_to, assigned_by, status, project_name, created_at, result
|
|
117
|
+
FROM tasks
|
|
118
|
+
WHERE 1=1${scope.sql}
|
|
119
|
+
ORDER BY
|
|
120
|
+
CASE status WHEN 'in_progress' THEN 0 WHEN 'open' THEN 1 WHEN 'blocked' THEN 2 WHEN 'needs_review' THEN 3 WHEN 'done' THEN 4 ELSE 5 END,
|
|
121
|
+
CASE priority WHEN 'p0' THEN 0 WHEN 'p1' THEN 1 WHEN 'p2' THEN 2 ELSE 3 END,
|
|
122
|
+
created_at DESC`,
|
|
123
|
+
args: [...scope.args]
|
|
124
|
+
});
|
|
125
|
+
return result.rows.map((row) => ({
|
|
126
|
+
id: String(row.id ?? ""),
|
|
127
|
+
title: String(row.title ?? ""),
|
|
128
|
+
priority: String(row.priority ?? "p2").toUpperCase(),
|
|
129
|
+
assignedTo: String(row.assigned_to ?? ""),
|
|
130
|
+
assignedBy: String(row.assigned_by ?? ""),
|
|
131
|
+
status: String(row.status ?? "open"),
|
|
132
|
+
projectName: String(row.project_name ?? ""),
|
|
133
|
+
createdAt: String(row.created_at ?? ""),
|
|
134
|
+
result: String(row.result ?? "")
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
async function searchWikiMemoryRows(query) {
|
|
138
|
+
const client = getClient();
|
|
139
|
+
const result = await client.execute({
|
|
140
|
+
sql: `SELECT id, agent_id, raw_text, timestamp, project_name
|
|
141
|
+
FROM memories
|
|
142
|
+
WHERE raw_text LIKE ? AND COALESCE(status, 'active') = 'active'
|
|
143
|
+
ORDER BY timestamp DESC LIMIT 20`,
|
|
144
|
+
args: [`%${query}%`]
|
|
145
|
+
});
|
|
146
|
+
return result.rows.map((row) => ({
|
|
147
|
+
id: String(row.id),
|
|
148
|
+
agentId: String(row.agent_id),
|
|
149
|
+
rawText: String(row.raw_text),
|
|
150
|
+
timestamp: String(row.timestamp),
|
|
151
|
+
projectName: String(row.project_name ?? "")
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
export {
|
|
155
|
+
loadMemoryDashboard,
|
|
156
|
+
loadTaskList,
|
|
157
|
+
loadTeamBadgeCounts,
|
|
158
|
+
loadTeamDetailMetrics,
|
|
159
|
+
loadTeamMetrics,
|
|
160
|
+
searchWikiMemoryRows
|
|
161
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import "./chunk-KFQGP6VL.js";
|
|
2
|
+
|
|
3
|
+
// src/gateway/adapters/webhook.ts
|
|
4
|
+
import { randomUUID } from "crypto";
|
|
5
|
+
var SEND_TIMEOUT_MS = 1e4;
|
|
6
|
+
function resolvePath(obj, path) {
|
|
7
|
+
let current = obj;
|
|
8
|
+
for (const segment of path.split(".")) {
|
|
9
|
+
if (current == null || typeof current !== "object") return void 0;
|
|
10
|
+
current = current[segment];
|
|
11
|
+
}
|
|
12
|
+
return current;
|
|
13
|
+
}
|
|
14
|
+
var WebhookAdapter = class {
|
|
15
|
+
platform = "webhook";
|
|
16
|
+
responseUrl = "";
|
|
17
|
+
fieldMap = { text: "text", senderId: "from", channelId: "channel" };
|
|
18
|
+
messageHandler = null;
|
|
19
|
+
connected = false;
|
|
20
|
+
async connect(config) {
|
|
21
|
+
const { response_url, field_map } = config.credentials;
|
|
22
|
+
if (!field_map) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
"Webhook adapter requires field_map in credentials (JSON string with text, senderId paths)"
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
this.responseUrl = response_url ?? "";
|
|
28
|
+
try {
|
|
29
|
+
this.fieldMap = typeof field_map === "string" ? JSON.parse(field_map) : field_map;
|
|
30
|
+
} catch {
|
|
31
|
+
throw new Error("field_map must be a valid JSON string with text and senderId paths");
|
|
32
|
+
}
|
|
33
|
+
if (!this.fieldMap.text || !this.fieldMap.senderId) {
|
|
34
|
+
throw new Error("field_map must include at least 'text' and 'senderId' paths");
|
|
35
|
+
}
|
|
36
|
+
this.connected = true;
|
|
37
|
+
console.log("[webhook] Generic webhook adapter connected");
|
|
38
|
+
}
|
|
39
|
+
async disconnect() {
|
|
40
|
+
this.connected = false;
|
|
41
|
+
}
|
|
42
|
+
onMessage(handler) {
|
|
43
|
+
this.messageHandler = handler;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Inject a raw webhook payload. Normalizes using configured field mappings
|
|
47
|
+
* and calls the registered message handler.
|
|
48
|
+
*/
|
|
49
|
+
async injectMessage(rawPayload) {
|
|
50
|
+
if (!this.messageHandler) return;
|
|
51
|
+
const text = String(resolvePath(rawPayload, this.fieldMap.text) ?? "");
|
|
52
|
+
const senderId = String(resolvePath(rawPayload, this.fieldMap.senderId) ?? "");
|
|
53
|
+
if (!text || !senderId) return;
|
|
54
|
+
const channelId = this.fieldMap.channelId ? String(resolvePath(rawPayload, this.fieldMap.channelId) ?? senderId) : senderId;
|
|
55
|
+
const senderName = this.fieldMap.senderName ? String(resolvePath(rawPayload, this.fieldMap.senderName) ?? "") || void 0 : void 0;
|
|
56
|
+
const messageId = this.fieldMap.messageId ? String(resolvePath(rawPayload, this.fieldMap.messageId) ?? randomUUID()) : randomUUID();
|
|
57
|
+
const timestamp = this.fieldMap.timestamp ? String(resolvePath(rawPayload, this.fieldMap.timestamp) ?? (/* @__PURE__ */ new Date()).toISOString()) : (/* @__PURE__ */ new Date()).toISOString();
|
|
58
|
+
const normalized = {
|
|
59
|
+
messageId,
|
|
60
|
+
platform: "webhook",
|
|
61
|
+
senderId,
|
|
62
|
+
senderName,
|
|
63
|
+
channelId,
|
|
64
|
+
chatType: "direct",
|
|
65
|
+
text,
|
|
66
|
+
timestamp,
|
|
67
|
+
raw: rawPayload
|
|
68
|
+
};
|
|
69
|
+
try {
|
|
70
|
+
await this.messageHandler(normalized);
|
|
71
|
+
} catch (err) {
|
|
72
|
+
console.error("[webhook] Message handler error:", err);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async sendText(channelId, text, _options) {
|
|
76
|
+
if (!this.responseUrl) return;
|
|
77
|
+
const res = await fetch(this.responseUrl, {
|
|
78
|
+
method: "POST",
|
|
79
|
+
headers: { "Content-Type": "application/json" },
|
|
80
|
+
body: JSON.stringify({ channelId, text }),
|
|
81
|
+
signal: AbortSignal.timeout(SEND_TIMEOUT_MS)
|
|
82
|
+
});
|
|
83
|
+
if (!res.ok) {
|
|
84
|
+
const errBody = await res.text();
|
|
85
|
+
throw new Error(`Webhook send failed (${res.status}): ${errBody}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async sendTyping(_channelId) {
|
|
89
|
+
}
|
|
90
|
+
async healthCheck() {
|
|
91
|
+
return { connected: this.connected };
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
export {
|
|
95
|
+
WebhookAdapter
|
|
96
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
_resetCache,
|
|
3
|
+
getAccountByName,
|
|
4
|
+
getAccountByPhoneNumberId,
|
|
5
|
+
getDefaultAccount,
|
|
6
|
+
loadAccounts
|
|
7
|
+
} from "./chunk-YGAAZN3E.js";
|
|
8
|
+
import "./chunk-KFQGP6VL.js";
|
|
9
|
+
export {
|
|
10
|
+
_resetCache,
|
|
11
|
+
getAccountByName,
|
|
12
|
+
getAccountByPhoneNumberId,
|
|
13
|
+
getDefaultAccount,
|
|
14
|
+
loadAccounts
|
|
15
|
+
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import "./chunk-KFQGP6VL.js";
|
|
2
|
+
|
|
3
|
+
// src/lib/wiki-client.ts
|
|
4
|
+
var LOCAL_WIKI_URL = process.env.EXE_WIKI_URL || "http://localhost:3001";
|
|
5
|
+
var REQUEST_TIMEOUT_MS = 8e3;
|
|
6
|
+
async function wikiFetch(config, path, method = "GET", body) {
|
|
7
|
+
const url = `${config.baseUrl}/api/v1${path}`;
|
|
8
|
+
const headers = {
|
|
9
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
10
|
+
"Content-Type": "application/json"
|
|
11
|
+
};
|
|
12
|
+
const controller = new AbortController();
|
|
13
|
+
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
14
|
+
try {
|
|
15
|
+
let response;
|
|
16
|
+
try {
|
|
17
|
+
response = await fetch(url, {
|
|
18
|
+
method,
|
|
19
|
+
headers,
|
|
20
|
+
body: body ? JSON.stringify(body) : void 0,
|
|
21
|
+
signal: controller.signal
|
|
22
|
+
});
|
|
23
|
+
} catch {
|
|
24
|
+
clearTimeout(timeout);
|
|
25
|
+
const retryController = new AbortController();
|
|
26
|
+
const retryTimeout = setTimeout(() => retryController.abort(), REQUEST_TIMEOUT_MS);
|
|
27
|
+
try {
|
|
28
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
29
|
+
response = await fetch(url, {
|
|
30
|
+
method,
|
|
31
|
+
headers,
|
|
32
|
+
body: body ? JSON.stringify(body) : void 0,
|
|
33
|
+
signal: retryController.signal
|
|
34
|
+
});
|
|
35
|
+
} finally {
|
|
36
|
+
clearTimeout(retryTimeout);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
throw new Error(`Wiki API ${method} ${path}: ${response.status} ${response.statusText}`);
|
|
41
|
+
}
|
|
42
|
+
return response.json();
|
|
43
|
+
} finally {
|
|
44
|
+
clearTimeout(timeout);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function resolveWikiUrl(configUrl) {
|
|
48
|
+
try {
|
|
49
|
+
const controller = new AbortController();
|
|
50
|
+
const timeout = setTimeout(() => controller.abort(), 3e3);
|
|
51
|
+
const res = await fetch(`${LOCAL_WIKI_URL}/api/v1/auth`, { signal: controller.signal });
|
|
52
|
+
clearTimeout(timeout);
|
|
53
|
+
if (res.ok || res.status === 401 || res.status === 403) {
|
|
54
|
+
return LOCAL_WIKI_URL;
|
|
55
|
+
}
|
|
56
|
+
} catch {
|
|
57
|
+
}
|
|
58
|
+
if (configUrl && configUrl !== LOCAL_WIKI_URL) {
|
|
59
|
+
try {
|
|
60
|
+
const controller = new AbortController();
|
|
61
|
+
const timeout = setTimeout(() => controller.abort(), 3e3);
|
|
62
|
+
const res = await fetch(`${configUrl}/api/v1/auth`, { signal: controller.signal });
|
|
63
|
+
clearTimeout(timeout);
|
|
64
|
+
if (res.ok || res.status === 401 || res.status === 403) {
|
|
65
|
+
return configUrl;
|
|
66
|
+
}
|
|
67
|
+
} catch {
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
async function createWikiClient() {
|
|
73
|
+
const { loadConfig } = await import("./lib/config.js");
|
|
74
|
+
const config = await loadConfig();
|
|
75
|
+
const baseUrl = await resolveWikiUrl(config.wikiUrl);
|
|
76
|
+
if (!baseUrl) return null;
|
|
77
|
+
return {
|
|
78
|
+
baseUrl,
|
|
79
|
+
apiKey: config.wikiApiKey
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async function listWorkspaces(client) {
|
|
83
|
+
const data = await wikiFetch(client, "/workspaces");
|
|
84
|
+
return (data.workspaces ?? []).map((w) => ({
|
|
85
|
+
slug: w.slug,
|
|
86
|
+
name: w.name,
|
|
87
|
+
createdAt: w.createdAt ?? "",
|
|
88
|
+
threads: w.threads ?? []
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
async function listDocuments(client, workspaceSlug) {
|
|
92
|
+
const data = await wikiFetch(
|
|
93
|
+
client,
|
|
94
|
+
`/workspace/${encodeURIComponent(workspaceSlug)}`
|
|
95
|
+
);
|
|
96
|
+
const docs = Array.isArray(data.workspace) ? data.workspace[0]?.documents ?? [] : [];
|
|
97
|
+
return docs.map((d) => ({
|
|
98
|
+
filename: d.filename ?? "untitled",
|
|
99
|
+
docpath: d.docpath,
|
|
100
|
+
workspace: workspaceSlug,
|
|
101
|
+
pinned: d.pinned ?? false
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
async function chatInWorkspace(client, workspaceSlug, message, mode = "chat") {
|
|
105
|
+
const data = await wikiFetch(
|
|
106
|
+
client,
|
|
107
|
+
`/workspace/${encodeURIComponent(workspaceSlug)}/chat`,
|
|
108
|
+
"POST",
|
|
109
|
+
{ message, mode }
|
|
110
|
+
);
|
|
111
|
+
return {
|
|
112
|
+
id: data.id ?? "",
|
|
113
|
+
type: data.type ?? "textResponse",
|
|
114
|
+
textResponse: data.textResponse ?? "",
|
|
115
|
+
sources: data.sources ?? [],
|
|
116
|
+
error: data.error ?? null
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async function getChatHistory(client, workspaceSlug, limit = 50) {
|
|
120
|
+
const data = await wikiFetch(
|
|
121
|
+
client,
|
|
122
|
+
`/workspace/${encodeURIComponent(workspaceSlug)}/chats?limit=${limit}&orderBy=desc`
|
|
123
|
+
);
|
|
124
|
+
return (data.history ?? []).reverse().map((h) => ({
|
|
125
|
+
role: h.role === "user" ? "user" : "assistant",
|
|
126
|
+
content: h.content,
|
|
127
|
+
sentAt: h.sentAt ?? 0
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
export {
|
|
131
|
+
chatInWorkspace,
|
|
132
|
+
createWikiClient,
|
|
133
|
+
getChatHistory,
|
|
134
|
+
listDocuments,
|
|
135
|
+
listWorkspaces
|
|
136
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MAX_CONCURRENT_WORKERS,
|
|
3
|
+
cleanupWorkerPid,
|
|
4
|
+
registerWorkerPid,
|
|
5
|
+
releaseBackfillLock,
|
|
6
|
+
tryAcquireBackfillLock,
|
|
7
|
+
tryAcquireWorkerSlot
|
|
8
|
+
} from "./chunk-TWYEE4FB.js";
|
|
9
|
+
import "./chunk-KVPG5UT6.js";
|
|
10
|
+
import "./chunk-X2IMCCM5.js";
|
|
11
|
+
import "./chunk-KFQGP6VL.js";
|
|
12
|
+
export {
|
|
13
|
+
MAX_CONCURRENT_WORKERS,
|
|
14
|
+
cleanupWorkerPid,
|
|
15
|
+
registerWorkerPid,
|
|
16
|
+
releaseBackfillLock,
|
|
17
|
+
tryAcquireBackfillLock,
|
|
18
|
+
tryAcquireWorkerSlot
|
|
19
|
+
};
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import "./chunk-KFQGP6VL.js";
|
|
2
|
+
|
|
3
|
+
// src/lib/worktree.ts
|
|
4
|
+
import { execSync } from "child_process";
|
|
5
|
+
import { existsSync, readFileSync, appendFileSync, mkdirSync, realpathSync } from "fs";
|
|
6
|
+
import path from "path";
|
|
7
|
+
var GIT_TIMEOUT_MS = 1e4;
|
|
8
|
+
function getGitRoot(dir) {
|
|
9
|
+
try {
|
|
10
|
+
const root = execSync("git rev-parse --show-toplevel", {
|
|
11
|
+
cwd: dir,
|
|
12
|
+
encoding: "utf-8",
|
|
13
|
+
timeout: GIT_TIMEOUT_MS,
|
|
14
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
15
|
+
}).trim();
|
|
16
|
+
return realpath(root);
|
|
17
|
+
} catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function getMainRepoRoot(dir) {
|
|
22
|
+
try {
|
|
23
|
+
const commonDir = execSync(
|
|
24
|
+
"git rev-parse --path-format=absolute --git-common-dir",
|
|
25
|
+
{ cwd: dir, encoding: "utf-8", timeout: GIT_TIMEOUT_MS, stdio: ["pipe", "pipe", "pipe"] }
|
|
26
|
+
).trim();
|
|
27
|
+
return realpath(path.dirname(commonDir));
|
|
28
|
+
} catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function worktreePath(repoRoot, employeeName, instance) {
|
|
33
|
+
const label = instanceLabel(employeeName, instance);
|
|
34
|
+
return path.join(repoRoot, ".worktrees", label);
|
|
35
|
+
}
|
|
36
|
+
function worktreeBranch(employeeName, instance) {
|
|
37
|
+
return `${instanceLabel(employeeName, instance)}-work`;
|
|
38
|
+
}
|
|
39
|
+
function instanceLabel(name, instance) {
|
|
40
|
+
return instance != null && instance > 0 ? `${name}${instance}` : name;
|
|
41
|
+
}
|
|
42
|
+
function ensureWorktree(projectDir, employeeName, instance) {
|
|
43
|
+
const repoRoot = getGitRoot(projectDir);
|
|
44
|
+
if (!repoRoot) return null;
|
|
45
|
+
const wtPath = worktreePath(repoRoot, employeeName, instance);
|
|
46
|
+
const branch = worktreeBranch(employeeName, instance);
|
|
47
|
+
if (existsSync(path.join(wtPath, ".git"))) {
|
|
48
|
+
return wtPath;
|
|
49
|
+
}
|
|
50
|
+
const worktreesDir = path.join(repoRoot, ".worktrees");
|
|
51
|
+
mkdirSync(worktreesDir, { recursive: true });
|
|
52
|
+
ensureGitignoreEntry(repoRoot, "/.worktrees/");
|
|
53
|
+
try {
|
|
54
|
+
execSync("git worktree prune", {
|
|
55
|
+
cwd: repoRoot,
|
|
56
|
+
encoding: "utf-8",
|
|
57
|
+
timeout: GIT_TIMEOUT_MS,
|
|
58
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
59
|
+
});
|
|
60
|
+
} catch {
|
|
61
|
+
}
|
|
62
|
+
const branchExists = branchExistsLocally(repoRoot, branch);
|
|
63
|
+
try {
|
|
64
|
+
if (branchExists) {
|
|
65
|
+
execSync(`git worktree add "${wtPath}" "${branch}"`, {
|
|
66
|
+
cwd: repoRoot,
|
|
67
|
+
encoding: "utf-8",
|
|
68
|
+
timeout: GIT_TIMEOUT_MS,
|
|
69
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
70
|
+
});
|
|
71
|
+
} else {
|
|
72
|
+
execSync(`git worktree add "${wtPath}" -b "${branch}" HEAD`, {
|
|
73
|
+
cwd: repoRoot,
|
|
74
|
+
encoding: "utf-8",
|
|
75
|
+
timeout: GIT_TIMEOUT_MS,
|
|
76
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return wtPath;
|
|
80
|
+
} catch (err) {
|
|
81
|
+
process.stderr.write(
|
|
82
|
+
`[worktree] Failed to create worktree for ${employeeName}: ${err instanceof Error ? err.message : String(err)}
|
|
83
|
+
`
|
|
84
|
+
);
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function isWorktreeDirty(wtPath) {
|
|
89
|
+
try {
|
|
90
|
+
const status = execSync("git status --porcelain", {
|
|
91
|
+
cwd: wtPath,
|
|
92
|
+
encoding: "utf-8",
|
|
93
|
+
timeout: GIT_TIMEOUT_MS,
|
|
94
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
95
|
+
}).trim();
|
|
96
|
+
return status.length > 0;
|
|
97
|
+
} catch {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function cleanupWorktree(projectDir, employeeName, instance) {
|
|
102
|
+
const repoRoot = getMainRepoRoot(projectDir);
|
|
103
|
+
if (!repoRoot) return { cleaned: false, reason: "not a git repo" };
|
|
104
|
+
const wtPath = worktreePath(repoRoot, employeeName, instance);
|
|
105
|
+
const branch = worktreeBranch(employeeName, instance);
|
|
106
|
+
if (!existsSync(wtPath)) {
|
|
107
|
+
return { cleaned: false, reason: "worktree does not exist" };
|
|
108
|
+
}
|
|
109
|
+
if (isWorktreeDirty(wtPath)) {
|
|
110
|
+
return { cleaned: false, reason: "worktree has uncommitted changes" };
|
|
111
|
+
}
|
|
112
|
+
const mainBranch = detectMainBranch(repoRoot);
|
|
113
|
+
if (!mainBranch) {
|
|
114
|
+
return { cleaned: false, reason: "could not determine main branch" };
|
|
115
|
+
}
|
|
116
|
+
if (!isBranchMerged(repoRoot, branch, mainBranch)) {
|
|
117
|
+
return { cleaned: false, reason: `branch ${branch} not merged into ${mainBranch}` };
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
execSync(`git worktree remove "${wtPath}"`, {
|
|
121
|
+
cwd: repoRoot,
|
|
122
|
+
encoding: "utf-8",
|
|
123
|
+
timeout: GIT_TIMEOUT_MS,
|
|
124
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
125
|
+
});
|
|
126
|
+
} catch (err) {
|
|
127
|
+
return {
|
|
128
|
+
cleaned: false,
|
|
129
|
+
reason: `git worktree remove failed: ${err instanceof Error ? err.message : String(err)}`
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
execSync(`git branch -d "${branch}"`, {
|
|
134
|
+
cwd: repoRoot,
|
|
135
|
+
encoding: "utf-8",
|
|
136
|
+
timeout: GIT_TIMEOUT_MS,
|
|
137
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
138
|
+
});
|
|
139
|
+
} catch {
|
|
140
|
+
}
|
|
141
|
+
return { cleaned: true, reason: `worktree and branch ${branch} removed (merged into ${mainBranch})` };
|
|
142
|
+
}
|
|
143
|
+
function branchExistsLocally(repoRoot, branch) {
|
|
144
|
+
try {
|
|
145
|
+
execSync(`git rev-parse --verify "refs/heads/${branch}"`, {
|
|
146
|
+
cwd: repoRoot,
|
|
147
|
+
encoding: "utf-8",
|
|
148
|
+
timeout: GIT_TIMEOUT_MS,
|
|
149
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
150
|
+
});
|
|
151
|
+
return true;
|
|
152
|
+
} catch {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function detectMainBranch(repoRoot) {
|
|
157
|
+
for (const candidate of ["main", "master"]) {
|
|
158
|
+
if (branchExistsLocally(repoRoot, candidate)) return candidate;
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
function isBranchMerged(repoRoot, branch, into) {
|
|
163
|
+
try {
|
|
164
|
+
const merged = execSync(`git branch --merged "${into}"`, {
|
|
165
|
+
cwd: repoRoot,
|
|
166
|
+
encoding: "utf-8",
|
|
167
|
+
timeout: GIT_TIMEOUT_MS,
|
|
168
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
169
|
+
});
|
|
170
|
+
return merged.split("\n").map((l) => l.replace(/^[*+]?\s+/, "").trim()).includes(branch);
|
|
171
|
+
} catch {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function realpath(p) {
|
|
176
|
+
try {
|
|
177
|
+
return realpathSync(p);
|
|
178
|
+
} catch {
|
|
179
|
+
return p;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function ensureGitignoreEntry(repoRoot, entry) {
|
|
183
|
+
try {
|
|
184
|
+
const gitignorePath = path.join(repoRoot, ".gitignore");
|
|
185
|
+
if (existsSync(gitignorePath)) {
|
|
186
|
+
const content = readFileSync(gitignorePath, "utf-8");
|
|
187
|
+
if (content.includes(entry)) return;
|
|
188
|
+
appendFileSync(gitignorePath, `
|
|
189
|
+
# Agent worktrees (exe-os)
|
|
190
|
+
${entry}
|
|
191
|
+
`);
|
|
192
|
+
} else {
|
|
193
|
+
}
|
|
194
|
+
} catch {
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
export {
|
|
198
|
+
cleanupWorktree,
|
|
199
|
+
ensureWorktree,
|
|
200
|
+
getGitRoot,
|
|
201
|
+
getMainRepoRoot,
|
|
202
|
+
isWorktreeDirty,
|
|
203
|
+
worktreeBranch,
|
|
204
|
+
worktreePath
|
|
205
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askexenow/exe-os",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.129",
|
|
4
4
|
"description": "AI employee operating system — persistent memory, task management, and multi-agent coordination for Claude Code.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"type": "module",
|