pybao-cli 1.5.50 → 1.5.52
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/REPL-CDBGUX7H.js +53 -0
- package/dist/{acp-VXAHCMQ4.js → acp-KC4VUW7Q.js} +47 -47
- package/dist/{agentsValidate-PFVCK6ZC.js → agentsValidate-YGJMW4T4.js} +9 -9
- package/dist/{ask-7RQ2G5S3.js → ask-YHWMV475.js} +46 -46
- package/dist/{autoUpdater-TDN3ABMG.js → autoUpdater-76RMCNA7.js} +4 -4
- package/dist/{blockParser-QPLEX5NJ.js → blockParser-RZPICWAA.js} +2 -2
- package/dist/{chunk-L4CGYTJQ.js → chunk-2EQA5NLL.js} +1 -1
- package/dist/{chunk-FNDIHEBT.js → chunk-33EYH7S3.js} +5 -5
- package/dist/{chunk-IXFDCJ25.js → chunk-3I35GELX.js} +5 -5
- package/dist/{chunk-CHH6TEXB.js → chunk-4MAX5UNY.js} +1 -1
- package/dist/{chunk-ZDDVFBS4.js → chunk-4UQCXDKA.js} +4 -4
- package/dist/{chunk-DBMDQEQO.js → chunk-6QSG5OON.js} +5 -5
- package/dist/{chunk-VAZ4VRTA.js → chunk-AZF3LTDE.js} +3 -3
- package/dist/{chunk-XHAEEYYH.js → chunk-CBDJJ2WQ.js} +2 -2
- package/dist/{chunk-YFVKGHW2.js → chunk-DPE2QUR4.js} +4 -4
- package/dist/{chunk-CNBKKQSV.js → chunk-DYLRL3GG.js} +1 -1
- package/dist/{chunk-F4AXICO7.js → chunk-EXNV3ROJ.js} +1 -1
- package/dist/{chunk-NBDDIZNJ.js → chunk-FNMZKMUC.js} +2 -2
- package/dist/{chunk-ZKW5V7MR.js → chunk-HSOB4XJ2.js} +1 -1
- package/dist/{chunk-7MR3XX5X.js → chunk-I42N2MZA.js} +3 -3
- package/dist/{chunk-KKNO6B2K.js → chunk-JGECWVPT.js} +1873 -766
- package/dist/{chunk-UJRT7VK2.js → chunk-KPZ4UMNV.js} +1 -1
- package/dist/{chunk-CNW45NOZ.js → chunk-KQBUAEA5.js} +4 -4
- package/dist/{chunk-NQGIALRP.js → chunk-L2JZIHLB.js} +6 -6
- package/dist/{chunk-5ITEAEJC.js → chunk-NQJAXQZX.js} +3 -3
- package/dist/{chunk-A45A3UUU.js → chunk-O6CVVWZV.js} +1 -1
- package/dist/{chunk-Y7I4XTJJ.js → chunk-OEHXDSEI.js} +4 -4
- package/dist/{chunk-NRORTICH.js → chunk-PA5FTBIQ.js} +2 -2
- package/dist/{chunk-NSFU6Y4R.js → chunk-QEPBMPEE.js} +1 -1
- package/dist/{chunk-5AGDLQAW.js → chunk-QQ27ECXF.js} +1 -1
- package/dist/{chunk-J6HKEIL2.js → chunk-QYVB7FJ4.js} +1 -1
- package/dist/{chunk-K3QEELFX.js → chunk-R64GVTIZ.js} +3 -3
- package/dist/{chunk-LE5VGGP6.js → chunk-RETS7G2B.js} +6 -6
- package/dist/{chunk-EY3ZOE75.js → chunk-SZS6SEDB.js} +1 -1
- package/dist/{chunk-PXRUNRK7.js → chunk-UCNZU6OO.js} +2 -2
- package/dist/{chunk-BQCQ3DEN.js → chunk-UG7ZFONK.js} +4 -4
- package/dist/{chunk-C7BUAPKP.js → chunk-VFFYWI27.js} +4 -4
- package/dist/{chunk-OMELVAJD.js → chunk-YQ6JLMLS.js} +1 -1
- package/dist/{chunk-3IPEAISZ.js → chunk-ZFLQSIXD.js} +3 -3
- package/dist/{chunk-5P4A6TN2.js → chunk-ZWTGVUTI.js} +3 -3
- package/dist/{cli-PMOATR2H.js → cli-JMJIGYNF.js} +120 -120
- package/dist/commands-N4RLEJU6.js +57 -0
- package/dist/{config-PQYZDDGW.js → config-6AW7SYEB.js} +6 -6
- package/dist/{context-BWXP2WB4.js → context-VGBWHZ57.js} +9 -9
- package/dist/{conversationPersistence-CS2SQ6Z6.js → conversationPersistence-AAJPHPUT.js} +4 -4
- package/dist/{conversationTracker-3OLKEYWM.js → conversationTracker-MVX6VQG2.js} +5 -5
- package/dist/{costTracker-DJVFVAVZ.js → costTracker-KBXHS4NS.js} +2 -2
- package/dist/{customCommands-VPTXXYYR.js → customCommands-PJI43HDH.js} +6 -6
- package/dist/{env-G5ZYCG5S.js → env-JEHV2OD5.js} +3 -3
- package/dist/{file-2I2KXCVN.js → file-G3IOPSJE.js} +5 -5
- package/dist/index.js +4 -4
- package/dist/{llm-KXF74SNS.js → llm-CVILTZMI.js} +50 -50
- package/dist/{llmLazy-L3IJUBN2.js → llmLazy-TS22QBZC.js} +2 -2
- package/dist/{loader-CJOJNOV7.js → loader-DA33SOZU.js} +7 -7
- package/dist/{lsp-OKPL75YW.js → lsp-M5NJ7YC7.js} +9 -9
- package/dist/{lspAnchor-7Z5YNXX3.js → lspAnchor-LUE27QI2.js} +10 -10
- package/dist/{mcp-C65V4JYM.js → mcp-3R7KNW6M.js} +10 -10
- package/dist/{mentionProcessor-EDZBHP7Y.js → mentionProcessor-KM7DJSIF.js} +8 -8
- package/dist/{messages-YBAYUMKL.js → messages-EUS4CRVP.js} +3 -3
- package/dist/{model-7WMFC6F7.js → model-3GE72U3P.js} +7 -7
- package/dist/{openai-YWEX6G4I.js → openai-3TL5XAIV.js} +8 -8
- package/dist/{outputStyles-N6S27KGD.js → outputStyles-7FC4BJZX.js} +7 -7
- package/dist/{pluginRuntime-3XWIAPQ7.js → pluginRuntime-IWKORZEI.js} +8 -8
- package/dist/{pluginValidation-2JLTTMJL.js → pluginValidation-DC2PWTS3.js} +8 -8
- package/dist/prompts-X5RHKH65.js +59 -0
- package/dist/{pybAgentSessionId-EPCAMQ25.js → pybAgentSessionId-3LL4RMFU.js} +2 -2
- package/dist/{pybAgentSessionLoad-XJ6XWCK5.js → pybAgentSessionLoad-DCESKISD.js} +6 -6
- package/dist/{pybAgentSessionResume-SMNXFGFB.js → pybAgentSessionResume-CIJIMHTT.js} +8 -8
- package/dist/{pybAgentStreamJson-EQPO52B6.js → pybAgentStreamJson-K7E4VEFE.js} +2 -2
- package/dist/{pybAgentStreamJsonSession-33YU7WNJ.js → pybAgentStreamJsonSession-SZMCWTVW.js} +4 -4
- package/dist/{pybAgentStructuredStdio-ROCSOGNT.js → pybAgentStructuredStdio-T6JJLJVC.js} +3 -3
- package/dist/{pybHooks-6JRPW3VW.js → pybHooks-CYAJNZ6G.js} +7 -7
- package/dist/query-7PFFQCW2.js +57 -0
- package/dist/{registry-67P26WKJ.js → registry-HF5Y4WZS.js} +6 -6
- package/dist/{replSessionBridge-EBXNFUAD.js → replSessionBridge-4XEXXNRH.js} +3 -3
- package/dist/{responsesStreaming-NPGJLPV3.js → responsesStreaming-RZW2QVJU.js} +3 -3
- package/dist/{ripgrep-DPLWHL7O.js → ripgrep-W5ULQHU4.js} +4 -4
- package/dist/{skillMarketplace-MGU4KRUF.js → skillMarketplace-WKOGEWIO.js} +4 -4
- package/dist/{smart-edit-AWHJDSU6.js → smart-edit-EQBEMPKQ.js} +2 -2
- package/dist/{state-NZVNNCHH.js → state-GWKESQ7O.js} +3 -3
- package/dist/theme-VRKM2HNU.js +14 -0
- package/dist/{toolPermissionContext-BSFV23IL.js → toolPermissionContext-TAUII5GX.js} +2 -2
- package/dist/{toolPermissionSettings-NEXN25B3.js → toolPermissionSettings-Z2I77LVO.js} +9 -9
- package/dist/tools-VM7IZKXZ.js +57 -0
- package/dist/{userInput-PHXM4ITY.js → userInput-Q2HIIFPM.js} +49 -49
- package/dist/{uuid-CVHEFGW4.js → uuid-EJN2AIBK.js} +2 -2
- package/package.json +3 -3
- package/dist/REPL-5XUDCAF4.js +0 -53
- package/dist/REPL-5XUDCAF4.js.map +0 -7
- package/dist/acp-VXAHCMQ4.js.map +0 -7
- package/dist/agentsValidate-PFVCK6ZC.js.map +0 -7
- package/dist/ask-7RQ2G5S3.js.map +0 -7
- package/dist/autoUpdater-TDN3ABMG.js.map +0 -7
- package/dist/blockParser-QPLEX5NJ.js.map +0 -7
- package/dist/chunk-2RXKUCFS.js.map +0 -7
- package/dist/chunk-3DFBSQIT.js.map +0 -7
- package/dist/chunk-3IPEAISZ.js.map +0 -7
- package/dist/chunk-5AGDLQAW.js.map +0 -7
- package/dist/chunk-5ITEAEJC.js.map +0 -7
- package/dist/chunk-5JHD6MUL.js.map +0 -7
- package/dist/chunk-5P4A6TN2.js.map +0 -7
- package/dist/chunk-5P7HBXTD.js.map +0 -7
- package/dist/chunk-7MR3XX5X.js.map +0 -7
- package/dist/chunk-A3BVXXA3.js.map +0 -7
- package/dist/chunk-A45A3UUU.js.map +0 -7
- package/dist/chunk-B6IMQJZM.js.map +0 -7
- package/dist/chunk-BJSWTHRM.js.map +0 -7
- package/dist/chunk-BKCAVW2G.js.map +0 -7
- package/dist/chunk-BQCQ3DEN.js.map +0 -7
- package/dist/chunk-C7BUAPKP.js.map +0 -7
- package/dist/chunk-CHH6TEXB.js.map +0 -7
- package/dist/chunk-CNBKKQSV.js.map +0 -7
- package/dist/chunk-CNW45NOZ.js.map +0 -7
- package/dist/chunk-CZZKRPE2.js.map +0 -7
- package/dist/chunk-DBMDQEQO.js.map +0 -7
- package/dist/chunk-EY3ZOE75.js.map +0 -7
- package/dist/chunk-F4AXICO7.js.map +0 -7
- package/dist/chunk-FNDIHEBT.js.map +0 -7
- package/dist/chunk-I3J4JYES.js.map +0 -7
- package/dist/chunk-IXFDCJ25.js.map +0 -7
- package/dist/chunk-J6HKEIL2.js.map +0 -7
- package/dist/chunk-K3QEELFX.js.map +0 -7
- package/dist/chunk-KFEHHKZ2.js.map +0 -7
- package/dist/chunk-KKNO6B2K.js.map +0 -7
- package/dist/chunk-L4CGYTJQ.js.map +0 -7
- package/dist/chunk-LE5VGGP6.js.map +0 -7
- package/dist/chunk-MWPFU2KU.js.map +0 -7
- package/dist/chunk-NBDDIZNJ.js.map +0 -7
- package/dist/chunk-NQGIALRP.js.map +0 -7
- package/dist/chunk-NRORTICH.js.map +0 -7
- package/dist/chunk-NSFU6Y4R.js.map +0 -7
- package/dist/chunk-OMELVAJD.js.map +0 -7
- package/dist/chunk-OUXHGDLH.js.map +0 -7
- package/dist/chunk-PXRUNRK7.js.map +0 -7
- package/dist/chunk-QWIBSCDN.js.map +0 -7
- package/dist/chunk-RQVLBMP7.js.map +0 -7
- package/dist/chunk-TFHFYID3.js.map +0 -7
- package/dist/chunk-UJRT7VK2.js.map +0 -7
- package/dist/chunk-UNNVICVU.js.map +0 -7
- package/dist/chunk-UZ34JEUK.js.map +0 -7
- package/dist/chunk-VAZ4VRTA.js.map +0 -7
- package/dist/chunk-XHAEEYYH.js.map +0 -7
- package/dist/chunk-XKYHFZEC.js.map +0 -7
- package/dist/chunk-Y7I4XTJJ.js.map +0 -7
- package/dist/chunk-YFVKGHW2.js.map +0 -7
- package/dist/chunk-ZDDVFBS4.js.map +0 -7
- package/dist/chunk-ZKW5V7MR.js.map +0 -7
- package/dist/cli-PMOATR2H.js.map +0 -7
- package/dist/commands-HA2TW7NU.js +0 -57
- package/dist/commands-HA2TW7NU.js.map +0 -7
- package/dist/config-PQYZDDGW.js.map +0 -7
- package/dist/context-BWXP2WB4.js.map +0 -7
- package/dist/conversationPersistence-CS2SQ6Z6.js.map +0 -7
- package/dist/conversationTracker-3OLKEYWM.js.map +0 -7
- package/dist/costTracker-DJVFVAVZ.js.map +0 -7
- package/dist/customCommands-VPTXXYYR.js.map +0 -7
- package/dist/env-G5ZYCG5S.js.map +0 -7
- package/dist/file-2I2KXCVN.js.map +0 -7
- package/dist/index.js.map +0 -7
- package/dist/llm-KXF74SNS.js.map +0 -7
- package/dist/llmLazy-L3IJUBN2.js.map +0 -7
- package/dist/loader-CJOJNOV7.js.map +0 -7
- package/dist/lsp-OKPL75YW.js.map +0 -7
- package/dist/lspAnchor-7Z5YNXX3.js.map +0 -7
- package/dist/mcp-C65V4JYM.js.map +0 -7
- package/dist/mentionProcessor-EDZBHP7Y.js.map +0 -7
- package/dist/messages-YBAYUMKL.js.map +0 -7
- package/dist/model-7WMFC6F7.js.map +0 -7
- package/dist/openai-YWEX6G4I.js.map +0 -7
- package/dist/outputStyles-N6S27KGD.js.map +0 -7
- package/dist/pluginRuntime-3XWIAPQ7.js.map +0 -7
- package/dist/pluginValidation-2JLTTMJL.js.map +0 -7
- package/dist/prompts-HCGQPTDJ.js +0 -59
- package/dist/prompts-HCGQPTDJ.js.map +0 -7
- package/dist/pybAgentSessionId-EPCAMQ25.js.map +0 -7
- package/dist/pybAgentSessionLoad-XJ6XWCK5.js.map +0 -7
- package/dist/pybAgentSessionResume-SMNXFGFB.js.map +0 -7
- package/dist/pybAgentStreamJson-EQPO52B6.js.map +0 -7
- package/dist/pybAgentStreamJsonSession-33YU7WNJ.js.map +0 -7
- package/dist/pybAgentStructuredStdio-ROCSOGNT.js.map +0 -7
- package/dist/pybHooks-6JRPW3VW.js.map +0 -7
- package/dist/query-GGJC3XT2.js +0 -57
- package/dist/query-GGJC3XT2.js.map +0 -7
- package/dist/registry-67P26WKJ.js.map +0 -7
- package/dist/replSessionBridge-EBXNFUAD.js.map +0 -7
- package/dist/responsesStreaming-NPGJLPV3.js.map +0 -7
- package/dist/ripgrep-DPLWHL7O.js.map +0 -7
- package/dist/skillMarketplace-MGU4KRUF.js.map +0 -7
- package/dist/smart-edit-AWHJDSU6.js.map +0 -7
- package/dist/state-NZVNNCHH.js.map +0 -7
- package/dist/theme-XV4CTBG6.js +0 -14
- package/dist/theme-XV4CTBG6.js.map +0 -7
- package/dist/toolPermissionContext-BSFV23IL.js.map +0 -7
- package/dist/toolPermissionSettings-NEXN25B3.js.map +0 -7
- package/dist/tools-R7EDLOFS.js +0 -57
- package/dist/tools-R7EDLOFS.js.map +0 -7
- package/dist/userInput-PHXM4ITY.js.map +0 -7
- package/dist/uuid-CVHEFGW4.js.map +0 -7
- /package/dist/{chunk-UZ34JEUK.js → chunk-7HEKZ73X.js} +0 -0
- /package/dist/{chunk-5JHD6MUL.js → chunk-ADD7XJ5F.js} +0 -0
- /package/dist/{chunk-B6IMQJZM.js → chunk-DRSLDSBY.js} +0 -0
- /package/dist/{chunk-KFEHHKZ2.js → chunk-F3JSDBR6.js} +0 -0
- /package/dist/{chunk-QWIBSCDN.js → chunk-GEEDQS2I.js} +0 -0
- /package/dist/{chunk-2RXKUCFS.js → chunk-ISMRCABJ.js} +0 -0
- /package/dist/{chunk-MWPFU2KU.js → chunk-JVKJ7J5H.js} +0 -0
- /package/dist/{chunk-BJSWTHRM.js → chunk-KNUG3M6O.js} +0 -0
- /package/dist/{chunk-UNNVICVU.js → chunk-LG65MFKB.js} +0 -0
- /package/dist/{chunk-CZZKRPE2.js → chunk-MGN3VYPN.js} +0 -0
- /package/dist/{chunk-A3BVXXA3.js → chunk-OQEZC7X2.js} +0 -0
- /package/dist/{chunk-I3J4JYES.js → chunk-OYT6EI36.js} +0 -0
- /package/dist/{chunk-RQVLBMP7.js → chunk-PDH2QHLY.js} +0 -0
- /package/dist/{chunk-5P7HBXTD.js → chunk-QAMAR4LW.js} +0 -0
- /package/dist/{chunk-TFHFYID3.js → chunk-TNCBVAVV.js} +0 -0
- /package/dist/{chunk-XKYHFZEC.js → chunk-U6BMHOQT.js} +0 -0
- /package/dist/{chunk-OUXHGDLH.js → chunk-VEHLCRJN.js} +0 -0
- /package/dist/{chunk-3DFBSQIT.js → chunk-XZG5WCDK.js} +0 -0
- /package/dist/{chunk-BKCAVW2G.js → chunk-ZY2PESP4.js} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/tools/search/LspTool/registry.ts", "../src/tools/search/LspTool/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { join, dirname, basename } from 'path'\nimport { fileURLToPath } from 'url'\nimport { existsSync, mkdirSync, mkdtempSync, rmSync, readdirSync, writeFileSync, chmodSync, renameSync, statSync } from 'fs'\nimport { tmpdir } from 'os'\nimport { spawn } from 'child_process'\nimport { createRequire } from 'module'\nimport which from 'which'\nimport { getLspBinDir } from './utils'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { env } from '@utils/config/env'\nimport { loadSettingsWithLegacyFallback } from '@utils/config/settingsFiles'\nimport { getSessionRoot } from '@utils/state'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\nconst nodeRequire = createRequire(import.meta.url)\n\nconst lspInstallDir = getLspBinDir()\nconst getEnvPackageRoot = () => {\n const root = process.env.PYB_PACKAGE_ROOT?.trim()\n return root || ''\n}\n\ntype BunRuntime = {\n which?: (cmd: string) => string | null\n spawn?: (args: any) => any\n resolve?: (name: string, rootPath: string) => Promise<string>\n}\n\nconst getBunRuntime = (): BunRuntime | undefined =>\n (globalThis as typeof globalThis & { Bun?: BunRuntime }).Bun\n\nconst safeWhich = (cmd: string): string | null => {\n const bun = getBunRuntime()\n if (bun?.which) return bun.which(cmd)\n try {\n return which.sync(cmd)\n } catch {\n return null\n }\n}\n\nconst safeResolvePackage = async (name: string, rootPath: string): Promise<boolean> => {\n const bun = getBunRuntime()\n if (bun?.resolve) {\n await bun.resolve(name, rootPath)\n return true\n }\n try {\n nodeRequire.resolve(name, { paths: [rootPath] })\n return true\n } catch {\n return false\n }\n}\n\nconst spawnProcess = async (\n cmd: string[],\n options: { cwd?: string; env?: NodeJS.ProcessEnv }\n): Promise<{ stdout: string; stderr: string; exitCode: number }> => {\n const bun = getBunRuntime()\n if (bun?.spawn) {\n const proc = bun.spawn({\n cmd,\n cwd: options.cwd,\n env: options.env,\n stdout: 'pipe',\n stderr: 'pipe',\n stdin: 'pipe'\n })\n const [stdout, stderr, exitCode] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n proc.exited\n ])\n return { stdout, stderr, exitCode }\n }\n return await new Promise(resolve => {\n const [command, ...args] = cmd\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['ignore', 'pipe', 'pipe']\n })\n let stdout = ''\n let stderr = ''\n child.stdout?.on('data', chunk => {\n stdout += chunk.toString()\n })\n child.stderr?.on('data', chunk => {\n stderr += chunk.toString()\n })\n child.on('error', error => {\n resolve({ stdout, stderr: `${stderr}${String(error)}`, exitCode: 1 })\n })\n child.on('close', code => {\n resolve({ stdout, stderr, exitCode: code ?? 1 })\n })\n })\n}\n\ntype LspInstallNotice = {\n server: string\n stage: 'start' | 'success' | 'failed' | 'timeout' | 'skipped'\n message: string\n at: number\n}\n\nconst installNotices: LspInstallNotice[] = []\nconst installNoticeKeys = new Set<string>()\nconst HEAVY_LSP_SERVERS = new Set([\n 'eslint',\n 'vue-language-server',\n 'jdtls',\n 'metals',\n 'elixir-ls',\n 'haskell-language-server',\n 'zls',\n 'lua-language-server'\n])\n\nfunction addInstallNotice(notice: LspInstallNotice) {\n installNotices.push(notice)\n if (installNotices.length > 50) {\n installNotices.shift()\n }\n}\n\nfunction addInstallNoticeOnce(notice: LspInstallNotice, key: string) {\n if (installNoticeKeys.has(key)) return\n installNoticeKeys.add(key)\n addInstallNotice(notice)\n}\n\nexport function getInstallNotices(): LspInstallNotice[] {\n return [...installNotices]\n}\n\nexport function __resetInstallNoticesForTests(): void {\n installNotices.length = 0\n installNoticeKeys.clear()\n}\n\nfunction parseBoolean(value?: string): boolean | undefined {\n if (value === undefined) return undefined\n const normalized = value.trim().toLowerCase()\n if (!normalized) return undefined\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false\n return undefined\n}\n\nfunction resolveEnvRuntimePath(key: string): string {\n const raw = process.env[key]?.trim()\n if (!raw) return ''\n return existsSync(raw) ? raw : ''\n}\n\nfunction isNodeExecutablePath(value: string): boolean {\n const name = basename(value).toLowerCase()\n return name === 'node' || name === 'node.exe' || name === 'nodejs' || name === 'nodejs.exe'\n}\n\nfunction isBunExecutablePath(value: string): boolean {\n const name = basename(value).toLowerCase()\n return name === 'bun' || name === 'bun.exe'\n}\n\nfunction resolveRuntimeCommand(): string {\n const envNode = resolveEnvRuntimePath('PYB_NODE_PATH')\n if (envNode) return envNode\n const envBun = resolveEnvRuntimePath('PYB_BUN_PATH')\n if (envBun) return envBun\n if (process.execPath && existsSync(process.execPath)) {\n if (isNodeExecutablePath(process.execPath) || isBunExecutablePath(process.execPath)) {\n return process.execPath\n }\n }\n const nodeBin = safeWhich('node')\n if (nodeBin && existsSync(nodeBin)) {\n return nodeBin\n }\n const bunBin = safeWhich('bun')\n if (bunBin && existsSync(bunBin)) {\n return bunBin\n }\n return 'node'\n}\n\nfunction resolveBunRuntimePath(): string {\n const envBun = resolveEnvRuntimePath('PYB_BUN_PATH')\n if (envBun) return envBun\n if (process.execPath && existsSync(process.execPath) && isBunExecutablePath(process.execPath)) {\n return process.execPath\n }\n const bunBin = safeWhich('bun')\n if (bunBin && existsSync(bunBin)) return bunBin\n return ''\n}\n\nasync function isAutoInstallEnabled(): Promise<boolean> {\n const disabled = parseBoolean(\n process.env.PYB_DISABLE_LSP_DOWNLOAD ??\n process.env.PYB_DISABLE_LSP_INSTALL ??\n process.env.OPENCODE_DISABLE_LSP_DOWNLOAD\n )\n if (disabled === true) return false\n const enabled = parseBoolean(\n process.env.PYB_LSP_AUTO_INSTALL ?? process.env.PYB_ENABLE_LSP_AUTO_INSTALL\n )\n if (enabled === false) return false\n return env.hasInternetAccess()\n}\n\nfunction isHeavyAutoInstallEnabled(): boolean {\n const disabled = parseBoolean(\n process.env.PYB_DISABLE_LSP_HEAVY_INSTALL ?? process.env.PYB_LSP_HEAVY_INSTALL_DISABLED\n )\n if (disabled === true) return false\n const enabled = parseBoolean(process.env.PYB_LSP_HEAVY_AUTO_INSTALL)\n if (enabled === false) return false\n return true\n}\n\nfunction getInstallTimeoutMs(): number | null {\n const override = Number.parseInt(process.env.PYB_LSP_INSTALL_TIMEOUT_MS ?? '', 10)\n if (Number.isFinite(override)) {\n if (override <= 0) return null\n return override\n }\n return 120000\n}\n\nasync function runInstallWithPolicy(serverId: string, install: LspInstallStrategy): Promise<boolean> {\n const isHeavy = HEAVY_LSP_SERVERS.has(serverId)\n if (isHeavy && !isHeavyAutoInstallEnabled()) {\n addInstallNoticeOnce(\n {\n server: serverId,\n stage: 'skipped',\n message: `${serverId} install skipped (heavy auto install disabled)`,\n at: Date.now()\n },\n `${serverId}:skipped:heavy-disabled`\n )\n if (isHeavy) {\n console.log(`[LSP] ${serverId} install skipped (heavy auto install disabled)`)\n }\n return false\n }\n const startAt = Date.now()\n if (isHeavy) {\n addInstallNotice({\n server: serverId,\n stage: 'start',\n message: `${serverId} install started`,\n at: startAt\n })\n console.log(`[LSP] ${serverId} install started`)\n }\n const timeoutMs = getInstallTimeoutMs()\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n const timeoutPromise =\n timeoutMs === null\n ? null\n : new Promise<{ timeout: true }>(resolve => {\n timeoutId = setTimeout(() => resolve({ timeout: true }), timeoutMs)\n })\n const installPromise = install()\n .then(ok => ({ ok }))\n .catch(error => ({ error }))\n const result = timeoutPromise\n ? await Promise.race([installPromise, timeoutPromise])\n : await installPromise\n if (timeoutId) clearTimeout(timeoutId)\n if ('timeout' in result) {\n addInstallNotice({\n server: serverId,\n stage: 'timeout',\n message: `${serverId} install timed out`,\n at: Date.now()\n })\n if (isHeavy) {\n console.log(`[LSP] ${serverId} install timed out`)\n }\n return false\n }\n if ('error' in result) {\n addInstallNotice({\n server: serverId,\n stage: 'failed',\n message: `${serverId} install failed: ${String(result.error)}`,\n at: Date.now()\n })\n if (isHeavy) {\n console.log(`[LSP] ${serverId} install failed: ${String(result.error)}`)\n }\n return false\n }\n if (!result.ok) {\n addInstallNotice({\n server: serverId,\n stage: 'failed',\n message: `${serverId} install failed`,\n at: Date.now()\n })\n if (isHeavy) {\n console.log(`[LSP] ${serverId} install failed`)\n }\n return false\n }\n if (isHeavy) {\n addInstallNotice({\n server: serverId,\n stage: 'success',\n message: `${serverId} install completed`,\n at: Date.now()\n })\n console.log(`[LSP] ${serverId} install completed`)\n }\n return true\n}\n\nfunction ensureInstallDir() {\n if (!existsSync(lspInstallDir)) {\n mkdirSync(lspInstallDir, { recursive: true })\n }\n}\n\nfunction resolveBinInDir(dir: string, binName: string): string {\n const exts = process.platform === 'win32' ? ['.cmd', '.exe', '.ps1', ''] : ['']\n for (const ext of exts) {\n const binPath = join(dir, `${binName}${ext}`)\n if (existsSync(binPath)) {\n return binPath\n }\n }\n return ''\n}\n\nasync function bunInstall(packages: string[], cwd: string = lspInstallDir): Promise<boolean> {\n const bunBin = resolveBunRuntimePath()\n if (!bunBin) {\n debugLogger.error('LSP_MISSING_DEP', { server: 'npm', error: 'bun not found' })\n addInstallNoticeOnce(\n {\n server: 'npm',\n stage: 'failed',\n message: 'bun not found for npm-based LSP install',\n at: Date.now()\n },\n 'npm:missing:bun'\n )\n return false\n }\n if (!existsSync(cwd)) {\n mkdirSync(cwd, { recursive: true })\n }\n const result = await spawnProcess([bunBin, 'install', ...packages], {\n cwd,\n env: {\n ...process.env,\n BUN_BE_BUN: '1'\n }\n })\n return result.exitCode === 0\n}\n\nasync function runBinary(\n cmd: string[],\n extraEnv?: NodeJS.ProcessEnv,\n cwd: string = lspInstallDir\n): Promise<{ ok: boolean; error?: string }> {\n const { stdout, stderr, exitCode } = await spawnProcess(cmd, {\n cwd,\n env: {\n ...process.env,\n ...extraEnv\n }\n })\n if (exitCode === 0) {\n return { ok: true }\n }\n return { ok: false, error: stderr || stdout }\n}\n\nasync function runBinaryWithTimeout(\n cmd: string[],\n extraEnv: NodeJS.ProcessEnv | undefined,\n cwd: string,\n timeoutMs: number | null\n): Promise<{ ok: boolean; error?: string; timeout?: boolean }> {\n if (timeoutMs === null) {\n return runBinary(cmd, extraEnv, cwd)\n }\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n const timeoutPromise = new Promise<{ timeout: true }>(resolve => {\n timeoutId = setTimeout(() => resolve({ timeout: true }), timeoutMs)\n })\n const result = await Promise.race([runBinary(cmd, extraEnv, cwd), timeoutPromise])\n if (timeoutId) clearTimeout(timeoutId)\n if ('timeout' in result) {\n return { ok: false, timeout: true, error: 'timeout' }\n }\n return result\n}\n\nasync function getJavaMajorVersion(): Promise<number | null> {\n const { stdout, stderr, exitCode } = await spawnProcess(['java', '-version'], {})\n if (exitCode !== 0) return null\n const output = `${stderr}\\n${stdout}`\n const match = /\"(\\d+)(?:\\.\\d+)?(?:\\.\\d+)?\"?/.exec(output)\n if (!match) return null\n const major = Number.parseInt(match[1], 10)\n return Number.isNaN(major) ? null : major\n}\n\nconst ESLINT_ARCHIVE_URL = 'https://github.com/microsoft/vscode-eslint/archive/refs/heads/main.zip'\n\nexport function getEslintInstallDir(installDir: string = lspInstallDir): string {\n return join(installDir, 'vscode-eslint')\n}\n\nexport function getEslintServerPath(installDir: string = lspInstallDir): string {\n return join(getEslintInstallDir(installDir), 'server', 'out', 'eslintServer.js')\n}\n\nexport async function installEslintServer(installDir: string = lspInstallDir): Promise<boolean> {\n const serverPath = getEslintServerPath(installDir)\n if (existsSync(serverPath)) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n if (!existsSync(installDir)) {\n mkdirSync(installDir, { recursive: true })\n }\n const runtime = getBunRuntime() ? 'bun' : 'node'\n debugLogger.info('LSP_INSTALL', { server: 'eslint', action: 'start' })\n try {\n await downloadAndExtractArchive({\n url: ESLINT_ARCHIVE_URL,\n archiveType: 'zip',\n installDir,\n expectedFiles: ['vscode-eslint-main']\n })\n const extractedPath = join(installDir, 'vscode-eslint-main')\n const finalPath = getEslintInstallDir(installDir)\n if (!existsSync(extractedPath)) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'eslint', error: 'extracted path missing', runtime })\n return false\n }\n if (existsSync(finalPath)) {\n rmSync(finalPath, { recursive: true, force: true })\n }\n renameSync(extractedPath, finalPath)\n const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm'\n if (!safeWhich(npmCmd)) {\n debugLogger.error('LSP_MISSING_DEP', { server: 'eslint', error: `${npmCmd} not found`, runtime })\n addInstallNoticeOnce(\n {\n server: 'eslint',\n stage: 'failed',\n message: `${npmCmd} not found for eslint install`,\n at: Date.now()\n },\n `eslint:missing:${npmCmd}`\n )\n return false\n }\n const timeoutMs = getInstallTimeoutMs()\n const installResult = await runBinaryWithTimeout([npmCmd, 'install'], undefined, finalPath, timeoutMs)\n if (!installResult.ok) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'eslint', error: installResult.error, runtime })\n return false\n }\n const compileResult = await runBinaryWithTimeout([npmCmd, 'run', 'compile'], undefined, finalPath, timeoutMs)\n if (!compileResult.ok) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'eslint', error: compileResult.error, runtime })\n return false\n }\n if (!existsSync(serverPath)) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'eslint', error: 'eslintServer.js not found', runtime })\n return false\n }\n debugLogger.info('LSP_INSTALL', { server: 'eslint', action: 'success' })\n return true\n } catch (e) {\n debugLogger.error('LSP_INSTALL_ERROR', { server: 'eslint', error: String(e), runtime })\n return false\n }\n}\n\nconst DEFAULT_LANGUAGE_MAP: Record<string, string> = {\n '.sh': 'shellscript',\n '.bash': 'shellscript',\n '.zsh': 'shellscript',\n '.ksh': 'shellscript',\n '.ps1': 'powershell',\n '.psm1': 'powershell',\n '.bat': 'bat',\n '.cmd': 'bat',\n '.js': 'javascript',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.jsx': 'javascriptreact',\n '.ts': 'typescript',\n '.mts': 'typescript',\n '.cts': 'typescript',\n '.ets': 'typescript',\n '.tsx': 'typescriptreact',\n '.mtsx': 'typescriptreact',\n '.ctsx': 'typescriptreact',\n '.vue': 'vue',\n '.svelte': 'svelte',\n '.astro': 'astro',\n '.html': 'html',\n '.htm': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.sass': 'sass',\n '.less': 'less',\n '.json': 'json',\n '.yml': 'yaml',\n '.yaml': 'yaml',\n '.py': 'python',\n '.go': 'go',\n '.java': 'java',\n '.kt': 'kotlin',\n '.kts': 'kotlin',\n '.rb': 'ruby',\n '.rake': 'ruby',\n '.gemspec': 'ruby',\n '.ru': 'ruby',\n '.erb': 'erb',\n '.php': 'php',\n '.rs': 'rust',\n '.c': 'c',\n '.cpp': 'cpp',\n '.cxx': 'cpp',\n '.cc': 'cpp',\n '.hpp': 'cpp',\n '.h': 'c',\n '.cs': 'csharp',\n '.fs': 'fsharp',\n '.fsi': 'fsharp',\n '.fsx': 'fsharp',\n '.fsscript': 'fsharp',\n '.scala': 'scala',\n '.swift': 'swift',\n '.dart': 'dart',\n '.dockerfile': 'dockerfile',\n 'dockerfile': 'dockerfile',\n '.tf': 'terraform',\n '.tfvars': 'terraform',\n '.hcl': 'hcl',\n '.nix': 'nix',\n '.makefile': 'makefile',\n 'makefile': 'makefile',\n '.md': 'markdown',\n '.markdown': 'markdown',\n '.sql': 'sql',\n '.xml': 'xml',\n '.xsl': 'xml',\n '.tex': 'latex',\n '.latex': 'latex',\n '.bib': 'bibtex',\n '.bibtex': 'bibtex',\n '.diff': 'diff',\n '.patch': 'diff',\n '.clj': 'clojure',\n '.cljs': 'clojure',\n '.cljc': 'clojure',\n '.edn': 'clojure',\n '.ex': 'elixir',\n '.exs': 'elixir',\n '.erl': 'erlang',\n '.hrl': 'erlang',\n '.hs': 'haskell',\n '.lhs': 'haskell',\n '.ml': 'ocaml',\n '.mli': 'ocaml',\n '.zig': 'zig',\n '.zon': 'zig',\n '.gleam': 'gleam',\n '.typ': 'typst',\n '.typc': 'typst'\n}\n\nconst DEFAULT_LANGUAGE_CATEGORIES: Record<string, string> = {\n javascript: 'web',\n javascriptreact: 'web',\n typescript: 'web',\n typescriptreact: 'web',\n vue: 'web',\n svelte: 'web',\n astro: 'web',\n html: 'web',\n css: 'web',\n scss: 'web',\n sass: 'web',\n less: 'web',\n python: 'backend',\n go: 'backend',\n java: 'backend',\n kotlin: 'backend',\n ruby: 'backend',\n php: 'backend',\n rust: 'backend',\n csharp: 'backend',\n fsharp: 'backend',\n scala: 'backend',\n swift: 'backend',\n dart: 'backend',\n elixir: 'backend',\n erlang: 'backend',\n haskell: 'backend',\n ocaml: 'backend',\n c: 'system',\n cpp: 'system',\n zig: 'system',\n shellscript: 'system',\n powershell: 'system',\n makefile: 'system',\n sql: 'data',\n json: 'data',\n yaml: 'data',\n xml: 'data',\n latex: 'data',\n bibtex: 'data',\n dockerfile: 'infra',\n terraform: 'infra',\n hcl: 'infra',\n nix: 'infra',\n markdown: 'docs',\n diff: 'docs'\n}\n\ntype LspServerOverride = {\n disabled?: boolean\n extensions?: string[]\n rootMarkers?: string[]\n command?: string\n args?: string[]\n env?: Record<string, string>\n initializationOptions?: Record<string, unknown>\n root?: {\n include?: string[]\n exclude?: string[]\n branches?: string[][]\n }\n languageId?: string\n priority?: number\n group?: string\n}\n\nexport type LspServerGroup = {\n id: string\n strategy: 'parallel' | 'exclusive' | 'fallback'\n serverIds: string[]\n extensions?: string[]\n}\n\nexport type LspSettings = {\n disabledServers?: string[]\n servers?: Record<string, LspServerOverride>\n experimental?: Record<string, boolean>\n languageMap?: Record<string, string>\n languageCategories?: Record<string, string>\n serverGroups?: LspServerGroup[]\n initializationOptions?: Record<string, unknown>\n env?: Record<string, string>\n}\n\nconst EXPERIMENTAL_SWITCHES: Record<string, { enable: string[]; disable: string[] }> = {\n ty: { enable: ['ty'], disable: ['pyright'] }\n}\n\nfunction readExperimentalEnvToggles(): Record<string, boolean> | undefined {\n const out: Record<string, boolean> = {}\n for (const [key, value] of Object.entries(process.env)) {\n if (!key.startsWith('PYB_LSP_EXPERIMENTAL_')) continue\n const name = key.substring('PYB_LSP_EXPERIMENTAL_'.length).toLowerCase()\n const v = String(value ?? '').trim().toLowerCase()\n const enabled = v === '1' || v === 'true' || v === 'on' || v === 'yes'\n out[name] = enabled\n }\n return Object.keys(out).length ? out : undefined\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value))\n}\n\nfunction normalizeStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined\n const out: string[] = []\n const seen = new Set<string>()\n for (const entry of value) {\n if (typeof entry !== 'string') continue\n const trimmed = entry.trim()\n if (!trimmed || seen.has(trimmed)) continue\n seen.add(trimmed)\n out.push(trimmed)\n }\n return out.length ? out : undefined\n}\n\nfunction normalizeStringRecord(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined\n const out: Record<string, string> = {}\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === 'string') {\n out[key] = raw\n }\n }\n return Object.keys(out).length ? out : undefined\n}\n\nfunction normalizeBooleanRecord(value: unknown): Record<string, boolean> | undefined {\n if (!isRecord(value)) return undefined\n const out: Record<string, boolean> = {}\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === 'boolean') {\n out[key] = raw\n }\n }\n return Object.keys(out).length ? out : undefined\n}\n\nfunction normalizeInitializationOptions(value: unknown): Record<string, unknown> | undefined {\n if (!isRecord(value)) return undefined\n return Object.keys(value).length ? value : undefined\n}\n\nfunction normalizeServerOverrides(value: unknown): Record<string, LspServerOverride> | undefined {\n if (!isRecord(value)) return undefined\n const out: Record<string, LspServerOverride> = {}\n for (const [id, raw] of Object.entries(value)) {\n if (!isRecord(raw)) continue\n const entry: LspServerOverride = {}\n if (typeof raw.disabled === 'boolean') entry.disabled = raw.disabled\n entry.extensions = normalizeStringArray(raw.extensions)\n entry.rootMarkers = normalizeStringArray(raw.rootMarkers)\n if (typeof raw.command === 'string' && raw.command.trim()) entry.command = raw.command\n entry.args = normalizeStringArray(raw.args)\n entry.env = normalizeStringRecord(raw.env)\n entry.initializationOptions = normalizeInitializationOptions(raw.initializationOptions)\n if (isRecord(raw.root)) {\n const include = normalizeStringArray(raw.root.include)\n const exclude = normalizeStringArray(raw.root.exclude)\n const branches = Array.isArray(raw.root.branches)\n ? raw.root.branches\n .map(branch => normalizeStringArray(branch))\n .filter((branch): branch is string[] => Boolean(branch && branch.length))\n : undefined\n if (include || exclude || branches) {\n entry.root = { include, exclude, branches }\n }\n }\n if (typeof raw.languageId === 'string' && raw.languageId.trim()) entry.languageId = raw.languageId\n if (typeof raw.priority === 'number' && Number.isFinite(raw.priority)) entry.priority = raw.priority\n if (typeof raw.group === 'string' && raw.group.trim()) entry.group = raw.group\n out[id] = entry\n }\n return Object.keys(out).length ? out : undefined\n}\n\nfunction normalizeServerGroups(value: unknown): LspServerGroup[] | undefined {\n if (!Array.isArray(value)) return undefined\n const out: LspServerGroup[] = []\n for (const entry of value) {\n if (!isRecord(entry)) continue\n const id = typeof entry.id === 'string' ? entry.id.trim() : ''\n const strategy =\n entry.strategy === 'parallel' || entry.strategy === 'exclusive' || entry.strategy === 'fallback'\n ? entry.strategy\n : undefined\n const serverIds = normalizeStringArray(entry.serverIds)\n if (!id || !strategy || !serverIds || serverIds.length === 0) continue\n out.push({\n id,\n strategy,\n serverIds,\n extensions: normalizeStringArray(entry.extensions)\n })\n }\n return out.length ? out : undefined\n}\n\nfunction mergeOverrides(\n base: Record<string, LspServerOverride> | undefined,\n next: Record<string, LspServerOverride> | undefined\n): Record<string, LspServerOverride> | undefined {\n if (!base && !next) return undefined\n const out: Record<string, LspServerOverride> = { ...(base ?? {}) }\n if (next) {\n for (const [key, value] of Object.entries(next)) {\n out[key] = { ...(out[key] ?? {}), ...value }\n }\n }\n return out\n}\n\nfunction mergeStringArrays(base: string[] | undefined, next: string[] | undefined): string[] | undefined {\n if (!base && !next) return undefined\n return normalizeStringArray([...(base ?? []), ...(next ?? [])])\n}\n\nfunction mergeStringRecords(\n base: Record<string, string> | undefined,\n next: Record<string, string> | undefined\n): Record<string, string> | undefined {\n if (!base && !next) return undefined\n return { ...(base ?? {}), ...(next ?? {}) }\n}\n\nfunction mergeBooleanRecords(\n base: Record<string, boolean> | undefined,\n next: Record<string, boolean> | undefined\n): Record<string, boolean> | undefined {\n if (!base && !next) return undefined\n return { ...(base ?? {}), ...(next ?? {}) }\n}\n\nfunction mergeLspSettings(base: LspSettings | undefined, next: LspSettings | undefined): LspSettings | undefined {\n if (!base && !next) return undefined\n const merged: LspSettings = { ...(base ?? {}) }\n merged.disabledServers = mergeStringArrays(base?.disabledServers, next?.disabledServers)\n merged.servers = mergeOverrides(base?.servers, next?.servers)\n merged.experimental = mergeBooleanRecords(base?.experimental, next?.experimental)\n merged.languageMap = mergeStringRecords(base?.languageMap, next?.languageMap)\n merged.languageCategories = mergeStringRecords(base?.languageCategories, next?.languageCategories)\n merged.serverGroups = next?.serverGroups ?? base?.serverGroups\n merged.initializationOptions = mergeInitializationOptions(base?.initializationOptions, next?.initializationOptions)\n merged.env = mergeStringRecords(base?.env as Record<string, string> | undefined, next?.env as Record<string, string> | undefined)\n return merged\n}\n\nfunction mergeInitializationOptions(\n base: Record<string, unknown> | undefined,\n next: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined {\n if (!base && !next) return undefined\n return { ...(base ?? {}), ...(next ?? {}) }\n}\n\nfunction hasDenoConfig(rootPath: string): boolean {\n return ['deno.json', 'deno.jsonc'].some(name => existsSync(join(rootPath, name)))\n}\n\nfunction resolveTyBinary(rootPath: string): string | null {\n const direct = safeWhich('ty')\n if (direct) return direct\n const venvPaths = [process.env.VIRTUAL_ENV, join(rootPath, '.venv'), join(rootPath, 'venv')].filter(\n (value): value is string => Boolean(value)\n )\n for (const venvPath of venvPaths) {\n const binary =\n process.platform === 'win32'\n ? join(venvPath, 'Scripts', 'ty.exe')\n : join(venvPath, 'bin', 'ty')\n if (existsSync(binary)) return binary\n }\n return null\n}\n\nfunction hasTyBinary(rootPath: string): boolean {\n return Boolean(resolveTyBinary(rootPath))\n}\n\nfunction applyExperimentalSwitches(settings: LspSettings | undefined): LspSettings | undefined {\n if (!settings) return undefined\n const envToggles = readExperimentalEnvToggles()\n const experimental = settings.experimental || envToggles\n if (!experimental) return settings\n const disabled = new Set(settings.disabledServers ?? [])\n const merged: Record<string, boolean> = {\n ...(settings.experimental ?? {}),\n ...(envToggles ?? {})\n }\n for (const [key, enabled] of Object.entries(merged)) {\n if (!enabled) continue\n const rule = EXPERIMENTAL_SWITCHES[key]\n if (!rule) continue\n const canDisable =\n key !== 'ty' || hasTyBinary(getSessionRoot())\n for (const id of rule.enable) {\n disabled.delete(id)\n }\n for (const id of rule.disable) {\n if (canDisable) {\n disabled.add(id)\n }\n }\n }\n return {\n ...settings,\n disabledServers: disabled.size ? Array.from(disabled) : undefined,\n experimental\n }\n}\n\nfunction normalizeLspSettings(value: unknown): LspSettings | undefined {\n if (!isRecord(value)) return undefined\n return {\n disabledServers: normalizeStringArray(value.disabledServers),\n servers: normalizeServerOverrides(value.servers),\n experimental: normalizeBooleanRecord(value.experimental),\n languageMap: normalizeStringRecord(value.languageMap),\n languageCategories: normalizeStringRecord(value.languageCategories),\n serverGroups: normalizeServerGroups(value.serverGroups),\n initializationOptions: normalizeInitializationOptions(value.initializationOptions),\n env: normalizeStringRecord(value.env)\n }\n}\n\nfunction loadLspSettingsFromFiles(options?: { projectDir?: string; homeDir?: string }): LspSettings | undefined {\n if (process.env.BUN_TEST || process.env.NODE_ENV === 'test') {\n return undefined\n }\n const projectDir = options?.projectDir ?? getSessionRoot()\n const homeDir = options?.homeDir\n const user = loadSettingsWithLegacyFallback({\n destination: 'userSettings',\n projectDir,\n homeDir,\n migrateToPrimary: true\n }).settings\n const project = loadSettingsWithLegacyFallback({\n destination: 'projectSettings',\n projectDir,\n homeDir,\n migrateToPrimary: true\n }).settings\n const local = loadSettingsWithLegacyFallback({\n destination: 'localSettings',\n projectDir,\n homeDir,\n migrateToPrimary: true\n }).settings\n\n const userSettings = normalizeLspSettings((user as Record<string, unknown> | null)?.lsp)\n const projectSettings = normalizeLspSettings((project as Record<string, unknown> | null)?.lsp)\n const localSettings = normalizeLspSettings((local as Record<string, unknown> | null)?.lsp)\n\n return mergeLspSettings(mergeLspSettings(userSettings, projectSettings), localSettings)\n}\n\nexport function detectPythonVenv(rootPath: string): string | null {\n const envVenv = process.env.VIRTUAL_ENV?.trim()\n const candidates =\n process.platform === 'win32'\n ? [\n ...(envVenv ? [join(envVenv, 'Scripts', 'python.exe')] : []),\n join(rootPath, '.venv', 'Scripts', 'python.exe'),\n join(rootPath, 'venv', 'Scripts', 'python.exe')\n ]\n : [\n ...(envVenv ? [join(envVenv, 'bin', 'python')] : []),\n join(rootPath, '.venv', 'bin', 'python'),\n join(rootPath, 'venv', 'bin', 'python')\n ]\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate\n }\n return null\n}\n\nexport async function npmInstallIfMissing(\n packages: string[],\n cwd: string = lspInstallDir\n): Promise<boolean> {\n const missing = packages.filter(pkg => !existsSync(join(cwd, 'node_modules', pkg, 'package.json')))\n if (missing.length === 0) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n return bunInstall(missing, cwd)\n}\n\nexport function multiResolveBinary(options: {\n binNames: string[]\n packageName?: string\n args?: string[]\n cwd?: string\n}): LspServerCommand | null {\n const cwd = options.cwd ?? process.cwd()\n const localBinDir = join(cwd, 'node_modules', '.bin')\n for (const binName of options.binNames) {\n if (safeWhich(binName)) {\n return { command: binName, args: options.args ?? [] }\n }\n const localBin = resolveBinInDir(localBinDir, binName)\n if (localBin) {\n return { command: localBin, args: options.args ?? [] }\n }\n const lspBin = resolveBinInDir(join(lspInstallDir, 'node_modules', '.bin'), binName)\n if (lspBin) {\n return { command: lspBin, args: options.args ?? [] }\n }\n }\n if (options.packageName) {\n const bunBin = resolveBunRuntimePath()\n if (!bunBin) return null\n return { command: bunBin, args: ['x', options.packageName, ...(options.args ?? [])] }\n }\n return null\n}\n\nexport type BinaryDownloadPlan = {\n url: string\n archiveType: 'zip' | 'tar.gz'\n installDir: string\n expectedFiles: string[]\n}\n\nexport function planLuaLsDownload(installDir: string): BinaryDownloadPlan {\n const version = process.env.PYB_LUA_LS_VERSION?.trim() || '3.13.5'\n const platform =\n process.platform === 'win32'\n ? 'win32'\n : process.platform === 'darwin'\n ? 'darwin'\n : 'linux'\n const arch = process.arch === 'arm64' ? 'arm64' : 'x64'\n const archiveType = process.platform === 'win32' ? 'zip' : 'tar.gz'\n const filename = `lua-language-server-${version}-${platform}-${arch}.${archiveType}`\n return {\n url: `https://github.com/LuaLS/lua-language-server/releases/download/${version}/${filename}`,\n archiveType,\n installDir,\n expectedFiles: [process.platform === 'win32' ? 'bin/lua-language-server.exe' : 'bin/lua-language-server']\n }\n}\n\nexport function planZlsDownload(installDir: string): BinaryDownloadPlan {\n const version = process.env.PYB_ZLS_VERSION?.trim() || '0.13.0'\n const platform =\n process.platform === 'win32'\n ? 'windows'\n : process.platform === 'darwin'\n ? 'macos'\n : 'linux'\n const arch = process.arch === 'arm64' ? 'aarch64' : 'x86_64'\n const archiveType = process.platform === 'win32' ? 'zip' : 'tar.gz'\n const filename = `zls-${platform}-${arch}.${archiveType}`\n return {\n url: `https://github.com/zls/zls/releases/download/${version}/${filename}`,\n archiveType,\n installDir,\n expectedFiles: [process.platform === 'win32' ? 'zls.exe' : 'zls']\n }\n}\n\nexport function planElixirLsDownload(installDir: string): BinaryDownloadPlan {\n const version = process.env.PYB_ELIXIR_LS_VERSION?.trim() || '0.18.2'\n const archiveType = 'zip'\n const filename = `elixir-ls-${version}.zip`\n return {\n url: `https://github.com/elixir-lsp/elixir-ls/releases/download/${version}/${filename}`,\n archiveType,\n installDir,\n expectedFiles: ['language_server.sh']\n }\n}\n\nexport function planJdtlsDownload(installDir: string): BinaryDownloadPlan {\n const version = process.env.PYB_JDTLS_VERSION?.trim() || '1.34.0'\n const platform =\n process.platform === 'win32'\n ? 'win32'\n : process.platform === 'darwin'\n ? 'mac'\n : 'linux'\n const archiveType = 'tar.gz'\n const filename = `jdtls-${version}-${platform}.tar.gz`\n return {\n url: `https://download.eclipse.org/jdtls/milestones/${version}/${filename}`,\n archiveType,\n installDir,\n expectedFiles: ['plugins', 'configuration']\n }\n}\n\nasync function extractArchive(buffer: Uint8Array, archiveType: 'zip' | 'tar.gz', targetDir: string): Promise<void> {\n if (archiveType === 'zip') {\n const { unzipSync } = await import('fflate')\n const files = unzipSync(buffer)\n for (const [name, data] of Object.entries(files)) {\n const isDirEntry = name.endsWith('/')\n const entryName = isDirEntry ? name.slice(0, -1) : name\n if (!entryName) continue\n const targetPath = join(targetDir, entryName)\n const ensureDir = (dirPath: string) => {\n if (existsSync(dirPath)) {\n const stats = statSync(dirPath)\n if (stats.isDirectory()) return\n rmSync(dirPath, { recursive: true, force: true })\n }\n mkdirSync(dirPath, { recursive: true })\n }\n if (isDirEntry) {\n ensureDir(targetPath)\n continue\n }\n const targetDirPath = dirname(targetPath)\n ensureDir(targetDirPath)\n if (existsSync(targetPath)) {\n const stats = statSync(targetPath)\n if (stats.isDirectory()) {\n rmSync(targetPath, { recursive: true, force: true })\n }\n }\n writeFileSync(targetPath, data)\n }\n return\n }\n const archiveName = `archive-${Date.now()}.tar.gz`\n const tempDir = mkdtempSync(join(targetDir, 'tmp-'))\n const archivePath = join(tempDir, archiveName)\n writeFileSync(archivePath, buffer)\n await runBinary(['tar', '-xzf', archivePath, '-C', targetDir], undefined, tempDir)\n rmSync(tempDir, { recursive: true, force: true })\n}\n\nexport async function downloadAndExtractArchive(plan: BinaryDownloadPlan): Promise<void> {\n if (!existsSync(plan.installDir)) {\n mkdirSync(plan.installDir, { recursive: true })\n }\n const response = await fetch(plan.url)\n if (!response.ok) {\n throw new Error(`Failed to download ${plan.url}: ${response.status}`)\n }\n const buffer = new Uint8Array(await response.arrayBuffer())\n await extractArchive(buffer, plan.archiveType, plan.installDir)\n}\n\nfunction findFileRecursive(root: string, filename: string): string | null {\n const entries = readdirSync(root, { withFileTypes: true })\n for (const entry of entries) {\n const full = join(root, entry.name)\n if (entry.isDirectory()) {\n const found = findFileRecursive(full, filename)\n if (found) return found\n } else if (entry.isFile() && entry.name === filename) {\n return full\n }\n }\n return null\n}\n\nexport async function installLuaLs(installDir: string): Promise<boolean> {\n const plan = planLuaLsDownload(installDir)\n await downloadAndExtractArchive(plan)\n const expected = plan.expectedFiles.find(file => findFileRecursive(installDir, basename(file)))\n if (!expected) {\n throw new Error('LuaLS binary not found after extraction')\n }\n if (process.platform !== 'win32') {\n chmodSync(expected, 0o755)\n }\n return true\n}\n\nexport async function installZls(installDir: string): Promise<boolean> {\n if (!safeWhich('zig')) {\n throw new Error('zig not found')\n }\n const plan = planZlsDownload(installDir)\n await downloadAndExtractArchive(plan)\n const expected = plan.expectedFiles.find(file => findFileRecursive(installDir, basename(file)))\n if (!expected) {\n throw new Error('zls binary not found after extraction')\n }\n if (process.platform !== 'win32') {\n chmodSync(expected, 0o755)\n }\n return true\n}\n\nexport async function installElixirLs(installDir: string): Promise<boolean> {\n if (!safeWhich('elixir') || !safeWhich('mix')) {\n throw new Error('elixir or mix not found')\n }\n const plan = planElixirLsDownload(installDir)\n await downloadAndExtractArchive(plan)\n const script =\n findFileRecursive(\n installDir,\n process.platform === 'win32' ? 'language_server.bat' : 'language_server.sh'\n ) ?? findFileRecursive(installDir, 'language_server.sh')\n if (!script) {\n throw new Error('language_server script not found after extraction')\n }\n await runBinary(['mix', 'deps.get'], undefined, installDir)\n await runBinary(['mix', 'compile'], undefined, installDir)\n if (process.platform !== 'win32') {\n chmodSync(script, 0o755)\n }\n return true\n}\n\nexport async function installJdtls(installDir: string): Promise<boolean> {\n if (!safeWhich('java')) {\n throw new Error('java not found')\n }\n const javaMajor = await getJavaMajorVersion()\n if (!javaMajor || javaMajor < 21) {\n throw new Error('java 21 or newer required')\n }\n const plan = planJdtlsDownload(installDir)\n await downloadAndExtractArchive(plan)\n const pluginsDir = join(installDir, 'plugins')\n const configDir = join(installDir, 'configuration')\n if (!existsSync(pluginsDir) || !existsSync(configDir)) {\n throw new Error('jdtls install incomplete')\n }\n return true\n}\n\nfunction resolveMetalsBinary(installDir: string): string | null {\n const direct = safeWhich('metals')\n if (direct) return direct\n const local = resolveBinInDir(installDir, 'metals')\n return local || null\n}\n\nexport async function installMetals(installDir: string): Promise<boolean> {\n if (!safeWhich('java')) {\n throw new Error('java not found')\n }\n const javaMajor = await getJavaMajorVersion()\n if (!javaMajor || javaMajor < 17) {\n throw new Error('java 17 or newer required')\n }\n if (resolveMetalsBinary(installDir)) return true\n const installer = safeWhich('cs') ?? safeWhich('coursier')\n if (!installer) {\n throw new Error('coursier not found')\n }\n if (!existsSync(installDir)) {\n mkdirSync(installDir, { recursive: true })\n }\n const version = process.env.PYB_METALS_VERSION?.trim()\n const coord = version ? `metals:${version}` : 'metals'\n const result = await runBinary([installer, 'install', coord, '--install-dir', installDir], undefined, installDir)\n if (!result.ok) {\n throw new Error(result.error || 'metals install failed')\n }\n const binary = resolveBinInDir(installDir, 'metals')\n if (!binary) {\n throw new Error('metals binary not found after install')\n }\n if (process.platform !== 'win32') {\n chmodSync(binary, 0o755)\n }\n return true\n}\n\nfunction getJdtlsLauncherJar(installDir: string): string | null {\n const pluginsDir = join(installDir, 'plugins')\n if (!existsSync(pluginsDir)) return null\n const launcher = readdirSync(pluginsDir).find(name =>\n name.startsWith('org.eclipse.equinox.launcher_') && name.endsWith('.jar')\n )\n if (!launcher) return null\n const launcherPath = join(pluginsDir, launcher)\n return existsSync(launcherPath) ? launcherPath : null\n}\n\nfunction getJdtlsConfigDir(installDir: string): string | null {\n const suffix = process.platform === 'darwin' ? 'mac' : process.platform === 'win32' ? 'win' : 'linux'\n const baseConfig = join(installDir, 'configuration')\n const candidates = [\n join(installDir, `config_${suffix}`),\n join(baseConfig, `config_${suffix}`),\n baseConfig\n ]\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate\n }\n return null\n}\n\nexport type LspServerCommand = { command: string; args: string[] }\n\nexport type LspInstallStrategy = () => Promise<boolean>\n\nexport type LspSpawnStrategy = (rootPath: string) => Promise<LspServerCommand | null>\n\nexport type LspRootStrategy = (filePath: string, defaultRoot: string) => Promise<string> | string\n\nexport interface LspServerInfo {\n id: string\n extensions: string[]\n rootMarkers: string[]\n prepare(): Promise<boolean>\n getCommand(rootPath: string): Promise<LspServerCommand | null>\n isEnabled?: (rootPath: string) => Promise<boolean> | boolean\n resolveRoot?: LspRootStrategy\n env?: Record<string, string>\n initializationOptions?: Record<string, unknown>\n languageId?: string\n rootInclude?: string[]\n rootExclude?: string[]\n rootBranches?: string[][]\n priority?: number\n group?: string\n disabled?: boolean\n}\n\nabstract class BaseLspServer implements LspServerInfo {\n abstract id: string\n abstract extensions: string[]\n abstract rootMarkers: string[]\n\n abstract prepare(): Promise<boolean>\n abstract getCommand(rootPath: string): Promise<LspServerCommand | null>\n\n protected isInPath(cmd: string): boolean {\n return Boolean(safeWhich(cmd))\n }\n\n protected getLocalBinPath(binName: string, npmPackageName?: string): string {\n const envPackageRoot = getEnvPackageRoot()\n if (envPackageRoot) {\n const envBin = resolveBinInDir(join(envPackageRoot, 'node_modules', '.bin'), binName)\n if (envBin) return envBin\n }\n const localNodeModulesBin = join(process.cwd(), 'node_modules', '.bin')\n const localBin = resolveBinInDir(localNodeModulesBin, binName)\n if (localBin) return localBin\n\n try {\n const pkgName = npmPackageName || binName\n const resolvePaths = envPackageRoot\n ? [envPackageRoot, process.cwd(), __dirname]\n : [process.cwd(), __dirname]\n const pkgEntry = require.resolve(pkgName, { paths: resolvePaths })\n let current = pkgEntry\n let pkgRoot = ''\n for (let i = 0; i < 5; i++) {\n current = join(current, '..')\n if (existsSync(join(current, 'package.json'))) {\n pkgRoot = current\n break\n }\n }\n if (pkgRoot) {\n const nodeModulesRoot = join(pkgRoot, '..')\n const resolved = resolveBinInDir(join(nodeModulesRoot, '.bin'), binName)\n if (resolved) return resolved\n }\n } catch (e) {}\n\n const lspBin = resolveBinInDir(join(lspInstallDir, 'node_modules', '.bin'), binName)\n if (lspBin) return lspBin\n\n return ''\n }\n\n protected getRuntimeCommand(): string {\n return resolveRuntimeCommand()\n }\n}\n\nexport class ServerDefinition extends BaseLspServer {\n id: string\n extensions: string[]\n rootMarkers: string[]\n private installStrategy?: LspInstallStrategy\n private spawnStrategy?: LspSpawnStrategy\n private enabledStrategy?: (rootPath: string) => Promise<boolean> | boolean\n resolveRoot?: LspRootStrategy\n priority?: number\n group?: string\n\n constructor(options: {\n id: string\n extensions: string[]\n rootMarkers: string[]\n install?: LspInstallStrategy\n spawn?: LspSpawnStrategy\n isEnabled?: (rootPath: string) => Promise<boolean> | boolean\n resolveRoot?: LspRootStrategy\n priority?: number\n group?: string\n }) {\n super()\n this.id = options.id\n this.extensions = options.extensions\n this.rootMarkers = options.rootMarkers\n this.installStrategy = options.install\n this.spawnStrategy = options.spawn\n this.enabledStrategy = options.isEnabled\n this.resolveRoot = options.resolveRoot\n this.priority = options.priority\n this.group = options.group\n }\n\n async prepare(): Promise<boolean> {\n if (this.installStrategy) {\n return runInstallWithPolicy(this.id, this.installStrategy)\n }\n return true\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n if (this.spawnStrategy) {\n return this.spawnStrategy(rootPath)\n }\n return null\n }\n\n async isEnabled(rootPath: string): Promise<boolean> {\n if (!this.enabledStrategy) return true\n const result = await this.enabledStrategy(rootPath)\n return Boolean(result)\n }\n}\n\nclass OverriddenServer implements LspServerInfo {\n id: string\n extensions: string[]\n rootMarkers: string[]\n resolveRoot?: LspRootStrategy\n env?: Record<string, string>\n initializationOptions?: Record<string, unknown>\n languageId?: string\n rootInclude?: string[]\n rootExclude?: string[]\n rootBranches?: string[][]\n priority?: number\n group?: string\n disabled?: boolean\n private overrideCommand?: string\n private overrideArgs?: string[]\n private enabledStrategy?: (rootPath: string) => Promise<boolean> | boolean\n\n constructor(\n private base: LspServerInfo,\n override: LspServerOverride | undefined,\n globalEnv: Record<string, string> | undefined,\n globalInitializationOptions: Record<string, unknown> | undefined\n ) {\n this.id = base.id\n this.extensions = override?.extensions ?? base.extensions\n this.rootMarkers = override?.rootMarkers ?? base.rootMarkers\n this.resolveRoot = base.resolveRoot\n this.env = mergeStringRecords(mergeStringRecords(base.env, globalEnv), override?.env)\n this.initializationOptions = mergeInitializationOptions(\n mergeInitializationOptions(base.initializationOptions, globalInitializationOptions),\n override?.initializationOptions\n )\n this.languageId = override?.languageId ?? base.languageId\n this.rootInclude = override?.root?.include ?? base.rootInclude\n this.rootExclude = override?.root?.exclude ?? base.rootExclude\n this.rootBranches = override?.root?.branches ?? base.rootBranches\n this.priority = override?.priority ?? base.priority\n this.group = override?.group ?? base.group\n this.disabled = override?.disabled ?? base.disabled\n this.overrideCommand = override?.command\n this.overrideArgs = override?.args\n this.enabledStrategy =\n typeof base.isEnabled === 'function' ? base.isEnabled.bind(base) : undefined\n }\n\n async prepare(): Promise<boolean> {\n return this.base.prepare()\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n if (this.overrideCommand) {\n return { command: this.overrideCommand, args: this.overrideArgs ?? [] }\n }\n if (this.base.id && this.base.id.length > 0) {\n return this.base.getCommand(rootPath)\n }\n return null\n }\n\n async isEnabled(rootPath: string): Promise<boolean> {\n if (!this.enabledStrategy) return true\n const result = await this.enabledStrategy(rootPath)\n return Boolean(result)\n }\n}\n\nexport class GenericNpmServer extends BaseLspServer {\n id: string\n extensions: string[]\n rootMarkers: string[]\n npmPackage: string\n binName: string\n args: string[]\n\n constructor(id: string, extensions: string[], rootMarkers: string[], npmPackage: string, binName: string, args: string[]) {\n super()\n this.id = id\n this.extensions = extensions\n this.rootMarkers = rootMarkers\n this.npmPackage = npmPackage\n this.binName = binName\n this.args = args\n }\n\n async prepare(): Promise<boolean> {\n if (this.isInPath(this.binName)) {\n return true\n }\n \n const localBin = this.getLocalBinPath(this.binName, this.npmPackage)\n if (existsSync(localBin)) {\n return true\n }\n\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) {\n return false\n }\n\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'start' })\n const ok = await bunInstall([this.npmPackage])\n if (!ok) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: this.id })\n return false\n }\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'success' })\n return true\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n // Optimization for Windows: Always try to run node script directly to avoid cmd.exe issues\n // We do this BEFORE checking PATH because 'bun run' adds node_modules/.bin to PATH,\n // which points to the .cmd shim that we want to avoid.\n if (process.platform === 'win32') {\n const pkgJsonPaths: string[] = []\n const envPackageRoot = getEnvPackageRoot()\n if (envPackageRoot) {\n const envPkgJson = join(envPackageRoot, 'node_modules', ...this.npmPackage.split('/'), 'package.json')\n if (existsSync(envPkgJson)) {\n pkgJsonPaths.push(envPkgJson)\n }\n }\n try {\n const resolvePaths = envPackageRoot\n ? [envPackageRoot, process.cwd(), __dirname]\n : [process.cwd(), __dirname]\n const resolvedPath = require.resolve(`${this.npmPackage}/package.json`, { paths: resolvePaths })\n if (resolvedPath) {\n pkgJsonPaths.push(resolvedPath)\n }\n } catch (e) {}\n const localPkgJson = join(lspInstallDir, 'node_modules', ...this.npmPackage.split('/'), 'package.json')\n if (existsSync(localPkgJson)) {\n pkgJsonPaths.push(localPkgJson)\n }\n\n for (const pkgJsonPath of pkgJsonPaths) {\n try {\n const pkgJson = require(pkgJsonPath)\n let binScript = ''\n if (typeof pkgJson.bin === 'string') {\n binScript = pkgJson.bin\n } else if (typeof pkgJson.bin === 'object' && pkgJson.bin[this.binName]) {\n binScript = pkgJson.bin[this.binName]\n }\n\n if (binScript) {\n if (this.npmPackage === 'pyright' && binScript.endsWith('langserver.index.js')) {\n const distScript = join(dirname(pkgJsonPath), 'dist', 'pyright-langserver.js')\n if (existsSync(distScript)) {\n return { command: this.getRuntimeCommand(), args: [distScript, ...this.args] }\n }\n }\n\n const scriptPath = join(dirname(pkgJsonPath), binScript)\n if (existsSync(scriptPath)) {\n return { command: this.getRuntimeCommand(), args: [scriptPath, ...this.args] }\n }\n }\n } catch (e) {}\n }\n }\n\n if (this.isInPath(this.binName)) {\n return { command: this.binName, args: this.args }\n }\n \n const localBin = this.getLocalBinPath(this.binName, this.npmPackage)\n if (existsSync(localBin)) {\n return { command: localBin, args: this.args }\n }\n \n return null\n }\n}\n\nclass GenericBinaryServer extends BaseLspServer {\n id: string\n extensions: string[]\n rootMarkers: string[]\n binNames: string[]\n args: string[]\n\n constructor(id: string, extensions: string[], rootMarkers: string[], binNames: string | string[], args: string[]) {\n super()\n this.id = id\n this.extensions = extensions\n this.rootMarkers = rootMarkers\n this.binNames = Array.isArray(binNames) ? binNames : [binNames]\n this.args = args\n }\n\n async prepare(): Promise<boolean> {\n return this.binNames.some(bin => this.isInPath(bin))\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n for (const bin of this.binNames) {\n if (this.isInPath(bin)) {\n return { command: bin, args: this.args }\n }\n }\n return null\n }\n}\n\nclass GoplsServer extends BaseLspServer {\n id = 'gopls'\n extensions = ['.go', '.mod']\n rootMarkers = ['go.mod', 'go.work', '.git']\n\n async prepare(): Promise<boolean> {\n if (this.isInPath('gopls')) {\n return true\n }\n\n if (!this.isInPath('go')) {\n debugLogger.error('LSP_MISSING_DEP', { server: this.id, error: 'go command not found' })\n addInstallNoticeOnce(\n {\n server: this.id,\n stage: 'failed',\n message: 'go command not found for gopls install',\n at: Date.now()\n },\n 'gopls:missing:go'\n )\n return false\n }\n\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) {\n return false\n }\n\n return this.installGo()\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n if (this.isInPath('gopls')) {\n return { command: 'gopls', args: ['serve'] }\n }\n\n const localBin = resolveBinInDir(lspInstallDir, 'gopls')\n if (localBin) {\n return { command: localBin, args: ['serve'] }\n }\n\n return null\n }\n\n private async installGo(): Promise<boolean> {\n try {\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'start' })\n\n const result = await runBinary(\n ['go', 'install', 'golang.org/x/tools/gopls@latest'],\n {\n GOBIN: lspInstallDir,\n PATH: process.env.PATH ? `${lspInstallDir}${process.platform === 'win32' ? ';' : ':'}${process.env.PATH}` : lspInstallDir\n }\n )\n\n if (!result.ok) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: this.id, error: result.error })\n return false\n }\n\n if (!this.isInPath('gopls') && !resolveBinInDir(lspInstallDir, 'gopls')) {\n debugLogger.warn('LSP_INSTALL_WARNING', { server: this.id, message: 'gopls installed but not found in PATH.' })\n }\n\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'success' })\n return true\n } catch (e) {\n debugLogger.error('LSP_INSTALL_ERROR', { server: this.id, error: String(e) })\n return false\n }\n }\n}\n\nclass RustAnalyzerServer extends BaseLspServer {\n id = 'rust-analyzer'\n extensions = ['.rs']\n rootMarkers = ['Cargo.toml', 'rust-project.json', '.git']\n\n async prepare(): Promise<boolean> {\n if (this.isInPath('rust-analyzer')) {\n return true\n }\n\n if (this.isInPath('rustup')) {\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) {\n return false\n }\n return this.installRustup()\n }\n\n debugLogger.warn('LSP_MISSING_DEP', { server: this.id, message: 'rust-analyzer not found and rustup not available. Please install rust-analyzer manually.' })\n addInstallNoticeOnce(\n {\n server: this.id,\n stage: 'failed',\n message: 'rust-analyzer not found and rustup not available',\n at: Date.now()\n },\n 'rust-analyzer:missing:rustup'\n )\n return false\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n if (this.isInPath('rust-analyzer')) {\n return { command: 'rust-analyzer', args: [] }\n }\n return null\n }\n\n private async installRustup(): Promise<boolean> {\n try {\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'start' })\n\n const result = await runBinary(['rustup', 'component', 'add', 'rust-analyzer'])\n\n if (!result.ok) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: this.id, error: result.error })\n return false\n }\n\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'success' })\n return true\n } catch (e) {\n debugLogger.error('LSP_INSTALL_ERROR', { server: this.id, error: String(e) })\n return false\n }\n }\n}\n\n\nexport class LspServerRegistry {\n private static instance: LspServerRegistry\n private servers: LspServerInfo[] = []\n private baseServers: LspServerInfo[] = []\n private globalSettings: LspSettings | undefined\n\n private constructor() {\n // Pyright (GenericNpmServer)\n this.register(new GenericNpmServer(\n 'pyright',\n ['.py', '.pyi'],\n ['pyrightconfig.json', 'pyproject.toml', 'setup.py', 'requirements.txt', 'Pipfile'],\n 'pyright',\n 'pyright-langserver',\n ['--stdio']\n ))\n\n this.register(new ServerDefinition({\n id: 'ty',\n extensions: ['.py', '.pyi'],\n rootMarkers: ['pyproject.toml', 'ty.toml', 'setup.py', 'setup.cfg', 'requirements.txt', 'Pipfile', 'pyrightconfig.json'],\n spawn: async (rootPath) => {\n const binary = resolveTyBinary(rootPath)\n if (!binary) return null\n return { command: binary, args: ['server'] }\n },\n priority: -1\n }))\n \n this.register(new GoplsServer())\n this.register(new RustAnalyzerServer())\n this.register(new GenericNpmServer(\n 'bash-language-server',\n ['.sh', '.bash', '.zsh'],\n ['.git'],\n 'bash-language-server',\n 'bash-language-server',\n ['start']\n ))\n\n this.register(new ServerDefinition({\n id: 'deno',\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts'],\n rootMarkers: ['deno.json', 'deno.jsonc'],\n isEnabled: async (rootPath) => hasDenoConfig(rootPath),\n spawn: async (rootPath) => {\n const deno = safeWhich('deno')\n if (!deno) return null\n return { command: deno, args: ['lsp'] }\n },\n priority: 5\n }))\n\n // TypeScript/JavaScript (typescript-language-server)\n this.register(new GenericNpmServer(\n 'typescript-language-server',\n ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],\n ['tsconfig.json', 'package.json', 'jsconfig.json'],\n 'typescript-language-server',\n 'typescript-language-server',\n ['--stdio']\n ))\n\n // Tier 1: Easy NPM-based Servers\n // YAML\n this.register(new GenericNpmServer(\n 'yaml-language-server',\n ['.yaml', '.yml'],\n [],\n 'yaml-language-server',\n 'yaml-language-server',\n ['--stdio']\n ))\n\n // Dockerfile\n this.register(new GenericNpmServer(\n 'dockerfile-language-server',\n ['Dockerfile', '.dockerfile'],\n [],\n 'dockerfile-language-server-nodejs',\n 'docker-langserver',\n ['--stdio']\n ))\n\n // Vue\n this.register(new ServerDefinition({\n id: 'vue-language-server',\n extensions: ['.vue'],\n rootMarkers: ['package.json'],\n install: async () => {\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n return npmInstallIfMissing(['@vue/language-server'])\n },\n spawn: async (rootPath) =>\n multiResolveBinary({\n binNames: ['vue-language-server'],\n args: ['--stdio'],\n packageName: '@vue/language-server',\n cwd: rootPath\n })\n }))\n\n this.register(new ServerDefinition({\n id: 'eslint',\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts', '.vue'],\n rootMarkers: [\n 'package-lock.json',\n 'bun.lockb',\n 'bun.lock',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'package.json'\n ],\n install: async () => installEslintServer(),\n spawn: async (rootPath) => {\n const serverPath = getEslintServerPath()\n if (!existsSync(serverPath)) return null\n const hasEslint = await safeResolvePackage('eslint', rootPath)\n if (!hasEslint) return null\n const runtimeCommand = resolveBunRuntimePath() || resolveRuntimeCommand()\n return { command: runtimeCommand, args: [serverPath, '--stdio'] }\n },\n priority: -10,\n group: 'lint'\n }))\n\n this.register(new ServerDefinition({\n id: 'oxlint',\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts', '.vue', '.astro', '.svelte'],\n rootMarkers: [\n '.oxlintrc.json',\n 'package-lock.json',\n 'bun.lockb',\n 'bun.lock',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'package.json'\n ],\n spawn: async (rootPath) => {\n const lintCommand = multiResolveBinary({\n binNames: ['oxlint'],\n args: ['--lsp'],\n cwd: rootPath\n })\n if (lintCommand) return lintCommand\n const serverCommand = multiResolveBinary({\n binNames: ['oxc_language_server'],\n cwd: rootPath\n })\n if (serverCommand) return serverCommand\n return multiResolveBinary({\n binNames: ['oxlint'],\n args: ['--lsp'],\n packageName: 'oxlint',\n cwd: rootPath\n })\n },\n priority: -5,\n group: 'lint'\n }))\n\n this.register(new ServerDefinition({\n id: 'biome',\n extensions: [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.mts',\n '.cts',\n '.json',\n '.jsonc',\n '.vue',\n '.astro',\n '.svelte',\n '.css',\n '.graphql',\n '.gql',\n '.html'\n ],\n rootMarkers: [\n 'biome.json',\n 'biome.jsonc',\n 'package-lock.json',\n 'bun.lockb',\n 'bun.lock',\n 'pnpm-lock.yaml',\n 'yarn.lock'\n ],\n spawn: async (rootPath) =>\n multiResolveBinary({\n binNames: ['biome'],\n args: ['lsp-proxy', '--stdio'],\n packageName: 'biome',\n cwd: rootPath\n }),\n priority: -5,\n group: 'lint'\n }))\n\n // HTML/CSS/JSON (vscode-langservers-extracted)\n // Note: The binary names might vary, usually `vscode-html-language-server`, `vscode-css-language-server`\n // Let's add them individually but sharing the same package install? \n // GenericNpmServer assumes 1 package = 1 binary. \n // vscode-langservers-extracted provides multiple bins.\n // We can just instantiate multiple GenericNpmServer with the same package name. It's fine, it will just try to install it again (npm handles it).\n \n this.register(new GenericNpmServer(\n 'html-language-server',\n ['.html', '.htm'],\n [],\n 'vscode-langservers-extracted',\n 'vscode-html-language-server',\n ['--stdio']\n ))\n\n this.register(new GenericNpmServer(\n 'css-language-server',\n ['.css', '.scss', '.less'],\n [],\n 'vscode-langservers-extracted',\n 'vscode-css-language-server',\n ['--stdio']\n ))\n\n this.register(new GenericNpmServer(\n 'json-language-server',\n ['.json', '.jsonc'],\n [],\n 'vscode-langservers-extracted',\n 'vscode-json-language-server',\n ['--stdio']\n ))\n\n // Tier 2: Easy NPM-based Servers (More)\n // PHP (intelephense)\n this.register(new GenericNpmServer(\n 'intelephense',\n ['.php'],\n ['composer.json'],\n 'intelephense',\n 'intelephense',\n ['--stdio']\n ))\n\n // Svelte\n this.register(new ServerDefinition({\n id: 'svelte-language-server',\n extensions: ['.svelte'],\n rootMarkers: ['package.json'],\n install: async () => {\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n return npmInstallIfMissing(['svelte-language-server'])\n },\n spawn: async (rootPath) =>\n multiResolveBinary({\n binNames: ['svelte-language-server'],\n args: ['--stdio'],\n packageName: 'svelte-language-server',\n cwd: rootPath\n })\n }))\n\n // Astro\n this.register(new ServerDefinition({\n id: 'astro-ls',\n extensions: ['.astro'],\n rootMarkers: ['package.json'],\n install: async () => {\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n return npmInstallIfMissing(['@astrojs/language-server'])\n },\n spawn: async (rootPath) =>\n multiResolveBinary({\n binNames: ['astro-ls'],\n args: ['--stdio'],\n packageName: '@astrojs/language-server',\n cwd: rootPath\n })\n }))\n\n // Prisma\n this.register(new GenericNpmServer(\n 'prisma-language-server',\n ['.prisma'],\n ['schema.prisma'],\n '@prisma/language-server',\n 'prisma-language-server',\n ['--stdio']\n ))\n\n // GraphQL\n this.register(new GenericNpmServer(\n 'graphql-lsp',\n ['.graphql', '.gql'],\n ['.graphqlrc', 'graphql.config.js'],\n 'graphql-language-service-cli',\n 'graphql-lsp',\n ['server', '-m', 'stream']\n ))\n\n // Tier 3: Binary Path Detection (System Dependencies)\n this.register(new ServerDefinition({\n id: 'jdtls',\n extensions: ['.java'],\n rootMarkers: ['pom.xml', 'build.gradle', 'build.gradle.kts', '.project', '.classpath'],\n install: async () => {\n const installDir = join(lspInstallDir, 'jdtls')\n const launcherJar = getJdtlsLauncherJar(installDir)\n const configDir = getJdtlsConfigDir(installDir)\n if (launcherJar && configDir) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n try {\n await installJdtls(installDir)\n return true\n } catch (error) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'jdtls', error: String(error) })\n return false\n }\n },\n spawn: async () => {\n const java = safeWhich('java')\n if (!java) return null\n const javaMajor = await getJavaMajorVersion()\n if (!javaMajor || javaMajor < 21) return null\n const installDir = join(lspInstallDir, 'jdtls')\n const launcherJar = getJdtlsLauncherJar(installDir)\n const configDir = getJdtlsConfigDir(installDir)\n if (!launcherJar || !configDir) return null\n const dataDir = mkdtempSync(join(tmpdir(), 'pyb-jdtls-'))\n return {\n command: java,\n args: [\n '-jar',\n launcherJar,\n '-configuration',\n configDir,\n '-data',\n dataDir,\n '-Declipse.application=org.eclipse.jdt.ls.core.id1',\n '-Dosgi.bundles.defaultStartLevel=4',\n '-Declipse.product=org.eclipse.jdt.ls.core.product',\n '-Dlog.level=ALL',\n '--add-modules=ALL-SYSTEM',\n '--add-opens',\n 'java.base/java.util=ALL-UNNAMED',\n '--add-opens',\n 'java.base/java.lang=ALL-UNNAMED'\n ]\n }\n }\n }))\n\n // C/C++ (clangd)\n this.register(new GenericBinaryServer(\n 'clangd',\n ['.c', '.cpp', '.h', '.hpp', '.cc'],\n ['compile_commands.json', '.clang-format'],\n 'clangd',\n ['--stdio']\n ))\n\n // Ruby (ruby-lsp)\n this.register(new GenericBinaryServer(\n 'ruby-lsp',\n ['.rb', '.rake'],\n ['Gemfile', '.ruby-version'],\n 'ruby-lsp',\n ['--stdio']\n ))\n\n this.register(new ServerDefinition({\n id: 'lua-language-server',\n extensions: ['.lua'],\n rootMarkers: [\n '.luarc.json',\n '.luarc.jsonc',\n '.luacheckrc',\n '.stylua.toml',\n 'stylua.toml',\n 'selene.toml',\n 'selene.yml'\n ],\n install: async () => {\n const installDir = join(lspInstallDir, 'lua-language-server')\n const existing = findFileRecursive(\n installDir,\n process.platform === 'win32' ? 'lua-language-server.exe' : 'lua-language-server'\n )\n if (existing) return true\n if (safeWhich('lua-language-server') || safeWhich('lua-ls')) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n try {\n await installLuaLs(installDir)\n return true\n } catch (error) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'lua-language-server', error: String(error) })\n return false\n }\n },\n spawn: async (rootPath) => {\n const direct = multiResolveBinary({\n binNames: ['lua-language-server', 'lua-ls'],\n cwd: rootPath\n })\n if (direct) return direct\n const installDir = join(lspInstallDir, 'lua-language-server')\n const binary = findFileRecursive(\n installDir,\n process.platform === 'win32' ? 'lua-language-server.exe' : 'lua-language-server'\n )\n if (!binary) return null\n return { command: binary, args: [] }\n }\n }))\n\n // Terraform (terraform-ls)\n this.register(new GenericBinaryServer(\n 'terraform-ls',\n ['.tf', '.tfvars'],\n [],\n 'terraform-ls',\n ['serve']\n ))\n\n // Kotlin (kotlin-language-server)\n this.register(new GenericBinaryServer(\n 'kotlin-language-server',\n ['.kt', '.kts'],\n ['build.gradle.kts'],\n ['kotlin-ls', 'kotlin-language-server'],\n []\n ))\n\n this.register(new ServerDefinition({\n id: 'elixir-ls',\n extensions: ['.ex', '.exs'],\n rootMarkers: ['mix.exs', 'mix.lock'],\n install: async () => {\n const installDir = join(lspInstallDir, 'elixir-ls')\n const existing = findFileRecursive(\n installDir,\n process.platform === 'win32' ? 'language_server.bat' : 'language_server.sh'\n )\n if (existing) return true\n if (safeWhich('elixir-ls')) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n try {\n await installElixirLs(installDir)\n return true\n } catch (error) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'elixir-ls', error: String(error) })\n return false\n }\n },\n spawn: async (rootPath) => {\n if (safeWhich('elixir-ls')) {\n return { command: 'elixir-ls', args: [] }\n }\n const installDir = join(lspInstallDir, 'elixir-ls')\n const binary =\n findFileRecursive(installDir, process.platform === 'win32' ? 'language_server.bat' : 'language_server.sh') ??\n findFileRecursive(installDir, 'language_server.sh')\n if (!binary) return null\n return { command: binary, args: [] }\n }\n }))\n\n this.register(new ServerDefinition({\n id: 'zls',\n extensions: ['.zig', '.zon'],\n rootMarkers: ['build.zig'],\n install: async () => {\n const installDir = join(lspInstallDir, 'zls')\n const existing = findFileRecursive(installDir, process.platform === 'win32' ? 'zls.exe' : 'zls')\n if (existing) return true\n if (safeWhich('zls')) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n try {\n await installZls(installDir)\n return true\n } catch (error) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'zls', error: String(error) })\n return false\n }\n },\n spawn: async (rootPath) => {\n const direct = multiResolveBinary({ binNames: ['zls'], cwd: rootPath })\n if (direct) return direct\n const installDir = join(lspInstallDir, 'zls')\n const binary = findFileRecursive(installDir, process.platform === 'win32' ? 'zls.exe' : 'zls')\n if (!binary) return null\n return { command: binary, args: [] }\n }\n }))\n\n // C# (csharp-ls)\n this.register(new GenericBinaryServer(\n 'csharp-ls',\n ['.cs'],\n ['.csproj', '.sln'],\n 'csharp-ls',\n []\n ))\n\n // F# (fsautocomplete)\n this.register(new GenericBinaryServer(\n 'fsautocomplete',\n ['.fs', '.fsi', '.fsx'],\n ['.fsproj', '.sln'],\n 'fsautocomplete',\n ['--background-service-enabled']\n ))\n\n // Swift (sourcekit-lsp)\n this.register(new GenericBinaryServer(\n 'sourcekit-lsp',\n ['.swift'],\n ['Package.swift'],\n 'sourcekit-lsp',\n []\n ))\n\n // Dart (dart language-server)\n this.register(new GenericBinaryServer(\n 'dart',\n ['.dart'],\n ['pubspec.yaml'],\n 'dart',\n ['language-server']\n ))\n\n // OCaml (ocamllsp)\n this.register(new GenericBinaryServer(\n 'ocamllsp',\n ['.ml', '.mli'],\n ['dune-project'],\n ['ocaml-lsp', 'ocamllsp'],\n []\n ))\n\n // Gleam (gleam lsp)\n this.register(new GenericBinaryServer(\n 'gleam',\n ['.gleam'],\n ['gleam.toml'],\n 'gleam',\n ['lsp']\n ))\n\n // Clojure (clojure-lsp)\n this.register(new GenericBinaryServer(\n 'clojure-lsp',\n ['.clj', '.cljs', '.cljc', '.edn'],\n ['deps.edn', 'project.clj'],\n 'clojure-lsp',\n []\n ))\n\n // Nix (nixd)\n this.register(new GenericBinaryServer(\n 'nixd',\n ['.nix'],\n ['flake.nix'],\n 'nixd',\n []\n ))\n\n // Typst (tinymist)\n this.register(new GenericBinaryServer(\n 'tinymist',\n ['.typ'],\n [],\n 'tinymist',\n []\n ))\n\n // Scala (metals)\n this.register(new ServerDefinition({\n id: 'metals',\n extensions: ['.scala', '.sbt', '.sc'],\n rootMarkers: ['build.sbt', 'build.sc', '.bsp', '.metals'],\n install: async () => {\n const installDir = join(lspInstallDir, 'metals')\n if (resolveMetalsBinary(installDir)) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n try {\n await installMetals(installDir)\n return true\n } catch (error) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'metals', error: String(error) })\n return false\n }\n },\n spawn: async () => {\n const installDir = join(lspInstallDir, 'metals')\n const binary = resolveMetalsBinary(installDir)\n if (!binary) return null\n return { command: binary, args: ['--stdio'] }\n }\n }))\n\n // Haskell (haskell-language-server-wrapper)\n this.register(new GenericBinaryServer(\n 'haskell-language-server',\n ['.hs', '.lhs'],\n ['stack.yaml', 'cabal.project', '*.cabal'],\n 'haskell-language-server-wrapper',\n ['--lsp']\n ))\n\n // Tex/Latex (texlab)\n this.register(new GenericBinaryServer(\n 'texlab',\n ['.tex', '.bib'],\n [],\n 'texlab',\n []\n ))\n this.applyConfigOverrides(loadLspSettingsFromFiles())\n }\n\n static getInstance(): LspServerRegistry {\n if (!LspServerRegistry.instance) {\n LspServerRegistry.instance = new LspServerRegistry()\n }\n return LspServerRegistry.instance\n }\n\n register(server: LspServerInfo) {\n this.baseServers.push(server)\n this.servers.push(server)\n }\n\n getServerForExtension(ext: string): LspServerInfo | null {\n const servers = this.getServersForExtension(ext)\n return servers[0] ?? null\n }\n\n getServersForExtension(ext: string): LspServerInfo[] {\n const candidates = this.servers.filter(server => server.extensions.includes(ext))\n const enabled = candidates.filter(server => !this.isServerDisabled(server))\n const grouped = this.applyGroupStrategies(enabled, ext)\n return grouped.length ? grouped : this.sortByPriority(enabled)\n }\n\n getLanguageIdForExtension(ext: string): string {\n const map = this.getLanguageMap()\n return map[ext] ?? 'plaintext'\n }\n\n getLanguageCategoryForExtension(ext: string): string | undefined {\n const languageId = this.getLanguageIdForExtension(ext)\n return this.getLanguageCategoryForLanguageId(languageId)\n }\n\n getLanguageCategoryForLanguageId(languageId: string): string | undefined {\n const categories = this.getLanguageCategories()\n return categories[languageId]\n }\n\n getSettings(): LspSettings | undefined {\n return this.globalSettings\n }\n\n reloadSettingsFromFiles(options?: { projectDir?: string; homeDir?: string }): void {\n this.applyConfigOverrides(loadLspSettingsFromFiles(options))\n }\n\n applyConfigOverrides(settings?: LspSettings): void {\n const merged = mergeLspSettings(this.globalSettings, settings)\n const withExperiments = applyExperimentalSwitches(merged)\n this.globalSettings = withExperiments\n const overrides = withExperiments?.servers\n const baseIds = new Set(this.baseServers.map(server => server.id))\n const customServers: LspServerInfo[] = []\n if (overrides) {\n for (const [id, override] of Object.entries(overrides)) {\n if (baseIds.has(id)) continue\n if (!override.command) continue\n if (!override.extensions || override.extensions.length === 0) continue\n const base = new ServerDefinition({\n id,\n extensions: override.extensions,\n rootMarkers: override.rootMarkers ?? [],\n spawn: async () => ({ command: override.command ?? '', args: override.args ?? [] }),\n priority: override.priority,\n group: override.group\n })\n customServers.push(\n new OverriddenServer(\n base,\n override,\n withExperiments?.env,\n withExperiments?.initializationOptions\n )\n )\n }\n }\n this.servers = [\n ...this.baseServers.map(\n server =>\n new OverriddenServer(\n server,\n withExperiments?.servers?.[server.id],\n withExperiments?.env,\n withExperiments?.initializationOptions\n )\n ),\n ...customServers\n ]\n }\n\n resetOverridesForTests(): void {\n this.globalSettings = undefined\n this.servers = [...this.baseServers]\n }\n\n private getLanguageMap(): Record<string, string> {\n return { ...DEFAULT_LANGUAGE_MAP, ...(this.globalSettings?.languageMap ?? {}) }\n }\n\n private getLanguageCategories(): Record<string, string> {\n return { ...DEFAULT_LANGUAGE_CATEGORIES, ...(this.globalSettings?.languageCategories ?? {}) }\n }\n\n private isServerDisabled(server: LspServerInfo): boolean {\n if (server.disabled) return true\n const disabledServers = this.globalSettings?.disabledServers\n return Boolean(disabledServers?.includes(server.id))\n }\n\n private sortByPriority(servers: LspServerInfo[]): LspServerInfo[] {\n return [...servers].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n }\n\n private applyGroupStrategies(servers: LspServerInfo[], ext: string): LspServerInfo[] {\n const groups = this.globalSettings?.serverGroups\n if (!groups || groups.length === 0) return []\n const byId = new Map(servers.map(server => [server.id, server]))\n const results: LspServerInfo[] = []\n const used = new Set<string>()\n for (const group of groups) {\n if (group.extensions && !group.extensions.includes(ext)) continue\n const groupServers = group.serverIds\n .map(id => byId.get(id))\n .filter((server): server is LspServerInfo => Boolean(server))\n if (groupServers.length === 0) continue\n const sorted = this.sortByPriority(groupServers)\n if (group.strategy === 'parallel') {\n for (const server of sorted) {\n if (used.has(server.id)) continue\n used.add(server.id)\n results.push(server)\n }\n continue\n }\n const selected = sorted[0]\n if (selected && !used.has(selected.id)) {\n used.add(selected.id)\n results.push(selected)\n }\n }\n return results\n }\n}\n", "import { join, relative } from 'path'\nimport { existsSync, statSync } from 'fs'\nimport { resolveXdgDataPath } from '@utils/config/env'\nimport { minimatch } from 'minimatch'\n\nexport function getToolsDir(): string {\n return resolveXdgDataPath('tools')\n}\n\nexport function getLspBinDir(): string {\n return join(getToolsDir(), 'bin')\n}\n\nexport async function findNearestRoot(\n startDir: string,\n markers: string[],\n options?: {\n include?: string[]\n exclude?: string[]\n branches?: string[][]\n filePath?: string\n }\n): Promise<string | undefined> {\n const filePath = options?.filePath\n if (filePath) {\n const normalizedFile = filePath.replace(/\\\\/g, '/')\n const relativeToStart = relative(startDir, filePath).replace(/\\\\/g, '/')\n const matchesAny = (patterns: string[]) =>\n patterns.some(pattern => {\n if (minimatch(normalizedFile, pattern, { dot: true })) return true\n if (relativeToStart && !relativeToStart.startsWith('..')) {\n return minimatch(relativeToStart, pattern, { dot: true })\n }\n return false\n })\n if (options?.exclude && matchesAny(options.exclude)) return undefined\n if (options?.include && !matchesAny(options.include)) return undefined\n }\n\n if (options?.branches && options.branches.length > 0) {\n for (const branch of options.branches) {\n const resolved = await findNearestRoot(startDir, branch, {\n ...options,\n branches: undefined\n })\n if (resolved) return resolved\n }\n }\n let current = startDir\n while (true) {\n for (const marker of markers) {\n const p = join(current, marker)\n if (existsSync(p)) {\n return current\n }\n }\n const parent = join(current, '..')\n if (parent === current) {\n break\n }\n current = parent\n }\n return undefined\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["join", "existsSync", "statSync", "existsSync", "join", "statSync"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/services/plugins/skillMarketplace.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n copyFileSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport { homedir } from 'node:os'\nimport { basename, dirname, join, resolve, sep } from 'node:path'\nimport { unzipSync } from 'fflate'\nimport { z } from 'zod'\nimport { CONFIG_BASE_DIR } from '@constants/product'\nimport { getCwd } from '@utils/state'\nimport { resolveXdgCachePath, resolveXdgDataPath } from '@utils/config/env'\n\nconst KNOWN_MARKETPLACES_FILE = 'known_marketplaces.json'\nconst MARKETPLACES_CACHE_DIR = 'marketplaces'\nconst INSTALLED_SKILL_PLUGINS_FILE = 'installed-skill-plugins.json'\n\nfunction getMarketplacesCacheDir(): string {\n return resolveXdgCachePath(join('plugins', MARKETPLACES_CACHE_DIR))\n}\n\nfunction getKnownMarketplacesFile(): string {\n return join(resolveXdgDataPath('plugins'), KNOWN_MARKETPLACES_FILE)\n}\n\nfunction getInstalledSkillPluginsFile(): string {\n return resolveXdgDataPath(INSTALLED_SKILL_PLUGINS_FILE)\n}\n\nconst MarketplaceSourceSchema = z.discriminatedUnion('source', [\n z.strictObject({\n source: z.literal('github'),\n repo: z.string().min(3),\n ref: z.string().optional(),\n path: z.string().optional(),\n }),\n z.strictObject({\n source: z.literal('git'),\n url: z.string().min(3),\n ref: z.string().optional(),\n path: z.string().optional(),\n }),\n z.strictObject({\n source: z.literal('url'),\n url: z.string().url(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n z.strictObject({\n source: z.literal('npm'),\n package: z.string().min(1),\n }),\n z.strictObject({\n source: z.literal('file'),\n path: z.string().min(1),\n }),\n z.strictObject({\n source: z.literal('directory'),\n path: z.string().min(1),\n }),\n])\n\nexport type MarketplaceSource = z.infer<typeof MarketplaceSourceSchema>\n\nconst MarketplacePathListSchema = z.preprocess(value => {\n if (typeof value === 'string') return [value]\n return value\n}, z.array(z.string()))\n\nconst MarketplacePluginSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n source: z.string().optional().default('./'),\n strict: z.boolean().optional(),\n skills: MarketplacePathListSchema.optional(),\n commands: MarketplacePathListSchema.optional(),\n })\n .passthrough()\n\nexport const MarketplaceManifestSchema = z\n .object({\n $schema: z.string().optional(),\n description: z.string().optional(),\n name: z.string().min(1),\n owner: z\n .object({\n name: z.string().optional(),\n email: z.string().optional(),\n })\n .passthrough()\n .optional(),\n metadata: z.record(z.string(), z.unknown()).optional().default({}),\n plugins: z.array(MarketplacePluginSchema).default([]),\n })\n .passthrough()\n\nexport type MarketplaceManifest = z.infer<typeof MarketplaceManifestSchema>\nexport type PluginEntry = MarketplaceManifest['plugins'][number]\n\nconst KnownMarketplacesSchema = z.record(\n z.string(),\n z.strictObject({\n source: MarketplaceSourceSchema,\n installLocation: z.string().min(1),\n lastUpdated: z.string().min(1),\n autoUpdate: z.boolean().optional(),\n }),\n)\n\nexport type KnownMarketplacesConfig = z.infer<typeof KnownMarketplacesSchema>\n\nexport type PluginScope = 'user' | 'project' | 'local'\n\ntype InstalledSkillPlugin = {\n plugin: string\n marketplace: string\n scope: PluginScope\n kind?: 'skill-pack' | 'plugin-pack'\n isEnabled?: boolean\n projectPath?: string\n installedAt: string\n pluginRoot?: string\n skills: string[]\n commands: string[]\n sourceMarketplacePath: string\n}\n\ntype InstalledSkillPluginsFile = Record<string, InstalledSkillPlugin>\n\nfunction userPybDir(): string {\n return resolveXdgDataPath('')\n}\n\nfunction normalizePluginScope(options?: {\n scope?: PluginScope\n project?: boolean\n}): PluginScope {\n if (\n options?.scope === 'user' ||\n options?.scope === 'project' ||\n options?.scope === 'local'\n ) {\n return options.scope\n }\n if (options?.project === true) return 'project'\n return 'user'\n}\n\nfunction scopeBaseDir(scope: PluginScope): string {\n if (scope === 'user') return userPybDir()\n return join(getCwd(), CONFIG_BASE_DIR)\n}\n\nfunction scopeSkillsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'skills')\n}\n\nfunction scopeCommandsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'commands')\n}\n\nfunction scopeDisabledSkillsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'skills.disabled')\n}\n\nfunction scopeDisabledCommandsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'commands.disabled')\n}\n\nfunction scopeInstalledPluginsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'plugins', 'installed')\n}\n\nfunction scopeInstalledPluginRoot(\n scope: PluginScope,\n plugin: string,\n marketplace: string,\n): string {\n return join(scopeInstalledPluginsDir(scope), plugin, marketplace)\n}\n\nfunction pluginsDir(): string {\n return join(userPybDir(), 'plugins')\n}\n\nfunction knownMarketplacesConfigPath(): string {\n return join(pluginsDir(), KNOWN_MARKETPLACES_FILE)\n}\n\nfunction marketplaceCacheBaseDir(): string {\n return resolveXdgCachePath(join('plugins', MARKETPLACES_CACHE_DIR))\n}\n\nfunction installedSkillPluginsPath(): string {\n return join(userPybDir(), INSTALLED_SKILL_PLUGINS_FILE)\n}\n\nfunction ensureDir(path: string): void {\n mkdirSync(path, { recursive: true })\n}\n\nfunction readJsonFile<T>(path: string, fallback: T): T {\n try {\n if (!existsSync(path)) return fallback\n const raw = readFileSync(path, 'utf8')\n return JSON.parse(raw) as T\n } catch {\n return fallback\n }\n}\n\nfunction writeJsonFile(path: string, value: unknown): void {\n ensureDir(dirname(path))\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, 'utf8')\n}\n\nfunction normalizeMarketplaceSubPath(path: string | undefined): string | null {\n if (!path) return null\n const trimmed = path\n .trim()\n .replace(/^\\.?\\//, '')\n .replace(/^\\/+/, '')\n if (!trimmed) return null\n if (trimmed.includes('..')) {\n throw new Error(`Marketplace path contains '..': ${path}`)\n }\n return trimmed.replace(/\\\\/g, '/').replace(/\\/+$/, '')\n}\n\nfunction safeJoinWithin(baseDir: string, relativePath: string): string {\n const normalized = relativePath.replace(/\\\\/g, '/')\n if (!normalized || normalized.startsWith('/') || normalized.includes('..')) {\n throw new Error(`Unsafe path in archive: ${relativePath}`)\n }\n const joined = resolve(baseDir, normalized.split('/').join(sep))\n const resolvedBase = resolve(baseDir)\n if (!joined.startsWith(resolvedBase + sep) && joined !== resolvedBase) {\n throw new Error(`Path traversal detected: ${relativePath}`)\n }\n return joined\n}\n\nfunction ensureEmptyDir(path: string): void {\n if (existsSync(path)) rmSync(path, { recursive: true, force: true })\n ensureDir(path)\n}\n\nfunction safeCopyDirectory(srcDir: string, destDir: string): void {\n ensureDir(destDir)\n const entries = readdirSync(srcDir, { withFileTypes: true })\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name)\n const destPath = join(destDir, entry.name)\n\n if (entry.isDirectory()) {\n safeCopyDirectory(srcPath, destPath)\n continue\n }\n\n if (entry.isFile()) {\n ensureDir(dirname(destPath))\n copyFileSync(srcPath, destPath)\n continue\n }\n\n }\n}\n\nfunction readMarketplaceFromDirectory(rootDir: string): MarketplaceManifest {\n const primaryMarketplaceFile = resolve(\n rootDir,\n '.pyb-plugin',\n 'marketplace.json',\n )\n const legacyMarketplaceFile = resolve(\n rootDir,\n '.claude-plugin',\n 'marketplace.json',\n )\n const marketplaceFile = existsSync(primaryMarketplaceFile)\n ? primaryMarketplaceFile\n : legacyMarketplaceFile\n if (!existsSync(marketplaceFile)) {\n throw new Error(\n `Marketplace file not found (expected .pyb-plugin/marketplace.json or .claude-plugin/marketplace.json)`,\n )\n }\n const raw = readFileSync(marketplaceFile, 'utf8')\n const parsed = MarketplaceManifestSchema.safeParse(JSON.parse(raw))\n if (!parsed.success) {\n throw new Error(\n `Invalid marketplace.json: ${parsed.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n return parsed.data\n}\n\nexport function parsePluginSpec(spec: string): {\n plugin: string\n marketplace: string\n} {\n const trimmed = spec.trim()\n const parts = trimmed.split('@')\n if (parts.length !== 2) {\n throw new Error(\n `Invalid plugin spec: ${spec}. Expected format: <plugin>@<marketplace>`,\n )\n }\n const plugin = parts[0]!.trim()\n const marketplace = parts[1]!.trim()\n if (!plugin || !marketplace) {\n throw new Error(\n `Invalid plugin spec: ${spec}. Expected format: <plugin>@<marketplace>`,\n )\n }\n return { plugin, marketplace }\n}\n\nfunction resolvePluginForInstall(pluginInput: string): {\n plugin: string\n marketplace: string\n pluginSpec: string\n} {\n const trimmed = pluginInput.trim()\n if (!trimmed) throw new Error('Plugin is required')\n\n if (trimmed.includes('@')) {\n const resolved = parsePluginSpec(trimmed)\n return {\n ...resolved,\n pluginSpec: `${resolved.plugin}@${resolved.marketplace}`,\n }\n }\n\n const config = loadKnownMarketplaces()\n const matches: { marketplace: string; entry: PluginEntry }[] = []\n for (const [marketplace, entry] of Object.entries(config)) {\n try {\n const manifest = readMarketplaceFromDirectory(entry.installLocation)\n const found = manifest.plugins.find(p => p.name === trimmed)\n if (found) matches.push({ marketplace, entry: found })\n } catch {\n }\n }\n\n if (matches.length === 0) {\n const availableMarketplaces = Object.keys(config).sort().join(', ')\n throw new Error(\n `Plugin '${trimmed}' not found in any marketplace. Available marketplaces: ${availableMarketplaces || '(none)'}`,\n )\n }\n\n if (matches.length > 1) {\n const options = matches\n .map(m => `${trimmed}@${m.marketplace}`)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${trimmed}' is available in multiple marketplaces. Use an explicit spec: ${options}`,\n )\n }\n\n return {\n plugin: trimmed,\n marketplace: matches[0]!.marketplace,\n pluginSpec: `${trimmed}@${matches[0]!.marketplace}`,\n }\n}\n\nfunction resolveInstalledPluginSpec(\n pluginInput: string,\n state: InstalledSkillPluginsFile,\n): string {\n const trimmed = pluginInput.trim()\n if (!trimmed) throw new Error('Plugin is required')\n\n if (trimmed.includes('@')) {\n parsePluginSpec(trimmed)\n return trimmed\n }\n\n const matches = Object.entries(state).filter(\n ([, record]) => record?.plugin === trimmed,\n )\n if (matches.length === 0) {\n throw new Error(`Plugin '${trimmed}' is not installed`)\n }\n if (matches.length > 1) {\n const options = matches\n .map(([spec]) => spec)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${trimmed}' is installed from multiple marketplaces. Use an explicit spec: ${options}`,\n )\n }\n return matches[0]![0]\n}\n\nfunction baseDirForInstallRecord(record: InstalledSkillPlugin): string {\n if (record.scope === 'user') return userPybDir()\n const projectPath =\n typeof record.projectPath === 'string' ? record.projectPath.trim() : ''\n if (!projectPath) {\n throw new Error(\n `Installed plugin '${record.plugin}@${record.marketplace}' is missing projectPath for scope=${record.scope}`,\n )\n }\n return join(projectPath, CONFIG_BASE_DIR)\n}\n\nfunction githubRepoFromUrl(input: string): string | null {\n const ssh = input.match(/^git@github\\.com:([^/]+\\/[^/]+?)(?:\\.git)?$/)\n if (ssh?.[1]) return ssh[1]\n const https = input.match(\n /^https?:\\/\\/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?$/,\n )\n if (https?.[1]) return https[1]\n return null\n}\n\nfunction parseRefAndPath(input: string): {\n base: string\n ref?: string\n path?: string\n} {\n const [beforeHash, hashPart] = input.split('#', 2)\n const [base, refPart] = beforeHash.split('@', 2)\n return {\n base,\n ref: refPart?.trim() || undefined,\n path: hashPart?.trim() || undefined,\n }\n}\n\nfunction parseMarketplaceSourceInput(sourceInput: string): MarketplaceSource {\n const raw = sourceInput.trim()\n if (!raw) throw new Error('Marketplace source is required')\n\n for (const prefix of [\n 'github:',\n 'git:',\n 'url:',\n 'npm:',\n 'file:',\n 'dir:',\n ] as const) {\n if (raw.startsWith(prefix)) {\n const rest = raw.slice(prefix.length).trim()\n const parsed = parseRefAndPath(rest)\n if (prefix === 'github:') {\n return {\n source: 'github',\n repo: parsed.base.trim(),\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n if (prefix === 'git:') {\n const repo = githubRepoFromUrl(parsed.base.trim())\n if (repo) {\n return {\n source: 'github',\n repo,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n return {\n source: 'git',\n url: parsed.base.trim(),\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n if (prefix === 'url:') {\n return { source: 'url', url: rest }\n }\n if (prefix === 'npm:') {\n return { source: 'npm', package: rest }\n }\n if (prefix === 'file:') {\n return { source: 'file', path: rest }\n }\n if (prefix === 'dir:') {\n return { source: 'directory', path: rest }\n }\n }\n }\n\n const resolved = resolve(raw)\n if (existsSync(resolved)) {\n const stat = lstatSync(resolved)\n if (stat.isDirectory()) return { source: 'directory', path: resolved }\n if (stat.isFile()) return { source: 'file', path: resolved }\n throw new Error(`Marketplace source must be a directory or file: ${raw}`)\n }\n\n const parsed = parseRefAndPath(raw)\n if (/^[^/\\s]+\\/[^/\\s]+$/.test(parsed.base)) {\n return {\n source: 'github',\n repo: parsed.base,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n\n const repo = githubRepoFromUrl(parsed.base)\n if (repo) {\n return {\n source: 'github',\n repo,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n\n if (/^https?:\\/\\//.test(raw)) {\n return { source: 'url', url: raw }\n }\n\n throw new Error(\n `Unsupported marketplace source: ${sourceInput}. Use a local path, \"owner/repo\", or prefixes like github:, git:, url:, file:, dir:.`,\n )\n}\n\nasync function fetchBinary(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { method: 'GET' })\n if (!resp.ok) {\n throw new Error(\n `Failed to download ${url}: ${resp.status} ${resp.statusText}`,\n )\n }\n const buf = await resp.arrayBuffer()\n return new Uint8Array(buf)\n}\n\nasync function tryDownloadGithubZip(\n repo: string,\n ref: string,\n): Promise<Uint8Array> {\n const [owner, name] = repo.split('/', 2)\n if (!owner || !name) throw new Error(`Invalid GitHub repo: ${repo}`)\n\n const candidates = ref.startsWith('refs/')\n ? [ref]\n : [`refs/heads/${ref}`, `refs/tags/${ref}`]\n\n\t let lastError: Error | null = null\n\t for (const candidate of candidates) {\n\t const url = `https://codeload.github.com/${owner}/${name}/zip/${candidate}`\n\t try {\n\t return await fetchBinary(url)\n\t } catch (err) {\n\t lastError = err instanceof Error ? err : Error(String(err))\n\t }\n }\n throw lastError ?? new Error(`Failed to download GitHub repo ${repo}@${ref}`)\n}\n\nasync function cacheMarketplaceToTempDir(\n source: MarketplaceSource,\n tempDir: string,\n): Promise<void> {\n ensureEmptyDir(tempDir)\n\n if (source.source === 'directory') {\n const root = resolve(source.path)\n if (!existsSync(root) || !lstatSync(root).isDirectory()) {\n throw new Error(`Directory not found: ${source.path}`)\n }\n safeCopyDirectory(root, tempDir)\n return\n }\n\n if (source.source === 'file') {\n const file = resolve(source.path)\n if (!existsSync(file) || !lstatSync(file).isFile()) {\n throw new Error(`File not found: ${source.path}`)\n }\n const out = join(tempDir, '.pyb-plugin')\n ensureDir(out)\n copyFileSync(file, join(out, 'marketplace.json'))\n return\n }\n\n if (source.source === 'github') {\n const pathWithin = normalizeMarketplaceSubPath(source.path)\n\n const preferredRef = source.ref?.trim() || ''\n const refsToTry = preferredRef ? [preferredRef] : ['main', 'master']\n\n let zip: Uint8Array | null = null\n let usedRef = preferredRef || 'main'\n let lastError: Error | null = null\n for (const ref of refsToTry) {\n try {\n zip = await tryDownloadGithubZip(source.repo, ref)\n usedRef = ref\n break\n } catch (err) {\n lastError = err instanceof Error ? err : Error(String(err))\n }\n }\n if (!zip)\n throw (\n lastError ?? new Error(`Failed to download GitHub repo ${source.repo}`)\n )\n\n const files = unzipSync(zip)\n const names = Object.keys(files).filter(Boolean)\n const topDir = names.length > 0 ? names[0]!.split('/')[0]! : ''\n const includePrefix = pathWithin\n ? `${topDir}/${pathWithin.replace(/\\/+$/, '')}/`\n : `${topDir}/`\n\n let extractedCount = 0\n for (const [name, data] of Object.entries(files)) {\n if (!name.startsWith(includePrefix)) continue\n const rel = name.slice(includePrefix.length)\n if (!rel) continue\n if (rel.endsWith('/')) {\n ensureDir(safeJoinWithin(tempDir, rel))\n continue\n }\n const dest = safeJoinWithin(tempDir, rel)\n ensureDir(dirname(dest))\n writeFileSync(dest, data)\n extractedCount++\n }\n\n if (extractedCount === 0) {\n throw new Error(\n `No files extracted from ${source.repo}@${usedRef}${pathWithin ? `#${pathWithin}` : ''}`,\n )\n }\n return\n }\n\n if (source.source === 'url') {\n const url = source.url\n if (url.toLowerCase().endsWith('.json')) {\n const data = await fetchBinary(url)\n const out = join(tempDir, '.pyb-plugin')\n ensureDir(out)\n writeFileSync(join(out, 'marketplace.json'), Buffer.from(data))\n return\n }\n if (url.toLowerCase().endsWith('.zip')) {\n const zip = await fetchBinary(url)\n const files = unzipSync(zip)\n for (const [name, data] of Object.entries(files)) {\n if (!name || name.endsWith('/')) continue\n const dest = safeJoinWithin(tempDir, name)\n ensureDir(dirname(dest))\n writeFileSync(dest, data)\n }\n return\n }\n throw new Error(\n `Unsupported url marketplace source. Provide a .json or .zip URL: ${url}`,\n )\n }\n\n if (source.source === 'git') {\n const repo = githubRepoFromUrl(source.url)\n if (repo) {\n await cacheMarketplaceToTempDir(\n {\n source: 'github',\n repo,\n ...(source.ref ? { ref: source.ref } : {}),\n ...(source.path ? { path: source.path } : {}),\n },\n tempDir,\n )\n return\n }\n throw new Error(\n `git sources are not supported without GitHub conversion (url=${source.url})`,\n )\n }\n\n if (source.source === 'npm') {\n throw new Error(\n `npm marketplace sources are not supported yet (package=${source.package}). Install the package and add it as a local dir instead.`,\n )\n }\n}\n\nfunction loadKnownMarketplaces(): KnownMarketplacesConfig {\n const raw = readJsonFile<unknown>(knownMarketplacesConfigPath(), {})\n const parsed = KnownMarketplacesSchema.safeParse(raw)\n if (!parsed.success) {\n throw new Error(\n `Marketplace configuration is corrupted: ${parsed.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n return parsed.data\n}\n\nfunction saveKnownMarketplaces(config: KnownMarketplacesConfig): void {\n const parsed = KnownMarketplacesSchema.safeParse(config)\n if (!parsed.success) {\n throw new Error(`Invalid marketplace config: ${parsed.error.message}`)\n }\n writeJsonFile(knownMarketplacesConfigPath(), parsed.data)\n}\n\nexport function listMarketplaces(): KnownMarketplacesConfig {\n return loadKnownMarketplaces()\n}\n\nexport async function addMarketplace(\n sourceInput: string,\n): Promise<{ name: string }> {\n const source = parseMarketplaceSourceInput(sourceInput)\n const validatedSource = MarketplaceSourceSchema.safeParse(source)\n if (!validatedSource.success) {\n throw new Error(\n `Invalid marketplace source: ${validatedSource.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n\n const config = loadKnownMarketplaces()\n const cacheBase = marketplaceCacheBaseDir()\n ensureDir(cacheBase)\n\n const tempDir = join(cacheBase, `tmp-${randomUUID()}`)\n try {\n await cacheMarketplaceToTempDir(validatedSource.data, tempDir)\n const manifest = readMarketplaceFromDirectory(tempDir)\n const marketplaceName = manifest.name\n\n if (config[marketplaceName]) {\n throw new Error(\n `Marketplace '${marketplaceName}' is already installed. Remove it first to re-add.`,\n )\n }\n\n const installLocation = join(cacheBase, marketplaceName)\n if (existsSync(installLocation)) {\n throw new Error(\n `Marketplace cache directory already exists: ${installLocation}`,\n )\n }\n\n renameSync(tempDir, installLocation)\n config[marketplaceName] = {\n source: validatedSource.data,\n installLocation,\n lastUpdated: new Date().toISOString(),\n }\n saveKnownMarketplaces(config)\n return { name: marketplaceName }\n } catch (error) {\n if (existsSync(tempDir)) rmSync(tempDir, { recursive: true, force: true })\n throw error\n }\n}\n\nexport function removeMarketplace(name: string): void {\n const trimmed = name.trim()\n if (!trimmed) throw new Error('Marketplace name is required')\n\n const config = loadKnownMarketplaces()\n const entry = config[trimmed]\n if (!entry) throw new Error(`Marketplace '${trimmed}' not found`)\n\n delete config[trimmed]\n saveKnownMarketplaces(config)\n\n try {\n if (existsSync(entry.installLocation)) {\n rmSync(entry.installLocation, { recursive: true, force: true })\n }\n } catch {\n }\n}\n\nexport async function refreshMarketplaceAsync(name: string): Promise<void> {\n const trimmed = name.trim()\n if (!trimmed) throw new Error('Marketplace name is required')\n\n const config = loadKnownMarketplaces()\n const entry = config[trimmed]\n if (!entry) throw new Error(`Marketplace '${trimmed}' not found`)\n\n const cacheBase = marketplaceCacheBaseDir()\n ensureDir(cacheBase)\n\n const tempDir = join(cacheBase, `tmp-${randomUUID()}`)\n try {\n await cacheMarketplaceToTempDir(entry.source, tempDir)\n const manifest = readMarketplaceFromDirectory(tempDir)\n if (manifest.name !== trimmed) {\n throw new Error(\n `Marketplace name mismatch on refresh: expected ${trimmed}, got ${manifest.name}`,\n )\n }\n\n if (existsSync(entry.installLocation)) {\n rmSync(entry.installLocation, { recursive: true, force: true })\n }\n renameSync(tempDir, entry.installLocation)\n config[trimmed] = {\n ...entry,\n lastUpdated: new Date().toISOString(),\n }\n saveKnownMarketplaces(config)\n } catch (error) {\n if (existsSync(tempDir)) rmSync(tempDir, { recursive: true, force: true })\n throw error\n }\n}\n\nexport async function refreshAllMarketplacesAsync(\n onProgress?: (message: string) => void,\n): Promise<{ refreshed: string[]; failed: { name: string; error: string }[] }> {\n const config = loadKnownMarketplaces()\n const names = Object.keys(config).sort()\n\n const refreshed: string[] = []\n const failed: { name: string; error: string }[] = []\n\n for (const name of names) {\n try {\n onProgress?.(`Updating marketplace: ${name}...`)\n await refreshMarketplaceAsync(name)\n refreshed.push(name)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n failed.push({ name, error: message })\n onProgress?.(`Failed to refresh marketplace ${name}: ${message}`)\n }\n }\n\n return { refreshed, failed }\n}\n\nexport function getMarketplaceManifest(marketplaceName: string): {\n manifest: MarketplaceManifest\n rootDir: string\n source: MarketplaceSource\n} {\n const config = loadKnownMarketplaces()\n const entry = config[marketplaceName]\n if (!entry) {\n const available = Object.keys(config).sort().join(', ')\n throw new Error(\n `Marketplace '${marketplaceName}' not found. Available marketplaces: ${available || '(none)'}`,\n )\n }\n const manifest = readMarketplaceFromDirectory(entry.installLocation)\n return { manifest, rootDir: entry.installLocation, source: entry.source }\n}\n\nfunction ensurePluginInstallState(): InstalledSkillPluginsFile {\n ensureDir(userPybDir())\n const state = readJsonFile<Record<string, any>>(\n installedSkillPluginsPath(),\n {},\n )\n for (const record of Object.values(state)) {\n if (!record || typeof record !== 'object') continue\n if (\n record.scope !== 'user' &&\n record.scope !== 'project' &&\n record.scope !== 'local'\n ) {\n record.scope = 'user'\n }\n if (record.kind !== 'skill-pack' && record.kind !== 'plugin-pack') {\n record.kind =\n typeof record.pluginRoot === 'string' ? 'plugin-pack' : 'skill-pack'\n }\n if (record.isEnabled === undefined) record.isEnabled = true\n }\n return state as InstalledSkillPluginsFile\n}\n\nfunction savePluginInstallState(state: InstalledSkillPluginsFile): void {\n writeJsonFile(installedSkillPluginsPath(), state)\n}\n\nexport function installSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean; force?: boolean },\n): {\n pluginSpec: string\n installedSkills: string[]\n installedCommands: string[]\n} {\n const scope = normalizePluginScope(options)\n const { plugin, marketplace, pluginSpec } =\n resolvePluginForInstall(pluginInput)\n const { manifest, rootDir, source } = getMarketplaceManifest(marketplace)\n\n const entry = manifest.plugins.find(p => p.name === plugin)\n if (!entry) {\n const available = manifest.plugins\n .map(p => p.name)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${plugin}' not found in marketplace '${marketplace}'. Available plugins: ${available || '(none)'}`,\n )\n }\n\n const installState = ensurePluginInstallState()\n const existing = installState[pluginSpec]\n if (existing && existing.scope !== scope && options?.force !== true) {\n throw new Error(\n `Plugin '${pluginSpec}' is already installed with scope=${existing.scope}. Uninstall it first to install with scope=${scope}.`,\n )\n }\n if (existing && options?.force !== true) {\n throw new Error(\n `Plugin '${pluginSpec}' is already installed. Re-run with --force to reinstall.`,\n )\n }\n\n const entrySourceBase = resolve(rootDir, entry.source ?? './')\n const primaryManifestPath = join(\n entrySourceBase,\n '.pyb-plugin',\n 'plugin.json',\n )\n const legacyManifestPath = join(\n entrySourceBase,\n '.claude-plugin',\n 'plugin.json',\n )\n const pluginManifestPath = existsSync(primaryManifestPath)\n ? primaryManifestPath\n : legacyManifestPath\n\n if (\n existsSync(pluginManifestPath) &&\n lstatSync(pluginManifestPath).isFile()\n ) {\n const pluginRoot = scopeInstalledPluginRoot(scope, plugin, marketplace)\n if (existsSync(pluginRoot) && options?.force !== true) {\n throw new Error(`Destination already exists: ${pluginRoot}`)\n }\n ensureEmptyDir(pluginRoot)\n safeCopyDirectory(entrySourceBase, pluginRoot)\n\n installState[pluginSpec] = {\n plugin,\n marketplace,\n scope,\n kind: 'plugin-pack',\n pluginRoot,\n isEnabled: true,\n projectPath: scope === 'user' ? undefined : getCwd(),\n installedAt: new Date().toISOString(),\n skills: [],\n commands: [],\n sourceMarketplacePath:\n source.source === 'file' || source.source === 'directory'\n ? source.path\n : source.source === 'github'\n ? `github:${source.repo}`\n : source.source === 'url'\n ? source.url\n : source.source === 'git'\n ? source.url\n : `npm:${source.package}`,\n }\n savePluginInstallState(installState)\n\n return { pluginSpec, installedSkills: [], installedCommands: [] }\n }\n\n const skillsDestBase = scopeSkillsDir(scope)\n const commandsDestBase = join(scopeCommandsDir(scope), plugin, marketplace)\n\n ensureDir(skillsDestBase)\n ensureDir(commandsDestBase)\n\n const installedSkills: string[] = []\n const installedCommands: string[] = []\n\n const skillPaths = entry.skills ?? []\n for (const rel of skillPaths) {\n const src = safeJoinWithin(entrySourceBase, rel)\n if (!existsSync(src) || !lstatSync(src).isDirectory()) {\n throw new Error(`Skill path not found or not a directory: ${src}`)\n }\n const skillName = basename(src)\n const dest = join(skillsDestBase, skillName)\n\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n ensureEmptyDir(dest)\n safeCopyDirectory(src, dest)\n installedSkills.push(skillName)\n }\n\n const commandPaths = entry.commands ?? []\n for (const rel of commandPaths) {\n const src = safeJoinWithin(entrySourceBase, rel)\n if (!existsSync(src)) {\n throw new Error(`Command path not found: ${src}`)\n }\n const stat = lstatSync(src)\n if (stat.isDirectory()) {\n const dest = join(commandsDestBase, basename(src))\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n ensureEmptyDir(dest)\n safeCopyDirectory(src, dest)\n installedCommands.push(dest)\n continue\n }\n if (stat.isFile()) {\n const dest = join(commandsDestBase, basename(src))\n ensureDir(dirname(dest))\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n copyFileSync(src, dest)\n installedCommands.push(dest)\n continue\n }\n }\n\n installState[pluginSpec] = {\n plugin,\n marketplace,\n scope,\n kind: 'skill-pack',\n isEnabled: true,\n projectPath: scope === 'user' ? undefined : getCwd(),\n installedAt: new Date().toISOString(),\n skills: installedSkills,\n commands: installedCommands,\n sourceMarketplacePath:\n source.source === 'file' || source.source === 'directory'\n ? source.path\n : source.source === 'github'\n ? `github:${source.repo}`\n : source.source === 'url'\n ? source.url\n : source.source === 'git'\n ? source.url\n : `npm:${source.package}`,\n }\n savePluginInstallState(installState)\n\n return { pluginSpec, installedSkills, installedCommands }\n}\n\nexport function uninstallSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): { pluginSpec: string; removedSkills: string[]; removedCommands: string[] } {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) {\n throw new Error(`Plugin '${pluginSpec}' is not installed`)\n }\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.kind === 'plugin-pack') {\n const baseDir = baseDirForInstallRecord(record)\n const pluginRoot =\n typeof record.pluginRoot === 'string' && record.pluginRoot.trim()\n ? record.pluginRoot\n : join(\n baseDir,\n 'plugins',\n 'installed',\n record.plugin,\n record.marketplace,\n )\n\n const removedCommands: string[] = []\n if (existsSync(pluginRoot)) {\n rmSync(pluginRoot, { recursive: true, force: true })\n removedCommands.push(pluginRoot)\n }\n\n delete state[pluginSpec]\n savePluginInstallState(state)\n\n return { pluginSpec, removedSkills: [], removedCommands }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDestBase = join(baseDir, 'skills')\n const commandsDestBase = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsBase = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const removedSkills: string[] = []\n for (const skillName of record.skills) {\n const dest = join(skillsDestBase, skillName)\n if (existsSync(dest)) rmSync(dest, { recursive: true, force: true })\n const disabledDest = join(disabledSkillsBase, skillName)\n if (existsSync(disabledDest))\n rmSync(disabledDest, { recursive: true, force: true })\n removedSkills.push(skillName)\n }\n\n const removedCommands: string[] = []\n if (existsSync(commandsDestBase)) {\n rmSync(commandsDestBase, { recursive: true, force: true })\n removedCommands.push(commandsDestBase)\n }\n if (existsSync(disabledCommandsBase)) {\n rmSync(disabledCommandsBase, { recursive: true, force: true })\n removedCommands.push(disabledCommandsBase)\n }\n\n delete state[pluginSpec]\n savePluginInstallState(state)\n\n return { pluginSpec, removedSkills, removedCommands }\n}\n\nexport function disableSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): {\n pluginSpec: string\n disabledSkills: string[]\n disabledCommands: string[]\n} {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) throw new Error(`Plugin '${pluginSpec}' is not installed`)\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.isEnabled === false) {\n return { pluginSpec, disabledSkills: [], disabledCommands: [] }\n }\n\n if (record.kind === 'plugin-pack') {\n record.isEnabled = false\n state[pluginSpec] = record\n savePluginInstallState(state)\n return { pluginSpec, disabledSkills: [], disabledCommands: [] }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDir = join(baseDir, 'skills')\n const commandsDir = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsDir = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const disabledSkills: string[] = []\n for (const skillName of record.skills) {\n const src = join(skillsDir, skillName)\n if (!existsSync(src)) continue\n const dest = join(disabledSkillsBase, skillName)\n ensureDir(dirname(dest))\n if (existsSync(dest)) rmSync(dest, { recursive: true, force: true })\n renameSync(src, dest)\n disabledSkills.push(skillName)\n }\n\n const disabledCommands: string[] = []\n if (existsSync(commandsDir)) {\n ensureDir(dirname(disabledCommandsDir))\n if (existsSync(disabledCommandsDir)) {\n rmSync(disabledCommandsDir, { recursive: true, force: true })\n }\n renameSync(commandsDir, disabledCommandsDir)\n disabledCommands.push(disabledCommandsDir)\n }\n\n record.isEnabled = false\n state[pluginSpec] = record\n savePluginInstallState(state)\n\n return { pluginSpec, disabledSkills, disabledCommands }\n}\n\nexport function enableSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): { pluginSpec: string; enabledSkills: string[]; enabledCommands: string[] } {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) throw new Error(`Plugin '${pluginSpec}' is not installed`)\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.isEnabled !== false) {\n return { pluginSpec, enabledSkills: [], enabledCommands: [] }\n }\n\n if (record.kind === 'plugin-pack') {\n record.isEnabled = true\n state[pluginSpec] = record\n savePluginInstallState(state)\n return { pluginSpec, enabledSkills: [], enabledCommands: [] }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDir = join(baseDir, 'skills')\n const commandsDir = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsDir = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const enabledSkills: string[] = []\n for (const skillName of record.skills) {\n const src = join(disabledSkillsBase, skillName)\n if (!existsSync(src)) continue\n const dest = join(skillsDir, skillName)\n ensureDir(dirname(dest))\n if (existsSync(dest)) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n renameSync(src, dest)\n enabledSkills.push(skillName)\n }\n\n const enabledCommands: string[] = []\n if (existsSync(disabledCommandsDir)) {\n ensureDir(dirname(commandsDir))\n if (existsSync(commandsDir)) {\n throw new Error(`Destination already exists: ${commandsDir}`)\n }\n renameSync(disabledCommandsDir, commandsDir)\n enabledCommands.push(commandsDir)\n }\n\n record.isEnabled = true\n state[pluginSpec] = record\n savePluginInstallState(state)\n\n return { pluginSpec, enabledSkills, enabledCommands }\n}\n\nexport function listInstalledSkillPlugins(): InstalledSkillPluginsFile {\n return ensurePluginInstallState()\n}\n\nexport function listEnabledInstalledPluginPackRoots(): string[] {\n const state = ensurePluginInstallState()\n const cwd = getCwd()\n const roots: string[] = []\n\n for (const spec of Object.keys(state).sort()) {\n const record = state[spec]\n if (!record || record.kind !== 'plugin-pack') continue\n if (record.isEnabled === false) continue\n\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n if (!projectPath || projectPath !== cwd) continue\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const pluginRoot =\n typeof record.pluginRoot === 'string' && record.pluginRoot.trim()\n ? record.pluginRoot\n : join(\n baseDir,\n 'plugins',\n 'installed',\n record.plugin,\n record.marketplace,\n )\n\n try {\n if (!existsSync(pluginRoot) || !lstatSync(pluginRoot).isDirectory())\n continue\n roots.push(pluginRoot)\n } catch {\n continue\n }\n }\n\n return roots\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["parsed", "repo", "baseDir", "removedCommands"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/config/settingsFiles.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\nimport { homedir } from 'os'\nimport { dirname, join, resolve } from 'path'\nimport { getCwd } from '@utils/state'\nimport { logError } from '@utils/log'\n\nexport type SettingsDestination =\n | 'localSettings'\n | 'projectSettings'\n | 'userSettings'\n\nexport type SettingsFile = {\n [key: string]: unknown\n}\n\nfunction normalizeOverride(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed ? resolve(trimmed) : null\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n const out: string[] = []\n const seen = new Set<string>()\n for (const value of values) {\n if (!value) continue\n if (seen.has(value)) continue\n seen.add(value)\n out.push(value)\n }\n return out\n}\n\nfunction getDefaultHomeDir(): string {\n const envHome =\n typeof process.env.HOME === 'string'\n ? process.env.HOME\n : typeof process.env.USERPROFILE === 'string'\n ? process.env.USERPROFILE\n : ''\n const trimmed = envHome.trim()\n if (trimmed) return trimmed\n return homedir()\n}\n\nfunction getUserPybBaseDir(options?: {\n homeDir?: string\n respectEnvOverride?: boolean\n}): string {\n const respectEnvOverride = options?.respectEnvOverride ?? true\n if (respectEnvOverride) {\n const override = normalizeOverride(\n process.env.PYB_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR,\n )\n if (override) return override\n }\n const home = options?.homeDir ?? getDefaultHomeDir()\n return join(home, '.pyb')\n}\n\nfunction getUserLegacyBaseDir(options?: {\n homeDir?: string\n respectEnvOverride?: boolean\n}): string {\n const respectEnvOverride = options?.respectEnvOverride ?? true\n if (respectEnvOverride) {\n const override = normalizeOverride(process.env.CLAUDE_CONFIG_DIR)\n if (override) return override\n }\n const home = options?.homeDir ?? getDefaultHomeDir()\n return join(home, '.claude')\n}\n\nexport function getSettingsFileCandidates(options: {\n destination: SettingsDestination\n projectDir?: string\n homeDir?: string\n}): { primary: string; legacy: string[] } | null {\n const projectDir = options.projectDir ?? getCwd()\n const homeDir = options.homeDir ?? getDefaultHomeDir()\n const respectEnvOverride = options.homeDir === undefined\n\n switch (options.destination) {\n case 'localSettings': {\n const primary = join(projectDir, '.pyb', 'settings.local.json')\n const legacy = [join(projectDir, '.claude', 'settings.local.json')]\n return { primary, legacy }\n }\n case 'projectSettings': {\n const primary = join(projectDir, '.pyb', 'settings.json')\n const legacy = [join(projectDir, '.claude', 'settings.json')]\n return { primary, legacy }\n }\n case 'userSettings': {\n const primary = join(\n getUserPybBaseDir({ homeDir, respectEnvOverride }),\n 'settings.json',\n )\n const legacy = dedupeStrings([\n join(\n getUserLegacyBaseDir({ homeDir, respectEnvOverride }),\n 'settings.json',\n ),\n join(homeDir, '.claude', 'settings.json'),\n ])\n return { primary, legacy }\n }\n default:\n return null\n }\n}\n\nexport function readSettingsFile(filePath: string): SettingsFile | null {\n if (!existsSync(filePath)) return null\n try {\n const raw = readFileSync(filePath, 'utf-8')\n const parsed = JSON.parse(raw)\n if (!parsed || typeof parsed !== 'object') return null\n return parsed as SettingsFile\n } catch (error) {\n logError(error)\n return null\n }\n}\n\nexport function writeSettingsFile(\n filePath: string,\n settings: SettingsFile,\n): void {\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, JSON.stringify(settings, null, 2) + '\\n', 'utf-8')\n}\n\nexport function loadSettingsWithLegacyFallback(options: {\n destination: SettingsDestination\n projectDir?: string\n homeDir?: string\n migrateToPrimary?: boolean\n}): { settings: SettingsFile | null; usedPath: string | null } {\n const candidates = getSettingsFileCandidates(options)\n if (!candidates) return { settings: null, usedPath: null }\n\n const primarySettings = readSettingsFile(candidates.primary)\n if (primarySettings)\n return { settings: primarySettings, usedPath: candidates.primary }\n\n for (const legacyPath of candidates.legacy) {\n const legacySettings = readSettingsFile(legacyPath)\n if (!legacySettings) continue\n\n if (options.migrateToPrimary && legacyPath !== candidates.primary) {\n try {\n if (!existsSync(candidates.primary)) {\n writeSettingsFile(candidates.primary, legacySettings)\n }\n } catch (error) {\n logError(error)\n }\n }\n\n return { settings: legacySettings, usedPath: legacyPath }\n }\n\n return { settings: null, usedPath: null }\n}\n\nexport function saveSettingsToPrimaryAndSyncLegacy(options: {\n destination: SettingsDestination\n settings: SettingsFile\n projectDir?: string\n homeDir?: string\n syncLegacyIfExists?: boolean\n}): void {\n const candidates = getSettingsFileCandidates(options)\n if (!candidates) return\n\n writeSettingsFile(candidates.primary, options.settings)\n\n if (!options.syncLegacyIfExists) return\n for (const legacyPath of candidates.legacy) {\n if (legacyPath === candidates.primary) continue\n if (!existsSync(legacyPath)) continue\n try {\n writeSettingsFile(legacyPath, options.settings)\n } catch (error) {\n logError(error)\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|