@code-yeongyu/senpi 2026.9.23-3 → 2026.9.23-5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/bundle/chunks/{app-server-command-U5Y46LHO.js → app-server-command-BGT65PGC.js} +1 -1
  3. package/dist/bundle/chunks/{chunk-UCTYTLP3.js → chunk-3RN6BFG2.js} +2 -2
  4. package/dist/bundle/chunks/{chunk-XTXBPXZZ.js → chunk-EN6KDFY2.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-2NFHX2FJ.js → chunk-J3QXPP4T.js} +1 -1
  6. package/dist/bundle/chunks/chunk-LTIMMSDM.js +8 -0
  7. package/dist/bundle/chunks/{chunk-67Z5WNA4.js → chunk-PSMTQDII.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-TH4PERSI.js → chunk-RRSND33J.js} +50 -64
  9. package/dist/bundle/chunks/{chunk-Y4AJLTFT.js → chunk-WUYBEF7C.js} +1 -1
  10. package/dist/bundle/chunks/{chunk-IDSOMHWS.js → chunk-WXIRFRXY.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-R6F525XB.js → chunk-XDSQYM4F.js} +1 -1
  12. package/dist/bundle/chunks/{chunk-TUVSARCZ.js → chunk-ZEFQYQOU.js} +1 -1
  13. package/dist/bundle/chunks/{cli-main-65WMMIRT.js → cli-main-W55CWPEI.js} +1 -1
  14. package/dist/bundle/chunks/cursor-agent.js +1 -1
  15. package/dist/bundle/chunks/{help-fast-path-VXAZDQ3Z.js → help-fast-path-QXVCHTP3.js} +1 -1
  16. package/dist/bundle/chunks/{host-command-5PEFD4N6.js → host-command-3PUZYQOK.js} +1 -1
  17. package/dist/bundle/chunks/{host-lifecycle-BXW5C4JT.js → host-lifecycle-OHPSU5VU.js} +1 -1
  18. package/dist/bundle/chunks/{interactive-host-runtime-DUNYT24Q.js → interactive-host-runtime-57LEAJPU.js} +1 -1
  19. package/dist/bundle/chunks/{interactive-mode-SCG5PQZ6.js → interactive-mode-EDJZ4CSY.js} +1 -1
  20. package/dist/bundle/chunks/{multi-session-host-QC6BZZNH.js → multi-session-host-GFSDQQUJ.js} +1 -1
  21. package/dist/bundle/chunks/{package-manager-cli-23GULCVL.js → package-manager-cli-J7244EJE.js} +1 -1
  22. package/dist/bundle/chunks/{pi-messages-B6RSUQKL.js → pi-messages-CAS467IY.js} +1 -1
  23. package/dist/bundle/chunks/{rotation-stream-ZIYWOB2N.js → rotation-stream-CZT4TRPD.js} +1 -1
  24. package/dist/bundle/chunks/{rpc-mode-ZQ4E6FFA.js → rpc-mode-75CRTY24.js} +1 -1
  25. package/dist/bundle/chunks/{session-picker-CO2ZK3EC.js → session-picker-ZIBANFBQ.js} +1 -1
  26. package/dist/bundle/chunks/session-worker.js +56 -70
  27. package/dist/bundle/cli.js +1 -1
  28. package/dist/bundle/index.js +1 -1
  29. package/dist/bundle/rpc-entry.js +1 -1
  30. package/dist/core/agent-session.d.ts +9 -2
  31. package/dist/core/agent-session.d.ts.map +1 -1
  32. package/dist/core/agent-session.js +14 -1
  33. package/dist/core/agent-session.js.map +1 -1
  34. package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
  35. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +43 -26
  36. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
  37. package/dist/core/extensions/builtin/nested-agents-md/index.js +1 -1
  38. package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
  39. package/dist/core/extensions/builtin/rule-activation/types.d.ts +2 -0
  40. package/dist/core/extensions/builtin/rule-activation/types.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/rule-activation/types.js +7 -1
  42. package/dist/core/extensions/builtin/rule-activation/types.js.map +1 -1
  43. package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/rules/index.js +2 -1
  45. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  46. package/dist/core/extensions/builtin/terminal/output-format.d.ts +15 -0
  47. package/dist/core/extensions/builtin/terminal/output-format.d.ts.map +1 -1
  48. package/dist/core/extensions/builtin/terminal/output-format.js +43 -2
  49. package/dist/core/extensions/builtin/terminal/output-format.js.map +1 -1
  50. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
  51. package/dist/core/extensions/builtin/terminal/tools/bash-output.js +4 -3
  52. package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
  53. package/dist/core/extensions/builtin/terminal/tools/bash.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/terminal/tools/bash.js +3 -3
  55. package/dist/core/extensions/builtin/terminal/tools/bash.js.map +1 -1
  56. package/dist/core/extensions/builtin/terminal/tools/context.d.ts +7 -4
  57. package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/terminal/tools/context.js +5 -0
  59. package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
  60. package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/terminal/tools/render.js +5 -2
  62. package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -1
  63. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +3 -1
  64. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +9 -3
  66. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -1
  67. package/dist/core/model-resolver.d.ts.map +1 -1
  68. package/dist/core/model-resolver.js +87 -14
  69. package/dist/core/model-resolver.js.map +1 -1
  70. package/dist/core/tool-call-display-name.d.ts +15 -0
  71. package/dist/core/tool-call-display-name.d.ts.map +1 -0
  72. package/dist/core/tool-call-display-name.js +14 -0
  73. package/dist/core/tool-call-display-name.js.map +1 -0
  74. package/dist/core/tools/bash.d.ts.map +1 -1
  75. package/dist/core/tools/bash.js +12 -7
  76. package/dist/core/tools/bash.js.map +1 -1
  77. package/dist/core/tools/find.d.ts.map +1 -1
  78. package/dist/core/tools/find.js +9 -6
  79. package/dist/core/tools/find.js.map +1 -1
  80. package/dist/core/tools/grep/format.d.ts +3 -2
  81. package/dist/core/tools/grep/format.d.ts.map +1 -1
  82. package/dist/core/tools/grep/format.js +5 -3
  83. package/dist/core/tools/grep/format.js.map +1 -1
  84. package/dist/core/tools/grep/index.js +2 -2
  85. package/dist/core/tools/grep/index.js.map +1 -1
  86. package/dist/core/tools/ls.d.ts.map +1 -1
  87. package/dist/core/tools/ls.js +5 -3
  88. package/dist/core/tools/ls.js.map +1 -1
  89. package/dist/core/tools/model-only-text.d.ts +4 -0
  90. package/dist/core/tools/model-only-text.d.ts.map +1 -0
  91. package/dist/core/tools/model-only-text.js +12 -0
  92. package/dist/core/tools/model-only-text.js.map +1 -0
  93. package/dist/core/tools/read.d.ts.map +1 -1
  94. package/dist/core/tools/read.js +15 -5
  95. package/dist/core/tools/read.js.map +1 -1
  96. package/dist/core/tools/render-utils.d.ts.map +1 -1
  97. package/dist/core/tools/render-utils.js +2 -1
  98. package/dist/core/tools/render-utils.js.map +1 -1
  99. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  100. package/dist/core/tools/renderers/bash.js +1 -25
  101. package/dist/core/tools/renderers/bash.js.map +1 -1
  102. package/dist/core/tools/renderers/grep.d.ts.map +1 -1
  103. package/dist/core/tools/renderers/grep.js +0 -25
  104. package/dist/core/tools/renderers/grep.js.map +1 -1
  105. package/dist/core/tools/renderers/read.d.ts +8 -0
  106. package/dist/core/tools/renderers/read.d.ts.map +1 -1
  107. package/dist/core/tools/renderers/read.js +2 -14
  108. package/dist/core/tools/renderers/read.js.map +1 -1
  109. package/dist/modes/interactive/components/exploration-call.d.ts +4 -1
  110. package/dist/modes/interactive/components/exploration-call.d.ts.map +1 -1
  111. package/dist/modes/interactive/components/exploration-call.js +17 -2
  112. package/dist/modes/interactive/components/exploration-call.js.map +1 -1
  113. package/dist/modes/interactive/components/exploration-group.d.ts +3 -1
  114. package/dist/modes/interactive/components/exploration-group.d.ts.map +1 -1
  115. package/dist/modes/interactive/components/exploration-group.js +7 -1
  116. package/dist/modes/interactive/components/exploration-group.js.map +1 -1
  117. package/dist/modes/interactive/components/exploration-rules.d.ts +5 -0
  118. package/dist/modes/interactive/components/exploration-rules.d.ts.map +1 -0
  119. package/dist/modes/interactive/components/exploration-rules.js +15 -0
  120. package/dist/modes/interactive/components/exploration-rules.js.map +1 -0
  121. package/dist/modes/interactive/components/exploration-transcript-container.d.ts.map +1 -1
  122. package/dist/modes/interactive/components/exploration-transcript-container.js +10 -1
  123. package/dist/modes/interactive/components/exploration-transcript-container.js.map +1 -1
  124. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  125. package/dist/modes/interactive/components/tool-execution.js +4 -1
  126. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  127. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  128. package/dist/modes/interactive/interactive-mode.js +3 -1
  129. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  130. package/dist/modes/json-event.d.ts +1 -0
  131. package/dist/modes/json-event.d.ts.map +1 -1
  132. package/dist/modes/json-event.js +1 -0
  133. package/dist/modes/json-event.js.map +1 -1
  134. package/docs/json.md +4 -1
  135. package/docs/rpc.md +7 -1
  136. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +26 -0
  137. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  138. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +4 -19
  139. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  140. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +8 -23
  141. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  142. package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.d.ts +8 -0
  143. package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.d.ts.map +1 -1
  144. package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.js +27 -0
  145. package/node_modules/@earendil-works/pi-agent-core/dist/tool-name-alias.js.map +1 -1
  146. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  147. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +1 -1
  148. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js +17 -1
  149. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +1 -1
  150. package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.d.ts +18 -1
  151. package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.d.ts.map +1 -1
  152. package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.js +103 -3
  153. package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.js.map +1 -1
  154. package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.d.ts +3 -1
  155. package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.d.ts.map +1 -1
  156. package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js +15 -3
  157. package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js.map +1 -1
  158. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.d.ts +7 -2
  159. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.d.ts.map +1 -1
  160. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js +92 -20
  161. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js.map +1 -1
  162. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +9 -1
  163. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
  164. package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
  165. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -1
  166. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +1 -0
  167. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -1
  168. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  169. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  170. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +5 -0
  171. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  172. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  173. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  174. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  175. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  176. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  177. package/package.json +7 -7
  178. package/dist/bundle/chunks/chunk-XPDV6SIX.js +0 -8
@@ -1 +1 @@
1
- {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/core/tools/bash.ts"],"names":[],"mappings":"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","sourcesContent":["// allow: SIZE_OK - pre-existing cohesive shell integration; this patch only hardens its output-finalization seam.\nimport { constants } from \"node:fs\";\nimport { access as fsAccess } from \"node:fs/promises\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { spawn } from \"child_process\";\nimport { type Static, Type } from \"typebox\";\nimport { waitForChildProcess } from \"../../utils/child-process.ts\";\nimport {\n\tgetShellConfig,\n\tgetShellEnv,\n\tkillProcessTree,\n\tnoteDetachedChildExited,\n\tpruneTrackedDetachedChildren,\n\ttype ShellConfig,\n\ttrackDetachedChildPid,\n} from \"../../utils/shell.ts\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\nimport { OutputAccumulator } from \"./output-accumulator.ts\";\nimport { BASH_UPDATE_THROTTLE_MS, createShellRenderers } from \"./renderers/bash.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult } from \"./truncate.ts\";\n\nconst MAX_TIMEOUT_MS = 2_147_483_647;\nconst MAX_TIMEOUT_SECONDS = MAX_TIMEOUT_MS / 1000;\n\nfunction resolveTimeoutMs(timeout: number | undefined): number | undefined {\n\tif (timeout === undefined) return undefined;\n\tif (!Number.isFinite(timeout) || timeout <= 0) {\n\t\tthrow new Error(\"Invalid timeout: must be a finite number of seconds\");\n\t}\n\n\tconst timeoutMs = timeout * 1000;\n\tif (timeoutMs > MAX_TIMEOUT_MS) {\n\t\tthrow new Error(`Invalid timeout: maximum is ${MAX_TIMEOUT_SECONDS} seconds`);\n\t}\n\treturn timeoutMs;\n}\n\nconst bashSchema = Type.Object({\n\tcommand: Type.String({ description: \"Shell command to execute\" }),\n\ttimeout: Type.Optional(Type.Number({ description: \"Timeout in seconds (optional, no default timeout)\" })),\n});\n\nexport const bashToolSystemPromptContribution = {\n\tsnippet: \"Execute bash commands (ls, rg, find, etc.)\",\n\tguidelines: [\"You can inspect PI_* environment variables for current model and session details.\"],\n} as const;\n\nexport type BashToolInput = Static<typeof bashSchema>;\n\nexport interface BashToolDetails {\n\ttruncation?: TruncationResult;\n\tfullOutputPath?: string;\n}\n\n/**\n * Pluggable operations for the bash tool.\n * Override these to delegate command execution to remote systems (for example SSH).\n */\nexport interface BashOperations {\n\t/**\n\t * Execute a command and stream output.\n\t * @param command The command to execute\n\t * @param cwd Working directory\n\t * @param options Execution options\n\t * @returns Promise resolving to exit code (null if killed)\n\t */\n\texec: (\n\t\tcommand: string,\n\t\tcwd: string,\n\t\toptions: {\n\t\t\tonData: (data: Buffer) => void;\n\t\t\tsignal?: AbortSignal;\n\t\t\ttimeout?: number;\n\t\t\tenv?: NodeJS.ProcessEnv;\n\t\t},\n\t) => Promise<{ exitCode: number | null }>;\n}\n\n/** Shared process execution used by the built-in shell tools. */\nexport function createLocalShellOperations(shellName: string, resolveShellConfig: () => ShellConfig): BashOperations {\n\treturn {\n\t\texec: async (command, cwd, { onData, signal, timeout, env }) => {\n\t\t\tconst timeoutMs = resolveTimeoutMs(timeout);\n\t\t\tif (signal?.aborted) {\n\t\t\t\tthrow new Error(\"aborted\");\n\t\t\t}\n\t\t\tconst shellConfig = resolveShellConfig();\n\t\t\ttry {\n\t\t\t\tawait fsAccess(cwd, constants.F_OK);\n\t\t\t} catch {\n\t\t\t\tthrow new Error(`Working directory does not exist: ${cwd}\\nCannot execute ${shellName} commands.`);\n\t\t\t}\n\n\t\t\tconst commandFromStdin = shellConfig.commandTransport === \"stdin\";\n\t\t\tconst child = spawn(shellConfig.shell, commandFromStdin ? shellConfig.args : [...shellConfig.args, command], {\n\t\t\t\tcwd,\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\tenv: env ?? getShellEnv(),\n\t\t\t\tstdio: [commandFromStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t\tif (commandFromStdin) {\n\t\t\t\tchild.stdin?.on(\"error\", () => {});\n\t\t\t\tchild.stdin?.end(command);\n\t\t\t}\n\t\t\tif (child.pid) trackDetachedChildPid(child.pid);\n\t\t\tlet timedOut = false;\n\t\t\tlet timeoutHandle: NodeJS.Timeout | undefined;\n\t\t\tlet streamCallbackError: unknown;\n\t\t\tlet hasStreamCallbackError = false;\n\t\t\t// Fires once the process tree has been killed so waitForChildProcess\n\t\t\t// stops preserving output tails; descendants that survive the group\n\t\t\t// kill must not keep the aborted command running forever.\n\t\t\tconst killedController = new AbortController();\n\t\t\tconst onAbort = () => {\n\t\t\t\tif (child.pid) killProcessTree(child.pid);\n\t\t\t\tkilledController.abort();\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst handleData = (data: Buffer) => {\n\t\t\t\t\tif (hasStreamCallbackError) return;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst callbackResult = (onData as (data: Buffer) => unknown)(data);\n\t\t\t\t\t\tif (callbackResult && typeof (callbackResult as { then?: unknown }).then === \"function\") {\n\t\t\t\t\t\t\tvoid Promise.resolve(callbackResult).catch((error) => {\n\t\t\t\t\t\t\t\tif (!hasStreamCallbackError) {\n\t\t\t\t\t\t\t\t\tstreamCallbackError = error;\n\t\t\t\t\t\t\t\t\thasStreamCallbackError = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonAbort();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tstreamCallbackError = error;\n\t\t\t\t\t\thasStreamCallbackError = true;\n\t\t\t\t\t\tonAbort();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Set timeout if provided.\n\t\t\t\tif (timeoutMs !== undefined) {\n\t\t\t\t\ttimeoutHandle = setTimeout(() => {\n\t\t\t\t\t\ttimedOut = true;\n\t\t\t\t\t\tonAbort();\n\t\t\t\t\t}, timeoutMs);\n\t\t\t\t}\n\t\t\t\t// Stream stdout and stderr.\n\t\t\t\tchild.stdout?.on(\"data\", handleData);\n\t\t\t\tchild.stderr?.on(\"data\", handleData);\n\t\t\t\t// Handle abort signal by killing the entire process tree.\n\t\t\t\tif (signal) {\n\t\t\t\t\tif (signal.aborted) onAbort();\n\t\t\t\t\telse signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t}\n\t\t\t\t// Handle shell spawn errors and wait for the process to terminate without hanging\n\t\t\t\t// on inherited stdio handles held by detached descendants.\n\t\t\t\tconst exitCode = await waitForChildProcess(child, { signal: killedController.signal });\n\t\t\t\tif (hasStreamCallbackError) {\n\t\t\t\t\tthrow streamCallbackError;\n\t\t\t\t}\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tthrow new Error(\"aborted\");\n\t\t\t\t}\n\t\t\t\tif (timedOut) {\n\t\t\t\t\tthrow new Error(`timeout:${timeout}`);\n\t\t\t\t}\n\t\t\t\treturn { exitCode };\n\t\t\t} finally {\n\t\t\t\tconst pid = child.pid;\n\t\t\t\tif (pid !== undefined) {\n\t\t\t\t\tif (child.exitCode !== null || child.signalCode !== null) {\n\t\t\t\t\t\t// The shell exited, but whatever it backgrounded (`sleep 30 &`,\n\t\t\t\t\t\t// `nohup server &`) still runs in its process group: ownership is\n\t\t\t\t\t\t// released only once that group is empty (senpi#1697).\n\t\t\t\t\t\tnoteDetachedChildExited(pid);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// The kill grace released the wait while the child is still\n\t\t\t\t\t\t// alive (kill pending): keep it tracked so shutdown cleanup\n\t\t\t\t\t\t// retries, and unref it so it cannot pin the event loop.\n\t\t\t\t\t\tchild.unref();\n\t\t\t\t\t\tchild.once(\"exit\", () => noteDetachedChildExited(pid));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Groups kept past their shell's exit must not accumulate across a session.\n\t\t\t\tpruneTrackedDetachedChildren();\n\t\t\t\tif (timeoutHandle) clearTimeout(timeoutHandle);\n\t\t\t\tif (signal) signal.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Create bash operations using pi's built-in local shell execution backend.\n *\n * This is useful for extensions that intercept user_bash and still want pi's\n * standard local shell behavior while wrapping or rewriting commands.\n */\nexport function createLocalBashOperations(options?: { shellPath?: string }): BashOperations {\n\treturn createLocalShellOperations(\"bash\", () => getShellConfig(options?.shellPath));\n}\n\nexport interface BashSpawnContext {\n\tcommand: string;\n\tcwd: string;\n\tenv: NodeJS.ProcessEnv;\n}\n\nexport type BashSpawnHook = (context: BashSpawnContext) => BashSpawnContext;\n\nfunction resolveSpawnContext(\n\tcommand: string,\n\tcwd: string,\n\tspawnHook: BashSpawnHook | undefined,\n\texposeSessionEnvironment: boolean,\n\tctx: ExtensionContext | undefined,\n): BashSpawnContext {\n\tconst env = { ...getShellEnv() };\n\tdelete env.PI_SESSION_ID;\n\tdelete env.PI_SESSION_FILE;\n\tdelete env.PI_SESSION_CWD;\n\tdelete env.PI_GOAL_STORE_FILE;\n\tdelete env.PI_PROVIDER;\n\tdelete env.PI_MODEL;\n\tdelete env.PI_REASONING_LEVEL;\n\tif (exposeSessionEnvironment && ctx) {\n\t\tconst model = ctx.model;\n\t\tenv.PI_SESSION_ID = ctx.sessionManager.getSessionId();\n\t\tenv.PI_SESSION_CWD = ctx.cwd;\n\t\tif (ctx.goalStoreFile) env.PI_GOAL_STORE_FILE = ctx.goalStoreFile;\n\t\tconst sessionFile = ctx.sessionManager.getSessionFile();\n\t\tif (sessionFile) env.PI_SESSION_FILE = sessionFile;\n\t\tif (model) {\n\t\t\tenv.PI_PROVIDER = model.provider;\n\t\t\tenv.PI_MODEL = model.id;\n\t\t}\n\t\tif (ctx.thinkingLevel) env.PI_REASONING_LEVEL = ctx.thinkingLevel;\n\t}\n\tconst baseContext: BashSpawnContext = { command, cwd, env };\n\treturn spawnHook ? spawnHook(baseContext) : baseContext;\n}\n\nexport interface BashToolOptions {\n\t/** Custom operations for command execution. Default: local shell */\n\toperations?: BashOperations;\n\t/** Command prefix prepended to every command (for example shell setup commands) */\n\tcommandPrefix?: string;\n\t/** Optional explicit shell path from settings */\n\tshellPath?: string;\n\t/** Expose current Pi session metadata as PI_* environment variables. Default: true */\n\texposeSessionEnvironment?: boolean;\n\t/** Hook to adjust command, cwd, or env before execution */\n\tspawnHook?: BashSpawnHook;\n}\n\nexport type BashRenderState = {\n\tstartedAt: number | undefined;\n\tendedAt: number | undefined;\n\tinterval: NodeJS.Timeout | undefined;\n};\n\nexport interface ShellToolConfig {\n\tname: string;\n\tlabel: string;\n\tshellName: string;\n\tprompt: string;\n\tpromptSnippet: string;\n\tpromptGuidelines?: readonly string[];\n\ttempFilePrefix: string;\n}\n\nexport function createShellToolDefinition(\n\tcwd: string,\n\tconfig: ShellToolConfig,\n\toptions?: BashToolOptions,\n): ToolDefinition<typeof bashSchema, BashToolDetails | undefined, BashRenderState> {\n\tconst ops = options?.operations ?? createLocalBashOperations({ shellPath: options?.shellPath });\n\tconst commandPrefix = options?.commandPrefix;\n\tconst exposeSessionEnvironment = options?.exposeSessionEnvironment ?? true;\n\tconst spawnHook = options?.spawnHook;\n\treturn {\n\t\tname: config.name,\n\t\tlabel: config.label,\n\t\tdescription: `Execute a ${config.shellName} command in the current working directory. Returns stdout and stderr. Output is truncated to last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.`,\n\t\tpromptSnippet: config.promptSnippet,\n\t\tpromptGuidelines: exposeSessionEnvironment && config.promptGuidelines ? [...config.promptGuidelines] : undefined,\n\t\tparameters: bashSchema,\n\t\tconstrainedSampling: { type: \"json_schema\", strict: \"prefer\" },\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ command, timeout }: { command: string; timeout?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t\tonUpdate?,\n\t\t\tctx?: ExtensionContext,\n\t\t) {\n\t\t\tconst resolvedCommand = commandPrefix ? `${commandPrefix}\\n${command}` : command;\n\t\t\tconst spawnContext = resolveSpawnContext(\n\t\t\t\tresolvedCommand,\n\t\t\t\tctx?.cwd || cwd,\n\t\t\t\tspawnHook,\n\t\t\t\texposeSessionEnvironment,\n\t\t\t\tctx,\n\t\t\t);\n\t\t\tconst output = new OutputAccumulator({ tempFilePrefix: config.tempFilePrefix });\n\t\t\tlet acceptingOutput = true;\n\t\t\tlet updateTimer: NodeJS.Timeout | undefined;\n\t\t\tlet updateDirty = false;\n\t\t\tlet lastUpdateAt = 0;\n\t\t\tlet outputUpdateError: unknown;\n\t\t\tlet hasOutputUpdateError = false;\n\n\t\t\tconst emitOutputUpdate = () => {\n\t\t\t\tif (!onUpdate || !updateDirty || hasOutputUpdateError) return;\n\t\t\t\tupdateDirty = false;\n\t\t\t\tlastUpdateAt = Date.now();\n\t\t\t\tconst snapshot = output.snapshot({ persistIfTruncated: true });\n\t\t\t\ttry {\n\t\t\t\t\tonUpdate({\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: snapshot.content || \"\" }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\ttruncation: snapshot.truncation.truncated ? snapshot.truncation : undefined,\n\t\t\t\t\t\t\tfullOutputPath: snapshot.fullOutputPath,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\toutputUpdateError = error;\n\t\t\t\t\thasOutputUpdateError = true;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst clearUpdateTimer = () => {\n\t\t\t\tif (updateTimer) {\n\t\t\t\t\tclearTimeout(updateTimer);\n\t\t\t\t\tupdateTimer = undefined;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst scheduleOutputUpdate = () => {\n\t\t\t\tif (!onUpdate) return;\n\t\t\t\tupdateDirty = true;\n\t\t\t\tconst delay = BASH_UPDATE_THROTTLE_MS - (Date.now() - lastUpdateAt);\n\t\t\t\tif (delay <= 0) {\n\t\t\t\t\tclearUpdateTimer();\n\t\t\t\t\temitOutputUpdate();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tupdateTimer ??= setTimeout(() => {\n\t\t\t\t\tupdateTimer = undefined;\n\t\t\t\t\temitOutputUpdate();\n\t\t\t\t}, delay);\n\t\t\t};\n\n\t\t\tif (onUpdate) {\n\t\t\t\tonUpdate({ content: [], details: undefined });\n\t\t\t}\n\n\t\t\tconst handleData = (data: Buffer) => {\n\t\t\t\tif (!acceptingOutput) return;\n\t\t\t\toutput.append(data);\n\t\t\t\tscheduleOutputUpdate();\n\t\t\t};\n\n\t\t\tconst finishOutput = async () => {\n\t\t\t\tacceptingOutput = false;\n\t\t\t\tclearUpdateTimer();\n\t\t\t\tlet primaryError: unknown;\n\t\t\t\tlet hasPrimaryError = false;\n\t\t\t\tlet snapshot: Awaited<ReturnType<OutputAccumulator[\"snapshot\"]>> | undefined;\n\t\t\t\ttry {\n\t\t\t\t\toutput.finish();\n\t\t\t\t\temitOutputUpdate();\n\t\t\t\t\tsnapshot = output.snapshot({ persistIfTruncated: true });\n\t\t\t\t\tif (hasOutputUpdateError) {\n\t\t\t\t\t\tprimaryError = outputUpdateError;\n\t\t\t\t\t\thasPrimaryError = true;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tprimaryError = error;\n\t\t\t\t\thasPrimaryError = true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait output.closeTempFile();\n\t\t\t\t} catch (closeError) {\n\t\t\t\t\tif (hasPrimaryError) {\n\t\t\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t\t\t[primaryError, closeError],\n\t\t\t\t\t\t\t\"Bash output finalization and spill cleanup failed\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow closeError;\n\t\t\t\t}\n\t\t\t\tif (hasPrimaryError) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait output.removeTempFile();\n\t\t\t\t\t} catch (unlinkError) {\n\t\t\t\t\t\tif (!(unlinkError instanceof Error)) throw unlinkError;\n\t\t\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t\t\t[primaryError, unlinkError],\n\t\t\t\t\t\t\t\"Bash output finalization and spill cleanup failed\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow primaryError;\n\t\t\t\t}\n\t\t\t\tif (snapshot === undefined) {\n\t\t\t\t\tthrow new Error(\"Bash output finalization produced no snapshot\");\n\t\t\t\t}\n\t\t\t\treturn snapshot;\n\t\t\t};\n\n\t\t\tconst formatOutput = (snapshot: Awaited<ReturnType<typeof finishOutput>>, emptyText = \"(no output)\") => {\n\t\t\t\tconst truncation = snapshot.truncation;\n\t\t\t\tlet text = snapshot.content || emptyText;\n\t\t\t\tlet details: BashToolDetails | undefined;\n\t\t\t\tif (truncation.truncated) {\n\t\t\t\t\tdetails = { truncation, fullOutputPath: snapshot.fullOutputPath };\n\t\t\t\t\tconst startLine = truncation.totalLines - truncation.outputLines + 1;\n\t\t\t\t\tconst endLine = truncation.totalLines;\n\t\t\t\t\tif (truncation.lastLinePartial) {\n\t\t\t\t\t\tconst lastLineSize = formatSize(output.getLastLineBytes());\n\t\t\t\t\t\ttext += `\\n\\n[Showing last ${formatSize(truncation.outputBytes)} of line ${endLine} (line is ${lastLineSize}). Full output: ${snapshot.fullOutputPath}]`;\n\t\t\t\t\t} else if (truncation.truncatedBy === \"lines\") {\n\t\t\t\t\t\ttext += `\\n\\n[Showing lines ${startLine}-${endLine} of ${truncation.totalLines}. Full output: ${snapshot.fullOutputPath}]`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttext += `\\n\\n[Showing lines ${startLine}-${endLine} of ${truncation.totalLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Full output: ${snapshot.fullOutputPath}]`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { text, details };\n\t\t\t};\n\n\t\t\tconst appendStatus = (text: string, status: string) => `${text ? `${text}\\n\\n` : \"\"}${status}`;\n\n\t\t\ttry {\n\t\t\t\tlet exitCode: number | null;\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await ops.exec(spawnContext.command, spawnContext.cwd, {\n\t\t\t\t\t\tonData: handleData,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\ttimeout,\n\t\t\t\t\t\tenv: spawnContext.env,\n\t\t\t\t\t});\n\t\t\t\t\texitCode = result.exitCode;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlet snapshot: Awaited<ReturnType<typeof finishOutput>>;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsnapshot = await finishOutput();\n\t\t\t\t\t} catch (cleanupError) {\n\t\t\t\t\t\tthrow new AggregateError([err, cleanupError], \"Bash command and output cleanup failed\");\n\t\t\t\t\t}\n\t\t\t\t\tconst { text } = formatOutput(snapshot, \"\");\n\t\t\t\t\tif (err instanceof Error && err.message === \"aborted\") {\n\t\t\t\t\t\tthrow new Error(appendStatus(text, \"Command aborted\"));\n\t\t\t\t\t}\n\t\t\t\t\tif (err instanceof Error && err.message.startsWith(\"timeout:\")) {\n\t\t\t\t\t\tconst timeoutSecs = err.message.split(\":\")[1];\n\t\t\t\t\t\tthrow new Error(appendStatus(text, `Command timed out after ${timeoutSecs} seconds`));\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait output.removeTempFile();\n\t\t\t\t\t} catch (unlinkError) {\n\t\t\t\t\t\tthrow new AggregateError([err, unlinkError], \"Bash command and output cleanup failed\");\n\t\t\t\t\t}\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\n\t\t\t\tconst snapshot = await finishOutput();\n\t\t\t\tconst { text: outputText, details } = formatOutput(snapshot);\n\t\t\t\tif (exitCode !== 0 && exitCode !== null) {\n\t\t\t\t\tthrow new Error(appendStatus(outputText, `Command exited with code ${exitCode}`));\n\t\t\t\t}\n\t\t\t\treturn { content: [{ type: \"text\", text: outputText }], details };\n\t\t\t} finally {\n\t\t\t\tclearUpdateTimer();\n\t\t\t}\n\t\t},\n\t\t...createShellRenderers(config.prompt),\n\t};\n}\n\nconst bashToolConfig: ShellToolConfig = {\n\tname: \"bash\",\n\tlabel: \"bash\",\n\tshellName: \"bash\",\n\tprompt: \"$\",\n\tpromptSnippet: bashToolSystemPromptContribution.snippet,\n\tpromptGuidelines: bashToolSystemPromptContribution.guidelines,\n\ttempFilePrefix: \"pi-bash\",\n};\n\nexport function createBashToolDefinition(\n\tcwd: string,\n\toptions?: BashToolOptions,\n): ToolDefinition<typeof bashSchema, BashToolDetails | undefined, BashRenderState> {\n\treturn {\n\t\t...createShellToolDefinition(cwd, bashToolConfig, options),\n\t\texposure: \"eval\",\n\t};\n}\n\nexport function createBashTool(cwd: string, options?: BashToolOptions): AgentTool<typeof bashSchema> {\n\tconst definition = createBashToolDefinition(cwd, options);\n\tconst tool = wrapToolDefinition(definition);\n\tObject.assign(tool, {\n\t\tpromptSnippet: definition.promptSnippet,\n\t\tpromptGuidelines: definition.promptGuidelines,\n\t});\n\treturn tool;\n}\n"]}
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/core/tools/bash.ts"],"names":[],"mappings":"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","sourcesContent":["// allow: SIZE_OK - pre-existing cohesive shell integration; this patch only hardens its output-finalization seam.\nimport { constants } from \"node:fs\";\nimport { access as fsAccess } from \"node:fs/promises\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { TextContent } from \"@earendil-works/pi-ai\";\nimport { spawn } from \"child_process\";\nimport { type Static, Type } from \"typebox\";\nimport { waitForChildProcess } from \"../../utils/child-process.ts\";\nimport {\n\tgetShellConfig,\n\tgetShellEnv,\n\tkillProcessTree,\n\tnoteDetachedChildExited,\n\tpruneTrackedDetachedChildren,\n\ttype ShellConfig,\n\ttrackDetachedChildPid,\n} from \"../../utils/shell.ts\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\nimport { modelOnlyText } from \"./model-only-text.ts\";\nimport { OutputAccumulator } from \"./output-accumulator.ts\";\nimport { BASH_UPDATE_THROTTLE_MS, createShellRenderers } from \"./renderers/bash.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult } from \"./truncate.ts\";\n\nconst MAX_TIMEOUT_MS = 2_147_483_647;\nconst MAX_TIMEOUT_SECONDS = MAX_TIMEOUT_MS / 1000;\n\nfunction resolveTimeoutMs(timeout: number | undefined): number | undefined {\n\tif (timeout === undefined) return undefined;\n\tif (!Number.isFinite(timeout) || timeout <= 0) {\n\t\tthrow new Error(\"Invalid timeout: must be a finite number of seconds\");\n\t}\n\n\tconst timeoutMs = timeout * 1000;\n\tif (timeoutMs > MAX_TIMEOUT_MS) {\n\t\tthrow new Error(`Invalid timeout: maximum is ${MAX_TIMEOUT_SECONDS} seconds`);\n\t}\n\treturn timeoutMs;\n}\n\nconst bashSchema = Type.Object({\n\tcommand: Type.String({ description: \"Shell command to execute\" }),\n\ttimeout: Type.Optional(Type.Number({ description: \"Timeout in seconds (optional, no default timeout)\" })),\n});\n\nexport const bashToolSystemPromptContribution = {\n\tsnippet: \"Execute bash commands (ls, rg, find, etc.)\",\n\tguidelines: [\"You can inspect PI_* environment variables for current model and session details.\"],\n} as const;\n\nexport type BashToolInput = Static<typeof bashSchema>;\n\nexport interface BashToolDetails {\n\ttruncation?: TruncationResult;\n\tfullOutputPath?: string;\n}\n\n/**\n * Pluggable operations for the bash tool.\n * Override these to delegate command execution to remote systems (for example SSH).\n */\nexport interface BashOperations {\n\t/**\n\t * Execute a command and stream output.\n\t * @param command The command to execute\n\t * @param cwd Working directory\n\t * @param options Execution options\n\t * @returns Promise resolving to exit code (null if killed)\n\t */\n\texec: (\n\t\tcommand: string,\n\t\tcwd: string,\n\t\toptions: {\n\t\t\tonData: (data: Buffer) => void;\n\t\t\tsignal?: AbortSignal;\n\t\t\ttimeout?: number;\n\t\t\tenv?: NodeJS.ProcessEnv;\n\t\t},\n\t) => Promise<{ exitCode: number | null }>;\n}\n\n/** Shared process execution used by the built-in shell tools. */\nexport function createLocalShellOperations(shellName: string, resolveShellConfig: () => ShellConfig): BashOperations {\n\treturn {\n\t\texec: async (command, cwd, { onData, signal, timeout, env }) => {\n\t\t\tconst timeoutMs = resolveTimeoutMs(timeout);\n\t\t\tif (signal?.aborted) {\n\t\t\t\tthrow new Error(\"aborted\");\n\t\t\t}\n\t\t\tconst shellConfig = resolveShellConfig();\n\t\t\ttry {\n\t\t\t\tawait fsAccess(cwd, constants.F_OK);\n\t\t\t} catch {\n\t\t\t\tthrow new Error(`Working directory does not exist: ${cwd}\\nCannot execute ${shellName} commands.`);\n\t\t\t}\n\n\t\t\tconst commandFromStdin = shellConfig.commandTransport === \"stdin\";\n\t\t\tconst child = spawn(shellConfig.shell, commandFromStdin ? shellConfig.args : [...shellConfig.args, command], {\n\t\t\t\tcwd,\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\tenv: env ?? getShellEnv(),\n\t\t\t\tstdio: [commandFromStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t\tif (commandFromStdin) {\n\t\t\t\tchild.stdin?.on(\"error\", () => {});\n\t\t\t\tchild.stdin?.end(command);\n\t\t\t}\n\t\t\tif (child.pid) trackDetachedChildPid(child.pid);\n\t\t\tlet timedOut = false;\n\t\t\tlet timeoutHandle: NodeJS.Timeout | undefined;\n\t\t\tlet streamCallbackError: unknown;\n\t\t\tlet hasStreamCallbackError = false;\n\t\t\t// Fires once the process tree has been killed so waitForChildProcess\n\t\t\t// stops preserving output tails; descendants that survive the group\n\t\t\t// kill must not keep the aborted command running forever.\n\t\t\tconst killedController = new AbortController();\n\t\t\tconst onAbort = () => {\n\t\t\t\tif (child.pid) killProcessTree(child.pid);\n\t\t\t\tkilledController.abort();\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst handleData = (data: Buffer) => {\n\t\t\t\t\tif (hasStreamCallbackError) return;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst callbackResult = (onData as (data: Buffer) => unknown)(data);\n\t\t\t\t\t\tif (callbackResult && typeof (callbackResult as { then?: unknown }).then === \"function\") {\n\t\t\t\t\t\t\tvoid Promise.resolve(callbackResult).catch((error) => {\n\t\t\t\t\t\t\t\tif (!hasStreamCallbackError) {\n\t\t\t\t\t\t\t\t\tstreamCallbackError = error;\n\t\t\t\t\t\t\t\t\thasStreamCallbackError = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonAbort();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tstreamCallbackError = error;\n\t\t\t\t\t\thasStreamCallbackError = true;\n\t\t\t\t\t\tonAbort();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Set timeout if provided.\n\t\t\t\tif (timeoutMs !== undefined) {\n\t\t\t\t\ttimeoutHandle = setTimeout(() => {\n\t\t\t\t\t\ttimedOut = true;\n\t\t\t\t\t\tonAbort();\n\t\t\t\t\t}, timeoutMs);\n\t\t\t\t}\n\t\t\t\t// Stream stdout and stderr.\n\t\t\t\tchild.stdout?.on(\"data\", handleData);\n\t\t\t\tchild.stderr?.on(\"data\", handleData);\n\t\t\t\t// Handle abort signal by killing the entire process tree.\n\t\t\t\tif (signal) {\n\t\t\t\t\tif (signal.aborted) onAbort();\n\t\t\t\t\telse signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t}\n\t\t\t\t// Handle shell spawn errors and wait for the process to terminate without hanging\n\t\t\t\t// on inherited stdio handles held by detached descendants.\n\t\t\t\tconst exitCode = await waitForChildProcess(child, { signal: killedController.signal });\n\t\t\t\tif (hasStreamCallbackError) {\n\t\t\t\t\tthrow streamCallbackError;\n\t\t\t\t}\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tthrow new Error(\"aborted\");\n\t\t\t\t}\n\t\t\t\tif (timedOut) {\n\t\t\t\t\tthrow new Error(`timeout:${timeout}`);\n\t\t\t\t}\n\t\t\t\treturn { exitCode };\n\t\t\t} finally {\n\t\t\t\tconst pid = child.pid;\n\t\t\t\tif (pid !== undefined) {\n\t\t\t\t\tif (child.exitCode !== null || child.signalCode !== null) {\n\t\t\t\t\t\t// The shell exited, but whatever it backgrounded (`sleep 30 &`,\n\t\t\t\t\t\t// `nohup server &`) still runs in its process group: ownership is\n\t\t\t\t\t\t// released only once that group is empty (senpi#1697).\n\t\t\t\t\t\tnoteDetachedChildExited(pid);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// The kill grace released the wait while the child is still\n\t\t\t\t\t\t// alive (kill pending): keep it tracked so shutdown cleanup\n\t\t\t\t\t\t// retries, and unref it so it cannot pin the event loop.\n\t\t\t\t\t\tchild.unref();\n\t\t\t\t\t\tchild.once(\"exit\", () => noteDetachedChildExited(pid));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Groups kept past their shell's exit must not accumulate across a session.\n\t\t\t\tpruneTrackedDetachedChildren();\n\t\t\t\tif (timeoutHandle) clearTimeout(timeoutHandle);\n\t\t\t\tif (signal) signal.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Create bash operations using pi's built-in local shell execution backend.\n *\n * This is useful for extensions that intercept user_bash and still want pi's\n * standard local shell behavior while wrapping or rewriting commands.\n */\nexport function createLocalBashOperations(options?: { shellPath?: string }): BashOperations {\n\treturn createLocalShellOperations(\"bash\", () => getShellConfig(options?.shellPath));\n}\n\nexport interface BashSpawnContext {\n\tcommand: string;\n\tcwd: string;\n\tenv: NodeJS.ProcessEnv;\n}\n\nexport type BashSpawnHook = (context: BashSpawnContext) => BashSpawnContext;\n\nfunction resolveSpawnContext(\n\tcommand: string,\n\tcwd: string,\n\tspawnHook: BashSpawnHook | undefined,\n\texposeSessionEnvironment: boolean,\n\tctx: ExtensionContext | undefined,\n): BashSpawnContext {\n\tconst env = { ...getShellEnv() };\n\tdelete env.PI_SESSION_ID;\n\tdelete env.PI_SESSION_FILE;\n\tdelete env.PI_SESSION_CWD;\n\tdelete env.PI_GOAL_STORE_FILE;\n\tdelete env.PI_PROVIDER;\n\tdelete env.PI_MODEL;\n\tdelete env.PI_REASONING_LEVEL;\n\tif (exposeSessionEnvironment && ctx) {\n\t\tconst model = ctx.model;\n\t\tenv.PI_SESSION_ID = ctx.sessionManager.getSessionId();\n\t\tenv.PI_SESSION_CWD = ctx.cwd;\n\t\tif (ctx.goalStoreFile) env.PI_GOAL_STORE_FILE = ctx.goalStoreFile;\n\t\tconst sessionFile = ctx.sessionManager.getSessionFile();\n\t\tif (sessionFile) env.PI_SESSION_FILE = sessionFile;\n\t\tif (model) {\n\t\t\tenv.PI_PROVIDER = model.provider;\n\t\t\tenv.PI_MODEL = model.id;\n\t\t}\n\t\tif (ctx.thinkingLevel) env.PI_REASONING_LEVEL = ctx.thinkingLevel;\n\t}\n\tconst baseContext: BashSpawnContext = { command, cwd, env };\n\treturn spawnHook ? spawnHook(baseContext) : baseContext;\n}\n\nexport interface BashToolOptions {\n\t/** Custom operations for command execution. Default: local shell */\n\toperations?: BashOperations;\n\t/** Command prefix prepended to every command (for example shell setup commands) */\n\tcommandPrefix?: string;\n\t/** Optional explicit shell path from settings */\n\tshellPath?: string;\n\t/** Expose current Pi session metadata as PI_* environment variables. Default: true */\n\texposeSessionEnvironment?: boolean;\n\t/** Hook to adjust command, cwd, or env before execution */\n\tspawnHook?: BashSpawnHook;\n}\n\nexport type BashRenderState = {\n\tstartedAt: number | undefined;\n\tendedAt: number | undefined;\n\tinterval: NodeJS.Timeout | undefined;\n};\n\nexport interface ShellToolConfig {\n\tname: string;\n\tlabel: string;\n\tshellName: string;\n\tprompt: string;\n\tpromptSnippet: string;\n\tpromptGuidelines?: readonly string[];\n\ttempFilePrefix: string;\n}\n\nexport function createShellToolDefinition(\n\tcwd: string,\n\tconfig: ShellToolConfig,\n\toptions?: BashToolOptions,\n): ToolDefinition<typeof bashSchema, BashToolDetails | undefined, BashRenderState> {\n\tconst ops = options?.operations ?? createLocalBashOperations({ shellPath: options?.shellPath });\n\tconst commandPrefix = options?.commandPrefix;\n\tconst exposeSessionEnvironment = options?.exposeSessionEnvironment ?? true;\n\tconst spawnHook = options?.spawnHook;\n\treturn {\n\t\tname: config.name,\n\t\tlabel: config.label,\n\t\tdescription: `Execute a ${config.shellName} command in the current working directory. Returns stdout and stderr. Output is truncated to last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.`,\n\t\tpromptSnippet: config.promptSnippet,\n\t\tpromptGuidelines: exposeSessionEnvironment && config.promptGuidelines ? [...config.promptGuidelines] : undefined,\n\t\tparameters: bashSchema,\n\t\tconstrainedSampling: { type: \"json_schema\", strict: \"prefer\" },\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ command, timeout }: { command: string; timeout?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t\tonUpdate?,\n\t\t\tctx?: ExtensionContext,\n\t\t) {\n\t\t\tconst resolvedCommand = commandPrefix ? `${commandPrefix}\\n${command}` : command;\n\t\t\tconst spawnContext = resolveSpawnContext(\n\t\t\t\tresolvedCommand,\n\t\t\t\tctx?.cwd || cwd,\n\t\t\t\tspawnHook,\n\t\t\t\texposeSessionEnvironment,\n\t\t\t\tctx,\n\t\t\t);\n\t\t\tconst output = new OutputAccumulator({ tempFilePrefix: config.tempFilePrefix });\n\t\t\tlet acceptingOutput = true;\n\t\t\tlet updateTimer: NodeJS.Timeout | undefined;\n\t\t\tlet updateDirty = false;\n\t\t\tlet lastUpdateAt = 0;\n\t\t\tlet outputUpdateError: unknown;\n\t\t\tlet hasOutputUpdateError = false;\n\n\t\t\tconst emitOutputUpdate = () => {\n\t\t\t\tif (!onUpdate || !updateDirty || hasOutputUpdateError) return;\n\t\t\t\tupdateDirty = false;\n\t\t\t\tlastUpdateAt = Date.now();\n\t\t\t\tconst snapshot = output.snapshot({ persistIfTruncated: true });\n\t\t\t\ttry {\n\t\t\t\t\tonUpdate({\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: snapshot.content || \"\" }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\ttruncation: snapshot.truncation.truncated ? snapshot.truncation : undefined,\n\t\t\t\t\t\t\tfullOutputPath: snapshot.fullOutputPath,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\toutputUpdateError = error;\n\t\t\t\t\thasOutputUpdateError = true;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst clearUpdateTimer = () => {\n\t\t\t\tif (updateTimer) {\n\t\t\t\t\tclearTimeout(updateTimer);\n\t\t\t\t\tupdateTimer = undefined;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst scheduleOutputUpdate = () => {\n\t\t\t\tif (!onUpdate) return;\n\t\t\t\tupdateDirty = true;\n\t\t\t\tconst delay = BASH_UPDATE_THROTTLE_MS - (Date.now() - lastUpdateAt);\n\t\t\t\tif (delay <= 0) {\n\t\t\t\t\tclearUpdateTimer();\n\t\t\t\t\temitOutputUpdate();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tupdateTimer ??= setTimeout(() => {\n\t\t\t\t\tupdateTimer = undefined;\n\t\t\t\t\temitOutputUpdate();\n\t\t\t\t}, delay);\n\t\t\t};\n\n\t\t\tif (onUpdate) {\n\t\t\t\tonUpdate({ content: [], details: undefined });\n\t\t\t}\n\n\t\t\tconst handleData = (data: Buffer) => {\n\t\t\t\tif (!acceptingOutput) return;\n\t\t\t\toutput.append(data);\n\t\t\t\tscheduleOutputUpdate();\n\t\t\t};\n\n\t\t\tconst finishOutput = async () => {\n\t\t\t\tacceptingOutput = false;\n\t\t\t\tclearUpdateTimer();\n\t\t\t\tlet primaryError: unknown;\n\t\t\t\tlet hasPrimaryError = false;\n\t\t\t\tlet snapshot: Awaited<ReturnType<OutputAccumulator[\"snapshot\"]>> | undefined;\n\t\t\t\ttry {\n\t\t\t\t\toutput.finish();\n\t\t\t\t\temitOutputUpdate();\n\t\t\t\t\tsnapshot = output.snapshot({ persistIfTruncated: true });\n\t\t\t\t\tif (hasOutputUpdateError) {\n\t\t\t\t\t\tprimaryError = outputUpdateError;\n\t\t\t\t\t\thasPrimaryError = true;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tprimaryError = error;\n\t\t\t\t\thasPrimaryError = true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait output.closeTempFile();\n\t\t\t\t} catch (closeError) {\n\t\t\t\t\tif (hasPrimaryError) {\n\t\t\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t\t\t[primaryError, closeError],\n\t\t\t\t\t\t\t\"Bash output finalization and spill cleanup failed\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow closeError;\n\t\t\t\t}\n\t\t\t\tif (hasPrimaryError) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait output.removeTempFile();\n\t\t\t\t\t} catch (unlinkError) {\n\t\t\t\t\t\tif (!(unlinkError instanceof Error)) throw unlinkError;\n\t\t\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t\t\t[primaryError, unlinkError],\n\t\t\t\t\t\t\t\"Bash output finalization and spill cleanup failed\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow primaryError;\n\t\t\t\t}\n\t\t\t\tif (snapshot === undefined) {\n\t\t\t\t\tthrow new Error(\"Bash output finalization produced no snapshot\");\n\t\t\t\t}\n\t\t\t\treturn snapshot;\n\t\t\t};\n\n\t\t\tconst formatOutput = (snapshot: Awaited<ReturnType<typeof finishOutput>>, emptyText = \"(no output)\") => {\n\t\t\t\tconst truncation = snapshot.truncation;\n\t\t\t\tconst text = snapshot.content || emptyText;\n\t\t\t\tlet notice: string | undefined;\n\t\t\t\tlet details: BashToolDetails | undefined;\n\t\t\t\tif (truncation.truncated) {\n\t\t\t\t\tdetails = { truncation, fullOutputPath: snapshot.fullOutputPath };\n\t\t\t\t\tconst startLine = truncation.totalLines - truncation.outputLines + 1;\n\t\t\t\t\tconst endLine = truncation.totalLines;\n\t\t\t\t\tif (truncation.lastLinePartial) {\n\t\t\t\t\t\tconst lastLineSize = formatSize(output.getLastLineBytes());\n\t\t\t\t\t\tnotice = `[Showing last ${formatSize(truncation.outputBytes)} of line ${endLine} (line is ${lastLineSize}). Full output: ${snapshot.fullOutputPath}]`;\n\t\t\t\t\t} else if (truncation.truncatedBy === \"lines\") {\n\t\t\t\t\t\tnotice = `[Showing lines ${startLine}-${endLine} of ${truncation.totalLines}. Full output: ${snapshot.fullOutputPath}]`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnotice = `[Showing lines ${startLine}-${endLine} of ${truncation.totalLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Full output: ${snapshot.fullOutputPath}]`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst content: TextContent[] = [{ type: \"text\", text: notice === undefined ? text : `${text}\\n` }];\n\t\t\t\tif (notice !== undefined) content.push(modelOnlyText(notice));\n\t\t\t\treturn { text: notice === undefined ? text : `${text}\\n\\n${notice}`, content, details };\n\t\t\t};\n\n\t\t\tconst appendStatus = (text: string, status: string) => `${text ? `${text}\\n\\n` : \"\"}${status}`;\n\n\t\t\ttry {\n\t\t\t\tlet exitCode: number | null;\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await ops.exec(spawnContext.command, spawnContext.cwd, {\n\t\t\t\t\t\tonData: handleData,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\ttimeout,\n\t\t\t\t\t\tenv: spawnContext.env,\n\t\t\t\t\t});\n\t\t\t\t\texitCode = result.exitCode;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlet snapshot: Awaited<ReturnType<typeof finishOutput>>;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsnapshot = await finishOutput();\n\t\t\t\t\t} catch (cleanupError) {\n\t\t\t\t\t\tthrow new AggregateError([err, cleanupError], \"Bash command and output cleanup failed\");\n\t\t\t\t\t}\n\t\t\t\t\tconst { text } = formatOutput(snapshot, \"\");\n\t\t\t\t\tif (err instanceof Error && err.message === \"aborted\") {\n\t\t\t\t\t\tthrow new Error(appendStatus(text, \"Command aborted\"));\n\t\t\t\t\t}\n\t\t\t\t\tif (err instanceof Error && err.message.startsWith(\"timeout:\")) {\n\t\t\t\t\t\tconst timeoutSecs = err.message.split(\":\")[1];\n\t\t\t\t\t\tthrow new Error(appendStatus(text, `Command timed out after ${timeoutSecs} seconds`));\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait output.removeTempFile();\n\t\t\t\t\t} catch (unlinkError) {\n\t\t\t\t\t\tthrow new AggregateError([err, unlinkError], \"Bash command and output cleanup failed\");\n\t\t\t\t\t}\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\n\t\t\t\tconst snapshot = await finishOutput();\n\t\t\t\tconst { text: outputText, content, details } = formatOutput(snapshot);\n\t\t\t\tif (exitCode !== 0 && exitCode !== null) {\n\t\t\t\t\tthrow new Error(appendStatus(outputText, `Command exited with code ${exitCode}`));\n\t\t\t\t}\n\t\t\t\treturn { content, details };\n\t\t\t} finally {\n\t\t\t\tclearUpdateTimer();\n\t\t\t}\n\t\t},\n\t\t...createShellRenderers(config.prompt),\n\t};\n}\n\nconst bashToolConfig: ShellToolConfig = {\n\tname: \"bash\",\n\tlabel: \"bash\",\n\tshellName: \"bash\",\n\tprompt: \"$\",\n\tpromptSnippet: bashToolSystemPromptContribution.snippet,\n\tpromptGuidelines: bashToolSystemPromptContribution.guidelines,\n\ttempFilePrefix: \"pi-bash\",\n};\n\nexport function createBashToolDefinition(\n\tcwd: string,\n\toptions?: BashToolOptions,\n): ToolDefinition<typeof bashSchema, BashToolDetails | undefined, BashRenderState> {\n\treturn {\n\t\t...createShellToolDefinition(cwd, bashToolConfig, options),\n\t\texposure: \"eval\",\n\t};\n}\n\nexport function createBashTool(cwd: string, options?: BashToolOptions): AgentTool<typeof bashSchema> {\n\tconst definition = createBashToolDefinition(cwd, options);\n\tconst tool = wrapToolDefinition(definition);\n\tObject.assign(tool, {\n\t\tpromptSnippet: definition.promptSnippet,\n\t\tpromptGuidelines: definition.promptGuidelines,\n\t});\n\treturn tool;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../src/core/tools/find.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAoB,uBAAuB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAKxG,OAAO,EAAiC,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEnG,6FAA6F;AAC7F,wBAAgB,wBAAwB,CACvC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,OAAO,IAAI,CAAC,KAAY,GAClC,MAAM,CAMR;AAED,QAAA,MAAM,UAAU;;;;EAMd,CAAC;AAEH,eAAO,MAAM,gCAAgC;aAC5C,OAAO,EAAE,kDAAkD;aAC3D,UAAU;CACD,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAItD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,2BAA2B;IAC3B,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,4EAA4E;IAC5E,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;CACnH;AAQD,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;CAC3C;AAED,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACvB,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CA8PhE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAEnG"}
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../src/core/tools/find.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAoB,uBAAuB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAMxG,OAAO,EAAiC,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEnG,6FAA6F;AAC7F,wBAAgB,wBAAwB,CACvC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,OAAO,IAAI,CAAC,KAAY,GAClC,MAAM,CAMR;AAED,QAAA,MAAM,UAAU;;;;EAMd,CAAC;AAEH,eAAO,MAAM,gCAAgC;aAC5C,OAAO,EAAE,kDAAkD;aAC3D,UAAU;CACD,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAItD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,2BAA2B;IAC3B,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,4EAA4E;IAC5E,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;CACnH;AAQD,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;CAC3C;AAED,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACvB,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CAgQhE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAEnG"}
@@ -4,6 +4,7 @@ import path from "path";
4
4
  import { Type } from "typebox";
5
5
  import { ensureTool } from "../../utils/tools-manager.js";
6
6
  import { canonicalizeFilesystemPath } from "./filesystem-policy.js";
7
+ import { modelOnlyText } from "./model-only-text.js";
7
8
  import { pathExists, resolveToCwd } from "./path-utils.js";
8
9
  import { findRenderers } from "./renderers/find.js";
9
10
  import { wrapToolDefinition } from "./tool-definition-wrapper.js";
@@ -110,7 +111,6 @@ export function createFindToolDefinition(cwd, options) {
110
111
  const resultLimitReached = relativized.length >= effectiveLimit;
111
112
  const rawOutput = relativized.join("\n");
112
113
  const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
113
- let resultOutput = truncation.content;
114
114
  const details = {};
115
115
  const notices = [];
116
116
  if (resultLimitReached) {
@@ -121,11 +121,13 @@ export function createFindToolDefinition(cwd, options) {
121
121
  notices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);
122
122
  details.truncation = truncation;
123
123
  }
124
+ const content = [{ type: "text", text: truncation.content }];
124
125
  if (notices.length > 0) {
125
- resultOutput += `\n\n[${notices.join(". ")}]`;
126
+ content[0].text += "\n";
127
+ content.push(modelOnlyText(`[${notices.join(". ")}]`));
126
128
  }
127
129
  settle(() => resolve({
128
- content: [{ type: "text", text: resultOutput }],
130
+ content,
129
131
  details: Object.keys(details).length > 0 ? details : undefined,
130
132
  }));
131
133
  return;
@@ -226,7 +228,6 @@ export function createFindToolDefinition(cwd, options) {
226
228
  const resultLimitReached = relativized.length >= effectiveLimit;
227
229
  const rawOutput = relativized.join("\n");
228
230
  const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
229
- let resultOutput = truncation.content;
230
231
  const details = {};
231
232
  const notices = [];
232
233
  if (resultLimitReached) {
@@ -237,11 +238,13 @@ export function createFindToolDefinition(cwd, options) {
237
238
  notices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);
238
239
  details.truncation = truncation;
239
240
  }
241
+ const content = [{ type: "text", text: truncation.content }];
240
242
  if (notices.length > 0) {
241
- resultOutput += `\n\n[${notices.join(". ")}]`;
243
+ content[0].text += "\n";
244
+ content.push(modelOnlyText(`[${notices.join(". ")}]`));
242
245
  }
243
246
  settle(() => resolve({
244
- content: [{ type: "text", text: resultOutput }],
247
+ content,
245
248
  details: Object.keys(details).length > 0 ? details : undefined,
246
249
  }));
247
250
  });
@@ -1 +1 @@
1
- {"version":3,"file":"find.js","sourceRoot":"","sources":["../../../src/core/tools/find.ts"],"names":[],"mappings":"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","sourcesContent":["import { createInterface } from \"node:readline\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { spawn } from \"child_process\";\nimport path from \"path\";\nimport { type Static, Type } from \"typebox\";\nimport { ensureTool } from \"../../utils/tools-manager.ts\";\nimport type { ExtensionContext, FilesystemPolicyChecker, ToolDefinition } from \"../extensions/types.ts\";\nimport { canonicalizeFilesystemPath } from \"./filesystem-policy.ts\";\nimport { pathExists, resolveToCwd } from \"./path-utils.ts\";\nimport { findRenderers } from \"./renderers/find.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\n/** Relativize a find result against the search root and normalize it to posix separators. */\nexport function relativizeFindResultPath(\n\tresultPath: string,\n\tsearchPath: string,\n\tpathModule: typeof path.posix = path,\n): string {\n\tconst hadTrailingSeparator =\n\t\tresultPath.endsWith(pathModule.sep) || (pathModule.sep === \"\\\\\" && resultPath.endsWith(\"/\"));\n\tconst relativePath = pathModule.isAbsolute(resultPath) ? pathModule.relative(searchPath, resultPath) : resultPath;\n\tconst posixPath = relativePath.split(pathModule.sep).join(\"/\");\n\treturn hadTrailingSeparator && !posixPath.endsWith(\"/\") ? `${posixPath}/` : posixPath;\n}\n\nconst findSchema = Type.Object({\n\tpattern: Type.String({\n\t\tdescription: \"Glob pattern to match files, e.g. '*.ts', '**/*.json', or 'src/**/*.spec.ts'\",\n\t}),\n\tpath: Type.Optional(Type.String({ description: \"Directory to search in (default: current directory)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of results (default: 1000)\" })),\n});\n\nexport const findToolSystemPromptContribution = {\n\tsnippet: \"Find files by glob pattern (respects .gitignore)\",\n\tguidelines: [],\n} as const;\n\nexport type FindToolInput = Static<typeof findSchema>;\n\nconst DEFAULT_LIMIT = 1000;\n\nexport interface FindToolDetails {\n\ttruncation?: TruncationResult;\n\tresultLimitReached?: number;\n}\n\n/**\n * Pluggable operations for the find tool.\n * Override these to delegate file search to remote systems (for example SSH).\n */\nexport interface FindOperations {\n\t/** Check if path exists */\n\texists: (absolutePath: string) => Promise<boolean> | boolean;\n\t/** Find files matching glob pattern. Returns relative or absolute paths. */\n\tglob: (pattern: string, cwd: string, options: { ignore: string[]; limit: number }) => Promise<string[]> | string[];\n}\n\nconst defaultFindOperations: FindOperations = {\n\texists: pathExists,\n\t// This is a placeholder. Actual fd execution happens in execute() when no custom glob is provided.\n\tglob: () => [],\n};\n\nexport interface FindToolOptions {\n\t/** Custom operations for find. Default: local filesystem plus fd */\n\toperations?: FindOperations;\n\t/** Extension-registered filesystem policy checker. */\n\tfilesystemPolicy?: FilesystemPolicyChecker;\n}\n\nexport function createFindToolDefinition(\n\tcwd: string,\n\toptions?: FindToolOptions,\n): ToolDefinition<typeof findSchema, FindToolDetails | undefined> {\n\tconst customOps = options?.operations;\n\tconst filesystemPolicy = options?.filesystemPolicy;\n\treturn {\n\t\tname: \"find\",\n\t\tlabel: \"find\",\n\t\tdescription: `Search for files by glob pattern. Returns matching file paths relative to the search directory. Respects .gitignore. Output is truncated to ${DEFAULT_LIMIT} results or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,\n\t\tpromptSnippet: findToolSystemPromptContribution.snippet,\n\t\tparameters: findSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ pattern, path: searchDir, limit }: { pattern: string; path?: string; limit?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\tctx?: ExtensionContext,\n\t\t) {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet settled = false;\n\t\t\t\tlet stopChild: (() => void) | undefined;\n\t\t\t\tconst settle = (fn: () => void) => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tstopChild = undefined;\n\t\t\t\t\tfn();\n\t\t\t\t};\n\t\t\t\tconst onAbort = () => {\n\t\t\t\t\tstopChild?.();\n\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t};\n\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\t\t(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst searchPath = resolveToCwd(searchDir || \".\", ctx?.cwd || cwd);\n\t\t\t\t\t\tconst effectiveLimit = limit ?? DEFAULT_LIMIT;\n\t\t\t\t\t\tconst ops = customOps ?? defaultFindOperations;\n\t\t\t\t\t\tif (filesystemPolicy) {\n\t\t\t\t\t\t\tconst decision = await filesystemPolicy({\n\t\t\t\t\t\t\t\toperation: \"enumerate\",\n\t\t\t\t\t\t\t\tcanonicalPath: await canonicalizeFilesystemPath(searchPath),\n\t\t\t\t\t\t\t\ttoolName: \"find\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (!decision.allow) throw new Error(decision.reason);\n\t\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If custom operations provide glob(), use that instead of fd.\n\t\t\t\t\t\tif (customOps?.glob) {\n\t\t\t\t\t\t\tif (!(await ops.exists(searchPath))) {\n\t\t\t\t\t\t\t\tsettle(() => reject(new Error(`Path not found: ${searchPath}`)));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst results = await ops.glob(pattern, searchPath, {\n\t\t\t\t\t\t\t\tignore: [\"**/node_modules/**\", \"**/.git/**\"],\n\t\t\t\t\t\t\t\tlimit: effectiveLimit,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (results.length === 0) {\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No files found matching pattern\" }],\n\t\t\t\t\t\t\t\t\t\tdetails: undefined,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Relativize paths against the search root for stable output.\n\t\t\t\t\t\t\tconst relativized = results.map((p) => relativizeFindResultPath(p, searchPath));\n\t\t\t\t\t\t\tconst resultLimitReached = relativized.length >= effectiveLimit;\n\t\t\t\t\t\t\tconst rawOutput = relativized.join(\"\\n\");\n\t\t\t\t\t\t\tconst truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\t\t\t\t\tlet resultOutput = truncation.content;\n\t\t\t\t\t\t\tconst details: FindToolDetails = {};\n\t\t\t\t\t\t\tconst notices: string[] = [];\n\t\t\t\t\t\t\tif (resultLimitReached) {\n\t\t\t\t\t\t\t\tnotices.push(`${effectiveLimit} results limit reached`);\n\t\t\t\t\t\t\t\tdetails.resultLimitReached = effectiveLimit;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (truncation.truncated) {\n\t\t\t\t\t\t\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);\n\t\t\t\t\t\t\t\tdetails.truncation = truncation;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (notices.length > 0) {\n\t\t\t\t\t\t\t\tresultOutput += `\\n\\n[${notices.join(\". \")}]`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: resultOutput }],\n\t\t\t\t\t\t\t\t\tdetails: Object.keys(details).length > 0 ? details : undefined,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Default implementation uses fd.\n\t\t\t\t\t\tconst fdPath = await ensureTool(\"fd\");\n\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!fdPath) {\n\t\t\t\t\t\t\tsettle(() => reject(new Error(\"fd is not available and could not be downloaded\")));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst args: string[] = [\"--glob\", \"--color=never\", \"--hidden\"];\n\n\t\t\t\t\t\t// fd normally ignores .gitignore outside git repos, so keep --no-require-git\n\t\t\t\t\t\t// there. Inside repos, use fd's default git-aware behavior so parent\n\t\t\t\t\t\t// .gitignore rules stop at nested repo boundaries:\n\t\t\t\t\t\t// https://github.com/earendil-works/pi/issues/5960\n\t\t\t\t\t\tlet insideGitRepo = false;\n\t\t\t\t\t\tfor (let current = searchPath; ; ) {\n\t\t\t\t\t\t\tif (await pathExists(path.join(current, \".git\"))) {\n\t\t\t\t\t\t\t\tinsideGitRepo = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst parent = path.dirname(current);\n\t\t\t\t\t\t\tif (parent === current) break;\n\t\t\t\t\t\t\tcurrent = parent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!insideGitRepo) args.push(\"--no-require-git\");\n\t\t\t\t\t\targs.push(\"--max-results\", String(effectiveLimit));\n\n\t\t\t\t\t\t// fd --glob matches against the basename unless --full-path is set; in --full-path\n\t\t\t\t\t\t// mode it matches against the absolute candidate path, so a path-containing\n\t\t\t\t\t\t// pattern like 'src/**/*.spec.ts' needs a leading '**/' to match anything.\n\t\t\t\t\t\tlet effectivePattern = pattern;\n\t\t\t\t\t\tif (pattern.includes(\"/\")) {\n\t\t\t\t\t\t\targs.push(\"--full-path\");\n\t\t\t\t\t\t\tif (!pattern.startsWith(\"/\") && !pattern.startsWith(\"**/\") && pattern !== \"**\") {\n\t\t\t\t\t\t\t\teffectivePattern = `**/${pattern}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// fd matches full paths using native separators on Windows.\n\t\t\t\t\t\t\tif (process.platform === \"win32\")\n\t\t\t\t\t\t\t\teffectivePattern = effectivePattern.replaceAll(\"/\", String.raw`[/\\\\]`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\targs.push(\"--\", effectivePattern, searchPath);\n\n\t\t\t\t\t\tconst child = spawn(fdPath, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n\t\t\t\t\t\tconst rl = createInterface({ input: child.stdout });\n\t\t\t\t\t\tlet stderr = \"\";\n\t\t\t\t\t\tconst lines: string[] = [];\n\n\t\t\t\t\t\tstopChild = () => {\n\t\t\t\t\t\t\tif (!child.killed) {\n\t\t\t\t\t\t\t\tchild.kill();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst cleanup = () => {\n\t\t\t\t\t\t\trl.close();\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tchild.stderr?.on(\"data\", (chunk) => {\n\t\t\t\t\t\t\tstderr += chunk.toString();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\trl.on(\"line\", (line) => {\n\t\t\t\t\t\t\tlines.push(line);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\t\tsettle(() => reject(new Error(`Failed to run fd: ${error.message}`)));\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst output = lines.join(\"\\n\");\n\t\t\t\t\t\t\tif (code !== 0) {\n\t\t\t\t\t\t\t\tconst errorMsg = stderr.trim() || `fd exited with code ${code}`;\n\t\t\t\t\t\t\t\tif (!output) {\n\t\t\t\t\t\t\t\t\tsettle(() => reject(new Error(errorMsg)));\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!output) {\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No files found matching pattern\" }],\n\t\t\t\t\t\t\t\t\t\tdetails: undefined,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst relativized: string[] = [];\n\t\t\t\t\t\t\tfor (const rawLine of lines) {\n\t\t\t\t\t\t\t\tconst line = rawLine.replace(/\\r$/, \"\").trim();\n\t\t\t\t\t\t\t\tif (!line) continue;\n\t\t\t\t\t\t\t\trelativized.push(relativizeFindResultPath(line, searchPath));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst resultLimitReached = relativized.length >= effectiveLimit;\n\t\t\t\t\t\t\tconst rawOutput = relativized.join(\"\\n\");\n\t\t\t\t\t\t\tconst truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\t\t\t\t\tlet resultOutput = truncation.content;\n\t\t\t\t\t\t\tconst details: FindToolDetails = {};\n\t\t\t\t\t\t\tconst notices: string[] = [];\n\t\t\t\t\t\t\tif (resultLimitReached) {\n\t\t\t\t\t\t\t\tnotices.push(\n\t\t\t\t\t\t\t\t\t`${effectiveLimit} results limit reached. Use limit=${effectiveLimit * 2} for more, or refine pattern`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tdetails.resultLimitReached = effectiveLimit;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (truncation.truncated) {\n\t\t\t\t\t\t\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);\n\t\t\t\t\t\t\t\tdetails.truncation = truncation;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (notices.length > 0) {\n\t\t\t\t\t\t\t\tresultOutput += `\\n\\n[${notices.join(\". \")}]`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: resultOutput }],\n\t\t\t\t\t\t\t\t\tdetails: Object.keys(details).length > 0 ? details : undefined,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst error = e instanceof Error ? e : new Error(String(e));\n\t\t\t\t\t\tsettle(() => reject(error));\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t});\n\t\t},\n\t\t...findRenderers,\n\t};\n}\n\nexport function createFindTool(cwd: string, options?: FindToolOptions): AgentTool<typeof findSchema> {\n\treturn wrapToolDefinition(createFindToolDefinition(cwd, options));\n}\n"]}
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../../../src/core/tools/find.ts"],"names":[],"mappings":"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","sourcesContent":["import { createInterface } from \"node:readline\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { TextContent } from \"@earendil-works/pi-ai\";\nimport { spawn } from \"child_process\";\nimport path from \"path\";\nimport { type Static, Type } from \"typebox\";\nimport { ensureTool } from \"../../utils/tools-manager.ts\";\nimport type { ExtensionContext, FilesystemPolicyChecker, ToolDefinition } from \"../extensions/types.ts\";\nimport { canonicalizeFilesystemPath } from \"./filesystem-policy.ts\";\nimport { modelOnlyText } from \"./model-only-text.ts\";\nimport { pathExists, resolveToCwd } from \"./path-utils.ts\";\nimport { findRenderers } from \"./renderers/find.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\n/** Relativize a find result against the search root and normalize it to posix separators. */\nexport function relativizeFindResultPath(\n\tresultPath: string,\n\tsearchPath: string,\n\tpathModule: typeof path.posix = path,\n): string {\n\tconst hadTrailingSeparator =\n\t\tresultPath.endsWith(pathModule.sep) || (pathModule.sep === \"\\\\\" && resultPath.endsWith(\"/\"));\n\tconst relativePath = pathModule.isAbsolute(resultPath) ? pathModule.relative(searchPath, resultPath) : resultPath;\n\tconst posixPath = relativePath.split(pathModule.sep).join(\"/\");\n\treturn hadTrailingSeparator && !posixPath.endsWith(\"/\") ? `${posixPath}/` : posixPath;\n}\n\nconst findSchema = Type.Object({\n\tpattern: Type.String({\n\t\tdescription: \"Glob pattern to match files, e.g. '*.ts', '**/*.json', or 'src/**/*.spec.ts'\",\n\t}),\n\tpath: Type.Optional(Type.String({ description: \"Directory to search in (default: current directory)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of results (default: 1000)\" })),\n});\n\nexport const findToolSystemPromptContribution = {\n\tsnippet: \"Find files by glob pattern (respects .gitignore)\",\n\tguidelines: [],\n} as const;\n\nexport type FindToolInput = Static<typeof findSchema>;\n\nconst DEFAULT_LIMIT = 1000;\n\nexport interface FindToolDetails {\n\ttruncation?: TruncationResult;\n\tresultLimitReached?: number;\n}\n\n/**\n * Pluggable operations for the find tool.\n * Override these to delegate file search to remote systems (for example SSH).\n */\nexport interface FindOperations {\n\t/** Check if path exists */\n\texists: (absolutePath: string) => Promise<boolean> | boolean;\n\t/** Find files matching glob pattern. Returns relative or absolute paths. */\n\tglob: (pattern: string, cwd: string, options: { ignore: string[]; limit: number }) => Promise<string[]> | string[];\n}\n\nconst defaultFindOperations: FindOperations = {\n\texists: pathExists,\n\t// This is a placeholder. Actual fd execution happens in execute() when no custom glob is provided.\n\tglob: () => [],\n};\n\nexport interface FindToolOptions {\n\t/** Custom operations for find. Default: local filesystem plus fd */\n\toperations?: FindOperations;\n\t/** Extension-registered filesystem policy checker. */\n\tfilesystemPolicy?: FilesystemPolicyChecker;\n}\n\nexport function createFindToolDefinition(\n\tcwd: string,\n\toptions?: FindToolOptions,\n): ToolDefinition<typeof findSchema, FindToolDetails | undefined> {\n\tconst customOps = options?.operations;\n\tconst filesystemPolicy = options?.filesystemPolicy;\n\treturn {\n\t\tname: \"find\",\n\t\tlabel: \"find\",\n\t\tdescription: `Search for files by glob pattern. Returns matching file paths relative to the search directory. Respects .gitignore. Output is truncated to ${DEFAULT_LIMIT} results or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,\n\t\tpromptSnippet: findToolSystemPromptContribution.snippet,\n\t\tparameters: findSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ pattern, path: searchDir, limit }: { pattern: string; path?: string; limit?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\tctx?: ExtensionContext,\n\t\t) {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet settled = false;\n\t\t\t\tlet stopChild: (() => void) | undefined;\n\t\t\t\tconst settle = (fn: () => void) => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tstopChild = undefined;\n\t\t\t\t\tfn();\n\t\t\t\t};\n\t\t\t\tconst onAbort = () => {\n\t\t\t\t\tstopChild?.();\n\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t};\n\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\t\t(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst searchPath = resolveToCwd(searchDir || \".\", ctx?.cwd || cwd);\n\t\t\t\t\t\tconst effectiveLimit = limit ?? DEFAULT_LIMIT;\n\t\t\t\t\t\tconst ops = customOps ?? defaultFindOperations;\n\t\t\t\t\t\tif (filesystemPolicy) {\n\t\t\t\t\t\t\tconst decision = await filesystemPolicy({\n\t\t\t\t\t\t\t\toperation: \"enumerate\",\n\t\t\t\t\t\t\t\tcanonicalPath: await canonicalizeFilesystemPath(searchPath),\n\t\t\t\t\t\t\t\ttoolName: \"find\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (!decision.allow) throw new Error(decision.reason);\n\t\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If custom operations provide glob(), use that instead of fd.\n\t\t\t\t\t\tif (customOps?.glob) {\n\t\t\t\t\t\t\tif (!(await ops.exists(searchPath))) {\n\t\t\t\t\t\t\t\tsettle(() => reject(new Error(`Path not found: ${searchPath}`)));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst results = await ops.glob(pattern, searchPath, {\n\t\t\t\t\t\t\t\tignore: [\"**/node_modules/**\", \"**/.git/**\"],\n\t\t\t\t\t\t\t\tlimit: effectiveLimit,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (results.length === 0) {\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No files found matching pattern\" }],\n\t\t\t\t\t\t\t\t\t\tdetails: undefined,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Relativize paths against the search root for stable output.\n\t\t\t\t\t\t\tconst relativized = results.map((p) => relativizeFindResultPath(p, searchPath));\n\t\t\t\t\t\t\tconst resultLimitReached = relativized.length >= effectiveLimit;\n\t\t\t\t\t\t\tconst rawOutput = relativized.join(\"\\n\");\n\t\t\t\t\t\t\tconst truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\t\t\t\t\tconst details: FindToolDetails = {};\n\t\t\t\t\t\t\tconst notices: string[] = [];\n\t\t\t\t\t\t\tif (resultLimitReached) {\n\t\t\t\t\t\t\t\tnotices.push(`${effectiveLimit} results limit reached`);\n\t\t\t\t\t\t\t\tdetails.resultLimitReached = effectiveLimit;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (truncation.truncated) {\n\t\t\t\t\t\t\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);\n\t\t\t\t\t\t\t\tdetails.truncation = truncation;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst content: TextContent[] = [{ type: \"text\", text: truncation.content }];\n\t\t\t\t\t\t\tif (notices.length > 0) {\n\t\t\t\t\t\t\t\tcontent[0].text += \"\\n\";\n\t\t\t\t\t\t\t\tcontent.push(modelOnlyText(`[${notices.join(\". \")}]`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\t\tdetails: Object.keys(details).length > 0 ? details : undefined,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Default implementation uses fd.\n\t\t\t\t\t\tconst fdPath = await ensureTool(\"fd\");\n\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!fdPath) {\n\t\t\t\t\t\t\tsettle(() => reject(new Error(\"fd is not available and could not be downloaded\")));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst args: string[] = [\"--glob\", \"--color=never\", \"--hidden\"];\n\n\t\t\t\t\t\t// fd normally ignores .gitignore outside git repos, so keep --no-require-git\n\t\t\t\t\t\t// there. Inside repos, use fd's default git-aware behavior so parent\n\t\t\t\t\t\t// .gitignore rules stop at nested repo boundaries:\n\t\t\t\t\t\t// https://github.com/earendil-works/pi/issues/5960\n\t\t\t\t\t\tlet insideGitRepo = false;\n\t\t\t\t\t\tfor (let current = searchPath; ; ) {\n\t\t\t\t\t\t\tif (await pathExists(path.join(current, \".git\"))) {\n\t\t\t\t\t\t\t\tinsideGitRepo = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst parent = path.dirname(current);\n\t\t\t\t\t\t\tif (parent === current) break;\n\t\t\t\t\t\t\tcurrent = parent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!insideGitRepo) args.push(\"--no-require-git\");\n\t\t\t\t\t\targs.push(\"--max-results\", String(effectiveLimit));\n\n\t\t\t\t\t\t// fd --glob matches against the basename unless --full-path is set; in --full-path\n\t\t\t\t\t\t// mode it matches against the absolute candidate path, so a path-containing\n\t\t\t\t\t\t// pattern like 'src/**/*.spec.ts' needs a leading '**/' to match anything.\n\t\t\t\t\t\tlet effectivePattern = pattern;\n\t\t\t\t\t\tif (pattern.includes(\"/\")) {\n\t\t\t\t\t\t\targs.push(\"--full-path\");\n\t\t\t\t\t\t\tif (!pattern.startsWith(\"/\") && !pattern.startsWith(\"**/\") && pattern !== \"**\") {\n\t\t\t\t\t\t\t\teffectivePattern = `**/${pattern}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// fd matches full paths using native separators on Windows.\n\t\t\t\t\t\t\tif (process.platform === \"win32\")\n\t\t\t\t\t\t\t\teffectivePattern = effectivePattern.replaceAll(\"/\", String.raw`[/\\\\]`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\targs.push(\"--\", effectivePattern, searchPath);\n\n\t\t\t\t\t\tconst child = spawn(fdPath, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n\t\t\t\t\t\tconst rl = createInterface({ input: child.stdout });\n\t\t\t\t\t\tlet stderr = \"\";\n\t\t\t\t\t\tconst lines: string[] = [];\n\n\t\t\t\t\t\tstopChild = () => {\n\t\t\t\t\t\t\tif (!child.killed) {\n\t\t\t\t\t\t\t\tchild.kill();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst cleanup = () => {\n\t\t\t\t\t\t\trl.close();\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tchild.stderr?.on(\"data\", (chunk) => {\n\t\t\t\t\t\t\tstderr += chunk.toString();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\trl.on(\"line\", (line) => {\n\t\t\t\t\t\t\tlines.push(line);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\t\tsettle(() => reject(new Error(`Failed to run fd: ${error.message}`)));\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst output = lines.join(\"\\n\");\n\t\t\t\t\t\t\tif (code !== 0) {\n\t\t\t\t\t\t\t\tconst errorMsg = stderr.trim() || `fd exited with code ${code}`;\n\t\t\t\t\t\t\t\tif (!output) {\n\t\t\t\t\t\t\t\t\tsettle(() => reject(new Error(errorMsg)));\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!output) {\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No files found matching pattern\" }],\n\t\t\t\t\t\t\t\t\t\tdetails: undefined,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst relativized: string[] = [];\n\t\t\t\t\t\t\tfor (const rawLine of lines) {\n\t\t\t\t\t\t\t\tconst line = rawLine.replace(/\\r$/, \"\").trim();\n\t\t\t\t\t\t\t\tif (!line) continue;\n\t\t\t\t\t\t\t\trelativized.push(relativizeFindResultPath(line, searchPath));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst resultLimitReached = relativized.length >= effectiveLimit;\n\t\t\t\t\t\t\tconst rawOutput = relativized.join(\"\\n\");\n\t\t\t\t\t\t\tconst truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\t\t\t\t\tconst details: FindToolDetails = {};\n\t\t\t\t\t\t\tconst notices: string[] = [];\n\t\t\t\t\t\t\tif (resultLimitReached) {\n\t\t\t\t\t\t\t\tnotices.push(\n\t\t\t\t\t\t\t\t\t`${effectiveLimit} results limit reached. Use limit=${effectiveLimit * 2} for more, or refine pattern`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tdetails.resultLimitReached = effectiveLimit;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (truncation.truncated) {\n\t\t\t\t\t\t\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);\n\t\t\t\t\t\t\t\tdetails.truncation = truncation;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst content: TextContent[] = [{ type: \"text\", text: truncation.content }];\n\t\t\t\t\t\t\tif (notices.length > 0) {\n\t\t\t\t\t\t\t\tcontent[0].text += \"\\n\";\n\t\t\t\t\t\t\t\tcontent.push(modelOnlyText(`[${notices.join(\". \")}]`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\t\tdetails: Object.keys(details).length > 0 ? details : undefined,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst error = e instanceof Error ? e : new Error(String(e));\n\t\t\t\t\t\tsettle(() => reject(error));\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t});\n\t\t},\n\t\t...findRenderers,\n\t};\n}\n\nexport function createFindTool(cwd: string, options?: FindToolOptions): AgentTool<typeof findSchema> {\n\treturn wrapToolDefinition(createFindToolDefinition(cwd, options));\n}\n"]}
@@ -1,7 +1,8 @@
1
+ import type { TextContent } from "@earendil-works/pi-ai";
1
2
  import type { GrepToolDetails } from "./index.ts";
2
3
  export declare function displayPath(path: string): string;
3
4
  /** now supplies the elapsed duration, allowing deterministic text in renderer tests. */
4
- export declare function formatGrepText(result: GrepToolDetails, { now }?: {
5
+ export declare function formatGrepContent(result: GrepToolDetails, { now }?: {
5
6
  now?: () => number;
6
- }): string;
7
+ }): TextContent[];
7
8
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/grep/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAC7B,MAAM,EAAE,eAAe,EACvB,EAAE,GAAiC,EAAE,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GAChE,MAAM,CAiDR"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/grep/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,eAAe,EACvB,EAAE,GAAiC,EAAE,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GAChE,WAAW,EAAE,CAgDf"}
@@ -1,8 +1,9 @@
1
+ import { modelOnlyText } from "../model-only-text.js";
1
2
  export function displayPath(path) {
2
3
  return /[\x00-\x1f\x7f]/.test(path) ? JSON.stringify(path) : path;
3
4
  }
4
5
  /** now supplies the elapsed duration, allowing deterministic text in renderer tests. */
5
- export function formatGrepText(result, { now = () => result.scan.elapsedMs } = {}) {
6
+ export function formatGrepContent(result, { now = () => result.scan.elapsedMs } = {}) {
6
7
  const blocks = [];
7
8
  if (result.matches.length) {
8
9
  for (const file of result.fileMatches) {
@@ -41,7 +42,8 @@ export function formatGrepText(result, { now = () => result.scan.elapsedMs } = {
41
42
  notes.push(`Pattern searched literally: ${scan.effectivePattern}`);
42
43
  if (scan.patternKind === "sanitized")
43
44
  notes.push(`Pattern sanitized: ${scan.effectivePattern}`);
44
- notes.push(`[grep: matches=${result.matchCount ?? "n/a"} files=${result.fileCount} searched=${scan.filesSearched} elapsedMs=${Math.max(0, Math.round(now()))} engine=${result.engine} nextSkip=${result.nextSkip ?? "none"}]`);
45
- return `${blocks.join("\n\n")}\n\n${notes.join("\n")}`;
45
+ const footer = `[grep: matches=${result.matchCount ?? "n/a"} files=${result.fileCount} searched=${scan.filesSearched} elapsedMs=${Math.max(0, Math.round(now()))} engine=${result.engine} nextSkip=${result.nextSkip ?? "none"}]`;
46
+ const body = `${blocks.join("\n\n")}\n${notes.length ? `\n${notes.join("\n")}` : ""}`;
47
+ return [{ type: "text", text: body }, modelOnlyText(footer)];
46
48
  }
47
49
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../src/core/tools/grep/format.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,cAAc,CAC7B,MAAuB,EACvB,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAA2B,EAAE;IAElE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CACV,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACzG,IAAI,CACJ,CACD,CAAC;QACH,CAAC;IACF,CAAC;SAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CACV,MAAM,CAAC,WAAW;aAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;aAC1G,IAAI,CAAC,IAAI,CAAC,CACZ,CAAC;IACH,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,IAAI,CACV,MAAM,CAAC,MAAM,KAAK,SAAS;YAC1B,CAAC,CAAC,yBAAyB,MAAM,CAAC,IAAI,GAAG;YACzC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;gBAC5B,CAAC,CAAC,sCAAsC;gBACxC,CAAC,CAAC,kBAAkB,CACtB,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,IAAI,CAAC,cAAc;QACtB,KAAK,CAAC,IAAI,CACT,sDAAsD,IAAI,CAAC,cAAc,4CAA4C,CACrH,CAAC;IACH,IAAI,IAAI,CAAC,gBAAgB;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,gBAAgB,yCAAyC,CAAC,CAAC;IACjH,IAAI,IAAI,CAAC,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,kBAAkB,CAAC,CAAC;IACpF,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;QAC3B,KAAK,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzF,IAAI,IAAI,CAAC,QAAQ;QAChB,KAAK,CAAC,IAAI,CACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,OAAO;YACzD,iEAAiE,CAClE,CAAC;IACH,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO;QAC/B,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACrF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,+BAA+B,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvG,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAChG,KAAK,CAAC,IAAI,CACT,kBAAkB,MAAM,CAAC,UAAU,IAAI,KAAK,UAAU,MAAM,CAAC,SAAS,aAAa,IAAI,CAAC,aAAa,cAAc,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,MAAM,CAAC,MAAM,aAAa,MAAM,CAAC,QAAQ,IAAI,MAAM,GAAG,CAClN,CAAC;IACF,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACxD,CAAC","sourcesContent":["import type { GrepToolDetails } from \"./index.ts\";\n\nexport function displayPath(path: string): string {\n\treturn /[\\x00-\\x1f\\x7f]/.test(path) ? JSON.stringify(path) : path;\n}\n\n/** now supplies the elapsed duration, allowing deterministic text in renderer tests. */\nexport function formatGrepText(\n\tresult: GrepToolDetails,\n\t{ now = () => result.scan.elapsedMs }: { now?: () => number } = {},\n): string {\n\tconst blocks: string[] = [];\n\tif (result.matches.length) {\n\t\tfor (const file of result.fileMatches) {\n\t\t\tconst rows = result.matches.filter((match) => match.path === file.path);\n\t\t\tblocks.push(\n\t\t\t\t[displayPath(file.path), ...rows.map((row) => `${row.line}${row.isContext ? \"-\" : \":\"} ${row.text}`)].join(\n\t\t\t\t\t\"\\n\",\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t} else if (result.fileCount) {\n\t\tblocks.push(\n\t\t\tresult.fileMatches\n\t\t\t\t.map((file) => (file.count === null ? displayPath(file.path) : `${displayPath(file.path)}: ${file.count}`))\n\t\t\t\t.join(\"\\n\"),\n\t\t);\n\t} else {\n\t\tblocks.push(\n\t\t\tresult.status === \"pageEnd\"\n\t\t\t\t? `No more results (skip=${result.skip})`\n\t\t\t\t: result.status === \"partial\"\n\t\t\t\t\t? \"No matches found in searched portion\"\n\t\t\t\t\t: \"No matches found\",\n\t\t);\n\t}\n\tconst notes: string[] = [];\n\tconst scan = result.scan;\n\tif (scan.prefixSearched)\n\t\tnotes.push(\n\t\t\t`Partial coverage: searched only the first 4 MiB of ${scan.prefixSearched} large file(s); later matches are omitted.`,\n\t\t);\n\tif (scan.skippedOversized) notes.push(`Skipped ${scan.skippedOversized} unreadable/unsearchable large file(s).`);\n\tif (scan.skippedBinary) notes.push(`Skipped ${scan.skippedBinary} binary file(s).`);\n\tif (scan.missingPaths.length)\n\t\tnotes.push(`Skipped missing path(s): ${scan.missingPaths.map(displayPath).join(\", \")}`);\n\tif (scan.timedOut)\n\t\tnotes.push(\n\t\t\tscan.warnings.find((w) => w.code === \"TIMED_OUT\")?.message ??\n\t\t\t\t\"Timed out after 30000 ms; showing the completed ordered prefix.\",\n\t\t);\n\tif (scan.regexEngine === \"pcre2\")\n\t\tnotes.push(\"Regex unsupported by the native engine; matched with ripgrep --pcre2.\");\n\tif (scan.patternKind === \"literal\") notes.push(`Pattern searched literally: ${scan.effectivePattern}`);\n\tif (scan.patternKind === \"sanitized\") notes.push(`Pattern sanitized: ${scan.effectivePattern}`);\n\tnotes.push(\n\t\t`[grep: matches=${result.matchCount ?? \"n/a\"} files=${result.fileCount} searched=${scan.filesSearched} elapsedMs=${Math.max(0, Math.round(now()))} engine=${result.engine} nextSkip=${result.nextSkip ?? \"none\"}]`,\n\t);\n\treturn `${blocks.join(\"\\n\\n\")}\\n\\n${notes.join(\"\\n\")}`;\n}\n"]}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../src/core/tools/grep/format.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAChC,MAAuB,EACvB,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAA2B,EAAE;IAElE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CACV,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACzG,IAAI,CACJ,CACD,CAAC;QACH,CAAC;IACF,CAAC;SAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CACV,MAAM,CAAC,WAAW;aAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;aAC1G,IAAI,CAAC,IAAI,CAAC,CACZ,CAAC;IACH,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,IAAI,CACV,MAAM,CAAC,MAAM,KAAK,SAAS;YAC1B,CAAC,CAAC,yBAAyB,MAAM,CAAC,IAAI,GAAG;YACzC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;gBAC5B,CAAC,CAAC,sCAAsC;gBACxC,CAAC,CAAC,kBAAkB,CACtB,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,IAAI,CAAC,cAAc;QACtB,KAAK,CAAC,IAAI,CACT,sDAAsD,IAAI,CAAC,cAAc,4CAA4C,CACrH,CAAC;IACH,IAAI,IAAI,CAAC,gBAAgB;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,gBAAgB,yCAAyC,CAAC,CAAC;IACjH,IAAI,IAAI,CAAC,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,kBAAkB,CAAC,CAAC;IACpF,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;QAC3B,KAAK,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzF,IAAI,IAAI,CAAC,QAAQ;QAChB,KAAK,CAAC,IAAI,CACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,OAAO;YACzD,iEAAiE,CAClE,CAAC;IACH,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO;QAC/B,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACrF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,+BAA+B,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvG,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAChG,MAAM,MAAM,GAAG,kBAAkB,MAAM,CAAC,UAAU,IAAI,KAAK,UAAU,MAAM,CAAC,SAAS,aAAa,IAAI,CAAC,aAAa,cAAc,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,MAAM,CAAC,MAAM,aAAa,MAAM,CAAC,QAAQ,IAAI,MAAM,GAAG,CAAC;IAClO,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACtF,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9D,CAAC","sourcesContent":["import type { TextContent } from \"@earendil-works/pi-ai\";\nimport { modelOnlyText } from \"../model-only-text.ts\";\nimport type { GrepToolDetails } from \"./index.ts\";\n\nexport function displayPath(path: string): string {\n\treturn /[\\x00-\\x1f\\x7f]/.test(path) ? JSON.stringify(path) : path;\n}\n\n/** now supplies the elapsed duration, allowing deterministic text in renderer tests. */\nexport function formatGrepContent(\n\tresult: GrepToolDetails,\n\t{ now = () => result.scan.elapsedMs }: { now?: () => number } = {},\n): TextContent[] {\n\tconst blocks: string[] = [];\n\tif (result.matches.length) {\n\t\tfor (const file of result.fileMatches) {\n\t\t\tconst rows = result.matches.filter((match) => match.path === file.path);\n\t\t\tblocks.push(\n\t\t\t\t[displayPath(file.path), ...rows.map((row) => `${row.line}${row.isContext ? \"-\" : \":\"} ${row.text}`)].join(\n\t\t\t\t\t\"\\n\",\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t} else if (result.fileCount) {\n\t\tblocks.push(\n\t\t\tresult.fileMatches\n\t\t\t\t.map((file) => (file.count === null ? displayPath(file.path) : `${displayPath(file.path)}: ${file.count}`))\n\t\t\t\t.join(\"\\n\"),\n\t\t);\n\t} else {\n\t\tblocks.push(\n\t\t\tresult.status === \"pageEnd\"\n\t\t\t\t? `No more results (skip=${result.skip})`\n\t\t\t\t: result.status === \"partial\"\n\t\t\t\t\t? \"No matches found in searched portion\"\n\t\t\t\t\t: \"No matches found\",\n\t\t);\n\t}\n\tconst notes: string[] = [];\n\tconst scan = result.scan;\n\tif (scan.prefixSearched)\n\t\tnotes.push(\n\t\t\t`Partial coverage: searched only the first 4 MiB of ${scan.prefixSearched} large file(s); later matches are omitted.`,\n\t\t);\n\tif (scan.skippedOversized) notes.push(`Skipped ${scan.skippedOversized} unreadable/unsearchable large file(s).`);\n\tif (scan.skippedBinary) notes.push(`Skipped ${scan.skippedBinary} binary file(s).`);\n\tif (scan.missingPaths.length)\n\t\tnotes.push(`Skipped missing path(s): ${scan.missingPaths.map(displayPath).join(\", \")}`);\n\tif (scan.timedOut)\n\t\tnotes.push(\n\t\t\tscan.warnings.find((w) => w.code === \"TIMED_OUT\")?.message ??\n\t\t\t\t\"Timed out after 30000 ms; showing the completed ordered prefix.\",\n\t\t);\n\tif (scan.regexEngine === \"pcre2\")\n\t\tnotes.push(\"Regex unsupported by the native engine; matched with ripgrep --pcre2.\");\n\tif (scan.patternKind === \"literal\") notes.push(`Pattern searched literally: ${scan.effectivePattern}`);\n\tif (scan.patternKind === \"sanitized\") notes.push(`Pattern sanitized: ${scan.effectivePattern}`);\n\tconst footer = `[grep: matches=${result.matchCount ?? \"n/a\"} files=${result.fileCount} searched=${scan.filesSearched} elapsedMs=${Math.max(0, Math.round(now()))} engine=${result.engine} nextSkip=${result.nextSkip ?? \"none\"}]`;\n\tconst body = `${blocks.join(\"\\n\\n\")}\\n${notes.length ? `\\n${notes.join(\"\\n\")}` : \"\"}`;\n\treturn [{ type: \"text\", text: body }, modelOnlyText(footer)];\n}\n"]}
@@ -6,7 +6,7 @@ import { resolveToCwd } from "../path-utils.js";
6
6
  import { grepRenderers } from "../renderers/grep.js";
7
7
  import { wrapToolDefinition } from "../tool-definition-wrapper.js";
8
8
  import { DEFAULT_MAX_BYTES, GREP_MAX_LINE_LENGTH } from "../truncate.js";
9
- import { formatGrepText } from "./format.js";
9
+ import { formatGrepContent } from "./format.js";
10
10
  import { searchPattern } from "./pattern.js";
11
11
  import { resolveGrepEngine } from "./select-engine.js";
12
12
  const strings = () => Type.Optional(Type.Union([Type.String(), Type.Array(Type.String())]));
@@ -233,7 +233,7 @@ export function createGrepToolDefinition(cwd, options) {
233
233
  scan,
234
234
  linesTruncated: matches.some((row) => row.truncated),
235
235
  };
236
- return { content: [{ type: "text", text: formatGrepText(details) }], details };
236
+ return { content: formatGrepContent(details), details };
237
237
  },
238
238
  ...grepRenderers,
239
239
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/tools/grep/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport type { FilesystemPolicyChecker, ToolDefinition } from \"../../extensions/types.ts\";\nimport { canonicalizeFilesystemPath } from \"../filesystem-policy.ts\";\nimport { resolveToCwd } from \"../path-utils.ts\";\nimport { grepRenderers } from \"../renderers/grep.ts\";\nimport { wrapToolDefinition } from \"../tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, GREP_MAX_LINE_LENGTH, type TruncationResult } from \"../truncate.ts\";\nimport type { GrepEngineMatch, GrepEngineRequest, GrepEngineResult } from \"./engine.ts\";\nimport { formatGrepText } from \"./format.ts\";\nimport { searchPattern } from \"./pattern.ts\";\nimport { resolveGrepEngine } from \"./select-engine.ts\";\n\nconst strings = () => Type.Optional(Type.Union([Type.String(), Type.Array(Type.String())]));\nconst grepSchema = Type.Object({\n\tpattern: Type.String(),\n\tpath: strings(),\n\tglob: strings(),\n\ttype: Type.Optional(Type.String()),\n\tignoreCase: Type.Optional(Type.Boolean()),\n\tliteral: Type.Optional(Type.Boolean()),\n\tmultiline: Type.Optional(Type.Boolean()),\n\tcontext: Type.Optional(Type.Number()),\n\tbefore: Type.Optional(Type.Number()),\n\tafter: Type.Optional(Type.Number()),\n\tmode: Type.Optional(Type.Union([Type.Literal(\"content\"), Type.Literal(\"count\"), Type.Literal(\"files\")])),\n\tlimit: Type.Optional(Type.Number()),\n\tskip: Type.Optional(Type.Number()),\n\ttimeoutMs: Type.Optional(Type.Number()),\n\thidden: Type.Optional(Type.Boolean()),\n\tgitignore: Type.Optional(Type.Boolean()),\n});\nexport type GrepToolInput = Static<typeof grepSchema>;\nexport const grepToolSystemPromptContribution = {\n\tsnippet: \"Search file contents (regex/literal) across paths with structured results; respects .gitignore\",\n\tguidelines: [\n\t\t\"Use tool.grep for content search instead of rg/grep in a shell; paginate with skip and narrow with glob/path when a page is full\",\n\t],\n};\nexport interface GrepToolDetails {\n\tversion: 1;\n\tengine: \"native\" | \"rg\";\n\tstatus: \"ok\" | \"noMatch\" | \"pageEnd\" | \"partial\";\n\tcwd: string;\n\tpaths: string[];\n\tmatches: GrepEngineMatch[];\n\tfileMatches: Array<{ path: string; count: number | null }>;\n\tmatchCount: number | null;\n\tfileCount: number;\n\tskip: number;\n\tnextSkip: number | null;\n\tfileLimitReached: boolean;\n\tperFileLimitReached: boolean;\n\ttotalLimitReached: boolean;\n\tscan: Omit<GrepEngineResult, \"matches\" | \"fileCounts\">;\n\ttruncation?: TruncationResult;\n\tlinesTruncated?: boolean;\n}\n/** @deprecated No longer honored; removed next release. Use the engine-backed local tool. */\nexport interface GrepOperations {\n\tisDirectory: (absolutePath: string) => Promise<boolean> | boolean;\n\treadFile: (absolutePath: string) => Promise<string> | string;\n}\nexport interface GrepToolOptions {\n\tfilesystemPolicy?: FilesystemPolicyChecker;\n}\n\nasync function pathStat(path: string) {\n\ttry {\n\t\treturn await stat(path);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n\t\tthrow error;\n\t}\n}\n\nexport function createGrepToolDefinition(\n\tcwd: string,\n\toptions?: GrepToolOptions,\n): ToolDefinition<typeof grepSchema, GrepToolDetails> {\n\tif (options && \"operations\" in options)\n\t\tthrow new TypeError(\"GrepToolOptions.operations is deprecated and no longer supported; removed next release\");\n\treturn {\n\t\tname: \"grep\",\n\t\tlabel: \"grep\",\n\t\texposure: \"eval\",\n\t\tdescription:\n\t\t\t\"Search file contents with tool.grep({ pattern, path }) inside eval. Supports regex/literal patterns, file pages with skip, context, count/files modes, and structured results. Respects .gitignore.\",\n\t\tpromptSnippet: grepToolSystemPromptContribution.snippet,\n\t\tpromptGuidelines: grepToolSystemPromptContribution.guidelines,\n\t\tparameters: grepSchema,\n\t\tasync execute(_id, input, signal, _update, ctx) {\n\t\t\tconst started = Date.now();\n\t\t\tif (!input.pattern) throw new Error(\"Pattern must not be empty\");\n\t\t\tconst requested = input.path === undefined ? [\".\"] : Array.isArray(input.path) ? input.path : [input.path];\n\t\t\tif (!requested.length || requested.some((p) => typeof p !== \"string\" || !p.length))\n\t\t\t\tthrow new Error(\"path must be a non-empty string or array of non-empty strings\");\n\t\t\tconst limit = input.limit ?? 100;\n\t\t\tif (!Number.isInteger(input.skip ?? 0) || (input.skip ?? 0) < 0)\n\t\t\t\tthrow new Error(\"skip must be a non-negative integer\");\n\t\t\tif (!Number.isInteger(limit) || limit <= 0) throw new Error(\"limit must be a positive integer\");\n\t\t\tconst workingCwd = ctx?.cwd || cwd;\n\t\t\tconst paths: string[] = [];\n\t\t\tconst missingPaths: string[] = [];\n\t\t\tlet lineStart: number | undefined;\n\t\t\tlet lineEnd: number | undefined;\n\t\t\tlet singleFile = false;\n\t\t\tfor (const raw of requested) {\n\t\t\t\tlet path = resolveToCwd(raw, workingCwd);\n\t\t\t\tlet info = await pathStat(path);\n\t\t\t\tif (!info) {\n\t\t\t\t\tconst selector = /^(.*):L(\\d+)-L?(\\d+)$/.exec(path);\n\t\t\t\t\tif (selector) {\n\t\t\t\t\t\tconst prefix = await pathStat(selector[1]);\n\t\t\t\t\t\tif (prefix?.isFile()) {\n\t\t\t\t\t\t\tif (requested.length !== 1 || +selector[2] < 1 || +selector[3] < +selector[2])\n\t\t\t\t\t\t\t\tthrow new Error(\"Invalid line selector\");\n\t\t\t\t\t\t\tpath = selector[1];\n\t\t\t\t\t\t\tinfo = prefix;\n\t\t\t\t\t\t\tlineStart = +selector[2];\n\t\t\t\t\t\t\tlineEnd = +selector[3];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst canonicalPath = await canonicalizeFilesystemPath(path);\n\t\t\t\tif (options?.filesystemPolicy) {\n\t\t\t\t\tconst decision = await options.filesystemPolicy({\n\t\t\t\t\t\toperation: \"enumerate\",\n\t\t\t\t\t\tcanonicalPath,\n\t\t\t\t\t\ttoolName: \"grep\",\n\t\t\t\t\t});\n\t\t\t\t\tif (!decision.allow) throw new Error(decision.reason);\n\t\t\t\t}\n\t\t\t\tif (!info) {\n\t\t\t\t\tmissingPaths.push(path);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tpaths.push(path);\n\t\t\t\tsingleFile = info.isFile();\n\t\t\t}\n\t\t\tif (!paths.length) throw new Error(`Path not found: ${missingPaths.join(\", \")}`);\n\t\t\tsingleFile = paths.length === 1 && singleFile;\n\t\t\tconst skip = singleFile ? 0 : (input.skip ?? 0);\n\t\t\tconst mode = input.mode ?? \"content\";\n\t\t\tconst pageSize = Math.min(20, limit);\n\t\t\tconst cap = singleFile ? 200 : 20;\n\t\t\tconst before = input.before ?? input.context ?? 0;\n\t\t\tconst after = input.after ?? input.context ?? 0;\n\t\t\tconst request: GrepEngineRequest = {\n\t\t\t\tpattern: input.pattern,\n\t\t\t\tpaths,\n\t\t\t\tcwd: workingCwd,\n\t\t\t\tglob: input.glob === undefined ? undefined : Array.isArray(input.glob) ? input.glob : [input.glob],\n\t\t\t\ttype: input.type,\n\t\t\t\tignoreCase: input.ignoreCase,\n\t\t\t\tliteral: input.literal,\n\t\t\t\tmultiline: input.multiline ?? (input.pattern.includes(\"\\n\") || input.pattern.includes(\"\\\\n\")),\n\t\t\t\thidden: input.hidden,\n\t\t\t\tgitignore: input.gitignore,\n\t\t\t\tcontextBefore: before,\n\t\t\t\tcontextAfter: after,\n\t\t\t\tmaxColumns: GREP_MAX_LINE_LENGTH,\n\t\t\t\ttimeoutMs: input.timeoutMs ?? 30000,\n\t\t\t\tlineStart,\n\t\t\t\tlineEnd,\n\t\t\t\tmode,\n\t\t\t};\n\t\t\tlet engine = await resolveGrepEngine();\n\t\t\tlet preselection: GrepEngineResult | undefined;\n\t\t\tlet selected: string[] = [];\n\t\t\tlet more = false;\n\t\t\tif (!singleFile) {\n\t\t\t\tconst first = await searchPattern(\n\t\t\t\t\tengine,\n\t\t\t\t\t{ ...request, mode: \"files\", maxCount: skip + pageSize + 1 },\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\t\t\t\tengine = first.engine;\n\t\t\t\tpreselection = first.result;\n\t\t\t\tselected = first.result.fileCounts.slice(skip, skip + pageSize).map((file) => file.path);\n\t\t\t\tmore = first.result.fileCounts.length > skip + selected.length;\n\t\t\t}\n\t\t\tlet result: GrepEngineResult;\n\t\t\tif (!singleFile && !selected.length) result = preselection!;\n\t\t\telse if (mode === \"files\" && preselection)\n\t\t\t\tresult = { ...preselection, fileCounts: preselection.fileCounts.slice(skip, skip + pageSize) };\n\t\t\telse {\n\t\t\t\tconst response = await searchPattern(\n\t\t\t\t\tengine,\n\t\t\t\t\t{\n\t\t\t\t\t\t...request,\n\t\t\t\t\t\tpaths: singleFile ? paths : selected.map((path) => resolve(workingCwd, path)),\n\t\t\t\t\t\tmaxCountPerFile: mode === \"content\" ? cap + 1 : undefined,\n\t\t\t\t\t\ttimeoutMs: Math.max(0, (input.timeoutMs ?? 30000) - (Date.now() - started)),\n\t\t\t\t\t},\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\t\t\t\tengine = response.engine;\n\t\t\t\tresult = response.result;\n\t\t\t}\n\t\t\tlet matches: GrepEngineMatch[] = [];\n\t\t\tlet fileMatches: Array<{ path: string; count: number | null }> = [];\n\t\t\tlet perFileLimitReached = false;\n\t\t\tlet totalLimitReached = false;\n\t\t\tif (mode === \"content\") {\n\t\t\t\tconst groups = new Map<string, GrepEngineMatch[]>();\n\t\t\t\tfor (const row of result.matches)\n\t\t\t\t\tif (!row.isContext) {\n\t\t\t\t\t\tconst rows = groups.get(row.path) ?? [];\n\t\t\t\t\t\trows.push(row);\n\t\t\t\t\t\tgroups.set(row.path, rows);\n\t\t\t\t\t}\n\t\t\t\tconst admitted = new Set<GrepEngineMatch>();\n\t\t\t\tfor (let round = 0; round < cap && admitted.size < limit; round++) {\n\t\t\t\t\tfor (const rows of groups.values()) {\n\t\t\t\t\t\tif (rows[round] && admitted.size < limit) admitted.add(rows[round]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tperFileLimitReached = [...groups.values()].some((rows) => rows.length > cap);\n\t\t\t\ttotalLimitReached =\n\t\t\t\t\t[...groups.values()].reduce((n, rows) => n + Math.min(cap, rows.length), 0) > admitted.size;\n\t\t\t\t// Context belongs only to admitted matches, not to discarded matches from the second phase.\n\t\t\t\tmatches = result.matches.filter(\n\t\t\t\t\t(row) =>\n\t\t\t\t\t\tadmitted.has(row) ||\n\t\t\t\t\t\t(row.isContext &&\n\t\t\t\t\t\t\t[...admitted].some(\n\t\t\t\t\t\t\t\t(match) =>\n\t\t\t\t\t\t\t\t\tmatch.path === row.path && row.line >= match.line - before && row.line <= match.line + after,\n\t\t\t\t\t\t\t)),\n\t\t\t\t);\n\t\t\t\tlet bytes = 0;\n\t\t\t\tmatches = matches.filter((row) => {\n\t\t\t\t\tbytes += Buffer.byteLength(`${row.path}\\n${row.line}: ${row.text}\\n`);\n\t\t\t\t\tif (bytes > DEFAULT_MAX_BYTES - 2048) {\n\t\t\t\t\t\ttotalLimitReached = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t\tconst counts = new Map<string, number>();\n\t\t\t\tfor (const row of matches) if (!row.isContext) counts.set(row.path, (counts.get(row.path) ?? 0) + 1);\n\t\t\t\tmatches = matches.filter((row) => counts.has(row.path));\n\t\t\t\tfileMatches = [...counts].map(([path, count]) => ({ path, count }));\n\t\t\t} else if (singleFile || selected.length)\n\t\t\t\tfileMatches = result.fileCounts.map(({ path, count }) => ({ path, count }));\n\t\t\tconst { matches: _matches, fileCounts: _fileCounts, ...scan } = preselection ?? result;\n\t\t\tscan.missingPaths = missingPaths;\n\t\t\tscan.elapsedMs = Date.now() - started;\n\t\t\tscan.effectivePattern = result.effectivePattern;\n\t\t\tscan.patternKind = result.patternKind;\n\t\t\tscan.regexEngine = result.regexEngine;\n\t\t\tscan.timedOut ||= result.timedOut;\n\t\t\tif (result.timedOut && preselection) scan.warnings = [...scan.warnings, ...result.warnings];\n\t\t\tconst partial = scan.timedOut || scan.prefixSearched > 0 || scan.skippedOversized > 0;\n\t\t\tconst details: GrepToolDetails = {\n\t\t\t\tversion: 1,\n\t\t\t\tengine: engine.name,\n\t\t\t\tstatus: partial ? \"partial\" : fileMatches.length ? \"ok\" : skip ? \"pageEnd\" : \"noMatch\",\n\t\t\t\tcwd: workingCwd,\n\t\t\t\tpaths,\n\t\t\t\tmatches,\n\t\t\t\tfileMatches,\n\t\t\t\tmatchCount: mode === \"files\" ? null : fileMatches.reduce((n, file) => n + (file.count ?? 0), 0),\n\t\t\t\tfileCount: fileMatches.length,\n\t\t\t\tskip,\n\t\t\t\tnextSkip: more ? skip + selected.length : null,\n\t\t\t\tfileLimitReached: more,\n\t\t\t\tperFileLimitReached,\n\t\t\t\ttotalLimitReached,\n\t\t\t\tscan,\n\t\t\t\tlinesTruncated: matches.some((row) => row.truncated),\n\t\t\t};\n\t\t\treturn { content: [{ type: \"text\", text: formatGrepText(details) }], details };\n\t\t},\n\t\t...grepRenderers,\n\t};\n}\nexport function createGrepTool(cwd: string, options?: GrepToolOptions): AgentTool<typeof grepSchema> {\n\treturn wrapToolDefinition(createGrepToolDefinition(cwd, options));\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/tools/grep/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport type { FilesystemPolicyChecker, ToolDefinition } from \"../../extensions/types.ts\";\nimport { canonicalizeFilesystemPath } from \"../filesystem-policy.ts\";\nimport { resolveToCwd } from \"../path-utils.ts\";\nimport { grepRenderers } from \"../renderers/grep.ts\";\nimport { wrapToolDefinition } from \"../tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, GREP_MAX_LINE_LENGTH, type TruncationResult } from \"../truncate.ts\";\nimport type { GrepEngineMatch, GrepEngineRequest, GrepEngineResult } from \"./engine.ts\";\nimport { formatGrepContent } from \"./format.ts\";\nimport { searchPattern } from \"./pattern.ts\";\nimport { resolveGrepEngine } from \"./select-engine.ts\";\n\nconst strings = () => Type.Optional(Type.Union([Type.String(), Type.Array(Type.String())]));\nconst grepSchema = Type.Object({\n\tpattern: Type.String(),\n\tpath: strings(),\n\tglob: strings(),\n\ttype: Type.Optional(Type.String()),\n\tignoreCase: Type.Optional(Type.Boolean()),\n\tliteral: Type.Optional(Type.Boolean()),\n\tmultiline: Type.Optional(Type.Boolean()),\n\tcontext: Type.Optional(Type.Number()),\n\tbefore: Type.Optional(Type.Number()),\n\tafter: Type.Optional(Type.Number()),\n\tmode: Type.Optional(Type.Union([Type.Literal(\"content\"), Type.Literal(\"count\"), Type.Literal(\"files\")])),\n\tlimit: Type.Optional(Type.Number()),\n\tskip: Type.Optional(Type.Number()),\n\ttimeoutMs: Type.Optional(Type.Number()),\n\thidden: Type.Optional(Type.Boolean()),\n\tgitignore: Type.Optional(Type.Boolean()),\n});\nexport type GrepToolInput = Static<typeof grepSchema>;\nexport const grepToolSystemPromptContribution = {\n\tsnippet: \"Search file contents (regex/literal) across paths with structured results; respects .gitignore\",\n\tguidelines: [\n\t\t\"Use tool.grep for content search instead of rg/grep in a shell; paginate with skip and narrow with glob/path when a page is full\",\n\t],\n};\nexport interface GrepToolDetails {\n\tversion: 1;\n\tengine: \"native\" | \"rg\";\n\tstatus: \"ok\" | \"noMatch\" | \"pageEnd\" | \"partial\";\n\tcwd: string;\n\tpaths: string[];\n\tmatches: GrepEngineMatch[];\n\tfileMatches: Array<{ path: string; count: number | null }>;\n\tmatchCount: number | null;\n\tfileCount: number;\n\tskip: number;\n\tnextSkip: number | null;\n\tfileLimitReached: boolean;\n\tperFileLimitReached: boolean;\n\ttotalLimitReached: boolean;\n\tscan: Omit<GrepEngineResult, \"matches\" | \"fileCounts\">;\n\ttruncation?: TruncationResult;\n\tlinesTruncated?: boolean;\n}\n/** @deprecated No longer honored; removed next release. Use the engine-backed local tool. */\nexport interface GrepOperations {\n\tisDirectory: (absolutePath: string) => Promise<boolean> | boolean;\n\treadFile: (absolutePath: string) => Promise<string> | string;\n}\nexport interface GrepToolOptions {\n\tfilesystemPolicy?: FilesystemPolicyChecker;\n}\n\nasync function pathStat(path: string) {\n\ttry {\n\t\treturn await stat(path);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n\t\tthrow error;\n\t}\n}\n\nexport function createGrepToolDefinition(\n\tcwd: string,\n\toptions?: GrepToolOptions,\n): ToolDefinition<typeof grepSchema, GrepToolDetails> {\n\tif (options && \"operations\" in options)\n\t\tthrow new TypeError(\"GrepToolOptions.operations is deprecated and no longer supported; removed next release\");\n\treturn {\n\t\tname: \"grep\",\n\t\tlabel: \"grep\",\n\t\texposure: \"eval\",\n\t\tdescription:\n\t\t\t\"Search file contents with tool.grep({ pattern, path }) inside eval. Supports regex/literal patterns, file pages with skip, context, count/files modes, and structured results. Respects .gitignore.\",\n\t\tpromptSnippet: grepToolSystemPromptContribution.snippet,\n\t\tpromptGuidelines: grepToolSystemPromptContribution.guidelines,\n\t\tparameters: grepSchema,\n\t\tasync execute(_id, input, signal, _update, ctx) {\n\t\t\tconst started = Date.now();\n\t\t\tif (!input.pattern) throw new Error(\"Pattern must not be empty\");\n\t\t\tconst requested = input.path === undefined ? [\".\"] : Array.isArray(input.path) ? input.path : [input.path];\n\t\t\tif (!requested.length || requested.some((p) => typeof p !== \"string\" || !p.length))\n\t\t\t\tthrow new Error(\"path must be a non-empty string or array of non-empty strings\");\n\t\t\tconst limit = input.limit ?? 100;\n\t\t\tif (!Number.isInteger(input.skip ?? 0) || (input.skip ?? 0) < 0)\n\t\t\t\tthrow new Error(\"skip must be a non-negative integer\");\n\t\t\tif (!Number.isInteger(limit) || limit <= 0) throw new Error(\"limit must be a positive integer\");\n\t\t\tconst workingCwd = ctx?.cwd || cwd;\n\t\t\tconst paths: string[] = [];\n\t\t\tconst missingPaths: string[] = [];\n\t\t\tlet lineStart: number | undefined;\n\t\t\tlet lineEnd: number | undefined;\n\t\t\tlet singleFile = false;\n\t\t\tfor (const raw of requested) {\n\t\t\t\tlet path = resolveToCwd(raw, workingCwd);\n\t\t\t\tlet info = await pathStat(path);\n\t\t\t\tif (!info) {\n\t\t\t\t\tconst selector = /^(.*):L(\\d+)-L?(\\d+)$/.exec(path);\n\t\t\t\t\tif (selector) {\n\t\t\t\t\t\tconst prefix = await pathStat(selector[1]);\n\t\t\t\t\t\tif (prefix?.isFile()) {\n\t\t\t\t\t\t\tif (requested.length !== 1 || +selector[2] < 1 || +selector[3] < +selector[2])\n\t\t\t\t\t\t\t\tthrow new Error(\"Invalid line selector\");\n\t\t\t\t\t\t\tpath = selector[1];\n\t\t\t\t\t\t\tinfo = prefix;\n\t\t\t\t\t\t\tlineStart = +selector[2];\n\t\t\t\t\t\t\tlineEnd = +selector[3];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst canonicalPath = await canonicalizeFilesystemPath(path);\n\t\t\t\tif (options?.filesystemPolicy) {\n\t\t\t\t\tconst decision = await options.filesystemPolicy({\n\t\t\t\t\t\toperation: \"enumerate\",\n\t\t\t\t\t\tcanonicalPath,\n\t\t\t\t\t\ttoolName: \"grep\",\n\t\t\t\t\t});\n\t\t\t\t\tif (!decision.allow) throw new Error(decision.reason);\n\t\t\t\t}\n\t\t\t\tif (!info) {\n\t\t\t\t\tmissingPaths.push(path);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tpaths.push(path);\n\t\t\t\tsingleFile = info.isFile();\n\t\t\t}\n\t\t\tif (!paths.length) throw new Error(`Path not found: ${missingPaths.join(\", \")}`);\n\t\t\tsingleFile = paths.length === 1 && singleFile;\n\t\t\tconst skip = singleFile ? 0 : (input.skip ?? 0);\n\t\t\tconst mode = input.mode ?? \"content\";\n\t\t\tconst pageSize = Math.min(20, limit);\n\t\t\tconst cap = singleFile ? 200 : 20;\n\t\t\tconst before = input.before ?? input.context ?? 0;\n\t\t\tconst after = input.after ?? input.context ?? 0;\n\t\t\tconst request: GrepEngineRequest = {\n\t\t\t\tpattern: input.pattern,\n\t\t\t\tpaths,\n\t\t\t\tcwd: workingCwd,\n\t\t\t\tglob: input.glob === undefined ? undefined : Array.isArray(input.glob) ? input.glob : [input.glob],\n\t\t\t\ttype: input.type,\n\t\t\t\tignoreCase: input.ignoreCase,\n\t\t\t\tliteral: input.literal,\n\t\t\t\tmultiline: input.multiline ?? (input.pattern.includes(\"\\n\") || input.pattern.includes(\"\\\\n\")),\n\t\t\t\thidden: input.hidden,\n\t\t\t\tgitignore: input.gitignore,\n\t\t\t\tcontextBefore: before,\n\t\t\t\tcontextAfter: after,\n\t\t\t\tmaxColumns: GREP_MAX_LINE_LENGTH,\n\t\t\t\ttimeoutMs: input.timeoutMs ?? 30000,\n\t\t\t\tlineStart,\n\t\t\t\tlineEnd,\n\t\t\t\tmode,\n\t\t\t};\n\t\t\tlet engine = await resolveGrepEngine();\n\t\t\tlet preselection: GrepEngineResult | undefined;\n\t\t\tlet selected: string[] = [];\n\t\t\tlet more = false;\n\t\t\tif (!singleFile) {\n\t\t\t\tconst first = await searchPattern(\n\t\t\t\t\tengine,\n\t\t\t\t\t{ ...request, mode: \"files\", maxCount: skip + pageSize + 1 },\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\t\t\t\tengine = first.engine;\n\t\t\t\tpreselection = first.result;\n\t\t\t\tselected = first.result.fileCounts.slice(skip, skip + pageSize).map((file) => file.path);\n\t\t\t\tmore = first.result.fileCounts.length > skip + selected.length;\n\t\t\t}\n\t\t\tlet result: GrepEngineResult;\n\t\t\tif (!singleFile && !selected.length) result = preselection!;\n\t\t\telse if (mode === \"files\" && preselection)\n\t\t\t\tresult = { ...preselection, fileCounts: preselection.fileCounts.slice(skip, skip + pageSize) };\n\t\t\telse {\n\t\t\t\tconst response = await searchPattern(\n\t\t\t\t\tengine,\n\t\t\t\t\t{\n\t\t\t\t\t\t...request,\n\t\t\t\t\t\tpaths: singleFile ? paths : selected.map((path) => resolve(workingCwd, path)),\n\t\t\t\t\t\tmaxCountPerFile: mode === \"content\" ? cap + 1 : undefined,\n\t\t\t\t\t\ttimeoutMs: Math.max(0, (input.timeoutMs ?? 30000) - (Date.now() - started)),\n\t\t\t\t\t},\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\t\t\t\tengine = response.engine;\n\t\t\t\tresult = response.result;\n\t\t\t}\n\t\t\tlet matches: GrepEngineMatch[] = [];\n\t\t\tlet fileMatches: Array<{ path: string; count: number | null }> = [];\n\t\t\tlet perFileLimitReached = false;\n\t\t\tlet totalLimitReached = false;\n\t\t\tif (mode === \"content\") {\n\t\t\t\tconst groups = new Map<string, GrepEngineMatch[]>();\n\t\t\t\tfor (const row of result.matches)\n\t\t\t\t\tif (!row.isContext) {\n\t\t\t\t\t\tconst rows = groups.get(row.path) ?? [];\n\t\t\t\t\t\trows.push(row);\n\t\t\t\t\t\tgroups.set(row.path, rows);\n\t\t\t\t\t}\n\t\t\t\tconst admitted = new Set<GrepEngineMatch>();\n\t\t\t\tfor (let round = 0; round < cap && admitted.size < limit; round++) {\n\t\t\t\t\tfor (const rows of groups.values()) {\n\t\t\t\t\t\tif (rows[round] && admitted.size < limit) admitted.add(rows[round]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tperFileLimitReached = [...groups.values()].some((rows) => rows.length > cap);\n\t\t\t\ttotalLimitReached =\n\t\t\t\t\t[...groups.values()].reduce((n, rows) => n + Math.min(cap, rows.length), 0) > admitted.size;\n\t\t\t\t// Context belongs only to admitted matches, not to discarded matches from the second phase.\n\t\t\t\tmatches = result.matches.filter(\n\t\t\t\t\t(row) =>\n\t\t\t\t\t\tadmitted.has(row) ||\n\t\t\t\t\t\t(row.isContext &&\n\t\t\t\t\t\t\t[...admitted].some(\n\t\t\t\t\t\t\t\t(match) =>\n\t\t\t\t\t\t\t\t\tmatch.path === row.path && row.line >= match.line - before && row.line <= match.line + after,\n\t\t\t\t\t\t\t)),\n\t\t\t\t);\n\t\t\t\tlet bytes = 0;\n\t\t\t\tmatches = matches.filter((row) => {\n\t\t\t\t\tbytes += Buffer.byteLength(`${row.path}\\n${row.line}: ${row.text}\\n`);\n\t\t\t\t\tif (bytes > DEFAULT_MAX_BYTES - 2048) {\n\t\t\t\t\t\ttotalLimitReached = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t\tconst counts = new Map<string, number>();\n\t\t\t\tfor (const row of matches) if (!row.isContext) counts.set(row.path, (counts.get(row.path) ?? 0) + 1);\n\t\t\t\tmatches = matches.filter((row) => counts.has(row.path));\n\t\t\t\tfileMatches = [...counts].map(([path, count]) => ({ path, count }));\n\t\t\t} else if (singleFile || selected.length)\n\t\t\t\tfileMatches = result.fileCounts.map(({ path, count }) => ({ path, count }));\n\t\t\tconst { matches: _matches, fileCounts: _fileCounts, ...scan } = preselection ?? result;\n\t\t\tscan.missingPaths = missingPaths;\n\t\t\tscan.elapsedMs = Date.now() - started;\n\t\t\tscan.effectivePattern = result.effectivePattern;\n\t\t\tscan.patternKind = result.patternKind;\n\t\t\tscan.regexEngine = result.regexEngine;\n\t\t\tscan.timedOut ||= result.timedOut;\n\t\t\tif (result.timedOut && preselection) scan.warnings = [...scan.warnings, ...result.warnings];\n\t\t\tconst partial = scan.timedOut || scan.prefixSearched > 0 || scan.skippedOversized > 0;\n\t\t\tconst details: GrepToolDetails = {\n\t\t\t\tversion: 1,\n\t\t\t\tengine: engine.name,\n\t\t\t\tstatus: partial ? \"partial\" : fileMatches.length ? \"ok\" : skip ? \"pageEnd\" : \"noMatch\",\n\t\t\t\tcwd: workingCwd,\n\t\t\t\tpaths,\n\t\t\t\tmatches,\n\t\t\t\tfileMatches,\n\t\t\t\tmatchCount: mode === \"files\" ? null : fileMatches.reduce((n, file) => n + (file.count ?? 0), 0),\n\t\t\t\tfileCount: fileMatches.length,\n\t\t\t\tskip,\n\t\t\t\tnextSkip: more ? skip + selected.length : null,\n\t\t\t\tfileLimitReached: more,\n\t\t\t\tperFileLimitReached,\n\t\t\t\ttotalLimitReached,\n\t\t\t\tscan,\n\t\t\t\tlinesTruncated: matches.some((row) => row.truncated),\n\t\t\t};\n\t\t\treturn { content: formatGrepContent(details), details };\n\t\t},\n\t\t...grepRenderers,\n\t};\n}\nexport function createGrepTool(cwd: string, options?: GrepToolOptions): AgentTool<typeof grepSchema> {\n\treturn wrapToolDefinition(createGrepToolDefinition(cwd, options));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../../src/core/tools/ls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAoB,uBAAuB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAKxG,OAAO,EAAiC,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEnG,QAAA,MAAM,QAAQ;;;EAGZ,CAAC;AAEH,eAAO,MAAM,8BAA8B;aAC1C,OAAO,EAAE,yBAAyB;aAClC,UAAU;CACD,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,QAAQ,CAAC,CAAC;AAIlD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC5B,2BAA2B;IAC3B,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,wDAAwD;IACxD,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IACzG,6BAA6B;IAC7B,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;CAChE;AAQD,MAAM,WAAW,aAAa;IAC7B,yEAAyE;IACzE,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;CAC3C;AAED,wBAAgB,sBAAsB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,aAAa,GACrB,cAAc,CAAC,OAAO,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC,CA2H5D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC,OAAO,QAAQ,CAAC,CAE7F"}
1
+ {"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../../src/core/tools/ls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAoB,uBAAuB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAMxG,OAAO,EAAiC,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEnG,QAAA,MAAM,QAAQ;;;EAGZ,CAAC;AAEH,eAAO,MAAM,8BAA8B;aAC1C,OAAO,EAAE,yBAAyB;aAClC,UAAU;CACD,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,QAAQ,CAAC,CAAC;AAIlD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC5B,2BAA2B;IAC3B,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,wDAAwD;IACxD,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IACzG,6BAA6B;IAC7B,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;CAChE;AAQD,MAAM,WAAW,aAAa;IAC7B,yEAAyE;IACzE,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;CAC3C;AAED,wBAAgB,sBAAsB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,aAAa,GACrB,cAAc,CAAC,OAAO,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC,CA4H5D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC,OAAO,QAAQ,CAAC,CAE7F"}