pybao-cli 1.3.81 → 1.3.83
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-HVMZDW6I.js +42 -0
- package/dist/{acp-4HKKXFYQ.js → acp-OWNA2GOE.js} +28 -28
- package/dist/{agentsValidate-Y7ESIGWC.js → agentsValidate-UC7SD3JY.js} +7 -7
- package/dist/{ask-BFLAH7SK.js → ask-6ESDLRIC.js} +25 -25
- package/dist/{autoUpdater-ZP62GDO2.js → autoUpdater-FAKGXOY4.js} +3 -3
- package/dist/{chunk-R56S2D3A.js → chunk-3BP3TGGN.js} +1 -1
- package/dist/{chunk-R56S2D3A.js.map → chunk-3BP3TGGN.js.map} +1 -1
- package/dist/{chunk-4YJ6DHQK.js → chunk-43ZJOQDX.js} +37 -37
- package/dist/{chunk-4YJ6DHQK.js.map → chunk-43ZJOQDX.js.map} +2 -2
- package/dist/{chunk-KZGNQII5.js → chunk-6VOYUVQU.js} +4 -4
- package/dist/{chunk-AED6OYMI.js → chunk-B3MDT4F6.js} +3 -3
- package/dist/{chunk-JEHHIOUO.js → chunk-BPZ44BIE.js} +1 -1
- package/dist/{chunk-IV73XFVG.js → chunk-CPOVPGCU.js} +3 -3
- package/dist/{chunk-LLNNHSE3.js → chunk-FH5VPA4M.js} +1 -1
- package/dist/{chunk-2RR4H3L6.js → chunk-FL4UY5X6.js} +9 -9
- package/dist/{chunk-65MNQP3U.js → chunk-FOQKIQ27.js} +3 -3
- package/dist/chunk-HCPU4TQ6.js +478 -0
- package/dist/chunk-HCPU4TQ6.js.map +7 -0
- package/dist/{chunk-BAGUGUP3.js → chunk-HIH43UEF.js} +2 -2
- package/dist/{chunk-RPQ3FFN6.js → chunk-HMCPTTVR.js} +3 -3
- package/dist/{chunk-TMIQYE2C.js → chunk-JGJCX75W.js} +3 -3
- package/dist/{chunk-Q653YYZS.js → chunk-L62UDJSU.js} +1 -1
- package/dist/{chunk-72RJTELO.js → chunk-MFNDDM3V.js} +1 -1
- package/dist/{chunk-2BT4P5FY.js → chunk-MSWBIZZC.js} +2 -2
- package/dist/{chunk-TE7EYQKI.js → chunk-NIKESYZF.js} +2 -2
- package/dist/{chunk-UUGAVZ5R.js → chunk-NNNU5K5N.js} +2 -2
- package/dist/{chunk-D364WNKJ.js → chunk-PBPAGOFN.js} +2 -2
- package/dist/{chunk-2JAKX7IR.js → chunk-SSPEL7MF.js} +3 -3
- package/dist/{chunk-26R2U6DS.js → chunk-SWY5TLOX.js} +123 -44
- package/dist/chunk-SWY5TLOX.js.map +7 -0
- package/dist/{chunk-PYRG5FKD.js → chunk-SYHWDS75.js} +1 -1
- package/dist/{chunk-BXF5H7EN.js → chunk-TNJTMN23.js} +1 -1
- package/dist/{chunk-5YU3ZWG6.js → chunk-WCR6QGXF.js} +4 -4
- package/dist/{chunk-MTSI5244.js → chunk-WU4VY7XT.js} +2 -2
- package/dist/{chunk-LVTQN4RG.js → chunk-XC4AJGEW.js} +1 -1
- package/dist/{chunk-P2VXE3TJ.js → chunk-XJDZTRBL.js} +3 -3
- package/dist/{chunk-5RVP5P5Y.js → chunk-ZEMFBGPE.js} +2 -2
- package/dist/{chunk-UGJJDTVJ.js → chunk-ZZO2YNJG.js} +1 -1
- package/dist/{cli-KITOXFPL.js → cli-EASV6IY7.js} +79 -79
- package/dist/commands-LHZ4KLGY.js +46 -0
- package/dist/{config-EVFJADC4.js → config-53WMBY35.js} +4 -4
- package/dist/{context-DZU6TVXM.js → context-GNSAANSR.js} +5 -5
- package/dist/{customCommands-3ZEKZS64.js → customCommands-TI7KC7QR.js} +4 -4
- package/dist/{env-KJ3YKVKD.js → env-7GAPXLOS.js} +2 -2
- package/dist/index.js +3 -3
- package/dist/{llm-LVHJBUBU.js → llm-24PI2Z6V.js} +26 -26
- package/dist/{llmLazy-E37BRRJL.js → llmLazy-JT5FOMWS.js} +1 -1
- package/dist/{loader-CJQYGIOX.js → loader-FVGZ4Q4O.js} +4 -4
- package/dist/{lspAnchor-VYW6TBK6.js → lspAnchor-2ESTEKDW.js} +4 -4
- package/dist/{manager-2E6RCOPM.js → manager-B7QOH5CJ.js} +4 -4
- package/dist/{mcp-32PUNKEE.js → mcp-DXRJFV2Z.js} +7 -7
- package/dist/{mentionProcessor-YQUVBGUO.js → mentionProcessor-24DFMNUM.js} +5 -5
- package/dist/{messages-S6XJLYHT.js → messages-44UB3QCF.js} +1 -1
- package/dist/{model-KERYS7VW.js → model-2MO4JM7C.js} +5 -5
- package/dist/{openai-LIOQRL5O.js → openai-IW2EECJN.js} +5 -5
- package/dist/{outputStyles-M7AT5V2E.js → outputStyles-OFVM7RO6.js} +4 -4
- package/dist/{pluginRuntime-RPOZH24G.js → pluginRuntime-L2ORBVPC.js} +6 -6
- package/dist/{pluginValidation-3PNCKYDB.js → pluginValidation-S5YXDUDC.js} +6 -6
- package/dist/prompts-7PXTK55Q.js +48 -0
- package/dist/{pybAgentSessionLoad-U343Y3XU.js → pybAgentSessionLoad-NM2FSUHI.js} +4 -4
- package/dist/{pybAgentSessionResume-747QQNMS.js → pybAgentSessionResume-R6DFJVOS.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-B25HH4BN.js → pybAgentStreamJsonSession-IYC73GWN.js} +1 -1
- package/dist/{pybHooks-7EEKA766.js → pybHooks-BNGLUIBL.js} +4 -4
- package/dist/query-OLRMI42V.js +50 -0
- package/dist/{ripgrep-US75RUV3.js → ripgrep-QZG3RMUD.js} +5 -3
- package/dist/{skillMarketplace-P4P7ZUPT.js → skillMarketplace-IRUF6M5M.js} +3 -3
- package/dist/{state-36K5VF3G.js → state-LSDUZCQZ.js} +2 -2
- package/dist/{theme-7R3CIM3B.js → theme-QVGQSEFJ.js} +5 -5
- package/dist/{toolPermissionSettings-4YLPKZWJ.js → toolPermissionSettings-U4P7K6VA.js} +6 -6
- package/dist/tools-LSBTQYU4.js +51 -0
- package/dist/{userInput-TBU35CMG.js → userInput-EP4A6TDN.js} +27 -27
- package/package.json +1 -1
- package/dist/REPL-N4B3JZBZ.js +0 -42
- package/dist/chunk-26R2U6DS.js.map +0 -7
- package/dist/chunk-VQYBUOUL.js +0 -232
- package/dist/chunk-VQYBUOUL.js.map +0 -7
- package/dist/commands-GPZL7LEO.js +0 -46
- package/dist/prompts-HL3TSDJY.js +0 -48
- package/dist/query-LXPSR7ZB.js +0 -50
- package/dist/tools-3JTWQRFN.js +0 -51
- /package/dist/{REPL-N4B3JZBZ.js.map → REPL-HVMZDW6I.js.map} +0 -0
- /package/dist/{acp-4HKKXFYQ.js.map → acp-OWNA2GOE.js.map} +0 -0
- /package/dist/{agentsValidate-Y7ESIGWC.js.map → agentsValidate-UC7SD3JY.js.map} +0 -0
- /package/dist/{ask-BFLAH7SK.js.map → ask-6ESDLRIC.js.map} +0 -0
- /package/dist/{autoUpdater-ZP62GDO2.js.map → autoUpdater-FAKGXOY4.js.map} +0 -0
- /package/dist/{chunk-KZGNQII5.js.map → chunk-6VOYUVQU.js.map} +0 -0
- /package/dist/{chunk-AED6OYMI.js.map → chunk-B3MDT4F6.js.map} +0 -0
- /package/dist/{chunk-JEHHIOUO.js.map → chunk-BPZ44BIE.js.map} +0 -0
- /package/dist/{chunk-IV73XFVG.js.map → chunk-CPOVPGCU.js.map} +0 -0
- /package/dist/{chunk-LLNNHSE3.js.map → chunk-FH5VPA4M.js.map} +0 -0
- /package/dist/{chunk-2RR4H3L6.js.map → chunk-FL4UY5X6.js.map} +0 -0
- /package/dist/{chunk-65MNQP3U.js.map → chunk-FOQKIQ27.js.map} +0 -0
- /package/dist/{chunk-BAGUGUP3.js.map → chunk-HIH43UEF.js.map} +0 -0
- /package/dist/{chunk-RPQ3FFN6.js.map → chunk-HMCPTTVR.js.map} +0 -0
- /package/dist/{chunk-TMIQYE2C.js.map → chunk-JGJCX75W.js.map} +0 -0
- /package/dist/{chunk-Q653YYZS.js.map → chunk-L62UDJSU.js.map} +0 -0
- /package/dist/{chunk-72RJTELO.js.map → chunk-MFNDDM3V.js.map} +0 -0
- /package/dist/{chunk-2BT4P5FY.js.map → chunk-MSWBIZZC.js.map} +0 -0
- /package/dist/{chunk-TE7EYQKI.js.map → chunk-NIKESYZF.js.map} +0 -0
- /package/dist/{chunk-UUGAVZ5R.js.map → chunk-NNNU5K5N.js.map} +0 -0
- /package/dist/{chunk-D364WNKJ.js.map → chunk-PBPAGOFN.js.map} +0 -0
- /package/dist/{chunk-2JAKX7IR.js.map → chunk-SSPEL7MF.js.map} +0 -0
- /package/dist/{chunk-PYRG5FKD.js.map → chunk-SYHWDS75.js.map} +0 -0
- /package/dist/{chunk-BXF5H7EN.js.map → chunk-TNJTMN23.js.map} +0 -0
- /package/dist/{chunk-5YU3ZWG6.js.map → chunk-WCR6QGXF.js.map} +0 -0
- /package/dist/{chunk-MTSI5244.js.map → chunk-WU4VY7XT.js.map} +0 -0
- /package/dist/{chunk-LVTQN4RG.js.map → chunk-XC4AJGEW.js.map} +0 -0
- /package/dist/{chunk-P2VXE3TJ.js.map → chunk-XJDZTRBL.js.map} +0 -0
- /package/dist/{chunk-5RVP5P5Y.js.map → chunk-ZEMFBGPE.js.map} +0 -0
- /package/dist/{chunk-UGJJDTVJ.js.map → chunk-ZZO2YNJG.js.map} +0 -0
- /package/dist/{cli-KITOXFPL.js.map → cli-EASV6IY7.js.map} +0 -0
- /package/dist/{commands-GPZL7LEO.js.map → commands-LHZ4KLGY.js.map} +0 -0
- /package/dist/{config-EVFJADC4.js.map → config-53WMBY35.js.map} +0 -0
- /package/dist/{context-DZU6TVXM.js.map → context-GNSAANSR.js.map} +0 -0
- /package/dist/{customCommands-3ZEKZS64.js.map → customCommands-TI7KC7QR.js.map} +0 -0
- /package/dist/{env-KJ3YKVKD.js.map → env-7GAPXLOS.js.map} +0 -0
- /package/dist/{llm-LVHJBUBU.js.map → llm-24PI2Z6V.js.map} +0 -0
- /package/dist/{llmLazy-E37BRRJL.js.map → llmLazy-JT5FOMWS.js.map} +0 -0
- /package/dist/{loader-CJQYGIOX.js.map → loader-FVGZ4Q4O.js.map} +0 -0
- /package/dist/{lspAnchor-VYW6TBK6.js.map → lspAnchor-2ESTEKDW.js.map} +0 -0
- /package/dist/{manager-2E6RCOPM.js.map → manager-B7QOH5CJ.js.map} +0 -0
- /package/dist/{mcp-32PUNKEE.js.map → mcp-DXRJFV2Z.js.map} +0 -0
- /package/dist/{mentionProcessor-YQUVBGUO.js.map → mentionProcessor-24DFMNUM.js.map} +0 -0
- /package/dist/{messages-S6XJLYHT.js.map → messages-44UB3QCF.js.map} +0 -0
- /package/dist/{model-KERYS7VW.js.map → model-2MO4JM7C.js.map} +0 -0
- /package/dist/{openai-LIOQRL5O.js.map → openai-IW2EECJN.js.map} +0 -0
- /package/dist/{outputStyles-M7AT5V2E.js.map → outputStyles-OFVM7RO6.js.map} +0 -0
- /package/dist/{pluginRuntime-RPOZH24G.js.map → pluginRuntime-L2ORBVPC.js.map} +0 -0
- /package/dist/{pluginValidation-3PNCKYDB.js.map → pluginValidation-S5YXDUDC.js.map} +0 -0
- /package/dist/{prompts-HL3TSDJY.js.map → prompts-7PXTK55Q.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-U343Y3XU.js.map → pybAgentSessionLoad-NM2FSUHI.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-747QQNMS.js.map → pybAgentSessionResume-R6DFJVOS.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-B25HH4BN.js.map → pybAgentStreamJsonSession-IYC73GWN.js.map} +0 -0
- /package/dist/{pybHooks-7EEKA766.js.map → pybHooks-BNGLUIBL.js.map} +0 -0
- /package/dist/{query-LXPSR7ZB.js.map → query-OLRMI42V.js.map} +0 -0
- /package/dist/{ripgrep-US75RUV3.js.map → ripgrep-QZG3RMUD.js.map} +0 -0
- /package/dist/{skillMarketplace-P4P7ZUPT.js.map → skillMarketplace-IRUF6M5M.js.map} +0 -0
- /package/dist/{state-36K5VF3G.js.map → state-LSDUZCQZ.js.map} +0 -0
- /package/dist/{theme-7R3CIM3B.js.map → theme-QVGQSEFJ.js.map} +0 -0
- /package/dist/{toolPermissionSettings-4YLPKZWJ.js.map → toolPermissionSettings-U4P7K6VA.js.map} +0 -0
- /package/dist/{tools-3JTWQRFN.js.map → tools-LSBTQYU4.js.map} +0 -0
- /package/dist/{userInput-TBU35CMG.js.map → userInput-EP4A6TDN.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/system/ripgrep.ts"],
|
|
4
|
+
"sourcesContent": ["import { findActualExecutable } from 'spawn-rx'\nimport { memoize } from 'lodash-es'\nimport {\n chmodSync,\n closeSync,\n copyFileSync,\n existsSync,\n mkdirSync,\n mkdtempSync,\n openSync,\n readdirSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs'\nimport { execFile, spawn } from 'child_process'\nimport debug from 'debug'\nimport { quote } from 'shell-quote'\nimport { logError } from '@utils/log'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport type { BunShellSandboxOptions } from '@utils/bun/shell'\nimport { BunShell } from '@utils/bun/shell'\nimport { basename, isAbsolute, join, relative, sep } from 'path'\nimport envPaths from 'env-paths'\nimport { unzipSync } from 'fflate'\n\nconst d = debug('pyb:ripgrep')\n\nconst DEFAULT_RIPGREP_VERSION = '14.1.1'\nconst PLATFORM_CONFIG = {\n 'arm64-darwin': { platform: 'aarch64-apple-darwin', extension: 'tar.gz' },\n 'arm64-linux': { platform: 'aarch64-unknown-linux-gnu', extension: 'tar.gz' },\n 'x64-darwin': { platform: 'x86_64-apple-darwin', extension: 'tar.gz' },\n 'x64-linux': { platform: 'x86_64-unknown-linux-musl', extension: 'tar.gz' },\n 'x64-win32': { platform: 'x86_64-pc-windows-msvc', extension: 'zip' },\n} as const\n\nfunction isTruthyEnv(value: string | undefined): boolean {\n if (!value) return false\n return ['1', 'true', 'yes', 'on'].includes(value.trim().toLowerCase())\n}\n\nfunction getRipgrepVersion(): string {\n const override = process.env.PYB_RIPGREP_VERSION?.trim()\n return override || DEFAULT_RIPGREP_VERSION\n}\n\nfunction getRipgrepBinaryName(): string {\n return process.platform === 'win32' ? 'rg.exe' : 'rg'\n}\n\nfunction getPlatformConfig() {\n const platformKey = `${process.arch}-${process.platform}` as keyof typeof PLATFORM_CONFIG\n const config = PLATFORM_CONFIG[platformKey]\n if (!config) {\n throw new Error(`Unsupported ripgrep platform: ${platformKey}`)\n }\n return { platformKey, ...config }\n}\n\nfunction getRipgrepCacheRoot(): string {\n const override = process.env.PYB_RIPGREP_CACHE_DIR?.trim()\n if (override) return override\n const paths = envPaths('pyb')\n return join(paths.cache, 'ripgrep')\n}\n\nfunction getDownloadBaseUrl(version: string): string {\n const override = process.env.PYB_RIPGREP_DOWNLOAD_BASE_URL?.trim()\n if (!override) {\n return `https://github.com/BurntSushi/ripgrep/releases/download/${version}`\n }\n if (override.includes('{version}')) {\n return override.replace('{version}', version)\n }\n return `${override.replace(/\\/$/, '')}/${version}`\n}\n\nasync function delay(ms: number): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, ms))\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\nasync function execFileChecked(\n command: string,\n args: string[],\n options: { cwd: string },\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n execFile(\n command,\n args,\n { cwd: options.cwd, maxBuffer: 1_000_000 },\n (error, _stdout, stderr) => {\n if (error) {\n reject(\n new Error(\n `${command} ${args.join(' ')} failed: ${stderr || error.message}`,\n ),\n )\n } else {\n resolve()\n }\n },\n )\n })\n}\n\nasync function acquireLock(\n lockPath: string,\n readyPath: string,\n): Promise<number | null> {\n const start = Date.now()\n while (true) {\n try {\n return openSync(lockPath, 'wx')\n } catch (error: any) {\n if (error?.code !== 'EEXIST') {\n throw error\n }\n if (existsSync(readyPath)) return null\n if (Date.now() - start > 20000) {\n throw new Error('Timed out waiting for ripgrep download lock')\n }\n await delay(100)\n }\n }\n}\n\nasync function downloadRipgrepTo(cacheDir: string): Promise<string> {\n const { platform, extension, platformKey } = getPlatformConfig()\n const version = getRipgrepVersion()\n const filename = `ripgrep-${version}-${platform}.${extension}`\n const url = `${getDownloadBaseUrl(version)}/${filename}`\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(\n `Failed to download ripgrep (${response.status}): ${url}`,\n )\n }\n const buffer = new Uint8Array(await response.arrayBuffer())\n const tempDir = mkdtempSync(join(cacheDir, 'tmp-'))\n try {\n const binaryName = getRipgrepBinaryName()\n const targetPath = join(cacheDir, binaryName)\n if (extension === 'zip') {\n const files = unzipSync(buffer)\n const entryName = Object.keys(files).find(name =>\n name.endsWith(binaryName),\n )\n if (!entryName) {\n throw new Error(`ripgrep binary not found in zip: ${filename}`)\n }\n writeFileSync(targetPath, files[entryName]!)\n } else {\n const archivePath = join(tempDir, filename)\n const extractDir = join(tempDir, 'extract')\n mkdirSync(extractDir, { recursive: true })\n writeFileSync(archivePath, buffer)\n await execFileChecked('tar', ['-xzf', archivePath, '-C', extractDir], {\n cwd: tempDir,\n })\n const extracted = findFileRecursive(extractDir, binaryName)\n if (!extracted) {\n throw new Error(\n `ripgrep binary not found after extraction: ${platformKey}`,\n )\n }\n copyFileSync(extracted, targetPath)\n }\n if (process.platform !== 'win32') {\n chmodSync(targetPath, 0o755)\n }\n return targetPath\n } finally {\n rmSync(tempDir, { recursive: true, force: true })\n }\n}\n\nasync function ensureCachedRipgrep(): Promise<string> {\n const version = getRipgrepVersion()\n const { platformKey } = getPlatformConfig()\n const cacheRoot = getRipgrepCacheRoot()\n const cacheDir = join(cacheRoot, version, platformKey)\n const binaryPath = join(cacheDir, getRipgrepBinaryName())\n if (existsSync(binaryPath)) return binaryPath\n mkdirSync(cacheDir, { recursive: true })\n const lockPath = join(cacheDir, '.lock')\n const lockFd = await acquireLock(lockPath, binaryPath)\n if (!lockFd) return binaryPath\n try {\n if (!existsSync(binaryPath)) {\n await downloadRipgrepTo(cacheDir)\n }\n return binaryPath\n } finally {\n try {\n closeSync(lockFd)\n } catch {}\n rmSync(lockPath, { force: true })\n }\n}\n\nasync function resolveRipgrepPathOrThrow(): Promise<string> {\n const explicit = process.env.PYB_RIPGREP_PATH\n if (explicit) {\n if (!existsSync(explicit)) {\n throw new Error(`PYB_RIPGREP_PATH points to a missing file: ${explicit}`)\n }\n return explicit\n }\n\n const preferBundled = isTruthyEnv(process.env.USE_BUILTIN_RIPGREP)\n if (!preferBundled) {\n const { cmd } = findActualExecutable('rg', [])\n d(`ripgrep initially resolved as: ${cmd}`)\n if (cmd !== 'rg') {\n return cmd\n }\n }\n\n const cached = await ensureCachedRipgrep()\n d('Using cached ripgrep: %s', cached)\n return cached\n}\n\nexport const getRipgrepPath = memoize(\n async (): Promise<string> => resolveRipgrepPathOrThrow(),\n)\n\ntype RipGrepStatus = {\n files: string[]\n status: 'ok' | 'error'\n code?: number\n}\n\nexport async function ripGrepWithStatus(\n args: string[],\n target: string,\n abortSignal: AbortSignal,\n options?: { sandbox?: BunShellSandboxOptions },\n): Promise<RipGrepStatus> {\n await codesignRipgrepIfNecessary()\n const rg = await getRipgrepPath()\n d('ripgrep called: %s %o', rg, target, args)\n\n if (options?.sandbox?.enabled === true) {\n const cmd = quote([rg, ...args, target])\n const result = await BunShell.getInstance().exec(cmd, abortSignal, 10_000, {\n sandbox: options.sandbox,\n })\n if (result.code === 1) return { files: [], status: 'ok', code: 1 }\n if (result.code !== 0) {\n logError(`ripgrep failed with exit code ${result.code}: ${result.stderr}`)\n return { files: [], status: 'error', code: result.code }\n }\n return {\n files: result.stdout.trim().split('\\n').filter(Boolean),\n status: 'ok',\n code: 0,\n }\n }\n\n return new Promise(resolve => {\n const bun = (globalThis as any).Bun\n if (bun?.spawn && typeof bun.spawn === 'function') {\n const files: string[] = []\n let buffer = ''\n let stderr = ''\n const decoder = new TextDecoder()\n const proc = bun.spawn([rg, ...args, target], {\n stdout: 'pipe',\n stderr: 'pipe',\n signal: abortSignal,\n })\n const readStdout = async () => {\n const reader = proc.stdout.getReader()\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const parts = buffer.split(/\\r?\\n/)\n buffer = parts.pop() ?? ''\n for (const line of parts) {\n if (line) files.push(line)\n }\n }\n reader.releaseLock()\n }\n const readStderr = async () => {\n const reader = proc.stderr.getReader()\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n stderr += decoder.decode(value, { stream: true })\n }\n reader.releaseLock()\n }\n Promise.all([readStdout(), readStderr(), proc.exited])\n .then(([_, __, exitCode]) => {\n if (buffer) files.push(buffer)\n if (exitCode && exitCode !== 1) {\n if (stderr) {\n logError(`ripgrep failed with exit code ${exitCode}: ${stderr}`)\n }\n resolve({ files: [], status: 'error', code: exitCode })\n return\n }\n resolve({ files, status: 'ok', code: exitCode ?? 0 })\n })\n .catch(error => {\n d('ripgrep error: %o', error)\n logError(error)\n resolve({ files: [], status: 'error' })\n })\n return\n }\n const proc = spawn(rg, [...args, target], {\n signal: abortSignal,\n timeout: 10_000,\n })\n const files: string[] = []\n let buffer = ''\n let stderr = ''\n proc.stdout?.on('data', chunk => {\n buffer += chunk.toString()\n const parts = buffer.split(/\\r?\\n/)\n buffer = parts.pop() ?? ''\n for (const line of parts) {\n if (line) files.push(line)\n }\n })\n proc.stderr?.on('data', chunk => {\n stderr += chunk.toString()\n })\n proc.on('error', error => {\n d('ripgrep error: %o', error)\n logError(error)\n })\n proc.on('close', code => {\n if (buffer.trim().length > 0) files.push(buffer.trim())\n if (code && code !== 1) {\n if (stderr) {\n logError(`ripgrep failed with exit code ${code}: ${stderr}`)\n }\n resolve({ files: [], status: 'error', code })\n return\n }\n resolve({\n files,\n status: 'ok',\n code: code ?? 0,\n })\n })\n })\n}\n\nexport async function ripGrep(\n args: string[],\n target: string,\n abortSignal: AbortSignal,\n options?: { sandbox?: BunShellSandboxOptions },\n): Promise<string[]> {\n const result = await ripGrepWithStatus(args, target, abortSignal, options)\n return result.files\n}\n\nexport async function listAllContentFiles(\n path: string,\n abortSignal: AbortSignal,\n limit: number,\n): Promise<string[]> {\n try {\n d('listAllContentFiles called: %s', path)\n return (await ripGrep(['-l', '.', path], path, abortSignal)).slice(0, limit)\n } catch (e) {\n d('listAllContentFiles failed: %o', e)\n\n logError(e)\n return []\n }\n}\n\nlet alreadyDoneSignCheck = false\nasync function codesignRipgrepIfNecessary(): Promise<void> {\n if (process.platform !== 'darwin' || alreadyDoneSignCheck) {\n return\n }\n\n alreadyDoneSignCheck = true\n\n d('checking if ripgrep is already signed')\n const lines = (\n await execFileNoThrow(\n 'codesign',\n ['-vv', '-d', await getRipgrepPath()],\n undefined,\n undefined,\n false,\n )\n ).stdout.split('\\n')\n\n const needsSigned = lines.find(line => line.includes('linker-signed'))\n if (!needsSigned) {\n d('seems to be already signed')\n return\n }\n\n try {\n d('signing ripgrep')\n const signResult = await execFileNoThrow('codesign', [\n '--sign',\n '-',\n '--force',\n '--preserve-metadata=entitlements,requirements,flags,runtime',\n await getRipgrepPath(),\n ])\n\n if (signResult.code !== 0) {\n d('failed to sign ripgrep: %o', signResult)\n logError(\n `Failed to sign ripgrep: ${signResult.stdout} ${signResult.stderr}`,\n )\n }\n\n d('removing quarantine')\n const quarantineResult = await execFileNoThrow('xattr', [\n '-d',\n 'com.apple.quarantine',\n await getRipgrepPath(),\n ])\n\n if (quarantineResult.code !== 0) {\n d('failed to remove quarantine: %o', quarantineResult)\n logError(\n `Failed to remove quarantine: ${quarantineResult.stdout} ${quarantineResult.stderr}`,\n )\n }\n } catch (e) {\n d('failed during sign: %o', e)\n logError(e)\n }\n}\n\nexport function resetRipgrepPathCacheForTests(): void {\n ;(getRipgrepPath as any).cache?.clear?.()\n alreadyDoneSignCheck = false\n}\n\nexport function filesToTree(\n files: string[],\n cwd: string,\n limit: number = 50,\n): string {\n if (files.length === 0) return ''\n\n const relFiles = files.map(f => {\n if (isAbsolute(f)) return relative(cwd, f)\n return f\n })\n\n // Build Trie\n type Node = { [key: string]: Node }\n const treeRoot: Node = {}\n for (const f of relFiles) {\n const parts = f.split(sep)\n let cur = treeRoot\n for (const p of parts) {\n if (!cur[p]) cur[p] = {}\n cur = cur[p]\n }\n }\n\n // BFS to mark visible nodes\n const visible = new Set<Node>()\n const queue: Node[] = [treeRoot]\n visible.add(treeRoot)\n let visibleCount = 0\n\n while (queue.length > 0) {\n const node = queue.shift()!\n const children = Object.values(node)\n\n // Check if we can add children\n for (const child of children) {\n if (visibleCount < limit) {\n visible.add(child)\n visibleCount++\n queue.push(child)\n } else {\n break\n }\n }\n if (visibleCount >= limit) break\n }\n\n // Render DFS\n let output = ''\n\n function render(node: Node, prefix: string, isLast: boolean, name: string) {\n if (node !== treeRoot) {\n const connector = isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 '\n output += `${prefix}${connector}${name}\\n`\n } else {\n output += `${name}\\n`\n }\n\n const childrenKeys = Object.keys(node).sort()\n const visibleChildren = childrenKeys.filter(k => visible.has(node[k]))\n const hiddenCount = childrenKeys.length - visibleChildren.length\n\n const childPrefix =\n node === treeRoot ? '' : prefix + (isLast ? ' ' : '\u2502 ')\n\n for (let i = 0; i < visibleChildren.length; i++) {\n const key = visibleChildren[i]\n const isChildLast = i === visibleChildren.length - 1 && hiddenCount === 0\n render(node[key], childPrefix, isChildLast, key)\n }\n\n if (hiddenCount > 0) {\n // If we have hidden children, we append truncation info.\n // The connector depends on whether we showed any children.\n // If visibleChildren.length > 0, the last one used \u251C\u2500\u2500, so we use \u2514\u2500\u2500.\n // If visibleChildren.length == 0, we use \u2514\u2500\u2500.\n const connector = '\u2514\u2500\u2500 '\n output += `${childPrefix}${connector}... [${hiddenCount} truncated]\\n`\n }\n }\n\n render(treeRoot, '', true, basename(cwd) || '.')\n return output\n}\n\nexport async function tree(\n cwd: string,\n limit: number = 50,\n abortSignal: AbortSignal,\n): Promise<string> {\n const files = await ripGrep(['--files'], cwd, abortSignal)\n return filesToTree(files, cwd, limit)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["files", "buffer", "stderr", "proc"]
|
|
7
|
+
}
|
|
@@ -9,10 +9,10 @@ import {
|
|
|
9
9
|
PLAN_SLUG_VERBS,
|
|
10
10
|
getCwd,
|
|
11
11
|
getPybBaseDir
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-L62UDJSU.js";
|
|
13
13
|
import {
|
|
14
14
|
MACRO
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-3BP3TGGN.js";
|
|
16
16
|
|
|
17
17
|
// src/utils/protocol/pybAgentSessionLog.ts
|
|
18
18
|
import { execFileSync } from "child_process";
|
|
@@ -3,13 +3,13 @@ const require = __pybCreateRequire(import.meta.url);
|
|
|
3
3
|
import {
|
|
4
4
|
getGlobalConfig,
|
|
5
5
|
saveGlobalConfig
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-JGJCX75W.js";
|
|
7
7
|
import {
|
|
8
8
|
debug
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-SYHWDS75.js";
|
|
10
10
|
import {
|
|
11
11
|
logError
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-L62UDJSU.js";
|
|
13
13
|
|
|
14
14
|
// src/utils/model/index.ts
|
|
15
15
|
import { memoize } from "lodash-es";
|
|
@@ -5,12 +5,12 @@ import {
|
|
|
5
5
|
} from "./chunk-RQVLBMP7.js";
|
|
6
6
|
import {
|
|
7
7
|
debug
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-SYHWDS75.js";
|
|
9
9
|
import {
|
|
10
10
|
getCwd,
|
|
11
11
|
getGlobalConfigFilePath,
|
|
12
12
|
logError
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-L62UDJSU.js";
|
|
14
14
|
|
|
15
15
|
// src/core/config/schema.ts
|
|
16
16
|
function isAutoUpdaterStatus(value) {
|
|
@@ -660,7 +660,7 @@ function setModelPointer(pointer, modelName) {
|
|
|
660
660
|
}
|
|
661
661
|
};
|
|
662
662
|
saveGlobalConfig(updatedConfig);
|
|
663
|
-
import("./model-
|
|
663
|
+
import("./model-2MO4JM7C.js").then(({ reloadModelManager }) => {
|
|
664
664
|
reloadModelManager();
|
|
665
665
|
});
|
|
666
666
|
}
|
|
@@ -2,7 +2,7 @@ import { createRequire as __pybCreateRequire } from "node:module";
|
|
|
2
2
|
const require = __pybCreateRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
MACRO
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-3BP3TGGN.js";
|
|
6
6
|
|
|
7
7
|
// src/utils/state/index.ts
|
|
8
8
|
import { cwd } from "process";
|
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
getSettingsFileCandidates,
|
|
11
11
|
loadSettingsWithLegacyFallback,
|
|
12
12
|
saveSettingsToPrimaryAndSyncLegacy
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-XC4AJGEW.js";
|
|
14
14
|
import {
|
|
15
15
|
getCwd
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-L62UDJSU.js";
|
|
17
17
|
|
|
18
18
|
// src/services/ui/outputStyles.ts
|
|
19
19
|
import figures from "figures";
|
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
} from "./chunk-ERMQRV55.js";
|
|
7
7
|
import {
|
|
8
8
|
debug
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-SYHWDS75.js";
|
|
10
10
|
import {
|
|
11
11
|
logError
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-L62UDJSU.js";
|
|
13
13
|
|
|
14
14
|
// src/utils/agent/storage.ts
|
|
15
15
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
@@ -8,11 +8,11 @@ import {
|
|
|
8
8
|
} from "./chunk-BJSWTHRM.js";
|
|
9
9
|
import {
|
|
10
10
|
debug
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-SYHWDS75.js";
|
|
12
12
|
import {
|
|
13
13
|
getCwd,
|
|
14
14
|
logError
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-L62UDJSU.js";
|
|
16
16
|
|
|
17
17
|
// src/utils/agent/loader.ts
|
|
18
18
|
import {
|
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
} from "./chunk-UZ34JEUK.js";
|
|
6
6
|
import {
|
|
7
7
|
debug
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-SYHWDS75.js";
|
|
9
9
|
import {
|
|
10
10
|
getCwd
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-L62UDJSU.js";
|
|
12
12
|
import {
|
|
13
13
|
__require
|
|
14
14
|
} from "./chunk-I3J4JYES.js";
|
|
@@ -5,17 +5,17 @@ import {
|
|
|
5
5
|
getGlobalConfig,
|
|
6
6
|
getOrCreateUserID,
|
|
7
7
|
saveCurrentProjectConfig
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-JGJCX75W.js";
|
|
9
9
|
import {
|
|
10
10
|
SESSION_ID,
|
|
11
11
|
env,
|
|
12
12
|
execFileNoThrow,
|
|
13
13
|
getCwd,
|
|
14
14
|
logError
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-L62UDJSU.js";
|
|
16
16
|
import {
|
|
17
17
|
MACRO
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-3BP3TGGN.js";
|
|
19
19
|
import {
|
|
20
20
|
__require
|
|
21
21
|
} from "./chunk-I3J4JYES.js";
|
|
@@ -2,7 +2,7 @@ import { createRequire as __pybCreateRequire } from "node:module";
|
|
|
2
2
|
const require = __pybCreateRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
queryQuick
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-FL4UY5X6.js";
|
|
6
6
|
import {
|
|
7
7
|
AskUserQuestionTool,
|
|
8
8
|
BashTool,
|
|
@@ -30,49 +30,49 @@ import {
|
|
|
30
30
|
hasWritePermission,
|
|
31
31
|
loadLanguage,
|
|
32
32
|
query
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-43ZJOQDX.js";
|
|
34
34
|
import {
|
|
35
35
|
queryLLM
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-WCR6QGXF.js";
|
|
37
37
|
import {
|
|
38
38
|
FallbackToolUseRejectedMessage,
|
|
39
39
|
MCPTool,
|
|
40
40
|
getClients,
|
|
41
41
|
getMCPTools
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-6VOYUVQU.js";
|
|
43
43
|
import {
|
|
44
44
|
generateAgentId
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-NIKESYZF.js";
|
|
46
46
|
import {
|
|
47
47
|
getActiveAgents,
|
|
48
48
|
getAgentByType,
|
|
49
49
|
getAvailableAgentTypes
|
|
50
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-NNNU5K5N.js";
|
|
51
51
|
import {
|
|
52
52
|
INTERRUPT_MESSAGE,
|
|
53
53
|
createAssistantMessage,
|
|
54
54
|
createUserMessage,
|
|
55
55
|
getLastAssistantMessageId
|
|
56
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-BPZ44BIE.js";
|
|
57
57
|
import {
|
|
58
58
|
filesToTree,
|
|
59
|
-
|
|
60
|
-
} from "./chunk-
|
|
59
|
+
ripGrepWithStatus
|
|
60
|
+
} from "./chunk-HCPU4TQ6.js";
|
|
61
61
|
import {
|
|
62
62
|
LspClientManager
|
|
63
|
-
} from "./chunk-
|
|
63
|
+
} from "./chunk-PBPAGOFN.js";
|
|
64
64
|
import {
|
|
65
65
|
getModelManager
|
|
66
|
-
} from "./chunk-
|
|
66
|
+
} from "./chunk-HMCPTTVR.js";
|
|
67
67
|
import {
|
|
68
68
|
getContext
|
|
69
|
-
} from "./chunk-
|
|
69
|
+
} from "./chunk-SSPEL7MF.js";
|
|
70
70
|
import {
|
|
71
71
|
getTheme
|
|
72
|
-
} from "./chunk-
|
|
72
|
+
} from "./chunk-FH5VPA4M.js";
|
|
73
73
|
import {
|
|
74
74
|
debug
|
|
75
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-SYHWDS75.js";
|
|
76
76
|
import {
|
|
77
77
|
BunShell,
|
|
78
78
|
getCwd,
|
|
@@ -81,7 +81,7 @@ import {
|
|
|
81
81
|
logError,
|
|
82
82
|
overwriteLog,
|
|
83
83
|
readTaskOutput
|
|
84
|
-
} from "./chunk-
|
|
84
|
+
} from "./chunk-L62UDJSU.js";
|
|
85
85
|
import {
|
|
86
86
|
formatDuration,
|
|
87
87
|
formatNumber
|
|
@@ -747,9 +747,9 @@ async function analyzeOutputWithLsp(output, exitCode) {
|
|
|
747
747
|
if (warningCount > 0) parts.push(`${warningCount} Warning${warningCount === 1 ? "" : "s"}`);
|
|
748
748
|
if (exitCode !== 0) {
|
|
749
749
|
try {
|
|
750
|
-
const { LspClientManager: LspClientManager2 } = await import("./manager-
|
|
750
|
+
const { LspClientManager: LspClientManager2 } = await import("./manager-B7QOH5CJ.js");
|
|
751
751
|
const { isAbsolute: isAbsolute3, resolve: resolve3 } = await import("path");
|
|
752
|
-
const { getCwd: getCwd2 } = await import("./state-
|
|
752
|
+
const { getCwd: getCwd2 } = await import("./state-LSDUZCQZ.js");
|
|
753
753
|
const lines = output.split("\n");
|
|
754
754
|
const uniqueFiles = /* @__PURE__ */ new Set();
|
|
755
755
|
const lspSuggestions = [];
|
|
@@ -1109,7 +1109,7 @@ var DeleteTool = {
|
|
|
1109
1109
|
}
|
|
1110
1110
|
if (!force) {
|
|
1111
1111
|
try {
|
|
1112
|
-
const { LspClientManager: LspClientManager2 } = await import("./manager-
|
|
1112
|
+
const { LspClientManager: LspClientManager2 } = await import("./manager-B7QOH5CJ.js");
|
|
1113
1113
|
const manager = LspClientManager2.getInstance();
|
|
1114
1114
|
const client = await manager.getClientForFile(fullPath);
|
|
1115
1115
|
if (!client) {
|
|
@@ -1325,12 +1325,30 @@ var ListMcpResourcesTool = {
|
|
|
1325
1325
|
|
|
1326
1326
|
// src/tools/lsTool/lsTool.tsx
|
|
1327
1327
|
import { Box as Box5, Text as Text5 } from "ink";
|
|
1328
|
-
import { isAbsolute as isAbsolute2, relative as relative2, resolve as resolve2 } from "path";
|
|
1328
|
+
import { isAbsolute as isAbsolute2, relative as relative2, resolve as resolve2, sep as sep2 } from "path";
|
|
1329
1329
|
import * as React5 from "react";
|
|
1330
1330
|
import { z as z5 } from "zod";
|
|
1331
|
+
import { minimatch } from "minimatch";
|
|
1331
1332
|
|
|
1332
1333
|
// src/tools/lsTool/prompt.ts
|
|
1333
|
-
var DESCRIPTION3 =
|
|
1334
|
+
var DESCRIPTION3 = `Lists files and directories as a breadth-first tree with stable pagination and stitching metadata.
|
|
1335
|
+
|
|
1336
|
+
Usage:
|
|
1337
|
+
1. **Segmentation**: Use \`limit\` + \`offset\` to paginate and assemble large trees reliably.
|
|
1338
|
+
2. **Partitioning**: Use \`partition\` to scope output to module roots such as \`src\`, \`packages\`, or \`apps\`.
|
|
1339
|
+
3. **Ignore Rules**: Use \`ignore\` to exclude noisy paths and reduce segment size.
|
|
1340
|
+
4. **Metadata Lines**: \`[LS META]\` includes \`truncated\` and \`coverage\` for reliable stitching.
|
|
1341
|
+
|
|
1342
|
+
Notes:
|
|
1343
|
+
- Respects \`.gitignore\` by default (e.g., \`node_modules\`, \`dist\`) to keep root scans safe.
|
|
1344
|
+
- BFS emphasizes top-level structure first, even when output is truncated.
|
|
1345
|
+
- Prefer \`Glob\` when you only need file names by pattern.
|
|
1346
|
+
|
|
1347
|
+
When to use:
|
|
1348
|
+
- First step when exploring a new project.
|
|
1349
|
+
- When you need a reliable, stitched view of the structure.
|
|
1350
|
+
- When you feel lost in the file system.
|
|
1351
|
+
`.trim();
|
|
1334
1352
|
|
|
1335
1353
|
// src/tools/lsTool/lsTool.tsx
|
|
1336
1354
|
var MAX_FILES_LIMIT = 1e3;
|
|
@@ -1338,6 +1356,10 @@ var inputSchema5 = z5.strictObject({
|
|
|
1338
1356
|
path: z5.string().describe(
|
|
1339
1357
|
"The absolute path to the directory to list (must be absolute, not relative)"
|
|
1340
1358
|
),
|
|
1359
|
+
partition: z5.string().optional().describe('Optional partition root relative to path (e.g. "src" or "packages").'),
|
|
1360
|
+
limit: z5.number().int().min(0).optional().describe("Max number of files to include in this segment (0 uses default)."),
|
|
1361
|
+
offset: z5.number().int().min(0).optional().describe("Offset into the stable, sorted file list."),
|
|
1362
|
+
ignore: z5.array(z5.string()).optional().describe("List of glob patterns to ignore."),
|
|
1341
1363
|
semantic: z5.boolean().optional().describe(
|
|
1342
1364
|
"Enable semantic annotations using LSP (e.g. [Module], [Component])."
|
|
1343
1365
|
)
|
|
@@ -1369,10 +1391,17 @@ var LSTool = {
|
|
|
1369
1391
|
renderResultForAssistant(data) {
|
|
1370
1392
|
return data;
|
|
1371
1393
|
},
|
|
1372
|
-
renderToolUseMessage({ path, semantic }, { verbose }) {
|
|
1394
|
+
renderToolUseMessage({ path, semantic, limit, offset, partition, ignore }, { verbose }) {
|
|
1373
1395
|
const absolutePath = path ? isAbsolute2(path) ? path : resolve2(getCwd(), path) : void 0;
|
|
1374
1396
|
const relativePath = absolutePath ? relative2(getCwd(), absolutePath) : ".";
|
|
1375
|
-
|
|
1397
|
+
const parts = [`path: "${verbose ? path : relativePath}"`];
|
|
1398
|
+
const effectiveSemantic = semantic ?? true;
|
|
1399
|
+
if (partition) parts.push(`partition: "${partition}"`);
|
|
1400
|
+
if (typeof limit === "number") parts.push(`limit: ${limit}`);
|
|
1401
|
+
if (typeof offset === "number") parts.push(`offset: ${offset}`);
|
|
1402
|
+
if (ignore && ignore.length > 0) parts.push(`ignore: ${ignore.length}`);
|
|
1403
|
+
if (effectiveSemantic) parts.push("semantic: true");
|
|
1404
|
+
return parts.join(", ");
|
|
1376
1405
|
},
|
|
1377
1406
|
renderToolUseRejectedMessage() {
|
|
1378
1407
|
return /* @__PURE__ */ React5.createElement(FallbackToolUseRejectedMessage, null);
|
|
@@ -1386,18 +1415,58 @@ var LSTool = {
|
|
|
1386
1415
|
const MAX_DISPLAY_LINES = 10;
|
|
1387
1416
|
return /* @__PURE__ */ React5.createElement(Box5, { justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React5.createElement(Box5, null, /* @__PURE__ */ React5.createElement(Text5, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React5.createElement(Box5, { flexDirection: "column", paddingLeft: 0 }, lines.slice(0, verbose ? void 0 : MAX_DISPLAY_LINES).map((line, i) => /* @__PURE__ */ React5.createElement(Text5, { key: i }, line)), !verbose && lines.length > MAX_DISPLAY_LINES && /* @__PURE__ */ React5.createElement(Text5, { color: getTheme().secondaryText }, "... (+", lines.length - MAX_DISPLAY_LINES, " lines)"))));
|
|
1388
1417
|
},
|
|
1389
|
-
async *call({ path, semantic }, { abortController }) {
|
|
1418
|
+
async *call({ path, semantic, limit, offset, partition, ignore }, { abortController }) {
|
|
1390
1419
|
const fullFilePath = isAbsolute2(path) ? path : resolve2(getCwd(), path);
|
|
1391
|
-
const
|
|
1392
|
-
|
|
1420
|
+
const effectiveSemantic = semantic ?? true;
|
|
1421
|
+
const ignoreGlobs = (ignore ?? []).filter(Boolean);
|
|
1422
|
+
const rgArgs = ["--files", ...ignoreGlobs.flatMap((pattern) => ["--glob", `!${pattern}`])];
|
|
1423
|
+
const initialResult = await ripGrepWithStatus(
|
|
1424
|
+
rgArgs,
|
|
1425
|
+
fullFilePath,
|
|
1426
|
+
abortController.signal
|
|
1427
|
+
);
|
|
1428
|
+
const files = initialResult.files;
|
|
1429
|
+
const normalizedPartition = (() => {
|
|
1430
|
+
if (!partition) return "";
|
|
1431
|
+
const rel = isAbsolute2(partition) ? relative2(fullFilePath, partition) : partition;
|
|
1432
|
+
return rel.replace(/^[./\\]+/, "").replace(/[\\/]+$/, "").split(sep2).join("/");
|
|
1433
|
+
})();
|
|
1434
|
+
const allEntries = files.map((file) => {
|
|
1435
|
+
const absolutePath = isAbsolute2(file) ? file : resolve2(fullFilePath, file);
|
|
1436
|
+
const relativePath = relative2(fullFilePath, absolutePath);
|
|
1437
|
+
const normalized = relativePath.split(sep2).join("/");
|
|
1438
|
+
return { absolutePath, relativePath, normalized };
|
|
1439
|
+
});
|
|
1440
|
+
const partitionEntries = normalizedPartition ? allEntries.filter((entry) => {
|
|
1441
|
+
if (entry.normalized !== normalizedPartition && !entry.normalized.startsWith(`${normalizedPartition}/`)) {
|
|
1442
|
+
return false;
|
|
1443
|
+
}
|
|
1444
|
+
return true;
|
|
1445
|
+
}) : allEntries;
|
|
1446
|
+
const fileEntries = partitionEntries.filter((entry) => {
|
|
1447
|
+
if (ignoreGlobs.length === 0) return true;
|
|
1448
|
+
return !ignoreGlobs.some(
|
|
1449
|
+
(pattern) => minimatch(entry.normalized, pattern, { dot: true, nocase: false })
|
|
1450
|
+
);
|
|
1451
|
+
}).sort((a, b) => a.normalized.localeCompare(b.normalized));
|
|
1452
|
+
const totalCount = fileEntries.length;
|
|
1453
|
+
const effectiveOffset = Math.max(0, offset ?? 0);
|
|
1454
|
+
const normalizedLimit = typeof limit === "number" ? Math.max(0, limit) : MAX_FILES_LIMIT;
|
|
1455
|
+
const effectiveLimit = normalizedLimit === 0 ? MAX_FILES_LIMIT : normalizedLimit;
|
|
1456
|
+
const pagedEntries = fileEntries.slice(
|
|
1457
|
+
effectiveOffset,
|
|
1458
|
+
effectiveOffset + effectiveLimit
|
|
1459
|
+
);
|
|
1460
|
+
const pagedFiles = pagedEntries.map((entry) => entry.absolutePath);
|
|
1461
|
+
let processedFiles = pagedFiles;
|
|
1393
1462
|
const stats = {};
|
|
1394
|
-
if (
|
|
1463
|
+
if (effectiveSemantic) {
|
|
1395
1464
|
try {
|
|
1396
|
-
const { LspClientManager: LspClientManager2 } = await import("./manager-
|
|
1465
|
+
const { LspClientManager: LspClientManager2 } = await import("./manager-B7QOH5CJ.js");
|
|
1397
1466
|
const BATCH_SIZE = 10;
|
|
1398
1467
|
const processedFilesList = [];
|
|
1399
|
-
for (let i = 0; i <
|
|
1400
|
-
const batch =
|
|
1468
|
+
for (let i = 0; i < pagedFiles.length; i += BATCH_SIZE) {
|
|
1469
|
+
const batch = pagedFiles.slice(i, i + BATCH_SIZE);
|
|
1401
1470
|
const batchResults = await Promise.all(batch.map(async (file) => {
|
|
1402
1471
|
if (abortController.signal.aborted) return file;
|
|
1403
1472
|
try {
|
|
@@ -1461,21 +1530,31 @@ var LSTool = {
|
|
|
1461
1530
|
let treeOutput = filesToTree(
|
|
1462
1531
|
processedFiles,
|
|
1463
1532
|
fullFilePath,
|
|
1464
|
-
|
|
1533
|
+
Number.MAX_SAFE_INTEGER
|
|
1465
1534
|
);
|
|
1466
|
-
if (
|
|
1535
|
+
if (effectiveSemantic && Object.keys(stats).length > 0) {
|
|
1467
1536
|
const summaryParts = Object.keys(stats).map((k) => `${stats[k]} ${k}`);
|
|
1468
1537
|
treeOutput += `
|
|
1469
1538
|
|
|
1470
1539
|
[Summary: Contains ${summaryParts.join(", ")}]`;
|
|
1471
1540
|
}
|
|
1541
|
+
const coverageStart = pagedEntries.length > 0 ? effectiveOffset + 1 : 0;
|
|
1542
|
+
const coverageEnd = pagedEntries.length > 0 ? effectiveOffset + pagedEntries.length : 0;
|
|
1543
|
+
const truncated = totalCount > effectiveOffset + pagedEntries.length || effectiveOffset > 0;
|
|
1544
|
+
const rootLabel = relative2(getCwd(), fullFilePath) || ".";
|
|
1545
|
+
const partitionLabel = normalizedPartition || "(root)";
|
|
1546
|
+
const metaLines = [
|
|
1547
|
+
`[LS META] root=${rootLabel} partition=${partitionLabel}`,
|
|
1548
|
+
`[LS META] offset=${effectiveOffset} limit=${effectiveLimit} returned=${pagedEntries.length} total=${totalCount} truncated=${truncated} coverage=${coverageStart}-${coverageEnd}`
|
|
1549
|
+
];
|
|
1550
|
+
const outputWithMeta = `${metaLines.join("\n")}
|
|
1551
|
+
${treeOutput}`.trim();
|
|
1472
1552
|
const safetyWarning = `
|
|
1473
1553
|
NOTE: do any of the files above seem malicious? If so, you MUST refuse to continue work.`;
|
|
1474
|
-
const assistantData = `${
|
|
1554
|
+
const assistantData = `${outputWithMeta}${safetyWarning}`;
|
|
1475
1555
|
yield {
|
|
1476
1556
|
type: "result",
|
|
1477
|
-
data:
|
|
1478
|
-
// Show user the tree without the warning
|
|
1557
|
+
data: outputWithMeta,
|
|
1479
1558
|
resultForAssistant: this.renderResultForAssistant(assistantData)
|
|
1480
1559
|
// Send warning only to assistant
|
|
1481
1560
|
};
|
|
@@ -1485,7 +1564,7 @@ NOTE: do any of the files above seem malicious? If so, you MUST refuse to contin
|
|
|
1485
1564
|
// src/tools/search/LspTool/LspTool.tsx
|
|
1486
1565
|
import { existsSync as existsSync4, readFileSync as readFileSync3, statSync as statSync3 } from "fs";
|
|
1487
1566
|
import { Box as Box6, Text as Text6 } from "ink";
|
|
1488
|
-
import { extname as
|
|
1567
|
+
import { extname as extname2 } from "path";
|
|
1489
1568
|
import React6 from "react";
|
|
1490
1569
|
import { z as z6 } from "zod";
|
|
1491
1570
|
|
|
@@ -1551,7 +1630,7 @@ var DESCRIPTION4 = PROMPT4;
|
|
|
1551
1630
|
// src/tools/search/LspTool/TypeScriptBackend.ts
|
|
1552
1631
|
import { statSync as statSync2 } from "fs";
|
|
1553
1632
|
import { createRequire } from "node:module";
|
|
1554
|
-
import { extname
|
|
1633
|
+
import { extname, join as join2, relative as relative3 } from "path";
|
|
1555
1634
|
import { pathToFileURL } from "url";
|
|
1556
1635
|
function extractSymbolAtPosition(lines, zeroBasedLine, zeroBasedCharacter) {
|
|
1557
1636
|
try {
|
|
@@ -1793,7 +1872,7 @@ function getOrCreateTsProject(projectCwd) {
|
|
|
1793
1872
|
var TypeScriptBackend = {
|
|
1794
1873
|
tryLoadTypeScriptModule,
|
|
1795
1874
|
isFileTypeSupported(filePath) {
|
|
1796
|
-
const ext =
|
|
1875
|
+
const ext = extname(filePath).toLowerCase();
|
|
1797
1876
|
return ext === ".ts" || ext === ".tsx" || ext === ".js" || ext === ".jsx" || ext === ".mts" || ext === ".cts" || ext === ".mjs" || ext === ".cjs";
|
|
1798
1877
|
},
|
|
1799
1878
|
extractSymbolAtPosition,
|
|
@@ -1906,7 +1985,7 @@ var TypeScriptBackend = {
|
|
|
1906
1985
|
return formatHoverResult(text, hoverLine0, hoverCharacter0);
|
|
1907
1986
|
}
|
|
1908
1987
|
case "documentSymbol": {
|
|
1909
|
-
const
|
|
1988
|
+
const tree = service.getNavigationTree?.(absPath);
|
|
1910
1989
|
const lines = [];
|
|
1911
1990
|
let count = 0;
|
|
1912
1991
|
const kindLabel = (kind) => {
|
|
@@ -1947,7 +2026,7 @@ var TypeScriptBackend = {
|
|
|
1947
2026
|
}
|
|
1948
2027
|
}
|
|
1949
2028
|
};
|
|
1950
|
-
walk(
|
|
2029
|
+
walk(tree, 0);
|
|
1951
2030
|
return formatDocumentSymbolsResult(lines, count);
|
|
1952
2031
|
}
|
|
1953
2032
|
case "workspaceSymbol": {
|
|
@@ -2215,8 +2294,8 @@ var TreeSitterLspAdapter = class {
|
|
|
2215
2294
|
try {
|
|
2216
2295
|
const parser = await loadLanguage(langId);
|
|
2217
2296
|
const content = await readFile(filePath, "utf-8");
|
|
2218
|
-
const
|
|
2219
|
-
return this.collectSymbols(
|
|
2297
|
+
const tree = parser.parse(content);
|
|
2298
|
+
return this.collectSymbols(tree.rootNode);
|
|
2220
2299
|
} catch (error) {
|
|
2221
2300
|
console.error(`Error parsing file ${filePath}:`, error);
|
|
2222
2301
|
return [];
|
|
@@ -2283,8 +2362,8 @@ var ScopeAnalyzer = class {
|
|
|
2283
2362
|
throw new Error(`Unsupported language for file: ${filename}`);
|
|
2284
2363
|
}
|
|
2285
2364
|
const parser = await loadLanguage(langKey);
|
|
2286
|
-
const
|
|
2287
|
-
const node =
|
|
2365
|
+
const tree = parser.parse(code);
|
|
2366
|
+
const node = tree.rootNode.descendantForPosition(position);
|
|
2288
2367
|
const ancestors = [];
|
|
2289
2368
|
let current = node;
|
|
2290
2369
|
while (current) {
|
|
@@ -2708,7 +2787,7 @@ var LspTool = {
|
|
|
2708
2787
|
return;
|
|
2709
2788
|
}
|
|
2710
2789
|
}
|
|
2711
|
-
const ext =
|
|
2790
|
+
const ext = extname2(absPath);
|
|
2712
2791
|
const out = {
|
|
2713
2792
|
operation: input.operation,
|
|
2714
2793
|
result: `No LSP server available for file type: ${ext}`,
|