@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
package/dist/bin/exe-support.js
CHANGED
|
@@ -1,550 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import os from "os";
|
|
13
|
-
|
|
14
|
-
// src/lib/secure-files.ts
|
|
15
|
-
import { chmodSync, existsSync, mkdirSync } from "fs";
|
|
16
|
-
import { chmod, mkdir } from "fs/promises";
|
|
17
|
-
var PRIVATE_DIR_MODE = 448;
|
|
18
|
-
var PRIVATE_FILE_MODE = 384;
|
|
19
|
-
async function ensurePrivateDir(dirPath) {
|
|
20
|
-
await mkdir(dirPath, { recursive: true, mode: PRIVATE_DIR_MODE });
|
|
21
|
-
try {
|
|
22
|
-
await chmod(dirPath, PRIVATE_DIR_MODE);
|
|
23
|
-
} catch {
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
async function enforcePrivateFile(filePath) {
|
|
27
|
-
try {
|
|
28
|
-
await chmod(filePath, PRIVATE_FILE_MODE);
|
|
29
|
-
} catch {
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// src/lib/config.ts
|
|
34
|
-
function resolveDataDir() {
|
|
35
|
-
if (process.env.EXE_OS_DIR) return process.env.EXE_OS_DIR;
|
|
36
|
-
if (process.env.EXE_MEM_DIR) return process.env.EXE_MEM_DIR;
|
|
37
|
-
const newDir = path.join(os.homedir(), ".exe-os");
|
|
38
|
-
const legacyDir = path.join(os.homedir(), ".exe-mem");
|
|
39
|
-
if (!existsSync2(newDir) && existsSync2(legacyDir)) {
|
|
40
|
-
try {
|
|
41
|
-
renameSync(legacyDir, newDir);
|
|
42
|
-
process.stderr.write(`[exe-os] Migrated data directory: ~/.exe-mem \u2192 ~/.exe-os
|
|
43
|
-
`);
|
|
44
|
-
} catch {
|
|
45
|
-
return legacyDir;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return newDir;
|
|
49
|
-
}
|
|
50
|
-
var EXE_AI_DIR = resolveDataDir();
|
|
51
|
-
var DB_PATH = path.join(EXE_AI_DIR, "memories.db");
|
|
52
|
-
var MODELS_DIR = path.join(EXE_AI_DIR, "models");
|
|
53
|
-
var CONFIG_PATH = path.join(EXE_AI_DIR, "config.json");
|
|
54
|
-
var LEGACY_LANCE_PATH = path.join(EXE_AI_DIR, "local.lance");
|
|
55
|
-
var CURRENT_CONFIG_VERSION = 1;
|
|
56
|
-
var DEFAULT_CONFIG = {
|
|
57
|
-
config_version: CURRENT_CONFIG_VERSION,
|
|
58
|
-
dbPath: DB_PATH,
|
|
59
|
-
modelFile: "jina-embeddings-v5-small-q4_k_m.gguf",
|
|
60
|
-
embeddingDim: 1024,
|
|
61
|
-
batchSize: 20,
|
|
62
|
-
flushIntervalMs: 1e4,
|
|
63
|
-
autoIngestion: true,
|
|
64
|
-
autoRetrieval: true,
|
|
65
|
-
searchMode: "hybrid",
|
|
66
|
-
hookSearchMode: "hybrid",
|
|
67
|
-
fileGrepEnabled: true,
|
|
68
|
-
splashEffect: true,
|
|
69
|
-
consolidationEnabled: true,
|
|
70
|
-
consolidationIntervalMs: 6 * 60 * 60 * 1e3,
|
|
71
|
-
consolidationModel: "claude-haiku-4-5-20251001",
|
|
72
|
-
consolidationMaxCallsPerRun: 20,
|
|
73
|
-
selfQueryRouter: true,
|
|
74
|
-
selfQueryModel: "claude-haiku-4-5-20251001",
|
|
75
|
-
rerankerEnabled: true,
|
|
76
|
-
scalingRoadmap: {
|
|
77
|
-
rerankerAutoTrigger: {
|
|
78
|
-
enabled: true,
|
|
79
|
-
broadQueryMinCardinality: 5e4,
|
|
80
|
-
fetchTopK: 150,
|
|
81
|
-
returnTopK: 5
|
|
82
|
-
}
|
|
83
|
-
},
|
|
84
|
-
graphRagEnabled: true,
|
|
85
|
-
wikiEnabled: false,
|
|
86
|
-
wikiUrl: "",
|
|
87
|
-
wikiApiKey: "",
|
|
88
|
-
wikiSyncIntervalMs: 30 * 60 * 1e3,
|
|
89
|
-
wikiWorkspaceMapping: {},
|
|
90
|
-
wikiAutoUpdate: true,
|
|
91
|
-
wikiAutoUpdateThreshold: 0.5,
|
|
92
|
-
wikiAutoUpdateCreateNew: true,
|
|
93
|
-
skillLearning: true,
|
|
94
|
-
skillThreshold: 3,
|
|
95
|
-
skillModel: "claude-haiku-4-5-20251001",
|
|
96
|
-
exeHeartbeat: {
|
|
97
|
-
enabled: true,
|
|
98
|
-
intervalSeconds: 60,
|
|
99
|
-
staleInProgressThresholdHours: 2
|
|
100
|
-
},
|
|
101
|
-
sessionLifecycle: {
|
|
102
|
-
idleKillEnabled: true,
|
|
103
|
-
idleKillTicksRequired: 3,
|
|
104
|
-
idleKillIntercomAckWindowMs: 1e4,
|
|
105
|
-
maxAutoInstances: 10
|
|
106
|
-
},
|
|
107
|
-
autoUpdate: {
|
|
108
|
-
checkOnBoot: true,
|
|
109
|
-
autoInstall: false,
|
|
110
|
-
checkIntervalMs: 24 * 60 * 60 * 1e3
|
|
111
|
-
},
|
|
112
|
-
support: {
|
|
113
|
-
bugReportEndpoint: "https://askexe.com/v1/support/bug-reports"
|
|
114
|
-
},
|
|
115
|
-
orchestration: {
|
|
116
|
-
phase: "phase_1_coo",
|
|
117
|
-
phaseSetBy: "default"
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
function migrateLegacyConfig(raw) {
|
|
121
|
-
if ("r2" in raw) {
|
|
122
|
-
process.stderr.write(
|
|
123
|
-
"[exe-os] Warning: config.json contains deprecated 'r2' field from v1.0. R2 sync has been replaced in v1.1. The 'r2' field will be ignored.\n"
|
|
124
|
-
);
|
|
125
|
-
delete raw.r2;
|
|
126
|
-
}
|
|
127
|
-
if ("syncIntervalMs" in raw) {
|
|
128
|
-
delete raw.syncIntervalMs;
|
|
129
|
-
}
|
|
130
|
-
return raw;
|
|
131
|
-
}
|
|
132
|
-
var CONFIG_MIGRATIONS = [
|
|
133
|
-
{
|
|
134
|
-
from: 0,
|
|
135
|
-
to: 1,
|
|
136
|
-
migrate: (cfg) => {
|
|
137
|
-
cfg.config_version = 1;
|
|
138
|
-
return cfg;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
];
|
|
142
|
-
function migrateConfig(raw) {
|
|
143
|
-
const fromVersion = typeof raw.config_version === "number" ? raw.config_version : 0;
|
|
144
|
-
let currentVersion = fromVersion;
|
|
145
|
-
let migrated = false;
|
|
146
|
-
if (currentVersion > CURRENT_CONFIG_VERSION) {
|
|
147
|
-
return { config: raw, migrated: false, fromVersion };
|
|
148
|
-
}
|
|
149
|
-
for (const migration of CONFIG_MIGRATIONS) {
|
|
150
|
-
if (currentVersion === migration.from && migration.to <= CURRENT_CONFIG_VERSION) {
|
|
151
|
-
raw = migration.migrate(raw);
|
|
152
|
-
currentVersion = migration.to;
|
|
153
|
-
migrated = true;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
return { config: raw, migrated, fromVersion };
|
|
157
|
-
}
|
|
158
|
-
function normalizeScalingRoadmap(raw) {
|
|
159
|
-
const defaultAuto = DEFAULT_CONFIG.scalingRoadmap.rerankerAutoTrigger;
|
|
160
|
-
const userRoadmap = raw.scalingRoadmap ?? {};
|
|
161
|
-
const userAuto = userRoadmap.rerankerAutoTrigger ?? {};
|
|
162
|
-
if (userAuto.enabled === void 0 && raw.rerankerEnabled !== void 0) {
|
|
163
|
-
userAuto.enabled = raw.rerankerEnabled;
|
|
164
|
-
}
|
|
165
|
-
raw.scalingRoadmap = {
|
|
166
|
-
...userRoadmap,
|
|
167
|
-
rerankerAutoTrigger: { ...defaultAuto, ...userAuto }
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
function normalizeSessionLifecycle(raw) {
|
|
171
|
-
const defaultSL = DEFAULT_CONFIG.sessionLifecycle;
|
|
172
|
-
const userSL = raw.sessionLifecycle ?? {};
|
|
173
|
-
raw.sessionLifecycle = { ...defaultSL, ...userSL };
|
|
174
|
-
}
|
|
175
|
-
function normalizeAutoUpdate(raw) {
|
|
176
|
-
const defaultAU = DEFAULT_CONFIG.autoUpdate;
|
|
177
|
-
const userAU = raw.autoUpdate ?? {};
|
|
178
|
-
raw.autoUpdate = { ...defaultAU, ...userAU };
|
|
179
|
-
}
|
|
180
|
-
function normalizeOrchestration(raw) {
|
|
181
|
-
const defaultOrg = DEFAULT_CONFIG.orchestration;
|
|
182
|
-
const userOrg = raw.orchestration ?? {};
|
|
183
|
-
raw.orchestration = { ...defaultOrg, ...userOrg };
|
|
184
|
-
}
|
|
185
|
-
function normalizeCloudEndpoint(raw) {
|
|
186
|
-
const cloud = raw.cloud;
|
|
187
|
-
if (!cloud?.endpoint) return;
|
|
188
|
-
const ep = String(cloud.endpoint);
|
|
189
|
-
if (ep === "https://askexe.com/cloud" || ep === "https://askexe.com/cloud/") {
|
|
190
|
-
cloud.endpoint = "https://cloud.askexe.com";
|
|
191
|
-
process.stderr.write(
|
|
192
|
-
"[config] Auto-migrated cloud endpoint: askexe.com/cloud \u2192 cloud.askexe.com\n"
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
async function loadConfig() {
|
|
197
|
-
const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
|
|
198
|
-
await ensurePrivateDir(dir);
|
|
199
|
-
const configPath = path.join(dir, "config.json");
|
|
200
|
-
if (!existsSync2(configPath)) {
|
|
201
|
-
return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
|
|
202
|
-
}
|
|
203
|
-
const raw = await readFile(configPath, "utf-8");
|
|
204
|
-
try {
|
|
205
|
-
let parsed = JSON.parse(raw);
|
|
206
|
-
parsed = migrateLegacyConfig(parsed);
|
|
207
|
-
const { config: migratedCfg, migrated, fromVersion } = migrateConfig(parsed);
|
|
208
|
-
if (migrated) {
|
|
209
|
-
process.stderr.write(`[exe-os] Config migrated from v${fromVersion} to v${migratedCfg.config_version}
|
|
210
|
-
`);
|
|
211
|
-
try {
|
|
212
|
-
await writeFile(configPath, JSON.stringify(migratedCfg, null, 2) + "\n");
|
|
213
|
-
await enforcePrivateFile(configPath);
|
|
214
|
-
} catch {
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
normalizeScalingRoadmap(migratedCfg);
|
|
218
|
-
normalizeSessionLifecycle(migratedCfg);
|
|
219
|
-
normalizeAutoUpdate(migratedCfg);
|
|
220
|
-
normalizeOrchestration(migratedCfg);
|
|
221
|
-
normalizeCloudEndpoint(migratedCfg);
|
|
222
|
-
const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
|
|
223
|
-
if (config.dbPath.startsWith("~")) {
|
|
224
|
-
config.dbPath = config.dbPath.replace(/^~/, os.homedir());
|
|
225
|
-
}
|
|
226
|
-
const envDbPath = path.join(dir, "memories.db");
|
|
227
|
-
if (process.env.EXE_OS_DIR && config.dbPath !== envDbPath && !existsSync2(config.dbPath) && existsSync2(envDbPath)) {
|
|
228
|
-
config.dbPath = envDbPath;
|
|
229
|
-
}
|
|
230
|
-
return config;
|
|
231
|
-
} catch {
|
|
232
|
-
return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// src/lib/license.ts
|
|
237
|
-
import { readFileSync as readFileSync2, writeFileSync, existsSync as existsSync3, mkdirSync as mkdirSync2 } from "fs";
|
|
238
|
-
import { randomUUID } from "crypto";
|
|
239
|
-
import { createRequire } from "module";
|
|
240
|
-
import { pathToFileURL } from "url";
|
|
241
|
-
import os2 from "os";
|
|
242
|
-
import path2 from "path";
|
|
243
|
-
import { jwtVerify, importSPKI } from "jose";
|
|
244
|
-
var LICENSE_PATH = path2.join(EXE_AI_DIR, "license.key");
|
|
245
|
-
var CACHE_PATH = path2.join(EXE_AI_DIR, "license-cache.json");
|
|
246
|
-
var DEVICE_ID_PATH = path2.join(EXE_AI_DIR, "device-id");
|
|
247
|
-
var API_BASE = process.env.EXE_CLOUD_ENDPOINT ?? "https://cloud.askexe.com";
|
|
248
|
-
function loadLicense() {
|
|
249
|
-
try {
|
|
250
|
-
if (!existsSync3(LICENSE_PATH)) return null;
|
|
251
|
-
return readFileSync2(LICENSE_PATH, "utf8").trim();
|
|
252
|
-
} catch {
|
|
253
|
-
return null;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
function readCachedLicenseToken() {
|
|
257
|
-
try {
|
|
258
|
-
if (!existsSync3(CACHE_PATH)) return null;
|
|
259
|
-
const raw = JSON.parse(readFileSync2(CACHE_PATH, "utf8"));
|
|
260
|
-
return typeof raw.token === "string" ? raw.token : null;
|
|
261
|
-
} catch {
|
|
262
|
-
return null;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// src/bin/exe-support.ts
|
|
267
|
-
var DEFAULT_BUG_ENDPOINT = "https://askexe.com/v1/support/bug-reports";
|
|
268
|
-
var DEFAULT_ADMIN_ENDPOINT = "https://askexe.com/admin/support/bug-reports";
|
|
269
|
-
async function main(argv = process.argv.slice(2)) {
|
|
270
|
-
const command = argv[0] && !argv[0].startsWith("--") ? argv[0] : "health";
|
|
271
|
-
const json = argv.includes("--json");
|
|
272
|
-
const project = getArg(argv, "--project") ?? "support-smoke";
|
|
273
|
-
if (command === "help" || argv.includes("--help") || argv.includes("-h")) {
|
|
274
|
-
printHelp();
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
if (command === "health") {
|
|
278
|
-
const result = await runHealth();
|
|
279
|
-
output(result, json, "health");
|
|
280
|
-
process.exitCode = hasFailures(result) ? 1 : 0;
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
if (command === "test") {
|
|
284
|
-
const result = await runTest(project);
|
|
285
|
-
output(result, json, "test");
|
|
286
|
-
process.exitCode = hasFailures(result) ? 1 : 0;
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
console.error("Usage: exe-os support health|test [--project <name>] [--json]");
|
|
290
|
-
process.exitCode = 1;
|
|
291
|
-
}
|
|
292
|
-
async function runHealth() {
|
|
293
|
-
const checks = [];
|
|
294
|
-
const endpoints = await resolveEndpoints();
|
|
295
|
-
checks.push(checkLocalWrite());
|
|
296
|
-
checks.push({
|
|
297
|
-
check: "license_key_present",
|
|
298
|
-
level: loadLicense() ? "pass" : "fail",
|
|
299
|
-
detail: loadLicense() ? "license.key found" : "missing ~/.exe-os/license.key; run exe-os setup or exe-os cloud setup",
|
|
300
|
-
next: loadLicense() ? void 0 : "Run `exe-os setup` or ask AskExe for the customer license key."
|
|
301
|
-
});
|
|
302
|
-
checks.push({
|
|
303
|
-
check: "license_token_cached",
|
|
304
|
-
level: readCachedLicenseToken() ? "pass" : "warn",
|
|
305
|
-
detail: readCachedLicenseToken() ? "cached license token found" : "no cached token yet; support can still use license.key",
|
|
306
|
-
next: readCachedLicenseToken() ? void 0 : "This is OK if license.key exists. It refreshes after cloud/license validation."
|
|
307
|
-
});
|
|
308
|
-
try {
|
|
309
|
-
const res = await fetch(endpoints.healthEndpoint, { method: "GET", signal: AbortSignal.timeout(1e4) });
|
|
310
|
-
const body = await safeJson(res);
|
|
311
|
-
checks.push({
|
|
312
|
-
check: "support_health_endpoint",
|
|
313
|
-
level: res.ok && body?.status !== "down" ? "pass" : "fail",
|
|
314
|
-
detail: `${res.status} ${body?.status ?? res.statusText}`,
|
|
315
|
-
next: res.ok ? void 0 : "Check internet access, DNS, or AskExe support status."
|
|
316
|
-
});
|
|
317
|
-
for (const remote of body?.checks ?? []) {
|
|
318
|
-
const name = remote.name ?? "unknown";
|
|
319
|
-
checks.push({
|
|
320
|
-
check: `server_${name}`,
|
|
321
|
-
level: remote.ok === true ? "pass" : name === "admin_inbox_configured" ? "warn" : "fail",
|
|
322
|
-
detail: remote.detail ?? (remote.ok ? "ok" : "failed"),
|
|
323
|
-
next: remote.ok ? void 0 : "AskExe must fix this server-side."
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
} catch (err) {
|
|
327
|
-
checks.push({
|
|
328
|
-
check: "support_health_endpoint",
|
|
329
|
-
level: "fail",
|
|
330
|
-
detail: err instanceof Error ? err.message : String(err),
|
|
331
|
-
next: "Check internet access, then run `exe-os support health` again."
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
return checks;
|
|
335
|
-
}
|
|
336
|
-
async function runTest(project) {
|
|
337
|
-
const checks = await runHealth();
|
|
338
|
-
const endpoints = await resolveEndpoints();
|
|
339
|
-
const licenseKey = loadLicense();
|
|
340
|
-
const licenseToken = readCachedLicenseToken();
|
|
341
|
-
const id = randomUUID2();
|
|
342
|
-
const version = readPackageVersion();
|
|
343
|
-
const reportPath = writeLocalTestReport(id, project, version);
|
|
344
|
-
checks.push({ check: "local_report_file", level: "pass", detail: reportPath });
|
|
345
|
-
if (!licenseKey && !licenseToken) {
|
|
346
|
-
checks.push({
|
|
347
|
-
check: "upstream_post",
|
|
348
|
-
level: "fail",
|
|
349
|
-
detail: "not sent because this device has no license key/token",
|
|
350
|
-
next: "Run `exe-os setup` or ask AskExe to provision this customer device."
|
|
351
|
-
});
|
|
352
|
-
return checks;
|
|
353
|
-
}
|
|
354
|
-
const payload = {
|
|
355
|
-
id,
|
|
356
|
-
title: `TEST \u2014 ${project} support intake (${version})`,
|
|
357
|
-
classification: "unclear",
|
|
358
|
-
severity: "p3",
|
|
359
|
-
summary: "Synthetic exe-os support intake smoke test. Safe to close.",
|
|
360
|
-
customer_impact: "No customer impact; diagnostic only.",
|
|
361
|
-
reproduction_steps: ["Run exe-os support test"],
|
|
362
|
-
expected: "The report reaches AskExe support intake and can be triaged.",
|
|
363
|
-
actual: "Smoke test submitted by exe-os support test.",
|
|
364
|
-
package_version: `@askexenow/exe-os@${version}`,
|
|
365
|
-
project_name: project,
|
|
366
|
-
agent_id: "support-test",
|
|
367
|
-
agent_role: "diagnostic",
|
|
368
|
-
report_path: reportPath,
|
|
369
|
-
markdown: readFileSync3(reportPath, "utf8")
|
|
370
|
-
};
|
|
371
|
-
try {
|
|
372
|
-
const headers = { "content-type": "application/json" };
|
|
373
|
-
if (licenseKey) headers["x-exe-license-key"] = licenseKey;
|
|
374
|
-
if (licenseToken) headers["x-exe-license-token"] = licenseToken;
|
|
375
|
-
const res = await fetch(endpoints.bugEndpoint, {
|
|
376
|
-
method: "POST",
|
|
377
|
-
headers,
|
|
378
|
-
body: JSON.stringify(payload),
|
|
379
|
-
signal: AbortSignal.timeout(15e3)
|
|
380
|
-
});
|
|
381
|
-
const data = await safeJson(res);
|
|
382
|
-
checks.push({
|
|
383
|
-
check: "upstream_post",
|
|
384
|
-
level: res.ok ? "pass" : "fail",
|
|
385
|
-
detail: res.ok ? `sent id=${String(data?.id ?? id)}` : summarizeHttpFailure(res.status, data),
|
|
386
|
-
next: res.ok ? void 0 : nextForPostFailure(res.status)
|
|
387
|
-
});
|
|
388
|
-
if (res.ok) {
|
|
389
|
-
checks.push(await maybeCloseAdmin(String(data?.id ?? id), endpoints.adminEndpoint, version));
|
|
390
|
-
}
|
|
391
|
-
} catch (err) {
|
|
392
|
-
checks.push({
|
|
393
|
-
check: "upstream_post",
|
|
394
|
-
level: "fail",
|
|
395
|
-
detail: err instanceof Error ? err.message : String(err),
|
|
396
|
-
next: "Check internet access, then run `exe-os support test` again."
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
return checks;
|
|
400
|
-
}
|
|
401
|
-
async function resolveEndpoints() {
|
|
402
|
-
const config = await loadConfig();
|
|
403
|
-
const bugEndpoint = process.env.EXE_SUPPORT_BUG_REPORT_ENDPOINT ?? config.support?.bugReportEndpoint ?? DEFAULT_BUG_ENDPOINT;
|
|
404
|
-
const healthEndpoint = process.env.EXE_SUPPORT_HEALTH_ENDPOINT ?? bugEndpoint.replace(/\/bug-reports\/?$/, "/health");
|
|
405
|
-
const adminEndpoint = process.env.ASKEXE_SUPPORT_ADMIN_ENDPOINT ?? process.env.EXE_SUPPORT_ADMIN_ENDPOINT ?? DEFAULT_ADMIN_ENDPOINT;
|
|
406
|
-
return { bugEndpoint, healthEndpoint, adminEndpoint };
|
|
407
|
-
}
|
|
408
|
-
function checkLocalWrite() {
|
|
409
|
-
const dir = path3.join(EXE_AI_DIR, "bug-reports");
|
|
410
|
-
const testPath = path3.join(dir, ".support-write-test");
|
|
411
|
-
try {
|
|
412
|
-
mkdirSync3(dir, { recursive: true, mode: 448 });
|
|
413
|
-
writeFileSync2(testPath, "ok\n", { mode: 384 });
|
|
414
|
-
unlinkSync(testPath);
|
|
415
|
-
return { check: "local_bug_report_dir_writable", level: "pass", detail: dir };
|
|
416
|
-
} catch (err) {
|
|
417
|
-
return {
|
|
418
|
-
check: "local_bug_report_dir_writable",
|
|
419
|
-
level: "fail",
|
|
420
|
-
detail: err instanceof Error ? err.message : String(err),
|
|
421
|
-
next: "Fix permissions on ~/.exe-os or rerun setup on a writable user account."
|
|
422
|
-
};
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
function writeLocalTestReport(id, project, version) {
|
|
426
|
-
const dir = path3.join(EXE_AI_DIR, "bug-reports");
|
|
427
|
-
mkdirSync3(dir, { recursive: true, mode: 448 });
|
|
428
|
-
const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
429
|
-
const filePath = path3.join(dir, `${date}-support-intake-test-${id.slice(0, 8)}.md`);
|
|
430
|
-
writeFileSync2(filePath, `# TEST \u2014 ${project} support intake
|
|
431
|
-
|
|
432
|
-
Report ID: ${id}
|
|
433
|
-
Package: @askexenow/exe-os@${version}
|
|
434
|
-
|
|
435
|
-
Synthetic smoke test from \`exe-os support test\`. Safe to close.
|
|
436
|
-
`, { mode: 384 });
|
|
437
|
-
return filePath;
|
|
438
|
-
}
|
|
439
|
-
async function maybeCloseAdmin(id, adminEndpoint, version) {
|
|
440
|
-
const token = process.env.ASKEXE_SUPPORT_ADMIN_TOKEN ?? process.env.EXE_SUPPORT_ADMIN_TOKEN;
|
|
441
|
-
if (!token) {
|
|
442
|
-
return { check: "askexe_admin_autoclose", level: "warn", detail: "skipped; admin token is AskExe-only" };
|
|
443
|
-
}
|
|
444
|
-
try {
|
|
445
|
-
const res = await fetch(`${adminEndpoint}/${encodeURIComponent(id)}`, {
|
|
446
|
-
method: "PATCH",
|
|
447
|
-
headers: { authorization: `Bearer ${token}`, "content-type": "application/json" },
|
|
448
|
-
body: JSON.stringify({
|
|
449
|
-
status: "closed",
|
|
450
|
-
triage_notes: "Auto-closed synthetic support smoke test.",
|
|
451
|
-
fixed_version: version
|
|
452
|
-
}),
|
|
453
|
-
signal: AbortSignal.timeout(1e4)
|
|
454
|
-
});
|
|
455
|
-
return {
|
|
456
|
-
check: "askexe_admin_autoclose",
|
|
457
|
-
level: res.ok ? "pass" : "warn",
|
|
458
|
-
detail: res.ok ? "closed" : `${res.status} ${await res.text()}`,
|
|
459
|
-
next: res.ok ? void 0 : "Report was sent; AskExe can close the smoke report manually."
|
|
460
|
-
};
|
|
461
|
-
} catch (err) {
|
|
462
|
-
return {
|
|
463
|
-
check: "askexe_admin_autoclose",
|
|
464
|
-
level: "warn",
|
|
465
|
-
detail: err instanceof Error ? err.message : String(err),
|
|
466
|
-
next: "Report was sent; AskExe can close the smoke report manually."
|
|
467
|
-
};
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
function readPackageVersion() {
|
|
471
|
-
let dir = path3.dirname(new URL(import.meta.url).pathname);
|
|
472
|
-
for (let i = 0; i < 6; i++) {
|
|
473
|
-
const pkg = path3.join(dir, "package.json");
|
|
474
|
-
try {
|
|
475
|
-
const parsed = JSON.parse(readFileSync3(pkg, "utf8"));
|
|
476
|
-
if (parsed.version) return parsed.version;
|
|
477
|
-
} catch {
|
|
478
|
-
}
|
|
479
|
-
dir = path3.dirname(dir);
|
|
480
|
-
}
|
|
481
|
-
return "unknown";
|
|
482
|
-
}
|
|
483
|
-
async function safeJson(res) {
|
|
484
|
-
try {
|
|
485
|
-
return await res.json();
|
|
486
|
-
} catch {
|
|
487
|
-
return null;
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
function getArg(argv, name) {
|
|
491
|
-
const idx = argv.indexOf(name);
|
|
492
|
-
if (idx >= 0) return argv[idx + 1];
|
|
493
|
-
const prefix = `${name}=`;
|
|
494
|
-
const found = argv.find((arg) => arg.startsWith(prefix));
|
|
495
|
-
return found?.slice(prefix.length);
|
|
496
|
-
}
|
|
497
|
-
function hasFailures(rows) {
|
|
498
|
-
return rows.some((row) => row.level === "fail");
|
|
499
|
-
}
|
|
500
|
-
function summarizeHttpFailure(status, data) {
|
|
501
|
-
const error = data?.error;
|
|
502
|
-
return `${status} ${error?.message ?? JSON.stringify(data)}`;
|
|
503
|
-
}
|
|
504
|
-
function nextForPostFailure(status) {
|
|
505
|
-
if (status === 401) return "License credentials were not sent. Run `exe-os support health` and check license_key_present.";
|
|
506
|
-
if (status === 403) return "License is valid locally but not accepted by support intake. AskExe must check server-side license provisioning.";
|
|
507
|
-
if (status >= 500) return "AskExe support intake is unhealthy server-side. Try again shortly and report the local file path.";
|
|
508
|
-
return "Run `exe-os support health`; if it passes, send this output to AskExe.";
|
|
509
|
-
}
|
|
510
|
-
function printHelp() {
|
|
511
|
-
console.log(`
|
|
512
|
-
exe-os support
|
|
513
|
-
|
|
514
|
-
Customer-safe diagnostics for AskExe bug-report intake.
|
|
515
|
-
|
|
516
|
-
Commands:
|
|
517
|
-
exe-os support health Check local setup + AskExe support server health
|
|
518
|
-
exe-os support test --project hygo Send a safe smoke report end-to-end
|
|
519
|
-
|
|
520
|
-
What success means:
|
|
521
|
-
health = this device looks ready
|
|
522
|
-
test = AskExe received a real report from this device
|
|
523
|
-
`);
|
|
524
|
-
}
|
|
525
|
-
function output(rows, json, command) {
|
|
526
|
-
if (json) {
|
|
527
|
-
console.log(JSON.stringify({ ok: !hasFailures(rows), checks: rows }, null, 2));
|
|
528
|
-
return;
|
|
529
|
-
}
|
|
530
|
-
console.log(`
|
|
531
|
-
exe-os support ${command}
|
|
532
|
-
`);
|
|
533
|
-
for (const row of rows) {
|
|
534
|
-
const icon = row.level === "pass" ? "\u2705" : row.level === "warn" ? "\u26A0\uFE0F " : "\u274C";
|
|
535
|
-
console.log(`${icon} ${row.check}: ${row.detail}`);
|
|
536
|
-
if (row.next) console.log(` \u2192 ${row.next}`);
|
|
537
|
-
}
|
|
538
|
-
console.log("");
|
|
539
|
-
if (hasFailures(rows)) {
|
|
540
|
-
console.log("Result: not ready. Fix the failed item(s), then rerun this command.");
|
|
541
|
-
} else if (rows.some((row) => row.level === "warn")) {
|
|
542
|
-
console.log("Result: ready with warnings. Bug reports can be sent; warnings are informational unless AskExe asked for stricter validation.");
|
|
543
|
-
} else {
|
|
544
|
-
console.log(command === "test" ? "Result: ready. AskExe received the test report." : "Result: ready. Run `exe-os support test --project <customer>` for an end-to-end send test.");
|
|
545
|
-
}
|
|
546
|
-
console.log("");
|
|
547
|
-
}
|
|
2
|
+
import {
|
|
3
|
+
hasFailures,
|
|
4
|
+
main,
|
|
5
|
+
runHealth,
|
|
6
|
+
runTest
|
|
7
|
+
} from "../chunk-55S56YDO.js";
|
|
8
|
+
import "../chunk-IRQTM7DY.js";
|
|
9
|
+
import "../chunk-KVPG5UT6.js";
|
|
10
|
+
import "../chunk-X2IMCCM5.js";
|
|
11
|
+
import "../chunk-KFQGP6VL.js";
|
|
548
12
|
export {
|
|
549
13
|
hasFailures,
|
|
550
14
|
main,
|