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.
Files changed (142) hide show
  1. package/dist/REPL-HVMZDW6I.js +42 -0
  2. package/dist/{acp-4HKKXFYQ.js → acp-OWNA2GOE.js} +28 -28
  3. package/dist/{agentsValidate-Y7ESIGWC.js → agentsValidate-UC7SD3JY.js} +7 -7
  4. package/dist/{ask-BFLAH7SK.js → ask-6ESDLRIC.js} +25 -25
  5. package/dist/{autoUpdater-ZP62GDO2.js → autoUpdater-FAKGXOY4.js} +3 -3
  6. package/dist/{chunk-R56S2D3A.js → chunk-3BP3TGGN.js} +1 -1
  7. package/dist/{chunk-R56S2D3A.js.map → chunk-3BP3TGGN.js.map} +1 -1
  8. package/dist/{chunk-4YJ6DHQK.js → chunk-43ZJOQDX.js} +37 -37
  9. package/dist/{chunk-4YJ6DHQK.js.map → chunk-43ZJOQDX.js.map} +2 -2
  10. package/dist/{chunk-KZGNQII5.js → chunk-6VOYUVQU.js} +4 -4
  11. package/dist/{chunk-AED6OYMI.js → chunk-B3MDT4F6.js} +3 -3
  12. package/dist/{chunk-JEHHIOUO.js → chunk-BPZ44BIE.js} +1 -1
  13. package/dist/{chunk-IV73XFVG.js → chunk-CPOVPGCU.js} +3 -3
  14. package/dist/{chunk-LLNNHSE3.js → chunk-FH5VPA4M.js} +1 -1
  15. package/dist/{chunk-2RR4H3L6.js → chunk-FL4UY5X6.js} +9 -9
  16. package/dist/{chunk-65MNQP3U.js → chunk-FOQKIQ27.js} +3 -3
  17. package/dist/chunk-HCPU4TQ6.js +478 -0
  18. package/dist/chunk-HCPU4TQ6.js.map +7 -0
  19. package/dist/{chunk-BAGUGUP3.js → chunk-HIH43UEF.js} +2 -2
  20. package/dist/{chunk-RPQ3FFN6.js → chunk-HMCPTTVR.js} +3 -3
  21. package/dist/{chunk-TMIQYE2C.js → chunk-JGJCX75W.js} +3 -3
  22. package/dist/{chunk-Q653YYZS.js → chunk-L62UDJSU.js} +1 -1
  23. package/dist/{chunk-72RJTELO.js → chunk-MFNDDM3V.js} +1 -1
  24. package/dist/{chunk-2BT4P5FY.js → chunk-MSWBIZZC.js} +2 -2
  25. package/dist/{chunk-TE7EYQKI.js → chunk-NIKESYZF.js} +2 -2
  26. package/dist/{chunk-UUGAVZ5R.js → chunk-NNNU5K5N.js} +2 -2
  27. package/dist/{chunk-D364WNKJ.js → chunk-PBPAGOFN.js} +2 -2
  28. package/dist/{chunk-2JAKX7IR.js → chunk-SSPEL7MF.js} +3 -3
  29. package/dist/{chunk-26R2U6DS.js → chunk-SWY5TLOX.js} +123 -44
  30. package/dist/chunk-SWY5TLOX.js.map +7 -0
  31. package/dist/{chunk-PYRG5FKD.js → chunk-SYHWDS75.js} +1 -1
  32. package/dist/{chunk-BXF5H7EN.js → chunk-TNJTMN23.js} +1 -1
  33. package/dist/{chunk-5YU3ZWG6.js → chunk-WCR6QGXF.js} +4 -4
  34. package/dist/{chunk-MTSI5244.js → chunk-WU4VY7XT.js} +2 -2
  35. package/dist/{chunk-LVTQN4RG.js → chunk-XC4AJGEW.js} +1 -1
  36. package/dist/{chunk-P2VXE3TJ.js → chunk-XJDZTRBL.js} +3 -3
  37. package/dist/{chunk-5RVP5P5Y.js → chunk-ZEMFBGPE.js} +2 -2
  38. package/dist/{chunk-UGJJDTVJ.js → chunk-ZZO2YNJG.js} +1 -1
  39. package/dist/{cli-KITOXFPL.js → cli-EASV6IY7.js} +79 -79
  40. package/dist/commands-LHZ4KLGY.js +46 -0
  41. package/dist/{config-EVFJADC4.js → config-53WMBY35.js} +4 -4
  42. package/dist/{context-DZU6TVXM.js → context-GNSAANSR.js} +5 -5
  43. package/dist/{customCommands-3ZEKZS64.js → customCommands-TI7KC7QR.js} +4 -4
  44. package/dist/{env-KJ3YKVKD.js → env-7GAPXLOS.js} +2 -2
  45. package/dist/index.js +3 -3
  46. package/dist/{llm-LVHJBUBU.js → llm-24PI2Z6V.js} +26 -26
  47. package/dist/{llmLazy-E37BRRJL.js → llmLazy-JT5FOMWS.js} +1 -1
  48. package/dist/{loader-CJQYGIOX.js → loader-FVGZ4Q4O.js} +4 -4
  49. package/dist/{lspAnchor-VYW6TBK6.js → lspAnchor-2ESTEKDW.js} +4 -4
  50. package/dist/{manager-2E6RCOPM.js → manager-B7QOH5CJ.js} +4 -4
  51. package/dist/{mcp-32PUNKEE.js → mcp-DXRJFV2Z.js} +7 -7
  52. package/dist/{mentionProcessor-YQUVBGUO.js → mentionProcessor-24DFMNUM.js} +5 -5
  53. package/dist/{messages-S6XJLYHT.js → messages-44UB3QCF.js} +1 -1
  54. package/dist/{model-KERYS7VW.js → model-2MO4JM7C.js} +5 -5
  55. package/dist/{openai-LIOQRL5O.js → openai-IW2EECJN.js} +5 -5
  56. package/dist/{outputStyles-M7AT5V2E.js → outputStyles-OFVM7RO6.js} +4 -4
  57. package/dist/{pluginRuntime-RPOZH24G.js → pluginRuntime-L2ORBVPC.js} +6 -6
  58. package/dist/{pluginValidation-3PNCKYDB.js → pluginValidation-S5YXDUDC.js} +6 -6
  59. package/dist/prompts-7PXTK55Q.js +48 -0
  60. package/dist/{pybAgentSessionLoad-U343Y3XU.js → pybAgentSessionLoad-NM2FSUHI.js} +4 -4
  61. package/dist/{pybAgentSessionResume-747QQNMS.js → pybAgentSessionResume-R6DFJVOS.js} +4 -4
  62. package/dist/{pybAgentStreamJsonSession-B25HH4BN.js → pybAgentStreamJsonSession-IYC73GWN.js} +1 -1
  63. package/dist/{pybHooks-7EEKA766.js → pybHooks-BNGLUIBL.js} +4 -4
  64. package/dist/query-OLRMI42V.js +50 -0
  65. package/dist/{ripgrep-US75RUV3.js → ripgrep-QZG3RMUD.js} +5 -3
  66. package/dist/{skillMarketplace-P4P7ZUPT.js → skillMarketplace-IRUF6M5M.js} +3 -3
  67. package/dist/{state-36K5VF3G.js → state-LSDUZCQZ.js} +2 -2
  68. package/dist/{theme-7R3CIM3B.js → theme-QVGQSEFJ.js} +5 -5
  69. package/dist/{toolPermissionSettings-4YLPKZWJ.js → toolPermissionSettings-U4P7K6VA.js} +6 -6
  70. package/dist/tools-LSBTQYU4.js +51 -0
  71. package/dist/{userInput-TBU35CMG.js → userInput-EP4A6TDN.js} +27 -27
  72. package/package.json +1 -1
  73. package/dist/REPL-N4B3JZBZ.js +0 -42
  74. package/dist/chunk-26R2U6DS.js.map +0 -7
  75. package/dist/chunk-VQYBUOUL.js +0 -232
  76. package/dist/chunk-VQYBUOUL.js.map +0 -7
  77. package/dist/commands-GPZL7LEO.js +0 -46
  78. package/dist/prompts-HL3TSDJY.js +0 -48
  79. package/dist/query-LXPSR7ZB.js +0 -50
  80. package/dist/tools-3JTWQRFN.js +0 -51
  81. /package/dist/{REPL-N4B3JZBZ.js.map → REPL-HVMZDW6I.js.map} +0 -0
  82. /package/dist/{acp-4HKKXFYQ.js.map → acp-OWNA2GOE.js.map} +0 -0
  83. /package/dist/{agentsValidate-Y7ESIGWC.js.map → agentsValidate-UC7SD3JY.js.map} +0 -0
  84. /package/dist/{ask-BFLAH7SK.js.map → ask-6ESDLRIC.js.map} +0 -0
  85. /package/dist/{autoUpdater-ZP62GDO2.js.map → autoUpdater-FAKGXOY4.js.map} +0 -0
  86. /package/dist/{chunk-KZGNQII5.js.map → chunk-6VOYUVQU.js.map} +0 -0
  87. /package/dist/{chunk-AED6OYMI.js.map → chunk-B3MDT4F6.js.map} +0 -0
  88. /package/dist/{chunk-JEHHIOUO.js.map → chunk-BPZ44BIE.js.map} +0 -0
  89. /package/dist/{chunk-IV73XFVG.js.map → chunk-CPOVPGCU.js.map} +0 -0
  90. /package/dist/{chunk-LLNNHSE3.js.map → chunk-FH5VPA4M.js.map} +0 -0
  91. /package/dist/{chunk-2RR4H3L6.js.map → chunk-FL4UY5X6.js.map} +0 -0
  92. /package/dist/{chunk-65MNQP3U.js.map → chunk-FOQKIQ27.js.map} +0 -0
  93. /package/dist/{chunk-BAGUGUP3.js.map → chunk-HIH43UEF.js.map} +0 -0
  94. /package/dist/{chunk-RPQ3FFN6.js.map → chunk-HMCPTTVR.js.map} +0 -0
  95. /package/dist/{chunk-TMIQYE2C.js.map → chunk-JGJCX75W.js.map} +0 -0
  96. /package/dist/{chunk-Q653YYZS.js.map → chunk-L62UDJSU.js.map} +0 -0
  97. /package/dist/{chunk-72RJTELO.js.map → chunk-MFNDDM3V.js.map} +0 -0
  98. /package/dist/{chunk-2BT4P5FY.js.map → chunk-MSWBIZZC.js.map} +0 -0
  99. /package/dist/{chunk-TE7EYQKI.js.map → chunk-NIKESYZF.js.map} +0 -0
  100. /package/dist/{chunk-UUGAVZ5R.js.map → chunk-NNNU5K5N.js.map} +0 -0
  101. /package/dist/{chunk-D364WNKJ.js.map → chunk-PBPAGOFN.js.map} +0 -0
  102. /package/dist/{chunk-2JAKX7IR.js.map → chunk-SSPEL7MF.js.map} +0 -0
  103. /package/dist/{chunk-PYRG5FKD.js.map → chunk-SYHWDS75.js.map} +0 -0
  104. /package/dist/{chunk-BXF5H7EN.js.map → chunk-TNJTMN23.js.map} +0 -0
  105. /package/dist/{chunk-5YU3ZWG6.js.map → chunk-WCR6QGXF.js.map} +0 -0
  106. /package/dist/{chunk-MTSI5244.js.map → chunk-WU4VY7XT.js.map} +0 -0
  107. /package/dist/{chunk-LVTQN4RG.js.map → chunk-XC4AJGEW.js.map} +0 -0
  108. /package/dist/{chunk-P2VXE3TJ.js.map → chunk-XJDZTRBL.js.map} +0 -0
  109. /package/dist/{chunk-5RVP5P5Y.js.map → chunk-ZEMFBGPE.js.map} +0 -0
  110. /package/dist/{chunk-UGJJDTVJ.js.map → chunk-ZZO2YNJG.js.map} +0 -0
  111. /package/dist/{cli-KITOXFPL.js.map → cli-EASV6IY7.js.map} +0 -0
  112. /package/dist/{commands-GPZL7LEO.js.map → commands-LHZ4KLGY.js.map} +0 -0
  113. /package/dist/{config-EVFJADC4.js.map → config-53WMBY35.js.map} +0 -0
  114. /package/dist/{context-DZU6TVXM.js.map → context-GNSAANSR.js.map} +0 -0
  115. /package/dist/{customCommands-3ZEKZS64.js.map → customCommands-TI7KC7QR.js.map} +0 -0
  116. /package/dist/{env-KJ3YKVKD.js.map → env-7GAPXLOS.js.map} +0 -0
  117. /package/dist/{llm-LVHJBUBU.js.map → llm-24PI2Z6V.js.map} +0 -0
  118. /package/dist/{llmLazy-E37BRRJL.js.map → llmLazy-JT5FOMWS.js.map} +0 -0
  119. /package/dist/{loader-CJQYGIOX.js.map → loader-FVGZ4Q4O.js.map} +0 -0
  120. /package/dist/{lspAnchor-VYW6TBK6.js.map → lspAnchor-2ESTEKDW.js.map} +0 -0
  121. /package/dist/{manager-2E6RCOPM.js.map → manager-B7QOH5CJ.js.map} +0 -0
  122. /package/dist/{mcp-32PUNKEE.js.map → mcp-DXRJFV2Z.js.map} +0 -0
  123. /package/dist/{mentionProcessor-YQUVBGUO.js.map → mentionProcessor-24DFMNUM.js.map} +0 -0
  124. /package/dist/{messages-S6XJLYHT.js.map → messages-44UB3QCF.js.map} +0 -0
  125. /package/dist/{model-KERYS7VW.js.map → model-2MO4JM7C.js.map} +0 -0
  126. /package/dist/{openai-LIOQRL5O.js.map → openai-IW2EECJN.js.map} +0 -0
  127. /package/dist/{outputStyles-M7AT5V2E.js.map → outputStyles-OFVM7RO6.js.map} +0 -0
  128. /package/dist/{pluginRuntime-RPOZH24G.js.map → pluginRuntime-L2ORBVPC.js.map} +0 -0
  129. /package/dist/{pluginValidation-3PNCKYDB.js.map → pluginValidation-S5YXDUDC.js.map} +0 -0
  130. /package/dist/{prompts-HL3TSDJY.js.map → prompts-7PXTK55Q.js.map} +0 -0
  131. /package/dist/{pybAgentSessionLoad-U343Y3XU.js.map → pybAgentSessionLoad-NM2FSUHI.js.map} +0 -0
  132. /package/dist/{pybAgentSessionResume-747QQNMS.js.map → pybAgentSessionResume-R6DFJVOS.js.map} +0 -0
  133. /package/dist/{pybAgentStreamJsonSession-B25HH4BN.js.map → pybAgentStreamJsonSession-IYC73GWN.js.map} +0 -0
  134. /package/dist/{pybHooks-7EEKA766.js.map → pybHooks-BNGLUIBL.js.map} +0 -0
  135. /package/dist/{query-LXPSR7ZB.js.map → query-OLRMI42V.js.map} +0 -0
  136. /package/dist/{ripgrep-US75RUV3.js.map → ripgrep-QZG3RMUD.js.map} +0 -0
  137. /package/dist/{skillMarketplace-P4P7ZUPT.js.map → skillMarketplace-IRUF6M5M.js.map} +0 -0
  138. /package/dist/{state-36K5VF3G.js.map → state-LSDUZCQZ.js.map} +0 -0
  139. /package/dist/{theme-7R3CIM3B.js.map → theme-QVGQSEFJ.js.map} +0 -0
  140. /package/dist/{toolPermissionSettings-4YLPKZWJ.js.map → toolPermissionSettings-U4P7K6VA.js.map} +0 -0
  141. /package/dist/{tools-3JTWQRFN.js.map → tools-LSBTQYU4.js.map} +0 -0
  142. /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-Q653YYZS.js";
12
+ } from "./chunk-L62UDJSU.js";
13
13
  import {
14
14
  MACRO
15
- } from "./chunk-R56S2D3A.js";
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-TMIQYE2C.js";
6
+ } from "./chunk-JGJCX75W.js";
7
7
  import {
8
8
  debug
9
- } from "./chunk-PYRG5FKD.js";
9
+ } from "./chunk-SYHWDS75.js";
10
10
  import {
11
11
  logError
12
- } from "./chunk-Q653YYZS.js";
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-PYRG5FKD.js";
8
+ } from "./chunk-SYHWDS75.js";
9
9
  import {
10
10
  getCwd,
11
11
  getGlobalConfigFilePath,
12
12
  logError
13
- } from "./chunk-Q653YYZS.js";
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-KERYS7VW.js").then(({ reloadModelManager }) => {
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-R56S2D3A.js";
5
+ } from "./chunk-3BP3TGGN.js";
6
6
 
7
7
  // src/utils/state/index.ts
8
8
  import { cwd } from "process";
@@ -3,7 +3,7 @@ const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  getSessionProjectDir,
5
5
  getSessionProjectsDir
6
- } from "./chunk-BAGUGUP3.js";
6
+ } from "./chunk-HIH43UEF.js";
7
7
  import {
8
8
  isUuid
9
9
  } from "./chunk-5P7HBXTD.js";
@@ -10,10 +10,10 @@ import {
10
10
  getSettingsFileCandidates,
11
11
  loadSettingsWithLegacyFallback,
12
12
  saveSettingsToPrimaryAndSyncLegacy
13
- } from "./chunk-LVTQN4RG.js";
13
+ } from "./chunk-XC4AJGEW.js";
14
14
  import {
15
15
  getCwd
16
- } from "./chunk-Q653YYZS.js";
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-PYRG5FKD.js";
9
+ } from "./chunk-SYHWDS75.js";
10
10
  import {
11
11
  logError
12
- } from "./chunk-Q653YYZS.js";
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-PYRG5FKD.js";
11
+ } from "./chunk-SYHWDS75.js";
12
12
  import {
13
13
  getCwd,
14
14
  logError
15
- } from "./chunk-Q653YYZS.js";
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-PYRG5FKD.js";
8
+ } from "./chunk-SYHWDS75.js";
9
9
  import {
10
10
  getCwd
11
- } from "./chunk-Q653YYZS.js";
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-TMIQYE2C.js";
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-Q653YYZS.js";
15
+ } from "./chunk-L62UDJSU.js";
16
16
  import {
17
17
  MACRO
18
- } from "./chunk-R56S2D3A.js";
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-2RR4H3L6.js";
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-4YJ6DHQK.js";
33
+ } from "./chunk-43ZJOQDX.js";
34
34
  import {
35
35
  queryLLM
36
- } from "./chunk-5YU3ZWG6.js";
36
+ } from "./chunk-WCR6QGXF.js";
37
37
  import {
38
38
  FallbackToolUseRejectedMessage,
39
39
  MCPTool,
40
40
  getClients,
41
41
  getMCPTools
42
- } from "./chunk-KZGNQII5.js";
42
+ } from "./chunk-6VOYUVQU.js";
43
43
  import {
44
44
  generateAgentId
45
- } from "./chunk-TE7EYQKI.js";
45
+ } from "./chunk-NIKESYZF.js";
46
46
  import {
47
47
  getActiveAgents,
48
48
  getAgentByType,
49
49
  getAvailableAgentTypes
50
- } from "./chunk-UUGAVZ5R.js";
50
+ } from "./chunk-NNNU5K5N.js";
51
51
  import {
52
52
  INTERRUPT_MESSAGE,
53
53
  createAssistantMessage,
54
54
  createUserMessage,
55
55
  getLastAssistantMessageId
56
- } from "./chunk-JEHHIOUO.js";
56
+ } from "./chunk-BPZ44BIE.js";
57
57
  import {
58
58
  filesToTree,
59
- ripGrep
60
- } from "./chunk-VQYBUOUL.js";
59
+ ripGrepWithStatus
60
+ } from "./chunk-HCPU4TQ6.js";
61
61
  import {
62
62
  LspClientManager
63
- } from "./chunk-D364WNKJ.js";
63
+ } from "./chunk-PBPAGOFN.js";
64
64
  import {
65
65
  getModelManager
66
- } from "./chunk-RPQ3FFN6.js";
66
+ } from "./chunk-HMCPTTVR.js";
67
67
  import {
68
68
  getContext
69
- } from "./chunk-2JAKX7IR.js";
69
+ } from "./chunk-SSPEL7MF.js";
70
70
  import {
71
71
  getTheme
72
- } from "./chunk-LLNNHSE3.js";
72
+ } from "./chunk-FH5VPA4M.js";
73
73
  import {
74
74
  debug
75
- } from "./chunk-PYRG5FKD.js";
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-Q653YYZS.js";
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-2E6RCOPM.js");
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-36K5VF3G.js");
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-2E6RCOPM.js");
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 = "Smartly lists files and directories in a tree structure using a breadth-first approach. \n\n**Key Features**:\n1. **Smart Filtering**: Automatically respects `.gitignore` (skips `node_modules`, `dist`, etc.), making it safe to run on project roots.\n2. **Global Overview**: Uses BFS to show the project skeleton first. Even if truncated, you'll see all top-level directories.\n\n**When to use**: \n- FIRST step when exploring a new project.\n- When you need to understand the overall architecture.\n- When you feel lost in the file system.\n\nFor finding specific files by name, use `Glob` instead.";
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
- return `path: "${verbose ? path : relativePath}"${semantic ? ", semantic: true" : ""}`;
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 files = await ripGrep(["--files"], fullFilePath, abortController.signal);
1392
- let processedFiles = files;
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 (semantic) {
1463
+ if (effectiveSemantic) {
1395
1464
  try {
1396
- const { LspClientManager: LspClientManager2 } = await import("./manager-2E6RCOPM.js");
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 < files.length; i += BATCH_SIZE) {
1400
- const batch = files.slice(i, i + BATCH_SIZE);
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
- MAX_FILES_LIMIT
1533
+ Number.MAX_SAFE_INTEGER
1465
1534
  );
1466
- if (semantic && Object.keys(stats).length > 0) {
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 = `${treeOutput}${safetyWarning}`;
1554
+ const assistantData = `${outputWithMeta}${safetyWarning}`;
1475
1555
  yield {
1476
1556
  type: "result",
1477
- data: treeOutput,
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 extname3 } from "path";
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 as extname2, join as join2, relative as relative3 } from "path";
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 = extname2(filePath).toLowerCase();
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 tree2 = service.getNavigationTree?.(absPath);
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(tree2, 0);
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 tree2 = parser.parse(content);
2219
- return this.collectSymbols(tree2.rootNode);
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 tree2 = parser.parse(code);
2287
- const node = tree2.rootNode.descendantForPosition(position);
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 = extname3(absPath);
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}`,