turbollm 1.12.3 → 1.12.5
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/README.md +6 -1
- package/dist/android-preload.cjs +35 -0
- package/dist/chunk-5HBNOSJB.js +46 -0
- package/dist/chunk-6GI5HUKN.js +3743 -0
- package/dist/chunk-D2YPYKUY.js +48 -0
- package/dist/cli.js +13719 -16924
- package/dist/code-routes.js +985 -0
- package/dist/code-run-manager.js +12 -0
- package/dist/package.json +1 -0
- package/dist/resolve-executable-N5Z22V66.js +8 -0
- package/dist/shell-command-7HA6D5PW.js +14 -0
- package/dist/sql-js-database-DRKIVWYL.js +107 -0
- package/dist/webdist/assets/{AgentEditPage-CE4lxy1g.js → AgentEditPage-C4VY0moS.js} +1 -1
- package/dist/webdist/assets/{ChatScreen-BWZFrPkm.js → ChatScreen-DMl17RGg.js} +15 -15
- package/dist/webdist/assets/CodeComposer-NwJXV-sS.js +1 -0
- package/dist/webdist/assets/CodeHomeScreen-DxYMMclP.js +1 -0
- package/dist/webdist/assets/{CodeSessionScreen-p9tPPoVe.js → CodeSessionScreen-D-JVlqpE.js} +3 -3
- package/dist/webdist/assets/CustomizeScreen-BMrb1z3q.js +4 -0
- package/dist/webdist/assets/DeveloperScreen-pWGlvGUQ.js +1 -0
- package/dist/webdist/assets/EnginesScreen-CUF3ct2C.js +8 -0
- package/dist/webdist/assets/HardwareSection-CFYmYeI_.js +1 -0
- package/dist/webdist/assets/ModelDetailDialog-CX9Nwgko.js +1 -0
- package/dist/webdist/assets/ModelLoadMenu-CpTSQyrz.js +1 -0
- package/dist/webdist/assets/ModelsScreen-CNcbFWD5.js +2 -0
- package/dist/webdist/assets/MonitorScreen-CcWi0WA5.js +2 -0
- package/dist/webdist/assets/OnboardingScreen-BJsWdk3r.js +1 -0
- package/dist/webdist/assets/RoutineEditPage-BlNJkZLy.js +1 -0
- package/dist/webdist/assets/RoutinesPanel-dMiytZym.js +1 -0
- package/dist/webdist/assets/SettingsScreen-4-vbStcH.js +2 -0
- package/dist/webdist/assets/SidebarResizeHandle-Zs-1qltv.js +2 -0
- package/dist/webdist/assets/{SkillEditPage-CswptEm0.js → SkillEditPage-ggZet3Hq.js} +1 -1
- package/dist/webdist/assets/TokensScreen-DUgZza1M.js +1 -0
- package/dist/webdist/assets/{ToolApprovalBar-Ctxtcdk_.js → ToolApprovalBar-OQucQFQf.js} +3 -3
- package/dist/webdist/assets/WorkspaceScreen-DFgY3aJv.js +1 -0
- package/dist/webdist/assets/{abnfDiagram-N423BO3Z-wYX3XzEU.js → abnfDiagram-N423BO3Z-SHwyKkJQ.js} +1 -1
- package/dist/webdist/assets/{agent-api-CNgD3AG5.js → agent-api-CFwqFCzt.js} +1 -1
- package/dist/webdist/assets/alert-dialog-CVqoWRWc.js +1 -0
- package/dist/webdist/assets/{arc-CAVYLnrV.js → arc-DqmuRpYc.js} +1 -1
- package/dist/webdist/assets/{architectureDiagram-T3A2C74G-B-ep8-Wc.js → architectureDiagram-T3A2C74G-D7FxJSd4.js} +1 -1
- package/dist/webdist/assets/{arrow-left-BUyjb-eA.js → arrow-left-BkV1B6ug.js} +1 -1
- package/dist/webdist/assets/{badge-fTl4lUnO.js → badge-4b8OsMEX.js} +1 -1
- package/dist/webdist/assets/{blockDiagram-VBNYF7ZC-C_yOS3Cn.js → blockDiagram-VBNYF7ZC-DUxFHegq.js} +1 -1
- package/dist/webdist/assets/{bot-DjnxX6n5.js → bot-BK-6NRqy.js} +1 -1
- package/dist/webdist/assets/{c4Diagram-5PPSVZJV-yQy5pOFU.js → c4Diagram-5PPSVZJV-BNivJaYT.js} +1 -1
- package/dist/webdist/assets/channel-CY9E1Kb4.js +1 -0
- package/dist/webdist/assets/{chat-api-Cm7puych.js → chat-api-DlO-w34y.js} +1 -1
- package/dist/webdist/assets/{chat-queries-flf3EhI8.js → chat-queries-LKWLAeuG.js} +1 -1
- package/dist/webdist/assets/{chevron-down-BMj_J4Z6.js → chevron-down-zbOJaXec.js} +1 -1
- package/dist/webdist/assets/{chevron-left-CcApbuPp.js → chevron-left-DwWh7ZHr.js} +1 -1
- package/dist/webdist/assets/{chevron-right-DcT_N4lU.js → chevron-right-BdDJxnyQ.js} +1 -1
- package/dist/webdist/assets/{chunk-2GRJ4B5K-DGiFq5-O.js → chunk-2GRJ4B5K-aQaE3vvo.js} +1 -1
- package/dist/webdist/assets/{chunk-2Q5K7J3B-D3EdskXA.js → chunk-2Q5K7J3B-Bjz5EQqP.js} +1 -1
- package/dist/webdist/assets/{chunk-5RXB4S5H-BidckIKz.js → chunk-5RXB4S5H-BH5ljOIu.js} +1 -1
- package/dist/webdist/assets/{chunk-5VM5RSS4-DOxfljEH.js → chunk-5VM5RSS4-CsIYJ0Jp.js} +1 -1
- package/dist/webdist/assets/{chunk-6Q2QTUOP-DAYq99TW.js → chunk-6Q2QTUOP-DMRqg9RQ.js} +1 -1
- package/dist/webdist/assets/{chunk-GF5L2VYU-CRAn0Eq3.js → chunk-GF5L2VYU-DkpR5VII.js} +1 -1
- package/dist/webdist/assets/{chunk-JWPE2WC7-DHQMj5yT.js → chunk-JWPE2WC7-BD1-fEKP.js} +1 -1
- package/dist/webdist/assets/{chunk-KBJHAD2P-CVzZvxJP.js → chunk-KBJHAD2P-DbesCmhG.js} +1 -1
- package/dist/webdist/assets/{chunk-RYQCIY6F-BmrJERxa.js → chunk-RYQCIY6F-BlX7uhQc.js} +1 -1
- package/dist/webdist/assets/{chunk-XXDRQBXY-DEZG0EV3.js → chunk-XXDRQBXY-B5SFnzz3.js} +1 -1
- package/dist/webdist/assets/{circle-check-BNjlHnHh.js → circle-check-BPE-i-tc.js} +1 -1
- package/dist/webdist/assets/{circle-x-DV1nLTK3.js → circle-x-xsk30GP6.js} +1 -1
- package/dist/webdist/assets/classDiagram-JCYQIIEL-P_ZoCHhi.js +1 -0
- package/dist/webdist/assets/classDiagram-v2-OCEON4UE-P_ZoCHhi.js +1 -0
- package/dist/webdist/assets/collapsible-CNfR4Moz.js +1 -0
- package/dist/webdist/assets/{common-CaQP3vin.js → common-DKmzP8Iu.js} +1 -1
- package/dist/webdist/assets/{cose-bilkent-JH36ORCC-Bq5B3ICk.js → cose-bilkent-JH36ORCC-CQqOUIWj.js} +1 -1
- package/dist/webdist/assets/{cynefin-VYW2F7L2-DZle68dV.js → cynefin-VYW2F7L2-D9iY9Afn.js} +1 -1
- package/dist/webdist/assets/{cynefinDiagram-MW4NZA55-CfM3dACl.js → cynefinDiagram-MW4NZA55-BteySMfQ.js} +1 -1
- package/dist/webdist/assets/{dagre-VZM6K2ZE-DnxnfNsU.js → dagre-VZM6K2ZE-CgfkgcDR.js} +1 -1
- package/dist/webdist/assets/{diagram-7IWD3JNH-j2-QzJMm.js → diagram-7IWD3JNH-egXofmHL.js} +1 -1
- package/dist/webdist/assets/{diagram-B4RE2ZJO-b38UCmx1.js → diagram-B4RE2ZJO-CadYFhIH.js} +1 -1
- package/dist/webdist/assets/{diagram-LBJQPF4R-CdkW-WA-.js → diagram-LBJQPF4R-SLVfTI-S.js} +1 -1
- package/dist/webdist/assets/{diagram-Q27KOJAE-B0R9y_o4.js → diagram-Q27KOJAE-BWp4lrgb.js} +1 -1
- package/dist/webdist/assets/{diagram-UB23O5K3-ChZYNuxT.js → diagram-UB23O5K3-DnGLUoSC.js} +1 -1
- package/dist/webdist/assets/{dropdown-menu-CzL84hjo.js → dropdown-menu-CtEFJwSB.js} +1 -1
- package/dist/webdist/assets/{ebnfDiagram-BXEA7PRR-Df2n-V3W.js → ebnfDiagram-BXEA7PRR-bM2FJmRT.js} +1 -1
- package/dist/webdist/assets/{erDiagram-JOGREHBK-CJwWpaRB.js → erDiagram-JOGREHBK-j1DtaL1m.js} +1 -1
- package/dist/webdist/assets/{external-link-Bqgcz-GW.js → external-link-DF5_PKjr.js} +1 -1
- package/dist/webdist/assets/{file-text-CAqmQYG6.js → file-text-B0wPbdZg.js} +1 -1
- package/dist/webdist/assets/{flowDiagram-UKHOOZJN-Bd94ldad.js → flowDiagram-UKHOOZJN-D5MLDKXv.js} +1 -1
- package/dist/webdist/assets/{folder-input-dy5PCMy4.js → folder-input-BvyBtyaL.js} +1 -1
- package/dist/webdist/assets/{folder-plus-YR4wA8PT.js → folder-plus-DIX0-FRl.js} +1 -1
- package/dist/webdist/assets/{ganttDiagram-PKOTCBZU-DYeYOb2A.js → ganttDiagram-PKOTCBZU-BU1NVhpe.js} +1 -1
- package/dist/webdist/assets/{git-branch-BZWrq5B1.js → git-branch-CZ9MmZFb.js} +1 -1
- package/dist/webdist/assets/{gitGraphDiagram-DS77QQ5N-CvZdup4u.js → gitGraphDiagram-DS77QQ5N-CcL-ug-a.js} +1 -1
- package/dist/webdist/assets/{index-4QuGA7c6.js → index-BgulNYpG.js} +10 -10
- package/dist/webdist/assets/index-CCx71xgV.css +1 -0
- package/dist/webdist/assets/{index-B-lM0jtZ.js → index-Cx7COERb.js} +1 -1
- package/dist/webdist/assets/{infoDiagram-6WML65LV-jwAgJ0e9.js → infoDiagram-6WML65LV-BC-1EBgz.js} +1 -1
- package/dist/webdist/assets/{ishikawaDiagram-WSZJBQD7-BEdaiV3h.js → ishikawaDiagram-WSZJBQD7-GhjTdjOb.js} +1 -1
- package/dist/webdist/assets/{journeyDiagram-NVQOT4AX-CdVLYVhh.js → journeyDiagram-NVQOT4AX-B2vSQHW_.js} +1 -1
- package/dist/webdist/assets/{kanban-definition-27J2QSJJ-DT-DsTQr.js → kanban-definition-27J2QSJJ-BnIqm05v.js} +1 -1
- package/dist/webdist/assets/{linear-BrxtevgR.js → linear-are_XCSp.js} +1 -1
- package/dist/webdist/assets/link-queries-CHljIqX5.js +1 -0
- package/dist/webdist/assets/{lock-zeDOBniP.js → lock-DOK52bNq.js} +1 -1
- package/dist/webdist/assets/{mermaid.core-B9NxJSlE.js → mermaid.core-CR7ptkEZ.js} +4 -4
- package/dist/webdist/assets/{mindmap-definition-FAOFIHXS-BPQfqoP2.js → mindmap-definition-FAOFIHXS-BHxebqeh.js} +1 -1
- package/dist/webdist/assets/{monitor-BDzPa5YN.js → monitor-Dt5Ru2xZ.js} +1 -1
- package/dist/webdist/assets/onboarding-pick-BLFfRRkr.js +1 -0
- package/dist/webdist/assets/{pegDiagram-VL7TDLO6-CR4mTeP-.js → pegDiagram-VL7TDLO6-BQ5Ca2hG.js} +1 -1
- package/dist/webdist/assets/{pencil-BtEhdGP-.js → pencil-CH8Hr8E3.js} +1 -1
- package/dist/webdist/assets/{personas-BK5wc_P3.js → personas-D9neeRkw.js} +4 -4
- package/dist/webdist/assets/{pieDiagram-7S7Q4E2Y-DPD5scZh.js → pieDiagram-7S7Q4E2Y-CHfF2sPP.js} +1 -1
- package/dist/webdist/assets/{plus-D3Tv9cim.js → plus-D_ggg7WE.js} +1 -1
- package/dist/webdist/assets/{quadrantDiagram-CIZ2JOQS-DsESOJc6.js → quadrantDiagram-CIZ2JOQS-BMcM-HmJ.js} +1 -1
- package/dist/webdist/assets/{radix-DW4bWMkB.js → radix-Dr6k323W.js} +1 -1
- package/dist/webdist/assets/{railroadDiagram-AXF67PYL-U15r6DjT.js → railroadDiagram-AXF67PYL-CScIXm39.js} +1 -1
- package/dist/webdist/assets/{refresh-cw-BemgDv3Q.js → refresh-cw-B7Jn8FQQ.js} +1 -1
- package/dist/webdist/assets/{remote-failure-Ddau3S9z.js → remote-failure-D02-Qz17.js} +1 -1
- package/dist/webdist/assets/{requirementDiagram-LRYGKXZP-DDeRZQ__.js → requirementDiagram-LRYGKXZP-BOWjiS08.js} +1 -1
- package/dist/webdist/assets/{rocket-Uil5x1E9.js → rocket-bz4PERJI.js} +1 -1
- package/dist/webdist/assets/{rotate-ccw-Bar4GXPb.js → rotate-ccw-BQSKwfxQ.js} +1 -1
- package/dist/webdist/assets/{sankeyDiagram-W5VNT64P-BMTSd4xI.js → sankeyDiagram-W5VNT64P-C1fy2KmI.js} +1 -1
- package/dist/webdist/assets/search-Je8bpSwy.js +1 -0
- package/dist/webdist/assets/{sequenceDiagram-SI44F4Z6-DdMCm5jm.js → sequenceDiagram-SI44F4Z6-CUce2Nmx.js} +1 -1
- package/dist/webdist/assets/{sizeCapture-X5ZJPWSS-2IYIZrFi.js → sizeCapture-X5ZJPWSS-Do8gYr4s.js} +1 -1
- package/dist/webdist/assets/skeleton-B8GrdksY.js +1 -0
- package/dist/webdist/assets/{sliders-horizontal-DFahpoGu.js → sliders-horizontal-B65_miAJ.js} +1 -1
- package/dist/webdist/assets/{sparkles-BYaOifNR.js → sparkles-D5BySk1L.js} +1 -1
- package/dist/webdist/assets/{star-HYST5DWB.js → star-gDhncBNW.js} +1 -1
- package/dist/webdist/assets/{stateDiagram-OKZ733FA-DgPdyEyJ.js → stateDiagram-OKZ733FA-O2JTTQeQ.js} +1 -1
- package/dist/webdist/assets/stateDiagram-v2-UEYNNEHI-DgY0HcET.js +1 -0
- package/dist/webdist/assets/{swimlanes-SLNWSIFB-CxbQXrF7.js → swimlanes-SLNWSIFB-DUQC8WqG.js} +2 -2
- package/dist/webdist/assets/swimlanesDiagram-ULZ7WXOC-CI9ngVuS.js +8 -0
- package/dist/webdist/assets/{switch-VYcKekwB.js → switch-Cj1Na-eN.js} +1 -1
- package/dist/webdist/assets/{terminal-BXEMsYi1.js → terminal-pWu2qk8h.js} +1 -1
- package/dist/webdist/assets/{timeline-definition-Z64GVDOM-BN25-Wyy.js → timeline-definition-Z64GVDOM-y2fizDmT.js} +1 -1
- package/dist/webdist/assets/{trash-2-BNwq5WtQ.js → trash-2-BczQb4TK.js} +1 -1
- package/dist/webdist/assets/{triangle-alert-DTK5P852.js → triangle-alert-B4-Qf1AC.js} +1 -1
- package/dist/webdist/assets/use-engine-log-kaqJp0Mi.js +1 -0
- package/dist/webdist/assets/{vennDiagram-T6HMQDX7-Cmn8MOEp.js → vennDiagram-T6HMQDX7-Dmx8Uh-S.js} +1 -1
- package/dist/webdist/assets/vram-DPDyCsNQ.js +1 -0
- package/dist/webdist/assets/{wardleyDiagram-T6FBY63Y-AS3obg9i.js → wardleyDiagram-T6FBY63Y-C9Fob2YW.js} +1 -1
- package/dist/webdist/assets/{wrench-B5967UE3.js → wrench-84EHyYx6.js} +1 -1
- package/dist/webdist/assets/{xychartDiagram-ELKLHX3M-puQ_9bb2.js → xychartDiagram-ELKLHX3M-TsEHKCX0.js} +1 -1
- package/dist/webdist/index.html +4 -4
- package/package.json +7 -3
- package/dist/webdist/assets/CodeComposer-53_HhRBK.js +0 -1
- package/dist/webdist/assets/CodeHomeScreen-D1alRzQa.js +0 -1
- package/dist/webdist/assets/CustomizeScreen-CebO4Kif.js +0 -4
- package/dist/webdist/assets/DeveloperScreen-CI5WYmmt.js +0 -1
- package/dist/webdist/assets/EnginesScreen-DjzBXrbU.js +0 -8
- package/dist/webdist/assets/ModelDetailDialog-CriVmDMu.js +0 -1
- package/dist/webdist/assets/ModelLoadMenu-yzCvMZFM.js +0 -1
- package/dist/webdist/assets/ModelsScreen-BLosszVi.js +0 -2
- package/dist/webdist/assets/OnboardingScreen-1Eh4MMsz.js +0 -1
- package/dist/webdist/assets/RoutineEditPage-BBptNINr.js +0 -1
- package/dist/webdist/assets/RoutinesPanel-DA1e-FlT.js +0 -1
- package/dist/webdist/assets/SettingsScreen-CE211J25.js +0 -2
- package/dist/webdist/assets/SidebarResizeHandle-BS9E0P8t.js +0 -2
- package/dist/webdist/assets/TokensScreen-DqX7R08T.js +0 -1
- package/dist/webdist/assets/WorkspaceScreen-82kXmjux.js +0 -1
- package/dist/webdist/assets/alert-dialog-DtFUjjf-.js +0 -1
- package/dist/webdist/assets/channel-CMLjxq8A.js +0 -1
- package/dist/webdist/assets/classDiagram-JCYQIIEL-BaxaaW6h.js +0 -1
- package/dist/webdist/assets/classDiagram-v2-OCEON4UE-BaxaaW6h.js +0 -1
- package/dist/webdist/assets/collapsible-DDR_RndG.js +0 -1
- package/dist/webdist/assets/index-D4C8JIlz.css +0 -1
- package/dist/webdist/assets/link-queries-C3HTfth1.js +0 -1
- package/dist/webdist/assets/skeleton-MlF2228j.js +0 -1
- package/dist/webdist/assets/stateDiagram-v2-UEYNNEHI-Bi2zf8yv.js +0 -1
- package/dist/webdist/assets/swimlanesDiagram-ULZ7WXOC-DvkgZzhL.js +0 -8
- package/dist/webdist/assets/vram-CyjPY3u5.js +0 -1
package/README.md
CHANGED
|
@@ -507,6 +507,10 @@ above.
|
|
|
507
507
|
llama.cpp-compatible fork's git URL (+ optional branch, defaults to the repo's own default) and
|
|
508
508
|
build it in-app with the same 1-click flow, no separate "point at a folder" step needed.
|
|
509
509
|
|
|
510
|
+
Branch pickers and engine update checks both read GitHub's API, which allows 60 anonymous
|
|
511
|
+
requests an hour. If you run into that ceiling, add a **GitHub token** in Settings → Models &
|
|
512
|
+
loading to raise it to 5,000/hour — it is write-only and never leaves your machine.
|
|
513
|
+
|
|
510
514
|
**Auto-provisioned default.** Don't want to fetch anything? On first run TurboLLM downloads
|
|
511
515
|
the right upstream prebuilt for your GPU automatically — and a **backend picker** lets you
|
|
512
516
|
switch between CUDA / ROCm / Metal / SYCL / Vulkan / CPU at any time (it downloads the variant
|
|
@@ -624,7 +628,8 @@ Use `--config <file>` to point at an alternate config (its directory becomes the
|
|
|
624
628
|
|
|
625
629
|
</details>
|
|
626
630
|
|
|
627
|
-
- **Windows, macOS, or Linux
|
|
631
|
+
- **Windows, macOS, or Linux** for `npx turbollm`. A native **Android app** also exists, with a
|
|
632
|
+
bundled Vulkan-accelerated engine — currently in closed/open testing, see turbollm.dev.
|
|
628
633
|
- A GPU is recommended but **not required** — a CPU build is provisioned as a fallback.
|
|
629
634
|
- On Windows, the first time the auto-downloaded `llama-server` runs, SmartScreen/Defender may
|
|
630
635
|
prompt (it's an upstream binary). Allow it once.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// TurboLLM Android's `--require` preload for the embedded (nodejs-mobile) Node 18.20.4
|
|
2
|
+
// runtime (see NodeRuntimeLauncher.android.kt's startScript, which passes this via
|
|
3
|
+
// `--require` BEFORE the entry script path).
|
|
4
|
+
//
|
|
5
|
+
// Why a --require preload and not a normal import/require inside cli.ts: confirmed live that
|
|
6
|
+
// a plain top-level ESM import at the very top of cli.ts's own source does NOT reliably run
|
|
7
|
+
// before every other module in its import graph. Node's ESM linker executes CommonJS
|
|
8
|
+
// dependencies' top-level code as part of resolving their NAMED EXPORTS during the LINK
|
|
9
|
+
// phase, which covers the whole import graph before ANY module (including the entry module's
|
|
10
|
+
// own body) reaches evaluation — so "first import in the source" does not mean "runs first".
|
|
11
|
+
// A `--require` preload runs via Node's own CLI bootstrap strictly before it even begins
|
|
12
|
+
// loading the entry module, which is the only mechanism confirmed to reliably beat that phase.
|
|
13
|
+
//
|
|
14
|
+
// The actual bug this works around: this embedded Node build does not expose the WHATWG
|
|
15
|
+
// `File` global that `undici` (an npm dependency, used transitively for fetch) reads at its
|
|
16
|
+
// own module-load time (`node_modules/undici/lib/web/webidl/index.js` does
|
|
17
|
+
// `webidl.is.File = webidl.util.MakeTypeAssertion(File)`), which throws
|
|
18
|
+
// `ReferenceError: File is not defined` and crashes the whole daemon before any of its own
|
|
19
|
+
// code runs. Desktop Node exposes `File` as a global; this build's own `node:buffer` module
|
|
20
|
+
// does NOT re-export `File` either (confirmed live — re-exporting it as the global had zero
|
|
21
|
+
// effect), so this builds a minimal polyfill on `Blob` instead, which is stable since Node 15
|
|
22
|
+
// and far more likely to have survived a size-stripped mobile build.
|
|
23
|
+
'use strict'
|
|
24
|
+
|
|
25
|
+
if (typeof globalThis.File === 'undefined') {
|
|
26
|
+
const { Blob } = require('node:buffer')
|
|
27
|
+
class PolyfillFile extends Blob {
|
|
28
|
+
constructor(fileBits, fileName, options = {}) {
|
|
29
|
+
super(fileBits, options)
|
|
30
|
+
this.name = fileName
|
|
31
|
+
this.lastModified = options.lastModified ?? Date.now()
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
globalThis.File = PolyfillFile
|
|
35
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// src/util/resolve-executable.ts
|
|
2
|
+
import { accessSync, constants, statSync } from "fs";
|
|
3
|
+
import { delimiter, extname, isAbsolute, join } from "path";
|
|
4
|
+
var SHIM_EXTENSIONS = /* @__PURE__ */ new Set([".cmd", ".bat"]);
|
|
5
|
+
function isFile(p) {
|
|
6
|
+
try {
|
|
7
|
+
return statSync(p).isFile();
|
|
8
|
+
} catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function isExecutableFile(p) {
|
|
13
|
+
if (!isFile(p)) return false;
|
|
14
|
+
if (process.platform === "win32") return true;
|
|
15
|
+
try {
|
|
16
|
+
accessSync(p, constants.X_OK);
|
|
17
|
+
return true;
|
|
18
|
+
} catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function resolveExecutable(command, env = process.env, platform = process.platform) {
|
|
23
|
+
if (!command) return null;
|
|
24
|
+
const win32 = platform === "win32";
|
|
25
|
+
const exts = win32 ? (env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean).map((e) => e.toLowerCase()) : [""];
|
|
26
|
+
const candidates = (base) => extname(base) ? [base] : win32 ? exts.map((e) => base + e) : [base];
|
|
27
|
+
if (isAbsolute(command) || command.startsWith("./") || command.startsWith(".\\")) {
|
|
28
|
+
return candidates(command).find(isExecutableFile) ?? null;
|
|
29
|
+
}
|
|
30
|
+
for (const dir of (env.PATH ?? env.Path ?? "").split(delimiter).filter(Boolean)) {
|
|
31
|
+
const clean = dir.replace(/^"|"$/g, "");
|
|
32
|
+
const hit = candidates(join(clean, command)).find(isExecutableFile);
|
|
33
|
+
if (hit) return hit;
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
function requiresShell(resolvedPath, platform = process.platform) {
|
|
38
|
+
if (!resolvedPath) return true;
|
|
39
|
+
if (platform !== "win32") return false;
|
|
40
|
+
return SHIM_EXTENSIONS.has(extname(resolvedPath).toLowerCase());
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export {
|
|
44
|
+
resolveExecutable,
|
|
45
|
+
requiresShell
|
|
46
|
+
};
|