@bastani/atomic 0.9.17-alpha.1 → 0.9.18-alpha.1

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 (311) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +8 -0
  3. package/dist/builtin/intercom/index.bundle.mjs +349 -57517
  4. package/dist/builtin/intercom/package.json +1 -1
  5. package/dist/builtin/mcp/index.bundle.mjs +28948 -58339
  6. package/dist/builtin/mcp/package.json +1 -1
  7. package/dist/builtin/mcp/xdg-open +1267 -0
  8. package/dist/builtin/subagents/package.json +1 -1
  9. package/dist/builtin/subagents/src/extension/index.bundle.mjs +7929 -78021
  10. package/dist/builtin/web-access/index.bundle.mjs +70791 -57707
  11. package/dist/builtin/web-access/package.json +1 -1
  12. package/dist/builtin/workflows/builtin/adversarial-verification.js +0 -1
  13. package/dist/builtin/workflows/builtin/{chunk-3y1hmzw6.js → chunk-6v0yv8tj.js} +1 -1
  14. package/dist/builtin/workflows/builtin/{chunk-w9c7rkrk.js → chunk-brerg33r.js} +5 -7
  15. package/dist/builtin/workflows/builtin/{chunk-bz1c9732.js → chunk-ngffz3y8.js} +1 -1
  16. package/dist/builtin/workflows/builtin/{chunk-6rbajjf5.js → chunk-szz1ajz9.js} +1 -3
  17. package/dist/builtin/workflows/builtin/classify-and-act.js +0 -1
  18. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.js +0 -1
  19. package/dist/builtin/workflows/builtin/generate-and-filter.js +0 -1
  20. package/dist/builtin/workflows/builtin/goal.js +2 -5
  21. package/dist/builtin/workflows/builtin/index.js +4 -7
  22. package/dist/builtin/workflows/builtin/loop-until-done.js +0 -1
  23. package/dist/builtin/workflows/builtin/open-claude-design.js +1 -4
  24. package/dist/builtin/workflows/builtin/ralph.js +2 -5
  25. package/dist/builtin/workflows/builtin/steering-context.js +0 -1
  26. package/dist/builtin/workflows/builtin/tournament.js +0 -1
  27. package/dist/builtin/workflows/package.json +1 -1
  28. package/dist/builtin/workflows/src/extension/index.bundle.mjs +39989 -81500
  29. package/dist/builtin/workflows/src/index.js +1253 -58524
  30. package/dist/bun/cli.js.map +1 -1
  31. package/dist/bun/split-loader.js +2 -0
  32. package/dist/bun/split-loader.js.map +1 -1
  33. package/dist/cli/args.js.map +1 -1
  34. package/dist/cli/auth-command.js.map +1 -1
  35. package/dist/cli/session-picker.js.map +1 -1
  36. package/dist/cli/startup-ui.js.map +1 -1
  37. package/dist/cli.js +5 -2
  38. package/dist/cli.js.map +1 -1
  39. package/dist/core/agent-session-extension-bindings.d.ts +19 -2
  40. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  41. package/dist/core/agent-session-extension-bindings.js +253 -74
  42. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  43. package/dist/core/agent-session-methods.d.ts +8 -3
  44. package/dist/core/agent-session-methods.d.ts.map +1 -1
  45. package/dist/core/agent-session-methods.js.map +1 -1
  46. package/dist/core/agent-session-prompt.d.ts +2 -7
  47. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  48. package/dist/core/agent-session-prompt.js +1 -35
  49. package/dist/core/agent-session-prompt.js.map +1 -1
  50. package/dist/core/agent-session-services.d.ts.map +1 -1
  51. package/dist/core/agent-session-services.js +2 -0
  52. package/dist/core/agent-session-services.js.map +1 -1
  53. package/dist/core/agent-session-types.d.ts +2 -0
  54. package/dist/core/agent-session-types.d.ts.map +1 -1
  55. package/dist/core/agent-session-types.js.map +1 -1
  56. package/dist/core/agent-session.d.ts +1 -0
  57. package/dist/core/agent-session.d.ts.map +1 -1
  58. package/dist/core/agent-session.js +2 -0
  59. package/dist/core/agent-session.js.map +1 -1
  60. package/dist/core/auth-guidance.js.map +1 -1
  61. package/dist/core/auth-storage-backends.js.map +1 -1
  62. package/dist/core/auth-storage.js.map +1 -1
  63. package/dist/core/bash-executor.js.map +1 -1
  64. package/dist/core/builtin-packages.d.ts +8 -0
  65. package/dist/core/builtin-packages.d.ts.map +1 -1
  66. package/dist/core/builtin-packages.js +11 -5
  67. package/dist/core/builtin-packages.js.map +1 -1
  68. package/dist/core/event-bus.d.ts +11 -0
  69. package/dist/core/event-bus.d.ts.map +1 -1
  70. package/dist/core/event-bus.js +96 -0
  71. package/dist/core/event-bus.js.map +1 -1
  72. package/dist/core/experimental.js.map +1 -1
  73. package/dist/core/export-html/index.js.map +1 -1
  74. package/dist/core/extensions/builtin-extension-entry-labels.d.ts +6 -0
  75. package/dist/core/extensions/builtin-extension-entry-labels.d.ts.map +1 -0
  76. package/dist/core/extensions/builtin-extension-entry-labels.js +22 -0
  77. package/dist/core/extensions/builtin-extension-entry-labels.js.map +1 -0
  78. package/dist/core/extensions/host-module-bridge.d.ts +22 -0
  79. package/dist/core/extensions/host-module-bridge.d.ts.map +1 -0
  80. package/dist/core/extensions/host-module-bridge.js +39 -0
  81. package/dist/core/extensions/host-module-bridge.js.map +1 -0
  82. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  83. package/dist/core/extensions/loader-api.js +2 -2
  84. package/dist/core/extensions/loader-api.js.map +1 -1
  85. package/dist/core/extensions/loader-core.js.map +1 -1
  86. package/dist/core/extensions/loader-discovery.js.map +1 -1
  87. package/dist/core/extensions/loader-host-modules.d.ts +10 -0
  88. package/dist/core/extensions/loader-host-modules.d.ts.map +1 -0
  89. package/dist/core/extensions/loader-host-modules.js +88 -0
  90. package/dist/core/extensions/loader-host-modules.js.map +1 -0
  91. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  92. package/dist/core/extensions/loader-runtime.js +1 -0
  93. package/dist/core/extensions/loader-runtime.js.map +1 -1
  94. package/dist/core/extensions/loader-virtual-modules.d.ts +5 -2
  95. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  96. package/dist/core/extensions/loader-virtual-modules.js +51 -71
  97. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  98. package/dist/core/extensions/loader.d.ts +1 -1
  99. package/dist/core/extensions/loader.js.map +1 -1
  100. package/dist/core/extensions/native-builtin-entries.d.ts +6 -0
  101. package/dist/core/extensions/native-builtin-entries.d.ts.map +1 -0
  102. package/dist/core/extensions/native-builtin-entries.js +23 -0
  103. package/dist/core/extensions/native-builtin-entries.js.map +1 -0
  104. package/dist/core/extensions/runtime-types.d.ts +2 -0
  105. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  106. package/dist/core/extensions/runtime-types.js.map +1 -1
  107. package/dist/core/keybindings.js.map +1 -1
  108. package/dist/core/lifecycle-timings.d.ts +21 -0
  109. package/dist/core/lifecycle-timings.d.ts.map +1 -0
  110. package/dist/core/lifecycle-timings.js +57 -0
  111. package/dist/core/lifecycle-timings.js.map +1 -0
  112. package/dist/core/mandatory-resource-loader.d.ts.map +1 -1
  113. package/dist/core/mandatory-resource-loader.js +43 -0
  114. package/dist/core/mandatory-resource-loader.js.map +1 -1
  115. package/dist/core/model-runtime.d.ts +8 -0
  116. package/dist/core/model-runtime.d.ts.map +1 -1
  117. package/dist/core/model-runtime.js +82 -0
  118. package/dist/core/model-runtime.js.map +1 -1
  119. package/dist/core/models-store.js.map +1 -1
  120. package/dist/core/package-manager-auto-resources.js.map +1 -1
  121. package/dist/core/package-manager-env.js.map +1 -1
  122. package/dist/core/package-manager-git.js.map +1 -1
  123. package/dist/core/package-manager-manifest.js.map +1 -1
  124. package/dist/core/package-manager-npm.js.map +1 -1
  125. package/dist/core/package-manager-paths.js.map +1 -1
  126. package/dist/core/package-manager-resolver.js.map +1 -1
  127. package/dist/core/project-trust.js.map +1 -1
  128. package/dist/core/prompt-templates-async.js.map +1 -1
  129. package/dist/core/prompt-templates.js.map +1 -1
  130. package/dist/core/provider-attribution.js.map +1 -1
  131. package/dist/core/remote-catalog-provider.js.map +1 -1
  132. package/dist/core/resource-loader-assets.js.map +1 -1
  133. package/dist/core/resource-loader-context-files.js.map +1 -1
  134. package/dist/core/resource-loader-core.d.ts +5 -1
  135. package/dist/core/resource-loader-core.d.ts.map +1 -1
  136. package/dist/core/resource-loader-core.js +90 -1
  137. package/dist/core/resource-loader-core.js.map +1 -1
  138. package/dist/core/resource-loader-discovery.js.map +1 -1
  139. package/dist/core/resource-loader-paths.js.map +1 -1
  140. package/dist/core/resource-loader-source-info.js.map +1 -1
  141. package/dist/core/resource-loader-types.d.ts +16 -0
  142. package/dist/core/resource-loader-types.d.ts.map +1 -1
  143. package/dist/core/resource-loader-types.js.map +1 -1
  144. package/dist/core/sdk.d.ts.map +1 -1
  145. package/dist/core/sdk.js +4 -1
  146. package/dist/core/sdk.js.map +1 -1
  147. package/dist/core/session-manager-core.js.map +1 -1
  148. package/dist/core/session-manager-list.js.map +1 -1
  149. package/dist/core/session-manager-paths.js.map +1 -1
  150. package/dist/core/settings-manager-core.d.ts +6 -0
  151. package/dist/core/settings-manager-core.d.ts.map +1 -1
  152. package/dist/core/settings-manager-core.js +24 -0
  153. package/dist/core/settings-manager-core.js.map +1 -1
  154. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  155. package/dist/core/settings-storage.js.map +1 -1
  156. package/dist/core/skills-async.js.map +1 -1
  157. package/dist/core/skills.js.map +1 -1
  158. package/dist/core/slash-commands.d.ts.map +1 -1
  159. package/dist/core/slash-commands.js +0 -6
  160. package/dist/core/slash-commands.js.map +1 -1
  161. package/dist/core/system-prompt.js.map +1 -1
  162. package/dist/core/telemetry.js.map +1 -1
  163. package/dist/core/timings.js.map +1 -1
  164. package/dist/core/tools/bash.js.map +1 -1
  165. package/dist/core/tools/output-accumulator.js.map +1 -1
  166. package/dist/core/tools/powershell.js.map +1 -1
  167. package/dist/core/tools/read.js.map +1 -1
  168. package/dist/core/tools/session-temp-cleanup.js.map +1 -1
  169. package/dist/core/tools/session-temp-dir.js.map +1 -1
  170. package/dist/core/tools/todos-paths.js.map +1 -1
  171. package/dist/core/trust-manager.js.map +1 -1
  172. package/dist/index.d.ts +1 -1
  173. package/dist/index.js.map +1 -1
  174. package/dist/main-deferred-startup.d.ts +16 -0
  175. package/dist/main-deferred-startup.d.ts.map +1 -1
  176. package/dist/main-deferred-startup.js +14 -0
  177. package/dist/main-deferred-startup.js.map +1 -1
  178. package/dist/main-session.js.map +1 -1
  179. package/dist/main.d.ts.map +1 -1
  180. package/dist/main.js +41 -22
  181. package/dist/main.js.map +1 -1
  182. package/dist/migrations.js.map +1 -1
  183. package/dist/modes/interactive/chat-input-actions.js.map +1 -1
  184. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  185. package/dist/modes/interactive/components/config-selector-project-scope.js.map +1 -1
  186. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  187. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  188. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  189. package/dist/modes/interactive/components/startup-identity.d.ts.map +1 -1
  190. package/dist/modes/interactive/components/startup-identity.js +4 -0
  191. package/dist/modes/interactive/components/startup-identity.js.map +1 -1
  192. package/dist/modes/interactive/external-editor.js.map +1 -1
  193. package/dist/modes/interactive/interactive-editor-actions.js +13 -5
  194. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  195. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  196. package/dist/modes/interactive/interactive-input-handling.js +2 -5
  197. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  198. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  199. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  200. package/dist/modes/interactive/interactive-mode-surface.d.ts +8 -8
  201. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  202. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  203. package/dist/modes/interactive/interactive-onboarding.js +1 -1
  204. package/dist/modes/interactive/interactive-onboarding.js.map +1 -1
  205. package/dist/modes/interactive/interactive-prompt-restore.d.ts.map +1 -1
  206. package/dist/modes/interactive/interactive-prompt-restore.js +2 -1
  207. package/dist/modes/interactive/interactive-prompt-restore.js.map +1 -1
  208. package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -1
  209. package/dist/modes/interactive/interactive-render-chat.js +2 -0
  210. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  211. package/dist/modes/interactive/interactive-resource-disclosure.js +21 -53
  212. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  213. package/dist/modes/interactive/interactive-resource-paths.js +29 -5
  214. package/dist/modes/interactive/interactive-resource-paths.js.map +1 -1
  215. package/dist/modes/interactive/interactive-resource-rendering.js +66 -69
  216. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  217. package/dist/modes/interactive/interactive-startup-chat-container.d.ts.map +1 -1
  218. package/dist/modes/interactive/interactive-startup-chat-container.js +2 -0
  219. package/dist/modes/interactive/interactive-startup-chat-container.js.map +1 -1
  220. package/dist/modes/interactive/interactive-startup.d.ts +2 -0
  221. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  222. package/dist/modes/interactive/interactive-startup.js +30 -10
  223. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  224. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  225. package/dist/modes/interactive/interactive-tui.js +12 -2
  226. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  227. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  228. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  229. package/dist/modes/interactive-engine/create-isolated-runtime.js.map +1 -1
  230. package/dist/modes/interactive-engine/engine-child-liveness.d.ts +2 -0
  231. package/dist/modes/interactive-engine/engine-child-liveness.d.ts.map +1 -1
  232. package/dist/modes/interactive-engine/engine-child-liveness.js +16 -2
  233. package/dist/modes/interactive-engine/engine-child-liveness.js.map +1 -1
  234. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  235. package/dist/modes/interactive-engine/engine-monitor.d.ts +5 -0
  236. package/dist/modes/interactive-engine/engine-monitor.d.ts.map +1 -1
  237. package/dist/modes/interactive-engine/engine-monitor.js +24 -0
  238. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -1
  239. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
  240. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +3 -1
  241. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
  242. package/dist/modes/interactive-engine/extension-ui-bridge.js +6 -0
  243. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
  244. package/dist/modes/interactive-engine/isolated-runtime.d.ts +21 -2
  245. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  246. package/dist/modes/interactive-engine/isolated-runtime.js +160 -7
  247. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  248. package/dist/modes/interactive-engine/protocol.d.ts +9 -4
  249. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  250. package/dist/modes/interactive-engine/protocol.js +8 -4
  251. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  252. package/dist/modes/interactive-engine/resource-readiness-error.d.ts +6 -0
  253. package/dist/modes/interactive-engine/resource-readiness-error.d.ts.map +1 -0
  254. package/dist/modes/interactive-engine/resource-readiness-error.js +11 -0
  255. package/dist/modes/interactive-engine/resource-readiness-error.js.map +1 -0
  256. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -1
  257. package/dist/modes/rpc/rpc-client-process.js +3 -0
  258. package/dist/modes/rpc/rpc-client-process.js.map +1 -1
  259. package/dist/modes/rpc/rpc-client.d.ts +1 -0
  260. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  261. package/dist/modes/rpc/rpc-client.js +5 -1
  262. package/dist/modes/rpc/rpc-client.js.map +1 -1
  263. package/dist/modes/rpc/rpc-command-handler.d.ts +4 -1
  264. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  265. package/dist/modes/rpc/rpc-command-handler.js +59 -18
  266. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  267. package/dist/modes/rpc/rpc-mode.d.ts +4 -13
  268. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  269. package/dist/modes/rpc/rpc-mode.js +31 -2
  270. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  271. package/dist/modes/rpc/rpc-resource-readiness.d.ts +11 -0
  272. package/dist/modes/rpc/rpc-resource-readiness.d.ts.map +1 -0
  273. package/dist/modes/rpc/rpc-resource-readiness.js +51 -0
  274. package/dist/modes/rpc/rpc-resource-readiness.js.map +1 -0
  275. package/dist/modes/rpc/rpc-session-binding.d.ts +2 -0
  276. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  277. package/dist/modes/rpc/rpc-session-binding.js +21 -0
  278. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  279. package/dist/modes/rpc/rpc-types.d.ts +7 -0
  280. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  281. package/dist/modes/rpc/rpc-types.js.map +1 -1
  282. package/dist/package-manager-cli-parser.js.map +1 -1
  283. package/dist/package-manager-cli.js.map +1 -1
  284. package/dist/rpc-entry.js.map +1 -1
  285. package/dist/self-update-plan.js.map +1 -1
  286. package/dist/utils/changelog.d.ts +1 -1
  287. package/dist/utils/changelog.js.map +1 -1
  288. package/dist/utils/module-require.js.map +1 -1
  289. package/dist/utils/pi-user-agent.js.map +1 -1
  290. package/dist/utils/shell.js.map +1 -1
  291. package/dist/utils/tools-manager.js.map +1 -1
  292. package/dist/utils/version-check.js.map +1 -1
  293. package/dist/utils/windows-self-update.js.map +1 -1
  294. package/docs/development.md +28 -1
  295. package/docs/extensions.md +5 -3
  296. package/docs/quickstart.md +1 -3
  297. package/docs/sdk.md +2 -0
  298. package/docs/usage.md +3 -1
  299. package/docs/windows.md +8 -0
  300. package/npm-shrinkwrap.json +32 -32
  301. package/package.json +4 -4
  302. package/dist/builtin/workflows/builtin/chunk-4febxsv4.js +0 -264
  303. package/dist/builtin/workflows/builtin/chunk-5wgwscd0.js +0 -4
  304. package/dist/builtin/workflows/builtin/chunk-dattsgxg.js +0 -529
  305. package/dist/builtin/workflows/builtin/chunk-gdx0avpx.js +0 -70082
  306. package/dist/builtin/workflows/builtin/chunk-qx2ptjs3.js +0 -215
  307. package/dist/builtin/workflows/builtin/chunk-x2ghn0je.js +0 -4110
  308. package/dist/core/atomic-guide-command.d.ts +0 -41
  309. package/dist/core/atomic-guide-command.d.ts.map +0 -1
  310. package/dist/core/atomic-guide-command.js +0 -311
  311. package/dist/core/atomic-guide-command.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"powershell.js","sourceRoot":"","sources":["../../../src/core/tools/powershell.ts"],"names":[],"mappings":"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","sourcesContent":["import { APP_NAME } from \"../../config.ts\";\nimport { waitForChildProcess } from \"../../utils/child-process.ts\";\nimport {\n\tgetPowerShellConfig,\n\tkillProcessTree,\n\ttrackDetachedChildPid,\n\tuntrackDetachedChildPid,\n} from \"../../utils/shell.ts\";\nimport {\n\ttype BashOperations,\n\ttype BashSpawnContext,\n\ttype BashSpawnHook,\n\ttype BashToolDetails,\n\ttype BashToolInput,\n\ttype BashToolOptions,\n\tcreateBashToolDefinition,\n\ttype ShellToolPresentation,\n} from \"./bash.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst POWERSHELL_PRESENTATION: ShellToolPresentation = {\n\tprompt: \"PS>\",\n\ttempFilePrefix: `${APP_NAME}-powershell`,\n};\n\nconst UTF8_OUTPUT_PREFIX = \"try { [Console]::OutputEncoding=[System.Text.Encoding]::UTF8 } catch {}\\n\";\nexport const powershellToolSystemPromptContribution = Object.freeze({\n\tsnippet: \"Execute PowerShell commands.\",\n\tguidelines: Object.freeze([\n\t\t\"You can inspect ATOMIC_* or PI_* environment variables for current model and session details.\",\n\t] as const),\n} as const);\nexport type PowerShellOperations = BashOperations;\nexport type PowerShellToolDetails = BashToolDetails;\nexport type PowerShellToolInput = BashToolInput;\nexport interface PowerShellToolOptions extends Pick<BashToolOptions, \"exposeSessionEnvironment\" | \"spawnHook\"> {\n\toperations?: BashOperations;\n}\nexport function createLocalPowerShellOperations(): PowerShellOperations {\n\treturn {\n\t\texec: async (command, cwd, options) => {\n\t\t\tconst { shell, args } = getPowerShellConfig();\n\t\t\tconst { spawn } = await import(\"node:child_process\");\n\t\t\tif (options.signal?.aborted) throw new Error(\"aborted\");\n\t\t\tconst child = spawn(shell, [...args, `${UTF8_OUTPUT_PREFIX}${command}`], {\n\t\t\t\tcwd,\n\t\t\t\tenv: options.env,\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t\tif (child.pid) trackDetachedChildPid(child.pid);\n\t\t\tlet timedOut = false;\n\t\t\tlet timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n\t\t\tconst onAbort = () => {\n\t\t\t\tif (child.pid) killProcessTree(child.pid);\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tif (options.timeout !== undefined && options.timeout > 0) {\n\t\t\t\t\ttimeoutHandle = setTimeout(() => {\n\t\t\t\t\t\ttimedOut = true;\n\t\t\t\t\t\tif (child.pid) killProcessTree(child.pid);\n\t\t\t\t\t}, options.timeout * 1000);\n\t\t\t\t}\n\t\t\t\tchild.stdout?.on(\"data\", (data: Buffer) => options.onData(data, \"stdout\"));\n\t\t\t\tchild.stderr?.on(\"data\", (data: Buffer) => options.onData(data, \"stderr\"));\n\t\t\t\tif (options.signal) {\n\t\t\t\t\tif (options.signal.aborted) onAbort();\n\t\t\t\t\telse options.signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t}\n\t\t\t\tconst exitCode = await waitForChildProcess(child);\n\t\t\t\tif (options.signal?.aborted) throw new Error(\"aborted\");\n\t\t\t\tif (timedOut) throw new Error(`timeout:${options.timeout}`);\n\t\t\t\treturn { exitCode };\n\t\t\t} finally {\n\t\t\t\tif (child.pid) untrackDetachedChildPid(child.pid);\n\t\t\t\tif (timeoutHandle) clearTimeout(timeoutHandle);\n\t\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\t\t},\n\t};\n}\nexport function createPowerShellToolDefinition(cwd: string, options: PowerShellToolOptions = {}) {\n\tconst definition = createBashToolDefinition(\n\t\tcwd,\n\t\t{\n\t\t\t...options,\n\t\t\toperations: options.operations ?? createLocalPowerShellOperations(),\n\t\t},\n\t\tPOWERSHELL_PRESENTATION,\n\t);\n\treturn {\n\t\t...definition,\n\t\tname: \"powershell\",\n\t\tlabel: \"powershell\",\n\t\tdescription: \"Execute a PowerShell command in the session workspace.\",\n\t\tpromptSnippet: powershellToolSystemPromptContribution.snippet,\n\t\tpromptGuidelines:\n\t\t\toptions.exposeSessionEnvironment === false\n\t\t\t\t? undefined\n\t\t\t\t: [...powershellToolSystemPromptContribution.guidelines],\n\t};\n}\nexport function createPowerShellTool(cwd: string, options?: PowerShellToolOptions) {\n\treturn wrapToolDefinition(createPowerShellToolDefinition(cwd, options));\n}\nexport type PowerShellSpawnContext = BashSpawnContext;\nexport type PowerShellSpawnHook = BashSpawnHook;\n"]}
1
+ {"version":3,"file":"powershell.js","sourceRoot":"","sources":["../../../src/core/tools/powershell.ts"],"names":[],"mappings":"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","sourcesContent":["import { APP_NAME } from \"../../config.js\";\nimport { waitForChildProcess } from \"../../utils/child-process.ts\";\nimport {\n\tgetPowerShellConfig,\n\tkillProcessTree,\n\ttrackDetachedChildPid,\n\tuntrackDetachedChildPid,\n} from \"../../utils/shell.ts\";\nimport {\n\ttype BashOperations,\n\ttype BashSpawnContext,\n\ttype BashSpawnHook,\n\ttype BashToolDetails,\n\ttype BashToolInput,\n\ttype BashToolOptions,\n\tcreateBashToolDefinition,\n\ttype ShellToolPresentation,\n} from \"./bash.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst POWERSHELL_PRESENTATION: ShellToolPresentation = {\n\tprompt: \"PS>\",\n\ttempFilePrefix: `${APP_NAME}-powershell`,\n};\n\nconst UTF8_OUTPUT_PREFIX = \"try { [Console]::OutputEncoding=[System.Text.Encoding]::UTF8 } catch {}\\n\";\nexport const powershellToolSystemPromptContribution = Object.freeze({\n\tsnippet: \"Execute PowerShell commands.\",\n\tguidelines: Object.freeze([\n\t\t\"You can inspect ATOMIC_* or PI_* environment variables for current model and session details.\",\n\t] as const),\n} as const);\nexport type PowerShellOperations = BashOperations;\nexport type PowerShellToolDetails = BashToolDetails;\nexport type PowerShellToolInput = BashToolInput;\nexport interface PowerShellToolOptions extends Pick<BashToolOptions, \"exposeSessionEnvironment\" | \"spawnHook\"> {\n\toperations?: BashOperations;\n}\nexport function createLocalPowerShellOperations(): PowerShellOperations {\n\treturn {\n\t\texec: async (command, cwd, options) => {\n\t\t\tconst { shell, args } = getPowerShellConfig();\n\t\t\tconst { spawn } = await import(\"node:child_process\");\n\t\t\tif (options.signal?.aborted) throw new Error(\"aborted\");\n\t\t\tconst child = spawn(shell, [...args, `${UTF8_OUTPUT_PREFIX}${command}`], {\n\t\t\t\tcwd,\n\t\t\t\tenv: options.env,\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t\tif (child.pid) trackDetachedChildPid(child.pid);\n\t\t\tlet timedOut = false;\n\t\t\tlet timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n\t\t\tconst onAbort = () => {\n\t\t\t\tif (child.pid) killProcessTree(child.pid);\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tif (options.timeout !== undefined && options.timeout > 0) {\n\t\t\t\t\ttimeoutHandle = setTimeout(() => {\n\t\t\t\t\t\ttimedOut = true;\n\t\t\t\t\t\tif (child.pid) killProcessTree(child.pid);\n\t\t\t\t\t}, options.timeout * 1000);\n\t\t\t\t}\n\t\t\t\tchild.stdout?.on(\"data\", (data: Buffer) => options.onData(data, \"stdout\"));\n\t\t\t\tchild.stderr?.on(\"data\", (data: Buffer) => options.onData(data, \"stderr\"));\n\t\t\t\tif (options.signal) {\n\t\t\t\t\tif (options.signal.aborted) onAbort();\n\t\t\t\t\telse options.signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t}\n\t\t\t\tconst exitCode = await waitForChildProcess(child);\n\t\t\t\tif (options.signal?.aborted) throw new Error(\"aborted\");\n\t\t\t\tif (timedOut) throw new Error(`timeout:${options.timeout}`);\n\t\t\t\treturn { exitCode };\n\t\t\t} finally {\n\t\t\t\tif (child.pid) untrackDetachedChildPid(child.pid);\n\t\t\t\tif (timeoutHandle) clearTimeout(timeoutHandle);\n\t\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\t\t},\n\t};\n}\nexport function createPowerShellToolDefinition(cwd: string, options: PowerShellToolOptions = {}) {\n\tconst definition = createBashToolDefinition(\n\t\tcwd,\n\t\t{\n\t\t\t...options,\n\t\t\toperations: options.operations ?? createLocalPowerShellOperations(),\n\t\t},\n\t\tPOWERSHELL_PRESENTATION,\n\t);\n\treturn {\n\t\t...definition,\n\t\tname: \"powershell\",\n\t\tlabel: \"powershell\",\n\t\tdescription: \"Execute a PowerShell command in the session workspace.\",\n\t\tpromptSnippet: powershellToolSystemPromptContribution.snippet,\n\t\tpromptGuidelines:\n\t\t\toptions.exposeSessionEnvironment === false\n\t\t\t\t? undefined\n\t\t\t\t: [...powershellToolSystemPromptContribution.guidelines],\n\t};\n}\nexport function createPowerShellTool(cwd: string, options?: PowerShellToolOptions) {\n\treturn wrapToolDefinition(createPowerShellToolDefinition(cwd, options));\n}\nexport type PowerShellSpawnContext = BashSpawnContext;\nexport type PowerShellSpawnHook = BashSpawnHook;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/core/tools/read.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from \"node:path\";\nimport type { Api, ImageContent, Model, TextContent } from \"@bastani/pi-ai/compat\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { constants } from \"fs\";\nimport { access as fsAccess, readFile as fsReadFile, stat as fsStat } from \"fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { getReadmePath } from \"../../config.ts\";\nimport { parenthesizedKeyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { processImage } from \"../../utils/image-process.ts\";\nimport { detectSupportedImageMimeTypeFromFile } from \"../../utils/mime.ts\";\nimport { formatPathRelativeToCwdOrAbsolute } from \"../../utils/paths.ts\";\nimport { experimentalToolSamplingProperty } from \"../experimental.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { parseConflictBlocks, registerConflictBlocks } from \"./conflict-registry.ts\";\nimport {\n\tbuildDirectoryTree,\n\tbuildDirectoryTreeFromOperations,\n\ttype DirectoryTreeEntry,\n\ttype DirectoryTreeResult,\n} from \"./directory-tree.ts\";\nimport { isReadableUrlPath } from \"./fetch-url.ts\";\nimport {\n\tcreateHashlineSnapshotStore,\n\tformatHashlineContent,\n\ttype HashlineSnapshotStore,\n\trecordHashlineSnapshot,\n} from \"./hashline.ts\";\nimport { isNotebookPath, readEditableNotebookText } from \"./notebook.ts\";\nimport { resolveReadPathAsync, resolveToCwd } from \"./path-utils.ts\";\nimport { applyReadLineSelection, extractDocumentMarkdown, isDocumentPath } from \"./read-document-extract.ts\";\nimport {\n\tformatHashlineSelectedLines,\n\tisReadResourceSelector,\n\ttype ReadLineSelector,\n\tselectExactReadRanges,\n\tselectReadRanges,\n\tsplitReadLineSelector,\n} from \"./read-selectors.ts\";\nimport { readUrlBranch } from \"./read-url.ts\";\nimport { getTextOutput, invalidArgText, replaceTabs, shortenPath, str } from \"./render-utils.ts\";\nimport {\n\ttype InternalResourceContext,\n\tparseArchiveSelector,\n\treadArchiveSelector,\n\treadInternalSelector,\n\treadSqliteSelector,\n\tresolveArchiveSelector,\n\tresolveInternalSelector,\n\tsqliteSelectorForPath,\n} from \"./resource-selectors.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nconst readSchema = Type.Object(\n\t{\n\t\tpath: Type.String({\n\t\t\tdescription:\n\t\t\t\t\"File, directory, archive member, SQLite selector, internal resource, image, document, or URL to read. Append selectors such as :raw, :conflicts, :N, :A-B, :A+C, or :A-B,C-D to scope output.\",\n\t\t}),\n\t},\n\t{ additionalProperties: false },\n);\nexport const readToolSystemPromptContribution = Object.freeze({\n\tsnippet: \"Read a path selector.\",\n\tguidelines: Object.freeze([\n\t\t\"Use read to inspect file and resource contents; use path selectors for line ranges, raw output, and conflict views.\",\n\t] as const),\n} as const);\nexport type ReadToolInput = Static<typeof readSchema>;\nconst READ_TOOL_MAX_RESULT_CHARS = 50_000;\nexport interface OversizedReadDetails {\n\tblocked: true;\n\tpath: string;\n\tchars: number;\n\tmaxChars: number;\n\tstartLine: number;\n\trequestedLimit?: number;\n\ttotalFileLines: number;\n\tfirstLineBytes: number;\n\tbyteGuidance: boolean;\n}\nexport interface ReadToolDetails {\n\tisDirectory?: boolean;\n\tresolvedPath?: string;\n\ttruncation?: TruncationResult;\n\toversizedRead?: OversizedReadDetails;\n\tmeta?: {\n\t\tsource?: string;\n\t\tsourcePath?: string;\n\t\tartifactId?: string;\n\t\ttruncation?: TruncationResult;\n\t\tlimits?: Record<string, number>;\n\t};\n}\ninterface CompactReadClassification {\n\tkind: \"docs\" | \"resource\" | \"skill\";\n\tlabel: string;\n}\nconst COMPACT_RESOURCE_FILE_NAMES = new Set([\"AGENTS.override.md\", \"AGENTS.md\", \"AGENTS.MD\", \"CLAUDE.md\", \"CLAUDE.MD\"]);\nexport interface ReadOperations {\n\treadFile: (absolutePath: string) => Promise<Buffer>;\n\taccess: (absolutePath: string) => Promise<void>;\n\tstat?: (absolutePath: string) => Promise<{ isFile: boolean; isDirectory: boolean } | undefined>;\n\tlistDir?: (absolutePath: string) => Promise<DirectoryTreeEntry[] | undefined>;\n\tdetectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;\n}\nconst defaultReadOperations: ReadOperations = {\n\treadFile: (path) => fsReadFile(path),\n\taccess: (path) => fsAccess(path, constants.R_OK),\n\tdetectImageMimeType: detectSupportedImageMimeTypeFromFile,\n};\nexport interface ReadToolOptions {\n\tautoResizeImages?: boolean;\n\toperations?: ReadOperations;\n\thashlineStore?: HashlineSnapshotStore;\n}\ntype ReadRenderArgs = { path?: string };\nfunction formatReadLineRange(_args: ReadRenderArgs | undefined, _theme: Theme): string {\n\treturn \"\";\n}\nfunction formatReadCall(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tconst rawPath = str(args?.path);\n\tconst path = rawPath !== null ? shortenPath(rawPath) : null;\n\tconst invalidArg = invalidArgText(theme);\n\tconst pathDisplay = path === null ? invalidArg : path ? theme.fg(\"accent\", path) : theme.fg(\"toolOutput\", \"...\");\n\treturn `${theme.fg(\"toolTitle\", theme.bold(\"read\"))} ${pathDisplay}${formatReadLineRange(args, theme)}`;\n}\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") end--;\n\treturn lines.slice(0, end);\n}\nfunction getNonVisionImageNote(model: Model<Api> | undefined): string | undefined {\n\treturn !model || model.input.includes(\"image\")\n\t\t? undefined\n\t\t: \"[Current model does not support images. The image will be omitted from this request.]\";\n}\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\nfunction formatCount(count: number): string {\n\treturn count.toLocaleString(\"en-US\");\n}\nfunction shellQuote(value: string): string {\n\treturn `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\nfunction buildOversizedReadMessage(details: OversizedReadDetails): string {\n\tconst pathForExample = JSON.stringify(details.path);\n\tconst rangePathForExample = JSON.stringify(`${details.path}:${details.startLine}+200`);\n\tconst shellPathForExample = shellQuote(details.path);\n\tconst requestedLimitLine =\n\t\tdetails.requestedLimit !== undefined ? [`Requested line limit: ${formatCount(details.requestedLimit)}`] : [];\n\tif (details.byteGuidance) {\n\t\treturn [\n\t\t\t`File read blocked: requested selected range is too large (${formatCount(details.chars)} chars; threshold: ${formatCount(details.maxChars)} chars).`,\n\t\t\t`Path: ${details.path}`,\n\t\t\t...requestedLimitLine,\n\t\t\t\"\",\n\t\t\t\"The selected content starts with a single oversized line, so line pagination is not useful. Read byte slices instead. Examples:\",\n\t\t\t`- Inspect the start of line ${details.startLine}: sed -n '${details.startLine}p' ${shellPathForExample} | head -c ${DEFAULT_MAX_BYTES}`,\n\t\t\t`- Inspect a later byte window: sed -n '${details.startLine}p' ${shellPathForExample} | tail -c +${DEFAULT_MAX_BYTES + 1} | head -c ${DEFAULT_MAX_BYTES}`,\n\t\t\t`- Search for relevant text first: search({ \"pattern\": \"functionName\", \"paths\": ${pathForExample} })`,\n\t\t].join(\"\\n\");\n\t}\n\tconst targetedSnippetOffset = Math.max(details.startLine, 120);\n\tconst snippetPathForExample = JSON.stringify(`${details.path}:${targetedSnippetOffset}+80`);\n\treturn [\n\t\t`File read blocked: requested selected range is too large (${formatCount(details.chars)} chars; threshold: ${formatCount(details.maxChars)} chars).`,\n\t\t`Path: ${details.path}`,\n\t\t...requestedLimitLine,\n\t\t\"\",\n\t\t\"Read only the needed context incrementally. Examples:\",\n\t\t`- Search for relevant symbols first: search({ \"pattern\": \"functionName\", \"paths\": ${pathForExample} })`,\n\t\t`- Read a smaller line range: read({ \"path\": ${rangePathForExample} })`,\n\t\t`- Read a targeted snippet around a match: read({ \"path\": ${snippetPathForExample} })`,\n\t].join(\"\\n\");\n}\nfunction readSourceMeta(source: string): ReadToolDetails {\n\treturn { meta: { source, sourcePath: source } };\n}\nfunction oversizedReadResult(details: OversizedReadDetails): { content: TextContent[]; details: ReadToolDetails } {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: buildOversizedReadMessage(details) }],\n\t\tdetails: {\n\t\t\toversizedRead: details,\n\t\t\tmeta: { source: details.path, sourcePath: details.path, limits: { maxChars: details.maxChars } },\n\t\t},\n\t};\n}\nfunction getPiDocsClassification(absolutePath: string): CompactReadClassification | undefined {\n\tconst packageRoot = dirname(getReadmePath());\n\tconst relativePath = relative(resolvePath(packageRoot), resolvePath(absolutePath));\n\tif (\n\t\trelativePath === \"\" ||\n\t\trelativePath === \"..\" ||\n\t\trelativePath.startsWith(`..${sep}`) ||\n\t\tisAbsolute(relativePath)\n\t) {\n\t\treturn undefined;\n\t}\n\tconst label = toPosixPath(relativePath);\n\tif (label === \"README.md\" || label.startsWith(\"docs/\") || label.startsWith(\"examples/\")) {\n\t\treturn { kind: \"docs\", label };\n\t}\n\treturn undefined;\n}\nfunction getCompactReadClassification(\n\targs: ReadRenderArgs | undefined,\n\tcwd: string,\n): CompactReadClassification | undefined {\n\tconst rawPath = str(args?.path);\n\tif (!rawPath) return undefined;\n\tconst absolutePath = resolveToCwd(rawPath, cwd);\n\tconst fileName = basename(absolutePath);\n\tif (fileName === \"SKILL.md\") {\n\t\treturn { kind: \"skill\", label: basename(dirname(absolutePath)) || fileName };\n\t}\n\tconst docsClassification = getPiDocsClassification(absolutePath);\n\tif (docsClassification) return docsClassification;\n\tif (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {\n\t\treturn { kind: \"resource\", label: formatPathRelativeToCwdOrAbsolute(absolutePath, cwd) };\n\t}\n\treturn undefined;\n}\nfunction formatCompactReadCall(\n\tclassification: CompactReadClassification,\n\targs: ReadRenderArgs | undefined,\n\ttheme: Theme,\n): string {\n\tconst hint = parenthesizedKeyHint(\"app.tools.expand\", \"Expand\");\n\tconst expandHint = hint ? ` ${hint}` : \"\";\n\tif (classification.kind === \"skill\") {\n\t\treturn (\n\t\t\ttheme.fg(\"customMessageLabel\", `\\x1b[1m[skill]\\x1b[22m `) +\n\t\t\ttheme.fg(\"customMessageText\", classification.label) +\n\t\t\tformatReadLineRange(args, theme) +\n\t\t\texpandHint\n\t\t);\n\t}\n\treturn (\n\t\ttheme.fg(\"toolTitle\", theme.bold(`read ${classification.kind}`)) +\n\t\t\" \" +\n\t\ttheme.fg(\"accent\", classification.label) +\n\t\tformatReadLineRange(args, theme) +\n\t\texpandHint\n\t);\n}\nfunction formatReadResult(\n\targs: ReadRenderArgs | undefined,\n\tresult: { content: (TextContent | ImageContent)[]; details?: ReadToolDetails },\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n\t_cwd: string,\n\tisError: boolean,\n): string {\n\tconst oversizedRead = result.details?.oversizedRead;\n\tconst oversizedReadBlocked = oversizedRead?.blocked === true;\n\tif (!options.expanded && !isError && !oversizedReadBlocked) {\n\t\treturn \"\";\n\t}\n\tconst rawPath = str(args?.path);\n\tconst output = oversizedRead ? buildOversizedReadMessage(oversizedRead) : getTextOutput(result, showImages);\n\tconst lang = !isError && rawPath && !oversizedReadBlocked ? getLanguageFromPath(rawPath) : undefined;\n\tconst renderedLines = lang ? highlightCode(replaceTabs(output), lang) : output.split(\"\\n\");\n\tconst lines = trimTrailingEmptyLines(renderedLines);\n\tconst maxLines = options.expanded ? lines.length : 10;\n\tconst displayLines = lines.slice(0, maxLines);\n\tconst remaining = lines.length - maxLines;\n\tlet text = `\\n${displayLines.map((line) => (lang ? replaceTabs(line) : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\tif (remaining > 0) {\n\t\ttext +=\n\t\t\ttheme.fg(\"muted\", \"\\n... \") + parenthesizedKeyHint(\"app.tools.expand\", \"Expand\", `${remaining} more lines`);\n\t}\n\tconst truncation = result.details?.truncation;\n\tif (truncation?.truncated) {\n\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[First line exceeds ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;\n\t\t} else if (truncation.truncatedBy === \"lines\") {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines (${truncation.maxLines ?? DEFAULT_MAX_LINES} line limit)]`)}`;\n\t\t} else {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit)]`)}`;\n\t\t}\n\t}\n\treturn text;\n}\nfunction archiveSelectorMemberExists(pathValue: string, cwd: string): boolean {\n\tconst archive = parseArchiveSelector(pathValue);\n\tif (!archive?.memberPath) return false;\n\ttry {\n\t\treadArchiveSelector(resolveArchiveSelector(archive, cwd));\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\nfunction appendReadSelectors(pathValue: string, selector: ReadLineSelector): string {\n\tconst range =\n\t\tselector.ranges\n\t\t\t?.map((item) => (item.end === undefined ? `${item.start}` : `${item.start}-${item.end}`))\n\t\t\t.join(\",\") ?? (selector.offset ? `${selector.offset}` : \"\");\n\treturn `${pathValue}${range ? `:${range}` : \"\"}${selector.conflicts ? \":conflicts\" : \"\"}${selector.raw ? \":raw\" : \"\"}`;\n}\nexport function createReadToolDefinition(\n\tcwd: string,\n\toptions?: ReadToolOptions,\n): ToolDefinition<typeof readSchema, ReadToolDetails | undefined> {\n\tconst autoResizeImages = options?.autoResizeImages ?? true;\n\tconst ops = options?.operations ?? defaultReadOperations;\n\tconst hashlineStore = options?.hashlineStore ?? createHashlineSnapshotStore();\n\treturn {\n\t\tname: \"read\",\n\t\tlabel: \"read\",\n\t\tdescription:\n\t\t\t\"Read files, directories, archives, SQLite databases, internal resources, images, documents, and URLs through one path string.\",\n\t\tpromptSnippet: readToolSystemPromptContribution.snippet,\n\t\tpromptGuidelines: [...readToolSystemPromptContribution.guidelines],\n\t\t...experimentalToolSamplingProperty(),\n\t\tparameters: readSchema,\n\t\tmaxResultSizeChars: Infinity,\n\t\tasync execute(_toolCallId, { path }: ReadToolInput, signal?: AbortSignal, _onUpdate?, ctx?) {\n\t\t\tconst resourceCtx = ctx as InternalResourceContext | undefined;\n\t\t\tconst splitSelector = splitReadLineSelector(path),\n\t\t\t\tmarkerless = path.replace(/:raw(?=(:|$))/g, \"\").replace(/:conflicts(?=(:|$))/g, \"\"),\n\t\t\t\tsqliteOriginal = sqliteSelectorForPath(markerless, cwd),\n\t\t\t\tsqliteDirect = sqliteSelectorForPath(path, cwd);\n\t\t\tconst selector = archiveSelectorMemberExists(path, cwd)\n\t\t\t\t? { path }\n\t\t\t\t: sqliteDirect && (sqliteDirect.table === \"raw\" || sqliteDirect.table === \"conflicts\")\n\t\t\t\t\t? { path }\n\t\t\t\t\t: sqliteOriginal?.rowId && splitSelector.path !== markerless\n\t\t\t\t\t\t? { path: markerless, raw: splitSelector.raw, conflicts: splitSelector.conflicts }\n\t\t\t\t\t\t: sqliteOriginal && splitSelector.path === markerless && markerless !== path\n\t\t\t\t\t\t\t? { path: markerless, raw: splitSelector.raw, conflicts: splitSelector.conflicts }\n\t\t\t\t\t\t\t: splitSelector.path === path && sqliteDirect\n\t\t\t\t\t\t\t\t? { path }\n\t\t\t\t\t\t\t\t: splitSelector;\n\t\t\tconst effectivePath = selector.path;\n\t\t\tconst effectiveOffset = selector.offset;\n\t\t\tconst effectiveLimit = selector.limit;\n\t\t\tconst effectiveRanges = selector.ranges;\n\t\t\tconst rawOutput = selector.raw;\n\t\t\tconst conflictsOnly = selector.conflicts;\n\t\t\treturn new Promise<{ content: (TextContent | ImageContent)[]; details: ReadToolDetails | undefined }>(\n\t\t\t\t(resolve, reject) => {\n\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet aborted = false;\n\t\t\t\t\tconst onAbort = () => {\n\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t};\n\t\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst archive = parseArchiveSelector(effectivePath);\n\t\t\t\t\t\t\tconst sqlite = sqliteSelectorForPath(effectivePath, cwd);\n\t\t\t\t\t\t\tif (isReadableUrlPath(effectivePath)) {\n\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\tawait readUrlBranch({\n\t\t\t\t\t\t\t\t\t\teffectivePath,\n\t\t\t\t\t\t\t\t\t\trawOutput: rawOutput === true,\n\t\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t\t\teffectiveOffset,\n\t\t\t\t\t\t\t\t\t\teffectiveLimit,\n\t\t\t\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\tmaxBytes: DEFAULT_MAX_BYTES,\n\t\t\t\t\t\t\t\t\t\toversized: oversizedReadResult,\n\t\t\t\t\t\t\t\t\t\tsourceMeta: readSourceMeta,\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\t\t\t\t\t\t\tif (sqlite) {\n\t\t\t\t\t\t\t\tconst textContent = readSqliteSelector(sqlite),\n\t\t\t\t\t\t\t\t\tselection = applyReadLineSelection(\n\t\t\t\t\t\t\t\t\t\ttextContent.split(\"\\n\"),\n\t\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t\t\teffectiveOffset,\n\t\t\t\t\t\t\t\t\t\teffectiveLimit,\n\t\t\t\t\t\t\t\t\t\trawOutput,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tselectedText = selection.lines.join(\"\\n\");\n\t\t\t\t\t\t\t\tif ((effectiveRanges || effectiveOffset) && selection.lines.length === 0) {\n\t\t\t\t\t\t\t\t\tconst requested = effectiveRanges?.[0]?.start ?? effectiveOffset ?? 1;\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${requested} is beyond end of resource (${textContent.split(\"\\n\").length} lines total).`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tselectedText.length > READ_TOOL_MAX_RESULT_CHARS ||\n\t\t\t\t\t\t\t\t\tBuffer.byteLength(selectedText, \"utf8\") > DEFAULT_MAX_BYTES\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\toversizedReadResult({\n\t\t\t\t\t\t\t\t\t\t\tblocked: true,\n\t\t\t\t\t\t\t\t\t\t\tpath: effectivePath,\n\t\t\t\t\t\t\t\t\t\t\tchars: selectedText.length,\n\t\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\t\tstartLine: selection.firstLine,\n\t\t\t\t\t\t\t\t\t\t\ttotalFileLines: textContent.split(\"\\n\").length,\n\t\t\t\t\t\t\t\t\t\t\tfirstLineBytes: Buffer.byteLength(selection.lines[0] ?? \"\", \"utf8\"),\n\t\t\t\t\t\t\t\t\t\t\tbyteGuidance: false,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\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\tresolve({\n\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: selectedText }],\n\t\t\t\t\t\t\t\t\tdetails: readSourceMeta(effectivePath),\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\t\t\t\t\t\t\tif (archive) {\n\t\t\t\t\t\t\t\tconst resolvedArchive = resolveArchiveSelector(archive, cwd);\n\t\t\t\t\t\t\t\tconst textContent = readArchiveSelector(resolvedArchive);\n\t\t\t\t\t\t\t\tlet allLines = textContent.split(\"\\n\");\n\t\t\t\t\t\t\t\tif (conflictsOnly) {\n\t\t\t\t\t\t\t\t\tlet inConflict = false;\n\t\t\t\t\t\t\t\t\tconst conflictLines = allLines.filter((line) => {\n\t\t\t\t\t\t\t\t\t\tif (line.startsWith(\"<<<<<<<\")) inConflict = true;\n\t\t\t\t\t\t\t\t\t\tconst keep = inConflict;\n\t\t\t\t\t\t\t\t\t\tif (line.startsWith(\">>>>>>>\")) inConflict = false;\n\t\t\t\t\t\t\t\t\t\treturn keep;\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tif (conflictLines.length === 0) {\n\t\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No conflict markers found\" }],\n\t\t\t\t\t\t\t\t\t\t\tdetails: undefined,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tallLines = conflictLines;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst rangeSelection = (rawOutput ? selectExactReadRanges : selectReadRanges)(\n\t\t\t\t\t\t\t\t\tallLines,\n\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst startLine = rangeSelection\n\t\t\t\t\t\t\t\t\t? rangeSelection.firstLine - 1\n\t\t\t\t\t\t\t\t\t: effectiveOffset\n\t\t\t\t\t\t\t\t\t\t? Math.max(0, effectiveOffset - 1)\n\t\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tstartLine >= allLines.length ||\n\t\t\t\t\t\t\t\t\t(effectiveRanges && rangeSelection?.selectedLines.length === 0)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${startLine + 1} is beyond end of resource (${allLines.length} lines total).`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst endLine =\n\t\t\t\t\t\t\t\t\teffectiveLimit !== undefined\n\t\t\t\t\t\t\t\t\t\t? Math.min(startLine + effectiveLimit, allLines.length)\n\t\t\t\t\t\t\t\t\t\t: allLines.length;\n\t\t\t\t\t\t\t\tconst selectedLines = rangeSelection?.selectedLines ?? allLines.slice(startLine, endLine);\n\t\t\t\t\t\t\t\tconst selectedText = selectedLines.join(\"\\n\");\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tselectedText.length > READ_TOOL_MAX_RESULT_CHARS ||\n\t\t\t\t\t\t\t\t\tBuffer.byteLength(selectedText, \"utf8\") > DEFAULT_MAX_BYTES\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\toversizedReadResult({\n\t\t\t\t\t\t\t\t\t\t\tblocked: true,\n\t\t\t\t\t\t\t\t\t\t\tpath: `${resolvedArchive.archivePath}:${resolvedArchive.memberPath}`,\n\t\t\t\t\t\t\t\t\t\t\tchars: selectedText.length,\n\t\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\t\tstartLine: startLine + 1,\n\t\t\t\t\t\t\t\t\t\t\ttotalFileLines: allLines.length,\n\t\t\t\t\t\t\t\t\t\t\tfirstLineBytes: Buffer.byteLength(selectedLines[0] ?? \"\", \"utf8\"),\n\t\t\t\t\t\t\t\t\t\t\tbyteGuidance: false,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\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\tresolve({\n\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: selectedText }],\n\t\t\t\t\t\t\t\t\tdetails: readSourceMeta(`${resolvedArchive.archivePath}:${resolvedArchive.memberPath}`),\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\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t/^(?:skill|agent|artifact|history|issue|local|memory|pr|conflict|omp|rule|mcp|vault):\\/\\//.test(\n\t\t\t\t\t\t\t\t\teffectivePath,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconst sourcePath = effectivePath.startsWith(\"local://\")\n\t\t\t\t\t\t\t\t\t? resolveInternalSelector(effectivePath, cwd)\n\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\t\tif (sourcePath) {\n\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\tawait createReadToolDefinition(cwd, options).execute(\n\t\t\t\t\t\t\t\t\t\t\t_toolCallId,\n\t\t\t\t\t\t\t\t\t\t\t{ path: appendReadSelectors(sourcePath, selector) },\n\t\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\t\t_onUpdate,\n\t\t\t\t\t\t\t\t\t\t\tctx as never,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t);\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\tconst allLines = (await readInternalSelector(effectivePath, cwd, resourceCtx)).split(\"\\n\");\n\t\t\t\t\t\t\t\tconst rangeSelection = (rawOutput ? selectExactReadRanges : selectReadRanges)(\n\t\t\t\t\t\t\t\t\tallLines,\n\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst startLine = rangeSelection\n\t\t\t\t\t\t\t\t\t? rangeSelection.firstLine - 1\n\t\t\t\t\t\t\t\t\t: effectiveOffset\n\t\t\t\t\t\t\t\t\t\t? Math.max(0, effectiveOffset - 1)\n\t\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tstartLine >= allLines.length ||\n\t\t\t\t\t\t\t\t\t(effectiveRanges && rangeSelection?.selectedLines.length === 0)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${startLine + 1} is beyond end of resource (${allLines.length} lines total).`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst endLine =\n\t\t\t\t\t\t\t\t\teffectiveLimit !== undefined\n\t\t\t\t\t\t\t\t\t\t? Math.min(startLine + effectiveLimit, allLines.length)\n\t\t\t\t\t\t\t\t\t\t: allLines.length;\n\t\t\t\t\t\t\t\tconst selectedLines = rangeSelection?.selectedLines ?? allLines.slice(startLine, endLine);\n\t\t\t\t\t\t\t\tconst selectedText = selectedLines.join(\"\\n\");\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tselectedText.length > READ_TOOL_MAX_RESULT_CHARS ||\n\t\t\t\t\t\t\t\t\tBuffer.byteLength(selectedText, \"utf8\") > DEFAULT_MAX_BYTES\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\toversizedReadResult({\n\t\t\t\t\t\t\t\t\t\t\tblocked: true,\n\t\t\t\t\t\t\t\t\t\t\tpath: effectivePath,\n\t\t\t\t\t\t\t\t\t\t\tchars: selectedText.length,\n\t\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\t\tstartLine: startLine + 1,\n\t\t\t\t\t\t\t\t\t\t\ttotalFileLines: allLines.length,\n\t\t\t\t\t\t\t\t\t\t\tfirstLineBytes: Buffer.byteLength(selectedLines[0] ?? \"\", \"utf8\"),\n\t\t\t\t\t\t\t\t\t\t\tbyteGuidance: false,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\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\tresolve({\n\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: selectedText }],\n\t\t\t\t\t\t\t\t\tdetails: readSourceMeta(effectivePath),\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\t\t\t\t\t\t\tif (isReadResourceSelector(effectivePath))\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`Read resource selectors are not supported by this filesystem backend: ${path}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst absolutePath = await resolveReadPathAsync(effectivePath, cwd);\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tlet content: (TextContent | ImageContent)[];\n\t\t\t\t\t\t\tlet details: ReadToolDetails | undefined;\n\t\t\t\t\t\t\tawait ops.access(absolutePath);\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tif (isDocumentPath(absolutePath) && !rawOutput && !isNotebookPath(absolutePath)) {\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst textContent = await extractDocumentMarkdown(buffer, absolutePath);\n\t\t\t\t\t\t\t\tconst selection = applyReadLineSelection(\n\t\t\t\t\t\t\t\t\ttextContent.split(\"\\n\"),\n\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t\teffectiveOffset,\n\t\t\t\t\t\t\t\t\teffectiveLimit,\n\t\t\t\t\t\t\t\t\trawOutput,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (selection.lines.length === 0) {\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${selection.firstLine} is beyond end of document (${textContent.split(\"\\n\").length} lines total).`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst selectedText = selection.lines.join(\"\\n\");\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tselectedText.length > READ_TOOL_MAX_RESULT_CHARS ||\n\t\t\t\t\t\t\t\t\tBuffer.byteLength(selectedText, \"utf8\") > DEFAULT_MAX_BYTES\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\toversizedReadResult({\n\t\t\t\t\t\t\t\t\t\t\tblocked: true,\n\t\t\t\t\t\t\t\t\t\t\tpath: absolutePath,\n\t\t\t\t\t\t\t\t\t\t\tchars: selectedText.length,\n\t\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\t\tstartLine: selection.firstLine,\n\t\t\t\t\t\t\t\t\t\t\ttotalFileLines: textContent.split(\"\\n\").length,\n\t\t\t\t\t\t\t\t\t\t\tfirstLineBytes: Buffer.byteLength(selection.lines[0] ?? \"\", \"utf8\"),\n\t\t\t\t\t\t\t\t\t\t\tbyteGuidance: false,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\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\tcontent = [{ type: \"text\", text: selectedText }];\n\t\t\t\t\t\t\t\tresolve({ content, details: readSourceMeta(absolutePath) });\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlet tree: DirectoryTreeResult | undefined;\n\t\t\t\t\t\t\tif (ops.stat && ops.listDir) {\n\t\t\t\t\t\t\t\tconst stat = await ops.stat(absolutePath);\n\t\t\t\t\t\t\t\tif (stat?.isDirectory)\n\t\t\t\t\t\t\t\t\ttree = await buildDirectoryTreeFromOperations(\n\t\t\t\t\t\t\t\t\t\tabsolutePath,\n\t\t\t\t\t\t\t\t\t\t{ listDir: ops.listDir },\n\t\t\t\t\t\t\t\t\t\t{ maxDepth: 2, perDirLimit: 12, rootLimit: null },\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else if (!options?.operations && (await fsStat(absolutePath)).isDirectory()) {\n\t\t\t\t\t\t\t\ttree = await buildDirectoryTree(absolutePath, {\n\t\t\t\t\t\t\t\t\tmaxDepth: 2,\n\t\t\t\t\t\t\t\t\tperDirLimit: 12,\n\t\t\t\t\t\t\t\t\trootLimit: null,\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 (tree) {\n\t\t\t\t\t\t\t\tconst allLines = tree.rendered.split(\"\\n\"),\n\t\t\t\t\t\t\t\t\trangeSelection = (rawOutput ? selectExactReadRanges : selectReadRanges)(\n\t\t\t\t\t\t\t\t\t\tallLines,\n\t\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tstartLine = rangeSelection\n\t\t\t\t\t\t\t\t\t\t? rangeSelection.firstLine - 1\n\t\t\t\t\t\t\t\t\t\t: effectiveOffset\n\t\t\t\t\t\t\t\t\t\t\t? Math.max(0, effectiveOffset - 1)\n\t\t\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tstartLine >= allLines.length ||\n\t\t\t\t\t\t\t\t\t(effectiveRanges && rangeSelection?.selectedLines.length === 0)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${startLine + 1} is beyond end of directory (${allLines.length} lines total).`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst endLine =\n\t\t\t\t\t\t\t\t\t\teffectiveLimit !== undefined\n\t\t\t\t\t\t\t\t\t\t\t? Math.min(startLine + effectiveLimit, allLines.length)\n\t\t\t\t\t\t\t\t\t\t\t: allLines.length,\n\t\t\t\t\t\t\t\t\tselectedLines = rangeSelection?.selectedLines ?? allLines.slice(startLine, endLine);\n\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: selectedLines.join(\"\\n\") }];\n\t\t\t\t\t\t\t\tconst meta = {\n\t\t\t\t\t\t\t\t\t...readSourceMeta(absolutePath).meta,\n\t\t\t\t\t\t\t\t\t...(tree.truncated ? { limits: { perDirLimit: 12, totalLines: tree.totalLines } } : {}),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tresolve({ content, details: { isDirectory: true, resolvedPath: absolutePath, meta } });\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 mimeType = ops.detectImageMimeType ? await ops.detectImageMimeType(absolutePath) : undefined;\n\t\t\t\t\t\t\tconst nonVisionImageNote = getNonVisionImageNote(ctx?.model);\n\t\t\t\t\t\t\tif (mimeType) {\n\t\t\t\t\t\t\t\t// Read image as binary.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst processed = await processImage(buffer, mimeType, { autoResizeImages });\n\t\t\t\t\t\t\t\tif (!processed.ok) {\n\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]\\n${processed.message}`;\n\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: textNote }];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${processed.mimeType}]`;\n\t\t\t\t\t\t\t\t\tif (processed.hints.length > 0) textNote += `\\n${processed.hints.join(\"\\n\")}`;\n\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\tcontent = [\n\t\t\t\t\t\t\t\t\t\t{ type: \"text\", text: textNote },\n\t\t\t\t\t\t\t\t\t\t{ type: \"image\", data: processed.data, mimeType: processed.mimeType },\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} else {\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst textContent =\n\t\t\t\t\t\t\t\t\tisNotebookPath(absolutePath) && !rawOutput\n\t\t\t\t\t\t\t\t\t\t? readEditableNotebookText(absolutePath, effectivePath)\n\t\t\t\t\t\t\t\t\t\t: buffer.toString(\"utf-8\");\n\t\t\t\t\t\t\t\t// Numbered output uses the same LF-normalized text as its formatters. Keep raw reads\n\t\t\t\t\t\t\t\t// on the source bytes so :raw preserves CRLF and terminal-newline bytes exactly.\n\t\t\t\t\t\t\t\tconst numberedTextContent = rawOutput ? textContent : textContent.replace(/\\r\\n/g, \"\\n\");\n\t\t\t\t\t\t\t\tconst sourceLines = numberedTextContent.split(\"\\n\");\n\t\t\t\t\t\t\t\t// A terminal newline separates real lines; omit only its synthetic split item.\n\t\t\t\t\t\t\t\tlet allLines =\n\t\t\t\t\t\t\t\t\trawOutput || !numberedTextContent.endsWith(\"\\n\") ? sourceLines : sourceLines.slice(0, -1);\n\t\t\t\t\t\t\t\tlet conflictLineNumbers: number[] | undefined;\n\t\t\t\t\t\t\t\tif (conflictsOnly) {\n\t\t\t\t\t\t\t\t\tregisterConflictBlocks(cwd, parseConflictBlocks(absolutePath, textContent));\n\t\t\t\t\t\t\t\t\tconst conflictLines: string[] = [];\n\t\t\t\t\t\t\t\t\tconflictLineNumbers = [];\n\t\t\t\t\t\t\t\t\tlet inConflict = false;\n\t\t\t\t\t\t\t\t\tallLines.forEach((line, index) => {\n\t\t\t\t\t\t\t\t\t\tif (line.startsWith(\"<<<<<<<\")) inConflict = true;\n\t\t\t\t\t\t\t\t\t\tif (inConflict) {\n\t\t\t\t\t\t\t\t\t\t\tconflictLines.push(line);\n\t\t\t\t\t\t\t\t\t\t\tconflictLineNumbers!.push(index + 1);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (line.startsWith(\">>>>>>>\")) inConflict = false;\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tif (conflictLines.length > 0) allLines = conflictLines;\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No conflict markers found\" }],\n\t\t\t\t\t\t\t\t\t\t\tdetails: undefined,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\treturn;\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\tconst totalFileLines = allLines.length;\n\t\t\t\t\t\t\t\tconst rangeSelection = (rawOutput ? selectExactReadRanges : selectReadRanges)(\n\t\t\t\t\t\t\t\t\tallLines,\n\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst startLine = rangeSelection\n\t\t\t\t\t\t\t\t\t? rangeSelection.firstLine - 1\n\t\t\t\t\t\t\t\t\t: effectiveOffset\n\t\t\t\t\t\t\t\t\t\t? Math.max(0, effectiveOffset - 1)\n\t\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tconst startLineDisplay = startLine + 1;\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tstartLine >= allLines.length ||\n\t\t\t\t\t\t\t\t\t(effectiveRanges && rangeSelection?.selectedLines.length === 0)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst requested = effectiveRanges?.[0]?.start ?? startLineDisplay;\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${requested} is beyond end of file (${allLines.length} lines total). Use ${effectivePath}:${Math.max(1, allLines.length)} to read the final line.`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlet selectedContent: string;\n\t\t\t\t\t\t\t\tlet selectedLines: string[];\n\t\t\t\t\t\t\t\tlet userLimitedLines: number | undefined;\n\t\t\t\t\t\t\t\tif (rangeSelection) {\n\t\t\t\t\t\t\t\t\tselectedLines = rangeSelection.selectedLines;\n\t\t\t\t\t\t\t\t\tselectedContent = rangeSelection.selectedContent;\n\t\t\t\t\t\t\t\t\tuserLimitedLines = rangeSelection.userLimitedLines;\n\t\t\t\t\t\t\t\t} else if (effectiveLimit !== undefined) {\n\t\t\t\t\t\t\t\t\tconst endLine = Math.min(startLine + effectiveLimit, allLines.length);\n\t\t\t\t\t\t\t\t\tselectedLines = allLines.slice(startLine, endLine);\n\t\t\t\t\t\t\t\t\tselectedContent = selectedLines.join(\"\\n\");\n\t\t\t\t\t\t\t\t\tuserLimitedLines = endLine - startLine;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tselectedLines = allLines.slice(startLine);\n\t\t\t\t\t\t\t\t\tselectedContent = selectedLines.join(\"\\n\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (selectedContent.length > READ_TOOL_MAX_RESULT_CHARS) {\n\t\t\t\t\t\t\t\t\tconst firstSelectedLine = allLines[startLine] ?? \"\";\n\t\t\t\t\t\t\t\t\tconst firstLineBytes = Buffer.byteLength(firstSelectedLine, \"utf-8\");\n\t\t\t\t\t\t\t\t\tconst selectedLineCount = trimTrailingEmptyLines(selectedLines).length;\n\t\t\t\t\t\t\t\t\tconst byteGuidance = selectedLineCount <= 1 || firstLineBytes > DEFAULT_MAX_BYTES;\n\t\t\t\t\t\t\t\t\tconst oversizedRead: OversizedReadDetails = {\n\t\t\t\t\t\t\t\t\t\tblocked: true,\n\t\t\t\t\t\t\t\t\t\tpath: absolutePath,\n\t\t\t\t\t\t\t\t\t\tchars: selectedContent.length,\n\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\tstartLine: startLineDisplay,\n\t\t\t\t\t\t\t\t\t\t...(effectiveLimit !== undefined ? { requestedLimit: effectiveLimit } : {}),\n\t\t\t\t\t\t\t\t\t\ttotalFileLines,\n\t\t\t\t\t\t\t\t\t\tfirstLineBytes,\n\t\t\t\t\t\t\t\t\t\tbyteGuidance,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tdetails = { oversizedRead, meta: readSourceMeta(absolutePath).meta };\n\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: buildOversizedReadMessage(oversizedRead) }];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconst truncation = truncateHead(selectedContent);\n\t\t\t\t\t\t\t\t\tlet outputText = truncation.content;\n\t\t\t\t\t\t\t\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\t\t\t\t\t\t\t\tconst firstLineSize = formatSize(Buffer.byteLength(allLines[startLine], \"utf-8\"));\n\t\t\t\t\t\t\t\t\t\toutputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${effectivePath} | head -c ${DEFAULT_MAX_BYTES}]`;\n\t\t\t\t\t\t\t\t\t\tdetails = {\n\t\t\t\t\t\t\t\t\t\t\ttruncation,\n\t\t\t\t\t\t\t\t\t\t\tmeta: { source: absolutePath, sourcePath: absolutePath, truncation },\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t} else if (truncation.truncated) {\n\t\t\t\t\t\t\t\t\t\tconst endLineDisplay = startLineDisplay + truncation.outputLines - 1;\n\t\t\t\t\t\t\t\t\t\tconst nextOffset = endLineDisplay + 1;\n\t\t\t\t\t\t\t\t\t\toutputText +=\n\t\t\t\t\t\t\t\t\t\t\ttruncation.truncatedBy === \"lines\"\n\t\t\t\t\t\t\t\t\t\t\t\t? `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Continue with path selector :${nextOffset}.]`\n\t\t\t\t\t\t\t\t\t\t\t\t: `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Continue with path selector :${nextOffset}.]`;\n\t\t\t\t\t\t\t\t\t\tdetails = {\n\t\t\t\t\t\t\t\t\t\t\ttruncation,\n\t\t\t\t\t\t\t\t\t\t\tmeta: { source: absolutePath, sourcePath: absolutePath, truncation },\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\t!rawOutput &&\n\t\t\t\t\t\t\t\t\t\tuserLimitedLines !== undefined &&\n\t\t\t\t\t\t\t\t\t\tstartLine + userLimitedLines < allLines.length\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tconst remaining = allLines.length - (startLine + userLimitedLines);\n\t\t\t\t\t\t\t\t\t\tconst nextOffset = startLine + userLimitedLines + 1;\n\t\t\t\t\t\t\t\t\t\toutputText = `${truncation.content}\\n\\n[${remaining} more lines in file. Continue with path selector :${nextOffset}.]`;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (truncation.firstLineExceedsLimit) content = [{ type: \"text\", text: outputText }];\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tconst snapshot = recordHashlineSnapshot(absolutePath, cwd, textContent, hashlineStore);\n\t\t\t\t\t\t\t\t\t\tconst visibleContent = truncation.truncated ? truncation.content : selectedContent;\n\t\t\t\t\t\t\t\t\t\tconst header = `[${snapshot.displayPath}#${snapshot.tag}]`;\n\t\t\t\t\t\t\t\t\t\tconst selectedConflictLineNumbers =\n\t\t\t\t\t\t\t\t\t\t\tconflictLineNumbers && rangeSelection?.lineNumbers\n\t\t\t\t\t\t\t\t\t\t\t\t? rangeSelection.lineNumbers\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map((line) => conflictLineNumbers![line - 1])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter((line): line is number => typeof line === \"number\")\n\t\t\t\t\t\t\t\t\t\t\t\t: conflictLineNumbers\n\t\t\t\t\t\t\t\t\t\t\t\t\t? conflictLineNumbers.slice(startLine, startLine + selectedLines.length)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\t\t\t\tlet hashlineOutput = rawOutput\n\t\t\t\t\t\t\t\t\t\t\t? visibleContent\n\t\t\t\t\t\t\t\t\t\t\t: selectedConflictLineNumbers && visibleContent === selectedContent\n\t\t\t\t\t\t\t\t\t\t\t\t? formatHashlineSelectedLines(header, selectedLines, selectedConflictLineNumbers)\n\t\t\t\t\t\t\t\t\t\t\t\t: rangeSelection && visibleContent === selectedContent\n\t\t\t\t\t\t\t\t\t\t\t\t\t? formatHashlineSelectedLines(header, selectedLines, rangeSelection.lineNumbers)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: formatHashlineContent(snapshot, visibleContent, startLineDisplay);\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\toutputText.startsWith(truncation.content) &&\n\t\t\t\t\t\t\t\t\t\t\toutputText.length > truncation.content.length\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\thashlineOutput += outputText.slice(truncation.content.length);\n\t\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: hashlineOutput }];\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}\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tresolve({ content, details: details ?? readSourceMeta(absolutePath) });\n\t\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tif (!aborted) reject(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\tconst classification = !context.expanded ? getCompactReadClassification(args, context.cwd) : undefined;\n\t\t\ttext.setText(\n\t\t\t\tclassification ? formatCompactReadCall(classification, args, theme) : formatReadCall(args, theme),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tformatReadResult(context.args, result, options, theme, context.showImages, context.cwd, context.isError),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t};\n}\nexport function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema> {\n\treturn wrapToolDefinition(createReadToolDefinition(cwd, options));\n}\n"]}
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/core/tools/read.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from \"node:path\";\nimport type { Api, ImageContent, Model, TextContent } from \"@bastani/pi-ai/compat\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { constants } from \"fs\";\nimport { access as fsAccess, readFile as fsReadFile, stat as fsStat } from \"fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { getReadmePath } from \"../../config.js\";\nimport { parenthesizedKeyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { processImage } from \"../../utils/image-process.ts\";\nimport { detectSupportedImageMimeTypeFromFile } from \"../../utils/mime.ts\";\nimport { formatPathRelativeToCwdOrAbsolute } from \"../../utils/paths.ts\";\nimport { experimentalToolSamplingProperty } from \"../experimental.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { parseConflictBlocks, registerConflictBlocks } from \"./conflict-registry.ts\";\nimport {\n\tbuildDirectoryTree,\n\tbuildDirectoryTreeFromOperations,\n\ttype DirectoryTreeEntry,\n\ttype DirectoryTreeResult,\n} from \"./directory-tree.ts\";\nimport { isReadableUrlPath } from \"./fetch-url.ts\";\nimport {\n\tcreateHashlineSnapshotStore,\n\tformatHashlineContent,\n\ttype HashlineSnapshotStore,\n\trecordHashlineSnapshot,\n} from \"./hashline.ts\";\nimport { isNotebookPath, readEditableNotebookText } from \"./notebook.ts\";\nimport { resolveReadPathAsync, resolveToCwd } from \"./path-utils.ts\";\nimport { applyReadLineSelection, extractDocumentMarkdown, isDocumentPath } from \"./read-document-extract.ts\";\nimport {\n\tformatHashlineSelectedLines,\n\tisReadResourceSelector,\n\ttype ReadLineSelector,\n\tselectExactReadRanges,\n\tselectReadRanges,\n\tsplitReadLineSelector,\n} from \"./read-selectors.ts\";\nimport { readUrlBranch } from \"./read-url.ts\";\nimport { getTextOutput, invalidArgText, replaceTabs, shortenPath, str } from \"./render-utils.ts\";\nimport {\n\ttype InternalResourceContext,\n\tparseArchiveSelector,\n\treadArchiveSelector,\n\treadInternalSelector,\n\treadSqliteSelector,\n\tresolveArchiveSelector,\n\tresolveInternalSelector,\n\tsqliteSelectorForPath,\n} from \"./resource-selectors.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nconst readSchema = Type.Object(\n\t{\n\t\tpath: Type.String({\n\t\t\tdescription:\n\t\t\t\t\"File, directory, archive member, SQLite selector, internal resource, image, document, or URL to read. Append selectors such as :raw, :conflicts, :N, :A-B, :A+C, or :A-B,C-D to scope output.\",\n\t\t}),\n\t},\n\t{ additionalProperties: false },\n);\nexport const readToolSystemPromptContribution = Object.freeze({\n\tsnippet: \"Read a path selector.\",\n\tguidelines: Object.freeze([\n\t\t\"Use read to inspect file and resource contents; use path selectors for line ranges, raw output, and conflict views.\",\n\t] as const),\n} as const);\nexport type ReadToolInput = Static<typeof readSchema>;\nconst READ_TOOL_MAX_RESULT_CHARS = 50_000;\nexport interface OversizedReadDetails {\n\tblocked: true;\n\tpath: string;\n\tchars: number;\n\tmaxChars: number;\n\tstartLine: number;\n\trequestedLimit?: number;\n\ttotalFileLines: number;\n\tfirstLineBytes: number;\n\tbyteGuidance: boolean;\n}\nexport interface ReadToolDetails {\n\tisDirectory?: boolean;\n\tresolvedPath?: string;\n\ttruncation?: TruncationResult;\n\toversizedRead?: OversizedReadDetails;\n\tmeta?: {\n\t\tsource?: string;\n\t\tsourcePath?: string;\n\t\tartifactId?: string;\n\t\ttruncation?: TruncationResult;\n\t\tlimits?: Record<string, number>;\n\t};\n}\ninterface CompactReadClassification {\n\tkind: \"docs\" | \"resource\" | \"skill\";\n\tlabel: string;\n}\nconst COMPACT_RESOURCE_FILE_NAMES = new Set([\"AGENTS.override.md\", \"AGENTS.md\", \"AGENTS.MD\", \"CLAUDE.md\", \"CLAUDE.MD\"]);\nexport interface ReadOperations {\n\treadFile: (absolutePath: string) => Promise<Buffer>;\n\taccess: (absolutePath: string) => Promise<void>;\n\tstat?: (absolutePath: string) => Promise<{ isFile: boolean; isDirectory: boolean } | undefined>;\n\tlistDir?: (absolutePath: string) => Promise<DirectoryTreeEntry[] | undefined>;\n\tdetectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;\n}\nconst defaultReadOperations: ReadOperations = {\n\treadFile: (path) => fsReadFile(path),\n\taccess: (path) => fsAccess(path, constants.R_OK),\n\tdetectImageMimeType: detectSupportedImageMimeTypeFromFile,\n};\nexport interface ReadToolOptions {\n\tautoResizeImages?: boolean;\n\toperations?: ReadOperations;\n\thashlineStore?: HashlineSnapshotStore;\n}\ntype ReadRenderArgs = { path?: string };\nfunction formatReadLineRange(_args: ReadRenderArgs | undefined, _theme: Theme): string {\n\treturn \"\";\n}\nfunction formatReadCall(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tconst rawPath = str(args?.path);\n\tconst path = rawPath !== null ? shortenPath(rawPath) : null;\n\tconst invalidArg = invalidArgText(theme);\n\tconst pathDisplay = path === null ? invalidArg : path ? theme.fg(\"accent\", path) : theme.fg(\"toolOutput\", \"...\");\n\treturn `${theme.fg(\"toolTitle\", theme.bold(\"read\"))} ${pathDisplay}${formatReadLineRange(args, theme)}`;\n}\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") end--;\n\treturn lines.slice(0, end);\n}\nfunction getNonVisionImageNote(model: Model<Api> | undefined): string | undefined {\n\treturn !model || model.input.includes(\"image\")\n\t\t? undefined\n\t\t: \"[Current model does not support images. The image will be omitted from this request.]\";\n}\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\nfunction formatCount(count: number): string {\n\treturn count.toLocaleString(\"en-US\");\n}\nfunction shellQuote(value: string): string {\n\treturn `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\nfunction buildOversizedReadMessage(details: OversizedReadDetails): string {\n\tconst pathForExample = JSON.stringify(details.path);\n\tconst rangePathForExample = JSON.stringify(`${details.path}:${details.startLine}+200`);\n\tconst shellPathForExample = shellQuote(details.path);\n\tconst requestedLimitLine =\n\t\tdetails.requestedLimit !== undefined ? [`Requested line limit: ${formatCount(details.requestedLimit)}`] : [];\n\tif (details.byteGuidance) {\n\t\treturn [\n\t\t\t`File read blocked: requested selected range is too large (${formatCount(details.chars)} chars; threshold: ${formatCount(details.maxChars)} chars).`,\n\t\t\t`Path: ${details.path}`,\n\t\t\t...requestedLimitLine,\n\t\t\t\"\",\n\t\t\t\"The selected content starts with a single oversized line, so line pagination is not useful. Read byte slices instead. Examples:\",\n\t\t\t`- Inspect the start of line ${details.startLine}: sed -n '${details.startLine}p' ${shellPathForExample} | head -c ${DEFAULT_MAX_BYTES}`,\n\t\t\t`- Inspect a later byte window: sed -n '${details.startLine}p' ${shellPathForExample} | tail -c +${DEFAULT_MAX_BYTES + 1} | head -c ${DEFAULT_MAX_BYTES}`,\n\t\t\t`- Search for relevant text first: search({ \"pattern\": \"functionName\", \"paths\": ${pathForExample} })`,\n\t\t].join(\"\\n\");\n\t}\n\tconst targetedSnippetOffset = Math.max(details.startLine, 120);\n\tconst snippetPathForExample = JSON.stringify(`${details.path}:${targetedSnippetOffset}+80`);\n\treturn [\n\t\t`File read blocked: requested selected range is too large (${formatCount(details.chars)} chars; threshold: ${formatCount(details.maxChars)} chars).`,\n\t\t`Path: ${details.path}`,\n\t\t...requestedLimitLine,\n\t\t\"\",\n\t\t\"Read only the needed context incrementally. Examples:\",\n\t\t`- Search for relevant symbols first: search({ \"pattern\": \"functionName\", \"paths\": ${pathForExample} })`,\n\t\t`- Read a smaller line range: read({ \"path\": ${rangePathForExample} })`,\n\t\t`- Read a targeted snippet around a match: read({ \"path\": ${snippetPathForExample} })`,\n\t].join(\"\\n\");\n}\nfunction readSourceMeta(source: string): ReadToolDetails {\n\treturn { meta: { source, sourcePath: source } };\n}\nfunction oversizedReadResult(details: OversizedReadDetails): { content: TextContent[]; details: ReadToolDetails } {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: buildOversizedReadMessage(details) }],\n\t\tdetails: {\n\t\t\toversizedRead: details,\n\t\t\tmeta: { source: details.path, sourcePath: details.path, limits: { maxChars: details.maxChars } },\n\t\t},\n\t};\n}\nfunction getPiDocsClassification(absolutePath: string): CompactReadClassification | undefined {\n\tconst packageRoot = dirname(getReadmePath());\n\tconst relativePath = relative(resolvePath(packageRoot), resolvePath(absolutePath));\n\tif (\n\t\trelativePath === \"\" ||\n\t\trelativePath === \"..\" ||\n\t\trelativePath.startsWith(`..${sep}`) ||\n\t\tisAbsolute(relativePath)\n\t) {\n\t\treturn undefined;\n\t}\n\tconst label = toPosixPath(relativePath);\n\tif (label === \"README.md\" || label.startsWith(\"docs/\") || label.startsWith(\"examples/\")) {\n\t\treturn { kind: \"docs\", label };\n\t}\n\treturn undefined;\n}\nfunction getCompactReadClassification(\n\targs: ReadRenderArgs | undefined,\n\tcwd: string,\n): CompactReadClassification | undefined {\n\tconst rawPath = str(args?.path);\n\tif (!rawPath) return undefined;\n\tconst absolutePath = resolveToCwd(rawPath, cwd);\n\tconst fileName = basename(absolutePath);\n\tif (fileName === \"SKILL.md\") {\n\t\treturn { kind: \"skill\", label: basename(dirname(absolutePath)) || fileName };\n\t}\n\tconst docsClassification = getPiDocsClassification(absolutePath);\n\tif (docsClassification) return docsClassification;\n\tif (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {\n\t\treturn { kind: \"resource\", label: formatPathRelativeToCwdOrAbsolute(absolutePath, cwd) };\n\t}\n\treturn undefined;\n}\nfunction formatCompactReadCall(\n\tclassification: CompactReadClassification,\n\targs: ReadRenderArgs | undefined,\n\ttheme: Theme,\n): string {\n\tconst hint = parenthesizedKeyHint(\"app.tools.expand\", \"Expand\");\n\tconst expandHint = hint ? ` ${hint}` : \"\";\n\tif (classification.kind === \"skill\") {\n\t\treturn (\n\t\t\ttheme.fg(\"customMessageLabel\", `\\x1b[1m[skill]\\x1b[22m `) +\n\t\t\ttheme.fg(\"customMessageText\", classification.label) +\n\t\t\tformatReadLineRange(args, theme) +\n\t\t\texpandHint\n\t\t);\n\t}\n\treturn (\n\t\ttheme.fg(\"toolTitle\", theme.bold(`read ${classification.kind}`)) +\n\t\t\" \" +\n\t\ttheme.fg(\"accent\", classification.label) +\n\t\tformatReadLineRange(args, theme) +\n\t\texpandHint\n\t);\n}\nfunction formatReadResult(\n\targs: ReadRenderArgs | undefined,\n\tresult: { content: (TextContent | ImageContent)[]; details?: ReadToolDetails },\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n\t_cwd: string,\n\tisError: boolean,\n): string {\n\tconst oversizedRead = result.details?.oversizedRead;\n\tconst oversizedReadBlocked = oversizedRead?.blocked === true;\n\tif (!options.expanded && !isError && !oversizedReadBlocked) {\n\t\treturn \"\";\n\t}\n\tconst rawPath = str(args?.path);\n\tconst output = oversizedRead ? buildOversizedReadMessage(oversizedRead) : getTextOutput(result, showImages);\n\tconst lang = !isError && rawPath && !oversizedReadBlocked ? getLanguageFromPath(rawPath) : undefined;\n\tconst renderedLines = lang ? highlightCode(replaceTabs(output), lang) : output.split(\"\\n\");\n\tconst lines = trimTrailingEmptyLines(renderedLines);\n\tconst maxLines = options.expanded ? lines.length : 10;\n\tconst displayLines = lines.slice(0, maxLines);\n\tconst remaining = lines.length - maxLines;\n\tlet text = `\\n${displayLines.map((line) => (lang ? replaceTabs(line) : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\tif (remaining > 0) {\n\t\ttext +=\n\t\t\ttheme.fg(\"muted\", \"\\n... \") + parenthesizedKeyHint(\"app.tools.expand\", \"Expand\", `${remaining} more lines`);\n\t}\n\tconst truncation = result.details?.truncation;\n\tif (truncation?.truncated) {\n\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[First line exceeds ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;\n\t\t} else if (truncation.truncatedBy === \"lines\") {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines (${truncation.maxLines ?? DEFAULT_MAX_LINES} line limit)]`)}`;\n\t\t} else {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit)]`)}`;\n\t\t}\n\t}\n\treturn text;\n}\nfunction archiveSelectorMemberExists(pathValue: string, cwd: string): boolean {\n\tconst archive = parseArchiveSelector(pathValue);\n\tif (!archive?.memberPath) return false;\n\ttry {\n\t\treadArchiveSelector(resolveArchiveSelector(archive, cwd));\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\nfunction appendReadSelectors(pathValue: string, selector: ReadLineSelector): string {\n\tconst range =\n\t\tselector.ranges\n\t\t\t?.map((item) => (item.end === undefined ? `${item.start}` : `${item.start}-${item.end}`))\n\t\t\t.join(\",\") ?? (selector.offset ? `${selector.offset}` : \"\");\n\treturn `${pathValue}${range ? `:${range}` : \"\"}${selector.conflicts ? \":conflicts\" : \"\"}${selector.raw ? \":raw\" : \"\"}`;\n}\nexport function createReadToolDefinition(\n\tcwd: string,\n\toptions?: ReadToolOptions,\n): ToolDefinition<typeof readSchema, ReadToolDetails | undefined> {\n\tconst autoResizeImages = options?.autoResizeImages ?? true;\n\tconst ops = options?.operations ?? defaultReadOperations;\n\tconst hashlineStore = options?.hashlineStore ?? createHashlineSnapshotStore();\n\treturn {\n\t\tname: \"read\",\n\t\tlabel: \"read\",\n\t\tdescription:\n\t\t\t\"Read files, directories, archives, SQLite databases, internal resources, images, documents, and URLs through one path string.\",\n\t\tpromptSnippet: readToolSystemPromptContribution.snippet,\n\t\tpromptGuidelines: [...readToolSystemPromptContribution.guidelines],\n\t\t...experimentalToolSamplingProperty(),\n\t\tparameters: readSchema,\n\t\tmaxResultSizeChars: Infinity,\n\t\tasync execute(_toolCallId, { path }: ReadToolInput, signal?: AbortSignal, _onUpdate?, ctx?) {\n\t\t\tconst resourceCtx = ctx as InternalResourceContext | undefined;\n\t\t\tconst splitSelector = splitReadLineSelector(path),\n\t\t\t\tmarkerless = path.replace(/:raw(?=(:|$))/g, \"\").replace(/:conflicts(?=(:|$))/g, \"\"),\n\t\t\t\tsqliteOriginal = sqliteSelectorForPath(markerless, cwd),\n\t\t\t\tsqliteDirect = sqliteSelectorForPath(path, cwd);\n\t\t\tconst selector = archiveSelectorMemberExists(path, cwd)\n\t\t\t\t? { path }\n\t\t\t\t: sqliteDirect && (sqliteDirect.table === \"raw\" || sqliteDirect.table === \"conflicts\")\n\t\t\t\t\t? { path }\n\t\t\t\t\t: sqliteOriginal?.rowId && splitSelector.path !== markerless\n\t\t\t\t\t\t? { path: markerless, raw: splitSelector.raw, conflicts: splitSelector.conflicts }\n\t\t\t\t\t\t: sqliteOriginal && splitSelector.path === markerless && markerless !== path\n\t\t\t\t\t\t\t? { path: markerless, raw: splitSelector.raw, conflicts: splitSelector.conflicts }\n\t\t\t\t\t\t\t: splitSelector.path === path && sqliteDirect\n\t\t\t\t\t\t\t\t? { path }\n\t\t\t\t\t\t\t\t: splitSelector;\n\t\t\tconst effectivePath = selector.path;\n\t\t\tconst effectiveOffset = selector.offset;\n\t\t\tconst effectiveLimit = selector.limit;\n\t\t\tconst effectiveRanges = selector.ranges;\n\t\t\tconst rawOutput = selector.raw;\n\t\t\tconst conflictsOnly = selector.conflicts;\n\t\t\treturn new Promise<{ content: (TextContent | ImageContent)[]; details: ReadToolDetails | undefined }>(\n\t\t\t\t(resolve, reject) => {\n\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet aborted = false;\n\t\t\t\t\tconst onAbort = () => {\n\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t};\n\t\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst archive = parseArchiveSelector(effectivePath);\n\t\t\t\t\t\t\tconst sqlite = sqliteSelectorForPath(effectivePath, cwd);\n\t\t\t\t\t\t\tif (isReadableUrlPath(effectivePath)) {\n\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\tawait readUrlBranch({\n\t\t\t\t\t\t\t\t\t\teffectivePath,\n\t\t\t\t\t\t\t\t\t\trawOutput: rawOutput === true,\n\t\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t\t\teffectiveOffset,\n\t\t\t\t\t\t\t\t\t\teffectiveLimit,\n\t\t\t\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\tmaxBytes: DEFAULT_MAX_BYTES,\n\t\t\t\t\t\t\t\t\t\toversized: oversizedReadResult,\n\t\t\t\t\t\t\t\t\t\tsourceMeta: readSourceMeta,\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\t\t\t\t\t\t\tif (sqlite) {\n\t\t\t\t\t\t\t\tconst textContent = readSqliteSelector(sqlite),\n\t\t\t\t\t\t\t\t\tselection = applyReadLineSelection(\n\t\t\t\t\t\t\t\t\t\ttextContent.split(\"\\n\"),\n\t\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t\t\teffectiveOffset,\n\t\t\t\t\t\t\t\t\t\teffectiveLimit,\n\t\t\t\t\t\t\t\t\t\trawOutput,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tselectedText = selection.lines.join(\"\\n\");\n\t\t\t\t\t\t\t\tif ((effectiveRanges || effectiveOffset) && selection.lines.length === 0) {\n\t\t\t\t\t\t\t\t\tconst requested = effectiveRanges?.[0]?.start ?? effectiveOffset ?? 1;\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${requested} is beyond end of resource (${textContent.split(\"\\n\").length} lines total).`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tselectedText.length > READ_TOOL_MAX_RESULT_CHARS ||\n\t\t\t\t\t\t\t\t\tBuffer.byteLength(selectedText, \"utf8\") > DEFAULT_MAX_BYTES\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\toversizedReadResult({\n\t\t\t\t\t\t\t\t\t\t\tblocked: true,\n\t\t\t\t\t\t\t\t\t\t\tpath: effectivePath,\n\t\t\t\t\t\t\t\t\t\t\tchars: selectedText.length,\n\t\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\t\tstartLine: selection.firstLine,\n\t\t\t\t\t\t\t\t\t\t\ttotalFileLines: textContent.split(\"\\n\").length,\n\t\t\t\t\t\t\t\t\t\t\tfirstLineBytes: Buffer.byteLength(selection.lines[0] ?? \"\", \"utf8\"),\n\t\t\t\t\t\t\t\t\t\t\tbyteGuidance: false,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\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\tresolve({\n\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: selectedText }],\n\t\t\t\t\t\t\t\t\tdetails: readSourceMeta(effectivePath),\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\t\t\t\t\t\t\tif (archive) {\n\t\t\t\t\t\t\t\tconst resolvedArchive = resolveArchiveSelector(archive, cwd);\n\t\t\t\t\t\t\t\tconst textContent = readArchiveSelector(resolvedArchive);\n\t\t\t\t\t\t\t\tlet allLines = textContent.split(\"\\n\");\n\t\t\t\t\t\t\t\tif (conflictsOnly) {\n\t\t\t\t\t\t\t\t\tlet inConflict = false;\n\t\t\t\t\t\t\t\t\tconst conflictLines = allLines.filter((line) => {\n\t\t\t\t\t\t\t\t\t\tif (line.startsWith(\"<<<<<<<\")) inConflict = true;\n\t\t\t\t\t\t\t\t\t\tconst keep = inConflict;\n\t\t\t\t\t\t\t\t\t\tif (line.startsWith(\">>>>>>>\")) inConflict = false;\n\t\t\t\t\t\t\t\t\t\treturn keep;\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tif (conflictLines.length === 0) {\n\t\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No conflict markers found\" }],\n\t\t\t\t\t\t\t\t\t\t\tdetails: undefined,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tallLines = conflictLines;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst rangeSelection = (rawOutput ? selectExactReadRanges : selectReadRanges)(\n\t\t\t\t\t\t\t\t\tallLines,\n\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst startLine = rangeSelection\n\t\t\t\t\t\t\t\t\t? rangeSelection.firstLine - 1\n\t\t\t\t\t\t\t\t\t: effectiveOffset\n\t\t\t\t\t\t\t\t\t\t? Math.max(0, effectiveOffset - 1)\n\t\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tstartLine >= allLines.length ||\n\t\t\t\t\t\t\t\t\t(effectiveRanges && rangeSelection?.selectedLines.length === 0)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${startLine + 1} is beyond end of resource (${allLines.length} lines total).`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst endLine =\n\t\t\t\t\t\t\t\t\teffectiveLimit !== undefined\n\t\t\t\t\t\t\t\t\t\t? Math.min(startLine + effectiveLimit, allLines.length)\n\t\t\t\t\t\t\t\t\t\t: allLines.length;\n\t\t\t\t\t\t\t\tconst selectedLines = rangeSelection?.selectedLines ?? allLines.slice(startLine, endLine);\n\t\t\t\t\t\t\t\tconst selectedText = selectedLines.join(\"\\n\");\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tselectedText.length > READ_TOOL_MAX_RESULT_CHARS ||\n\t\t\t\t\t\t\t\t\tBuffer.byteLength(selectedText, \"utf8\") > DEFAULT_MAX_BYTES\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\toversizedReadResult({\n\t\t\t\t\t\t\t\t\t\t\tblocked: true,\n\t\t\t\t\t\t\t\t\t\t\tpath: `${resolvedArchive.archivePath}:${resolvedArchive.memberPath}`,\n\t\t\t\t\t\t\t\t\t\t\tchars: selectedText.length,\n\t\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\t\tstartLine: startLine + 1,\n\t\t\t\t\t\t\t\t\t\t\ttotalFileLines: allLines.length,\n\t\t\t\t\t\t\t\t\t\t\tfirstLineBytes: Buffer.byteLength(selectedLines[0] ?? \"\", \"utf8\"),\n\t\t\t\t\t\t\t\t\t\t\tbyteGuidance: false,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\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\tresolve({\n\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: selectedText }],\n\t\t\t\t\t\t\t\t\tdetails: readSourceMeta(`${resolvedArchive.archivePath}:${resolvedArchive.memberPath}`),\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\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t/^(?:skill|agent|artifact|history|issue|local|memory|pr|conflict|omp|rule|mcp|vault):\\/\\//.test(\n\t\t\t\t\t\t\t\t\teffectivePath,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconst sourcePath = effectivePath.startsWith(\"local://\")\n\t\t\t\t\t\t\t\t\t? resolveInternalSelector(effectivePath, cwd)\n\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\t\tif (sourcePath) {\n\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\tawait createReadToolDefinition(cwd, options).execute(\n\t\t\t\t\t\t\t\t\t\t\t_toolCallId,\n\t\t\t\t\t\t\t\t\t\t\t{ path: appendReadSelectors(sourcePath, selector) },\n\t\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\t\t_onUpdate,\n\t\t\t\t\t\t\t\t\t\t\tctx as never,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t);\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\tconst allLines = (await readInternalSelector(effectivePath, cwd, resourceCtx)).split(\"\\n\");\n\t\t\t\t\t\t\t\tconst rangeSelection = (rawOutput ? selectExactReadRanges : selectReadRanges)(\n\t\t\t\t\t\t\t\t\tallLines,\n\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst startLine = rangeSelection\n\t\t\t\t\t\t\t\t\t? rangeSelection.firstLine - 1\n\t\t\t\t\t\t\t\t\t: effectiveOffset\n\t\t\t\t\t\t\t\t\t\t? Math.max(0, effectiveOffset - 1)\n\t\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tstartLine >= allLines.length ||\n\t\t\t\t\t\t\t\t\t(effectiveRanges && rangeSelection?.selectedLines.length === 0)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${startLine + 1} is beyond end of resource (${allLines.length} lines total).`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst endLine =\n\t\t\t\t\t\t\t\t\teffectiveLimit !== undefined\n\t\t\t\t\t\t\t\t\t\t? Math.min(startLine + effectiveLimit, allLines.length)\n\t\t\t\t\t\t\t\t\t\t: allLines.length;\n\t\t\t\t\t\t\t\tconst selectedLines = rangeSelection?.selectedLines ?? allLines.slice(startLine, endLine);\n\t\t\t\t\t\t\t\tconst selectedText = selectedLines.join(\"\\n\");\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tselectedText.length > READ_TOOL_MAX_RESULT_CHARS ||\n\t\t\t\t\t\t\t\t\tBuffer.byteLength(selectedText, \"utf8\") > DEFAULT_MAX_BYTES\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\toversizedReadResult({\n\t\t\t\t\t\t\t\t\t\t\tblocked: true,\n\t\t\t\t\t\t\t\t\t\t\tpath: effectivePath,\n\t\t\t\t\t\t\t\t\t\t\tchars: selectedText.length,\n\t\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\t\tstartLine: startLine + 1,\n\t\t\t\t\t\t\t\t\t\t\ttotalFileLines: allLines.length,\n\t\t\t\t\t\t\t\t\t\t\tfirstLineBytes: Buffer.byteLength(selectedLines[0] ?? \"\", \"utf8\"),\n\t\t\t\t\t\t\t\t\t\t\tbyteGuidance: false,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\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\tresolve({\n\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: selectedText }],\n\t\t\t\t\t\t\t\t\tdetails: readSourceMeta(effectivePath),\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\t\t\t\t\t\t\tif (isReadResourceSelector(effectivePath))\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`Read resource selectors are not supported by this filesystem backend: ${path}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst absolutePath = await resolveReadPathAsync(effectivePath, cwd);\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tlet content: (TextContent | ImageContent)[];\n\t\t\t\t\t\t\tlet details: ReadToolDetails | undefined;\n\t\t\t\t\t\t\tawait ops.access(absolutePath);\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tif (isDocumentPath(absolutePath) && !rawOutput && !isNotebookPath(absolutePath)) {\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst textContent = await extractDocumentMarkdown(buffer, absolutePath);\n\t\t\t\t\t\t\t\tconst selection = applyReadLineSelection(\n\t\t\t\t\t\t\t\t\ttextContent.split(\"\\n\"),\n\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t\teffectiveOffset,\n\t\t\t\t\t\t\t\t\teffectiveLimit,\n\t\t\t\t\t\t\t\t\trawOutput,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (selection.lines.length === 0) {\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${selection.firstLine} is beyond end of document (${textContent.split(\"\\n\").length} lines total).`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst selectedText = selection.lines.join(\"\\n\");\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tselectedText.length > READ_TOOL_MAX_RESULT_CHARS ||\n\t\t\t\t\t\t\t\t\tBuffer.byteLength(selectedText, \"utf8\") > DEFAULT_MAX_BYTES\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\toversizedReadResult({\n\t\t\t\t\t\t\t\t\t\t\tblocked: true,\n\t\t\t\t\t\t\t\t\t\t\tpath: absolutePath,\n\t\t\t\t\t\t\t\t\t\t\tchars: selectedText.length,\n\t\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\t\tstartLine: selection.firstLine,\n\t\t\t\t\t\t\t\t\t\t\ttotalFileLines: textContent.split(\"\\n\").length,\n\t\t\t\t\t\t\t\t\t\t\tfirstLineBytes: Buffer.byteLength(selection.lines[0] ?? \"\", \"utf8\"),\n\t\t\t\t\t\t\t\t\t\t\tbyteGuidance: false,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\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\tcontent = [{ type: \"text\", text: selectedText }];\n\t\t\t\t\t\t\t\tresolve({ content, details: readSourceMeta(absolutePath) });\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlet tree: DirectoryTreeResult | undefined;\n\t\t\t\t\t\t\tif (ops.stat && ops.listDir) {\n\t\t\t\t\t\t\t\tconst stat = await ops.stat(absolutePath);\n\t\t\t\t\t\t\t\tif (stat?.isDirectory)\n\t\t\t\t\t\t\t\t\ttree = await buildDirectoryTreeFromOperations(\n\t\t\t\t\t\t\t\t\t\tabsolutePath,\n\t\t\t\t\t\t\t\t\t\t{ listDir: ops.listDir },\n\t\t\t\t\t\t\t\t\t\t{ maxDepth: 2, perDirLimit: 12, rootLimit: null },\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else if (!options?.operations && (await fsStat(absolutePath)).isDirectory()) {\n\t\t\t\t\t\t\t\ttree = await buildDirectoryTree(absolutePath, {\n\t\t\t\t\t\t\t\t\tmaxDepth: 2,\n\t\t\t\t\t\t\t\t\tperDirLimit: 12,\n\t\t\t\t\t\t\t\t\trootLimit: null,\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 (tree) {\n\t\t\t\t\t\t\t\tconst allLines = tree.rendered.split(\"\\n\"),\n\t\t\t\t\t\t\t\t\trangeSelection = (rawOutput ? selectExactReadRanges : selectReadRanges)(\n\t\t\t\t\t\t\t\t\t\tallLines,\n\t\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tstartLine = rangeSelection\n\t\t\t\t\t\t\t\t\t\t? rangeSelection.firstLine - 1\n\t\t\t\t\t\t\t\t\t\t: effectiveOffset\n\t\t\t\t\t\t\t\t\t\t\t? Math.max(0, effectiveOffset - 1)\n\t\t\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tstartLine >= allLines.length ||\n\t\t\t\t\t\t\t\t\t(effectiveRanges && rangeSelection?.selectedLines.length === 0)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${startLine + 1} is beyond end of directory (${allLines.length} lines total).`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst endLine =\n\t\t\t\t\t\t\t\t\t\teffectiveLimit !== undefined\n\t\t\t\t\t\t\t\t\t\t\t? Math.min(startLine + effectiveLimit, allLines.length)\n\t\t\t\t\t\t\t\t\t\t\t: allLines.length,\n\t\t\t\t\t\t\t\t\tselectedLines = rangeSelection?.selectedLines ?? allLines.slice(startLine, endLine);\n\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: selectedLines.join(\"\\n\") }];\n\t\t\t\t\t\t\t\tconst meta = {\n\t\t\t\t\t\t\t\t\t...readSourceMeta(absolutePath).meta,\n\t\t\t\t\t\t\t\t\t...(tree.truncated ? { limits: { perDirLimit: 12, totalLines: tree.totalLines } } : {}),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tresolve({ content, details: { isDirectory: true, resolvedPath: absolutePath, meta } });\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 mimeType = ops.detectImageMimeType ? await ops.detectImageMimeType(absolutePath) : undefined;\n\t\t\t\t\t\t\tconst nonVisionImageNote = getNonVisionImageNote(ctx?.model);\n\t\t\t\t\t\t\tif (mimeType) {\n\t\t\t\t\t\t\t\t// Read image as binary.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst processed = await processImage(buffer, mimeType, { autoResizeImages });\n\t\t\t\t\t\t\t\tif (!processed.ok) {\n\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]\\n${processed.message}`;\n\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: textNote }];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${processed.mimeType}]`;\n\t\t\t\t\t\t\t\t\tif (processed.hints.length > 0) textNote += `\\n${processed.hints.join(\"\\n\")}`;\n\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\tcontent = [\n\t\t\t\t\t\t\t\t\t\t{ type: \"text\", text: textNote },\n\t\t\t\t\t\t\t\t\t\t{ type: \"image\", data: processed.data, mimeType: processed.mimeType },\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} else {\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst textContent =\n\t\t\t\t\t\t\t\t\tisNotebookPath(absolutePath) && !rawOutput\n\t\t\t\t\t\t\t\t\t\t? readEditableNotebookText(absolutePath, effectivePath)\n\t\t\t\t\t\t\t\t\t\t: buffer.toString(\"utf-8\");\n\t\t\t\t\t\t\t\t// Numbered output uses the same LF-normalized text as its formatters. Keep raw reads\n\t\t\t\t\t\t\t\t// on the source bytes so :raw preserves CRLF and terminal-newline bytes exactly.\n\t\t\t\t\t\t\t\tconst numberedTextContent = rawOutput ? textContent : textContent.replace(/\\r\\n/g, \"\\n\");\n\t\t\t\t\t\t\t\tconst sourceLines = numberedTextContent.split(\"\\n\");\n\t\t\t\t\t\t\t\t// A terminal newline separates real lines; omit only its synthetic split item.\n\t\t\t\t\t\t\t\tlet allLines =\n\t\t\t\t\t\t\t\t\trawOutput || !numberedTextContent.endsWith(\"\\n\") ? sourceLines : sourceLines.slice(0, -1);\n\t\t\t\t\t\t\t\tlet conflictLineNumbers: number[] | undefined;\n\t\t\t\t\t\t\t\tif (conflictsOnly) {\n\t\t\t\t\t\t\t\t\tregisterConflictBlocks(cwd, parseConflictBlocks(absolutePath, textContent));\n\t\t\t\t\t\t\t\t\tconst conflictLines: string[] = [];\n\t\t\t\t\t\t\t\t\tconflictLineNumbers = [];\n\t\t\t\t\t\t\t\t\tlet inConflict = false;\n\t\t\t\t\t\t\t\t\tallLines.forEach((line, index) => {\n\t\t\t\t\t\t\t\t\t\tif (line.startsWith(\"<<<<<<<\")) inConflict = true;\n\t\t\t\t\t\t\t\t\t\tif (inConflict) {\n\t\t\t\t\t\t\t\t\t\t\tconflictLines.push(line);\n\t\t\t\t\t\t\t\t\t\t\tconflictLineNumbers!.push(index + 1);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (line.startsWith(\">>>>>>>\")) inConflict = false;\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tif (conflictLines.length > 0) allLines = conflictLines;\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No conflict markers found\" }],\n\t\t\t\t\t\t\t\t\t\t\tdetails: undefined,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\treturn;\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\tconst totalFileLines = allLines.length;\n\t\t\t\t\t\t\t\tconst rangeSelection = (rawOutput ? selectExactReadRanges : selectReadRanges)(\n\t\t\t\t\t\t\t\t\tallLines,\n\t\t\t\t\t\t\t\t\teffectiveRanges,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst startLine = rangeSelection\n\t\t\t\t\t\t\t\t\t? rangeSelection.firstLine - 1\n\t\t\t\t\t\t\t\t\t: effectiveOffset\n\t\t\t\t\t\t\t\t\t\t? Math.max(0, effectiveOffset - 1)\n\t\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tconst startLineDisplay = startLine + 1;\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tstartLine >= allLines.length ||\n\t\t\t\t\t\t\t\t\t(effectiveRanges && rangeSelection?.selectedLines.length === 0)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst requested = effectiveRanges?.[0]?.start ?? startLineDisplay;\n\t\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: `Requested line ${requested} is beyond end of file (${allLines.length} lines total). Use ${effectivePath}:${Math.max(1, allLines.length)} to read the final line.`,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\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\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlet selectedContent: string;\n\t\t\t\t\t\t\t\tlet selectedLines: string[];\n\t\t\t\t\t\t\t\tlet userLimitedLines: number | undefined;\n\t\t\t\t\t\t\t\tif (rangeSelection) {\n\t\t\t\t\t\t\t\t\tselectedLines = rangeSelection.selectedLines;\n\t\t\t\t\t\t\t\t\tselectedContent = rangeSelection.selectedContent;\n\t\t\t\t\t\t\t\t\tuserLimitedLines = rangeSelection.userLimitedLines;\n\t\t\t\t\t\t\t\t} else if (effectiveLimit !== undefined) {\n\t\t\t\t\t\t\t\t\tconst endLine = Math.min(startLine + effectiveLimit, allLines.length);\n\t\t\t\t\t\t\t\t\tselectedLines = allLines.slice(startLine, endLine);\n\t\t\t\t\t\t\t\t\tselectedContent = selectedLines.join(\"\\n\");\n\t\t\t\t\t\t\t\t\tuserLimitedLines = endLine - startLine;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tselectedLines = allLines.slice(startLine);\n\t\t\t\t\t\t\t\t\tselectedContent = selectedLines.join(\"\\n\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (selectedContent.length > READ_TOOL_MAX_RESULT_CHARS) {\n\t\t\t\t\t\t\t\t\tconst firstSelectedLine = allLines[startLine] ?? \"\";\n\t\t\t\t\t\t\t\t\tconst firstLineBytes = Buffer.byteLength(firstSelectedLine, \"utf-8\");\n\t\t\t\t\t\t\t\t\tconst selectedLineCount = trimTrailingEmptyLines(selectedLines).length;\n\t\t\t\t\t\t\t\t\tconst byteGuidance = selectedLineCount <= 1 || firstLineBytes > DEFAULT_MAX_BYTES;\n\t\t\t\t\t\t\t\t\tconst oversizedRead: OversizedReadDetails = {\n\t\t\t\t\t\t\t\t\t\tblocked: true,\n\t\t\t\t\t\t\t\t\t\tpath: absolutePath,\n\t\t\t\t\t\t\t\t\t\tchars: selectedContent.length,\n\t\t\t\t\t\t\t\t\t\tmaxChars: READ_TOOL_MAX_RESULT_CHARS,\n\t\t\t\t\t\t\t\t\t\tstartLine: startLineDisplay,\n\t\t\t\t\t\t\t\t\t\t...(effectiveLimit !== undefined ? { requestedLimit: effectiveLimit } : {}),\n\t\t\t\t\t\t\t\t\t\ttotalFileLines,\n\t\t\t\t\t\t\t\t\t\tfirstLineBytes,\n\t\t\t\t\t\t\t\t\t\tbyteGuidance,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tdetails = { oversizedRead, meta: readSourceMeta(absolutePath).meta };\n\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: buildOversizedReadMessage(oversizedRead) }];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconst truncation = truncateHead(selectedContent);\n\t\t\t\t\t\t\t\t\tlet outputText = truncation.content;\n\t\t\t\t\t\t\t\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\t\t\t\t\t\t\t\tconst firstLineSize = formatSize(Buffer.byteLength(allLines[startLine], \"utf-8\"));\n\t\t\t\t\t\t\t\t\t\toutputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${effectivePath} | head -c ${DEFAULT_MAX_BYTES}]`;\n\t\t\t\t\t\t\t\t\t\tdetails = {\n\t\t\t\t\t\t\t\t\t\t\ttruncation,\n\t\t\t\t\t\t\t\t\t\t\tmeta: { source: absolutePath, sourcePath: absolutePath, truncation },\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t} else if (truncation.truncated) {\n\t\t\t\t\t\t\t\t\t\tconst endLineDisplay = startLineDisplay + truncation.outputLines - 1;\n\t\t\t\t\t\t\t\t\t\tconst nextOffset = endLineDisplay + 1;\n\t\t\t\t\t\t\t\t\t\toutputText +=\n\t\t\t\t\t\t\t\t\t\t\ttruncation.truncatedBy === \"lines\"\n\t\t\t\t\t\t\t\t\t\t\t\t? `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Continue with path selector :${nextOffset}.]`\n\t\t\t\t\t\t\t\t\t\t\t\t: `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Continue with path selector :${nextOffset}.]`;\n\t\t\t\t\t\t\t\t\t\tdetails = {\n\t\t\t\t\t\t\t\t\t\t\ttruncation,\n\t\t\t\t\t\t\t\t\t\t\tmeta: { source: absolutePath, sourcePath: absolutePath, truncation },\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\t!rawOutput &&\n\t\t\t\t\t\t\t\t\t\tuserLimitedLines !== undefined &&\n\t\t\t\t\t\t\t\t\t\tstartLine + userLimitedLines < allLines.length\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tconst remaining = allLines.length - (startLine + userLimitedLines);\n\t\t\t\t\t\t\t\t\t\tconst nextOffset = startLine + userLimitedLines + 1;\n\t\t\t\t\t\t\t\t\t\toutputText = `${truncation.content}\\n\\n[${remaining} more lines in file. Continue with path selector :${nextOffset}.]`;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (truncation.firstLineExceedsLimit) content = [{ type: \"text\", text: outputText }];\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tconst snapshot = recordHashlineSnapshot(absolutePath, cwd, textContent, hashlineStore);\n\t\t\t\t\t\t\t\t\t\tconst visibleContent = truncation.truncated ? truncation.content : selectedContent;\n\t\t\t\t\t\t\t\t\t\tconst header = `[${snapshot.displayPath}#${snapshot.tag}]`;\n\t\t\t\t\t\t\t\t\t\tconst selectedConflictLineNumbers =\n\t\t\t\t\t\t\t\t\t\t\tconflictLineNumbers && rangeSelection?.lineNumbers\n\t\t\t\t\t\t\t\t\t\t\t\t? rangeSelection.lineNumbers\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map((line) => conflictLineNumbers![line - 1])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter((line): line is number => typeof line === \"number\")\n\t\t\t\t\t\t\t\t\t\t\t\t: conflictLineNumbers\n\t\t\t\t\t\t\t\t\t\t\t\t\t? conflictLineNumbers.slice(startLine, startLine + selectedLines.length)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\t\t\t\tlet hashlineOutput = rawOutput\n\t\t\t\t\t\t\t\t\t\t\t? visibleContent\n\t\t\t\t\t\t\t\t\t\t\t: selectedConflictLineNumbers && visibleContent === selectedContent\n\t\t\t\t\t\t\t\t\t\t\t\t? formatHashlineSelectedLines(header, selectedLines, selectedConflictLineNumbers)\n\t\t\t\t\t\t\t\t\t\t\t\t: rangeSelection && visibleContent === selectedContent\n\t\t\t\t\t\t\t\t\t\t\t\t\t? formatHashlineSelectedLines(header, selectedLines, rangeSelection.lineNumbers)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: formatHashlineContent(snapshot, visibleContent, startLineDisplay);\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\toutputText.startsWith(truncation.content) &&\n\t\t\t\t\t\t\t\t\t\t\toutputText.length > truncation.content.length\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\thashlineOutput += outputText.slice(truncation.content.length);\n\t\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: hashlineOutput }];\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}\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tresolve({ content, details: details ?? readSourceMeta(absolutePath) });\n\t\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tif (!aborted) reject(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\tconst classification = !context.expanded ? getCompactReadClassification(args, context.cwd) : undefined;\n\t\t\ttext.setText(\n\t\t\t\tclassification ? formatCompactReadCall(classification, args, theme) : formatReadCall(args, theme),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tformatReadResult(context.args, result, options, theme, context.showImages, context.cwd, context.isError),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t};\n}\nexport function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema> {\n\treturn wrapToolDefinition(createReadToolDefinition(cwd, options));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"session-temp-cleanup.js","sourceRoot":"","sources":["../../../src/core/tools/session-temp-cleanup.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Age-based sweeper for tool-output storage.\n *\n * Three targets are reaped, all strictly scoped to tool output:\n *\n * - `<tmpdir>/<APP_NAME>-<owner>/` — the per-session temp trees created by\n * `session-temp-dir.ts`.\n * - `<sessionsRoot>/<project>/tool-results/` — persisted tool results under the\n * default, project-nested session roots.\n * - `<sessionDir>/tool-results/` — the same, for a custom session directory\n * chosen with `--session-dir`, `ATOMIC_CODING_AGENT_SESSION_DIR`, or the\n * `sessionDir` setting, where there is no project nesting to walk.\n *\n * Transcripts, `.jsonl` session files, and every other file under session\n * storage are out of scope: the walk only ever descends into a `tool-results`\n * directory, and only ever deletes inside it.\n *\n * The throttle/lock shape mirrors `packages/subagents/src/shared/artifacts.ts`:\n * a `.last-cleanup` marker skips the scan for a day, a `.cleanup.lock` exclusive\n * lock keeps concurrent sessions from racing, a stale lock left by a crashed\n * process is broken, and lock ownership is rechecked before every destructive\n * step. Those two names are required, but the subagents sweep already owns them\n * inside the default sessions roots, so session-storage scans keep their\n * marker/lock pair in a coding-agent control root keyed by target instead of\n * writing into the scanned directory. The temp root, which nothing else owns,\n * carries its pair directly.\n *\n * Symlinks are never followed. A scan root or a `tool-results` entry that is a\n * symlink is skipped rather than read or deleted, because `readdirSync` and\n * `rmSync` resolve links and would otherwise reach outside the target.\n */\n\nimport { createHash } from \"node:crypto\";\nimport {\n\tcloseSync,\n\tfchmodSync,\n\tfstatSync,\n\tlstatSync,\n\topenSync,\n\treaddirSync,\n\treadFileSync,\n\trenameSync,\n\trmSync,\n\tstatSync,\n\tunlinkSync,\n\twriteSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getAgentConfigPaths } from \"../../config.ts\";\nimport { getErrnoCode } from \"./errno.ts\";\nimport {\n\tensureTempDir,\n\tgetProtectedSessionTempDirs,\n\tgetTempRootDir,\n\tSESSION_TEMP_FILE_MODE,\n} from \"./session-temp-dir.ts\";\nimport { TOOL_RESULTS_SUBDIR } from \"./tool-limits.js\";\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n/** How long a tool-output tree survives without being touched. */\nexport const SESSION_TEMP_RETENTION_DAYS = 30;\nexport const SESSION_TEMP_RETENTION_MS = SESSION_TEMP_RETENTION_DAYS * MS_PER_DAY;\n\n/** Minimum interval between two sweeps of the same root. */\nexport const SESSION_TEMP_CLEANUP_INTERVAL_MS = MS_PER_DAY;\n\n/** A lock older than this belonged to a process that died holding it. */\nexport const SESSION_TEMP_CLEANUP_LOCK_STALE_MS = 60 * 60 * 1000;\n\n/** How long after startup the sweep runs, so it never sits on the startup path. */\nexport const SESSION_TEMP_CLEANUP_DELAY_MS = 10_000;\n\n/** Deepest directory nesting the mtime walk will descend. */\nconst MAX_SCAN_DEPTH = 32;\n\nexport const CLEANUP_MARKER_FILE = \".last-cleanup\";\nexport const CLEANUP_LOCK_FILE = \".cleanup.lock\";\n\n/**\n * Control root for session-storage scans, inside the owner-scoped temp root.\n * A session id can never sanitize to this name (leading dots are stripped), so\n * it cannot collide with a session temp tree.\n */\nexport const CLEANUP_CONTROL_SUBDIR = \".cleanup\";\n\nexport type SweepOutcome = \"swept\" | \"throttled\" | \"locked\" | \"missing\";\n\nexport interface SweepOptions {\n\t/** Clock override for tests. */\n\tnow?: number;\n\t/** Age past which an untouched entry is reaped. */\n\tretentionMs?: number;\n\t/** Minimum interval between sweeps of this root. */\n\tthrottleMs?: number;\n\t/** Directories that must survive regardless of age. */\n\tprotectedPaths?: Iterable<string>;\n\t/** Parent of the per-target control directories. Defaults to `<tempRoot>/.cleanup`. */\n\tcontrolRoot?: string;\n}\n\n/** Default parent for the marker/lock pair of a session-storage scan. */\nexport function getCleanupControlRoot(): string {\n\treturn join(getTempRootDir(), CLEANUP_CONTROL_SUBDIR);\n}\n\n/**\n * Control directory for one scan target: `<controlRoot>/<digest-of-target>`.\n * Keyed by the target path so two roots never share throttle state.\n */\nexport function getCleanupControlDir(target: string, controlRoot?: string): string {\n\tconst key = createHash(\"sha256\").update(target).digest(\"hex\").slice(0, 16);\n\treturn join(controlRoot ?? getCleanupControlRoot(), key);\n}\n\ninterface FileIdentity {\n\tdev: bigint;\n\tino: bigint;\n}\n\nfunction sameFileIdentity(left: FileIdentity, right: FileIdentity): boolean {\n\treturn left.dev === right.dev && left.ino === right.ino;\n}\n\nfunction realDirectoryIdentity(path: string): FileIdentity | undefined {\n\ttry {\n\t\tconst stat = lstatSync(path, { bigint: true });\n\t\tif (stat.isDirectory() && !stat.isSymbolicLink()) {\n\t\t\treturn { dev: stat.dev, ino: stat.ino };\n\t\t}\n\t} catch {\n\t\t// Missing, unreadable, and changing paths are not cleanup candidates.\n\t}\n\treturn undefined;\n}\n\n/** An existing real directory — not a symlink, not a file, not missing. */\nfunction isRealDirectory(path: string): boolean {\n\treturn realDirectoryIdentity(path) !== undefined;\n}\n\nfunction markerIsFresh(markerPath: string, now: number, throttleMs: number): boolean {\n\ttry {\n\t\tconst stat = lstatSync(markerPath);\n\t\treturn stat.isFile() && !stat.isSymbolicLink() && now - stat.mtimeMs < throttleMs;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\ninterface CleanupLock extends FileIdentity {\n\ttoken: string;\n}\n\nfunction pathIdentifiesFile(path: string, identity: FileIdentity): boolean {\n\ttry {\n\t\tconst stat = lstatSync(path, { bigint: true });\n\t\treturn stat.isFile() && !stat.isSymbolicLink() && sameFileIdentity(stat, identity);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction removeCreatedFile(path: string, identity: FileIdentity): void {\n\ttry {\n\t\tif (pathIdentifiesFile(path, identity)) {\n\t\t\tunlinkSync(path);\n\t\t}\n\t} catch {\n\t\t// Best effort. An uncertain path is left untouched.\n\t}\n}\n/**\n * Take an exclusive lock so two sessions never scan the same target at once.\n *\n * `wx` creation is the exclusivity primitive. Returns an ownership token; a lock\n * left behind by a crashed process is broken once stale, and release only\n * removes a lock that still carries the caller's token.\n */\nfunction acquireCleanupLock(lockPath: string, now: number, staleMs: number): CleanupLock | null {\n\tconst token = `${process.pid}.${now}.${Math.random().toString(36).slice(2)}`;\n\tfor (let attempt = 0; attempt < 2; attempt++) {\n\t\tlet fd: number;\n\t\ttry {\n\t\t\tfd = openSync(lockPath, \"wx+\", SESSION_TEMP_FILE_MODE);\n\t\t} catch (error) {\n\t\t\tif (getErrnoCode(error) !== \"EEXIST\") {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tlet lockMtimeMs: number;\n\t\t\ttry {\n\t\t\t\tlockMtimeMs = statSync(lockPath).mtimeMs;\n\t\t\t} catch {\n\t\t\t\t// The holder released between the failed create and the stat; retry.\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (now - lockMtimeMs < staleMs) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (!breakStaleLock(lockPath, lockMtimeMs)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet lock: CleanupLock | undefined;\n\t\tlet failed = false;\n\t\ttry {\n\t\t\tconst createdStat = fstatSync(fd, { bigint: true });\n\t\t\tlock = { token, dev: createdStat.dev, ino: createdStat.ino };\n\t\t\tif (!createdStat.isFile()) {\n\t\t\t\tfailed = true;\n\t\t\t} else {\n\t\t\t\tif (process.platform !== \"win32\") {\n\t\t\t\t\tfchmodSync(fd, SESSION_TEMP_FILE_MODE);\n\t\t\t\t\tconst modeStat = fstatSync(fd, { bigint: true });\n\t\t\t\t\tif (!modeStat.isFile() || Number(modeStat.mode & 0o777n) !== SESSION_TEMP_FILE_MODE) {\n\t\t\t\t\t\tfailed = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!failed && writeSync(fd, token) !== token.length) {\n\t\t\t\t\tfailed = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\tfailed = true;\n\t\t}\n\t\ttry {\n\t\t\tcloseSync(fd);\n\t\t} catch {\n\t\t\tfailed = true;\n\t\t}\n\t\tif (failed || lock === undefined || !pathIdentifiesFile(lockPath, lock) || !ownsCleanupLock(lockPath, lock)) {\n\t\t\tif (lock !== undefined) {\n\t\t\t\tremoveCreatedFile(lockPath, lock);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\treturn lock;\n\t}\n\treturn null;\n}\n\n/**\n * Claim a stale lock via rename, then verify it is still the lock observed\n * during stale detection. A lock that changed identity in between belongs to a\n * new holder: hand it back and treat the takeover as contention.\n */\nfunction breakStaleLock(lockPath: string, observedMtimeMs: number): boolean {\n\tconst breakPath = `${lockPath}.break.${process.pid}.${Math.random().toString(36).slice(2)}`;\n\ttry {\n\t\trenameSync(lockPath, breakPath);\n\t} catch {\n\t\t// Another sweep released or broke it first; contend again on create.\n\t\treturn false;\n\t}\n\tlet displacedFreshLock = false;\n\ttry {\n\t\tdisplacedFreshLock = statSync(breakPath).mtimeMs !== observedMtimeMs;\n\t} catch {\n\t\tdisplacedFreshLock = false;\n\t}\n\tif (displacedFreshLock) {\n\t\ttry {\n\t\t\trenameSync(breakPath, lockPath);\n\t\t} catch {\n\t\t\t// Best-effort hand-back; the displaced holder aborts at its next\n\t\t\t// ownership recheck.\n\t\t}\n\t\treturn false;\n\t}\n\ttry {\n\t\tunlinkSync(breakPath);\n\t} catch {\n\t\t// A leftover break file is harmless.\n\t}\n\treturn true;\n}\n\nfunction ownsCleanupLock(lockPath: string, lock: CleanupLock): boolean {\n\ttry {\n\t\treturn (\n\t\t\tpathIdentifiesFile(lockPath, lock) &&\n\t\t\treadFileSync(lockPath, \"utf-8\") === lock.token &&\n\t\t\tpathIdentifiesFile(lockPath, lock)\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction releaseCleanupLock(lockPath: string, lock: CleanupLock): void {\n\ttry {\n\t\tif (ownsCleanupLock(lockPath, lock) && pathIdentifiesFile(lockPath, lock)) {\n\t\t\tunlinkSync(lockPath);\n\t\t}\n\t} catch {\n\t\t// Release is best-effort: an unreleased lock only goes stale and is\n\t\t// broken by a later sweep.\n\t}\n}\n\n/** Publish the throttle marker without ever opening or unlinking its destination. */\nfunction publishCleanupMarker(markerPath: string, now: number): boolean {\n\tconst tempPath = `${markerPath}.tmp.${process.pid}.${Math.random().toString(36).slice(2)}`;\n\tconst timestamp = String(now);\n\tlet fd: number;\n\ttry {\n\t\tfd = openSync(tempPath, \"wx+\", SESSION_TEMP_FILE_MODE);\n\t} catch {\n\t\treturn false;\n\t}\n\n\tlet identity: FileIdentity | undefined;\n\tlet failed = false;\n\ttry {\n\t\tconst createdStat = fstatSync(fd, { bigint: true });\n\t\tidentity = { dev: createdStat.dev, ino: createdStat.ino };\n\t\tif (!createdStat.isFile()) {\n\t\t\tfailed = true;\n\t\t} else {\n\t\t\tif (process.platform !== \"win32\") {\n\t\t\t\tfchmodSync(fd, SESSION_TEMP_FILE_MODE);\n\t\t\t\tconst modeStat = fstatSync(fd, { bigint: true });\n\t\t\t\tif (!modeStat.isFile() || Number(modeStat.mode & 0o777n) !== SESSION_TEMP_FILE_MODE) {\n\t\t\t\t\tfailed = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!failed && writeSync(fd, timestamp) !== timestamp.length) {\n\t\t\t\tfailed = true;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\tfailed = true;\n\t}\n\ttry {\n\t\tcloseSync(fd);\n\t} catch {\n\t\tfailed = true;\n\t}\n\tif (failed || identity === undefined || !pathIdentifiesFile(tempPath, identity)) {\n\t\tif (identity !== undefined) {\n\t\t\tremoveCreatedFile(tempPath, identity);\n\t\t}\n\t\treturn false;\n\t}\n\n\ttry {\n\t\trenameSync(tempPath, markerPath);\n\t} catch {\n\t\tremoveCreatedFile(tempPath, identity);\n\t\treturn false;\n\t}\n\treturn pathIdentifiesFile(markerPath, identity);\n}\n\ntype ScanFreshness = \"fresh\" | \"stale\" | \"unknown\";\n\n/**\n * Classify whether `entryPath` has a fresh descendant, is fully stale, or could\n * not be scanned completely.\n *\n * Only `stale` authorizes deletion. Symlinks, unreadable entries, and the depth\n * bound fail closed as `unknown`; `ENOENT` is stale because the entry vanished.\n * The walk still exits on its first fresh descendant.\n */\nfunction scanFreshness(entryPath: string, cutoff: number, depth = 0): ScanFreshness {\n\tlet stat: ReturnType<typeof lstatSync>;\n\ttry {\n\t\tstat = lstatSync(entryPath);\n\t} catch (error) {\n\t\treturn getErrnoCode(error) === \"ENOENT\" ? \"stale\" : \"unknown\";\n\t}\n\tif (stat.isSymbolicLink()) {\n\t\treturn \"unknown\";\n\t}\n\tif (stat.mtimeMs >= cutoff) {\n\t\treturn \"fresh\";\n\t}\n\tif (!stat.isDirectory()) {\n\t\treturn \"stale\";\n\t}\n\tif (depth >= MAX_SCAN_DEPTH) {\n\t\treturn \"unknown\";\n\t}\n\tlet children: string[];\n\ttry {\n\t\tchildren = readdirSync(entryPath);\n\t} catch (error) {\n\t\treturn getErrnoCode(error) === \"ENOENT\" ? \"stale\" : \"unknown\";\n\t}\n\tlet foundUnknown = false;\n\tfor (const child of children) {\n\t\tconst freshness = scanFreshness(join(entryPath, child), cutoff, depth + 1);\n\t\tif (freshness === \"fresh\") {\n\t\t\treturn \"fresh\";\n\t\t}\n\t\tif (freshness === \"unknown\") {\n\t\t\tfoundUnknown = true;\n\t\t}\n\t}\n\treturn foundUnknown ? \"unknown\" : \"stale\";\n}\n\ninterface CleanupGate {\n\t/** Whether this sweep still owns the lock; false means another holder took over. */\n\townsLock(): boolean;\n\tcutoff: number;\n\tprotectedPaths: ReadonlySet<string>;\n}\n\n/**\n * Run `scan` under the marker/lock protocol for one target.\n *\n * `controlDir` holds the `.last-cleanup`/`.cleanup.lock` pair; it may be the\n * scanned directory itself (temp root) or a coding-agent-owned directory outside\n * it (session storage).\n */\nfunction withCleanupGate(controlDir: string, options: SweepOptions, scan: (gate: CleanupGate) => void): SweepOutcome {\n\tconst now = options.now ?? Date.now();\n\tconst throttleMs = options.throttleMs ?? SESSION_TEMP_CLEANUP_INTERVAL_MS;\n\ttry {\n\t\t// The control root lives under the owner temp root, so create it through the\n\t\t// same validated, non-recursive path the spill directories use.\n\t\tensureTempDir(controlDir);\n\t} catch {\n\t\t// Without a control directory there is nowhere to record the throttle;\n\t\t// skip rather than sweep unthrottled and unlocked.\n\t\treturn \"locked\";\n\t}\n\tconst markerPath = join(controlDir, CLEANUP_MARKER_FILE);\n\tif (markerIsFresh(markerPath, now, throttleMs)) {\n\t\treturn \"throttled\";\n\t}\n\tconst lockPath = join(controlDir, CLEANUP_LOCK_FILE);\n\tconst token = acquireCleanupLock(lockPath, now, SESSION_TEMP_CLEANUP_LOCK_STALE_MS);\n\tif (token === null) {\n\t\treturn \"locked\";\n\t}\n\tlet aborted = false;\n\ttry {\n\t\tscan({\n\t\t\townsLock: () => {\n\t\t\t\tif (aborted) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (ownsCleanupLock(lockPath, token)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\taborted = true;\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tcutoff: now - (options.retentionMs ?? SESSION_TEMP_RETENTION_MS),\n\t\t\tprotectedPaths: new Set(options.protectedPaths ?? []),\n\t\t});\n\t\tif (!aborted && ownsCleanupLock(lockPath, token)) {\n\t\t\t// Failing to publish the marker only means the sweep repeats sooner.\n\t\t\tpublishCleanupMarker(markerPath, now);\n\t\t}\n\t} finally {\n\t\treleaseCleanupLock(lockPath, token);\n\t}\n\treturn aborted ? \"locked\" : \"swept\";\n}\n\nfunction isCleanupArtifact(name: string): boolean {\n\treturn (\n\t\tname === CLEANUP_MARKER_FILE ||\n\t\tname.startsWith(`${CLEANUP_MARKER_FILE}.tmp.`) ||\n\t\tname === CLEANUP_LOCK_FILE ||\n\t\tname.startsWith(`${CLEANUP_LOCK_FILE}.`) ||\n\t\tname === CLEANUP_CONTROL_SUBDIR\n\t);\n}\n\n/**\n * Reap per-session temp trees under `<tmpdir>/<APP_NAME>-<owner>/`.\n *\n * A tree is removed only when nothing at any depth inside it is newer than the\n * retention cutoff, and never when it belongs to a session this process\n * registered as live. A symlinked root is refused outright.\n */\nexport function sweepSessionTempRoot(root: string = getTempRootDir(), options: SweepOptions = {}): SweepOutcome {\n\tif (!isRealDirectory(root)) {\n\t\treturn \"missing\";\n\t}\n\tconst gateOptions: SweepOptions = {\n\t\t...options,\n\t\tprotectedPaths: options.protectedPaths ?? getProtectedSessionTempDirs(),\n\t};\n\treturn withCleanupGate(root, gateOptions, (gate) => {\n\t\tlet entries: string[];\n\t\ttry {\n\t\t\tentries = readdirSync(root);\n\t\t} catch {\n\t\t\t// Cleanup is best-effort housekeeping; an unreadable root is skipped.\n\t\t\treturn;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tif (isCleanupArtifact(entry)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst entryPath = join(root, entry);\n\t\t\tif (gate.protectedPaths.has(entryPath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// A holder displaced by a stale-lock takeover must stop deleting\n\t\t\t// alongside the new owner.\n\t\t\tif (!gate.ownsLock()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst initialIdentity = realDirectoryIdentity(entryPath);\n\t\t\t\tif (initialIdentity === undefined || scanFreshness(entryPath, gate.cutoff) !== \"stale\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!gate.ownsLock()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst finalIdentity = realDirectoryIdentity(entryPath);\n\t\t\t\tif (finalIdentity === undefined || !sameFileIdentity(initialIdentity, finalIdentity)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\trmSync(entryPath, { recursive: true, force: true });\n\t\t\t} catch {\n\t\t\t\t// One bad entry must not block the rest of the sweep.\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Reap one `<parent>/tool-results` directory.\n *\n * A symlinked (or otherwise non-directory) `tool-results` is skipped entirely —\n * neither descended into nor deleted — because `readdirSync`/`rmSync` resolve\n * links and would reach the outside directory the link points at.\n *\n * A directory a live session registered is skipped whatever its age. Age alone\n * is not enough here: replaying a persisted result reuses the existing file\n * without touching its mtime, so a month-old file can be advertised to the model\n * this very turn.\n *\n * Otherwise the directory's newest entry decides its fate, exactly as it does for\n * a session temp tree: one fresh descendant keeps the entire tree, stale siblings\n * included.\n */\nfunction reapToolResultsDir(parent: string, cutoff: number, protectedPaths: ReadonlySet<string>): void {\n\tconst toolResultsDir = join(parent, TOOL_RESULTS_SUBDIR);\n\tif (protectedPaths.has(toolResultsDir) || !isRealDirectory(toolResultsDir)) {\n\t\treturn;\n\t}\n\tif (scanFreshness(toolResultsDir, cutoff) !== \"stale\") {\n\t\treturn;\n\t}\n\trmSync(toolResultsDir, { recursive: true, force: true });\n}\n\n/**\n * Reap stale `tool-results` directories under one project-nested sessions root.\n * Only `<sessionsRoot>/<project>/tool-results` is touched — never the sibling\n * `.jsonl` transcripts.\n */\nexport function sweepToolResultsRoot(sessionsRoot: string, options: SweepOptions = {}): SweepOutcome {\n\tif (!isRealDirectory(sessionsRoot)) {\n\t\treturn \"missing\";\n\t}\n\tconst gateOptions: SweepOptions = {\n\t\t...options,\n\t\tprotectedPaths: options.protectedPaths ?? getProtectedSessionTempDirs(),\n\t};\n\treturn withCleanupGate(getCleanupControlDir(sessionsRoot, options.controlRoot), gateOptions, (gate) => {\n\t\tlet entries: string[];\n\t\ttry {\n\t\t\tentries = readdirSync(sessionsRoot);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tconst projectDir = join(sessionsRoot, entry);\n\t\t\tif (!isRealDirectory(projectDir) || gate.protectedPaths.has(projectDir)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!gate.ownsLock()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treapToolResultsDir(projectDir, gate.cutoff, gate.protectedPaths);\n\t\t\t} catch {\n\t\t\t\t// Keep going so one unreadable project directory does not block the rest.\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Reap `<sessionDir>/tool-results` for a directly chosen session directory.\n *\n * A custom `--session-dir` has no project nesting: session files live in the\n * directory itself, so only its own `tool-results` child is in scope and its\n * siblings — including transcripts — are never touched.\n */\nexport function sweepSessionDirToolResults(sessionDir: string, options: SweepOptions = {}): SweepOutcome {\n\tif (!isRealDirectory(sessionDir)) {\n\t\treturn \"missing\";\n\t}\n\tconst gateOptions: SweepOptions = {\n\t\t...options,\n\t\tprotectedPaths: options.protectedPaths ?? getProtectedSessionTempDirs(),\n\t};\n\treturn withCleanupGate(getCleanupControlDir(sessionDir, options.controlRoot), gateOptions, (gate) => {\n\t\tif (!gate.ownsLock()) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\treapToolResultsDir(sessionDir, gate.cutoff, gate.protectedPaths);\n\t\t} catch {\n\t\t\t// Best effort.\n\t\t}\n\t});\n}\n\nexport interface SessionTempCleanupOptions extends SweepOptions {\n\t/** Temp root override; defaults to the owner-scoped root. */\n\ttempRoot?: string;\n\t/** Project-nested sessions roots; defaults to the configured agent session roots. */\n\tsessionsRoots?: readonly string[];\n\t/** Directly chosen session directories (custom `--session-dir` and friends). */\n\tsessionDirs?: readonly string[];\n}\n\nfunction safeSessionsRoots(): readonly string[] {\n\ttry {\n\t\treturn getAgentConfigPaths(\"sessions\");\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n/** Run every sweep once. Each failure is swallowed: cleanup is housekeeping. */\nexport function runSessionTempCleanup(options: SessionTempCleanupOptions = {}): void {\n\tconst { tempRoot, sessionsRoots, sessionDirs, ...sweepOptions } = options;\n\ttry {\n\t\tsweepSessionTempRoot(tempRoot ?? getTempRootDir(), sweepOptions);\n\t} catch {\n\t\t// Best effort.\n\t}\n\t// Session storage carries the same protection as the temp trees: a live\n\t// session registers its own `tool-results` directory, and a replayed result\n\t// reuses an old file without refreshing its mtime, so age alone cannot keep\n\t// an advertised path alive.\n\tfor (const root of sessionsRoots ?? safeSessionsRoots()) {\n\t\ttry {\n\t\t\tsweepToolResultsRoot(root, sweepOptions);\n\t\t} catch {\n\t\t\t// Best effort.\n\t\t}\n\t}\n\tfor (const dir of sessionDirs ?? []) {\n\t\ttry {\n\t\t\tsweepSessionDirToolResults(dir, sweepOptions);\n\t\t} catch {\n\t\t\t// Best effort.\n\t\t}\n\t}\n}\n\nlet cleanupScheduled = false;\nlet cleanupTimer: ReturnType<typeof setTimeout> | undefined;\nconst scheduledSessionsRoots = new Set<string>();\nconst scheduledSessionDirs = new Set<string>();\n\n/** Arm one deferred sweep for the roots currently pending. */\nfunction armSessionTempCleanup(options: SessionTempCleanupOptions): void {\n\tcleanupScheduled = true;\n\tcleanupTimer = setTimeout(() => {\n\t\t// Drain before the sweep. A session discovered while cleanup is running adds\n\t\t// to the now-empty sets and is rearmed in `finally`, rather than being lost\n\t\t// or starting a second callback alongside this one.\n\t\tconst sessionsRoots = [...scheduledSessionsRoots];\n\t\tconst sessionDirs = [...scheduledSessionDirs];\n\t\tscheduledSessionsRoots.clear();\n\t\tscheduledSessionDirs.clear();\n\t\ttry {\n\t\t\trunSessionTempCleanup({\n\t\t\t\t...options,\n\t\t\t\tsessionsRoots: sessionsRoots.length > 0 ? sessionsRoots : options.sessionsRoots,\n\t\t\t\tsessionDirs,\n\t\t\t});\n\t\t} finally {\n\t\t\tcleanupTimer = undefined;\n\t\t\tcleanupScheduled = false;\n\t\t\tif (scheduledSessionsRoots.size > 0 || scheduledSessionDirs.size > 0) {\n\t\t\t\tarmSessionTempCleanup(options);\n\t\t\t}\n\t\t}\n\t}, SESSION_TEMP_CLEANUP_DELAY_MS);\n\tcleanupTimer.unref?.();\n}\n\n/**\n * Schedule one deferred sweep for the current pending batch.\n *\n * Calls made before or during a sweep merge their targets into sets. The active\n * callback drains one snapshot, remains marked active while it runs, then rearms\n * one new unref'd timer only when later roots arrived.\n */\nexport function scheduleSessionTempCleanup(options: SessionTempCleanupOptions = {}): void {\n\tfor (const root of options.sessionsRoots ?? []) {\n\t\tscheduledSessionsRoots.add(root);\n\t}\n\tfor (const dir of options.sessionDirs ?? []) {\n\t\tscheduledSessionDirs.add(dir);\n\t}\n\tif (cleanupScheduled) {\n\t\treturn;\n\t}\n\tarmSessionTempCleanup(options);\n}\n\n/** Test seam: cancel pending work and forget scheduler state. */\nexport function resetSessionTempCleanupScheduleForTesting(): void {\n\tif (cleanupTimer !== undefined) {\n\t\tclearTimeout(cleanupTimer);\n\t}\n\tcleanupTimer = undefined;\n\tcleanupScheduled = false;\n\tscheduledSessionsRoots.clear();\n\tscheduledSessionDirs.clear();\n}\n\n/** Narrow lock seam for descriptor-mode and release tests. */\nexport const sessionTempCleanupTestHooks = {\n\tacquireCleanupLock,\n\treleaseCleanupLock,\n};\n"]}
1
+ {"version":3,"file":"session-temp-cleanup.js","sourceRoot":"","sources":["../../../src/core/tools/session-temp-cleanup.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Age-based sweeper for tool-output storage.\n *\n * Three targets are reaped, all strictly scoped to tool output:\n *\n * - `<tmpdir>/<APP_NAME>-<owner>/` — the per-session temp trees created by\n * `session-temp-dir.ts`.\n * - `<sessionsRoot>/<project>/tool-results/` — persisted tool results under the\n * default, project-nested session roots.\n * - `<sessionDir>/tool-results/` — the same, for a custom session directory\n * chosen with `--session-dir`, `ATOMIC_CODING_AGENT_SESSION_DIR`, or the\n * `sessionDir` setting, where there is no project nesting to walk.\n *\n * Transcripts, `.jsonl` session files, and every other file under session\n * storage are out of scope: the walk only ever descends into a `tool-results`\n * directory, and only ever deletes inside it.\n *\n * The throttle/lock shape mirrors `packages/subagents/src/shared/artifacts.ts`:\n * a `.last-cleanup` marker skips the scan for a day, a `.cleanup.lock` exclusive\n * lock keeps concurrent sessions from racing, a stale lock left by a crashed\n * process is broken, and lock ownership is rechecked before every destructive\n * step. Those two names are required, but the subagents sweep already owns them\n * inside the default sessions roots, so session-storage scans keep their\n * marker/lock pair in a coding-agent control root keyed by target instead of\n * writing into the scanned directory. The temp root, which nothing else owns,\n * carries its pair directly.\n *\n * Symlinks are never followed. A scan root or a `tool-results` entry that is a\n * symlink is skipped rather than read or deleted, because `readdirSync` and\n * `rmSync` resolve links and would otherwise reach outside the target.\n */\n\nimport { createHash } from \"node:crypto\";\nimport {\n\tcloseSync,\n\tfchmodSync,\n\tfstatSync,\n\tlstatSync,\n\topenSync,\n\treaddirSync,\n\treadFileSync,\n\trenameSync,\n\trmSync,\n\tstatSync,\n\tunlinkSync,\n\twriteSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getAgentConfigPaths } from \"../../config.js\";\nimport { getErrnoCode } from \"./errno.ts\";\nimport {\n\tensureTempDir,\n\tgetProtectedSessionTempDirs,\n\tgetTempRootDir,\n\tSESSION_TEMP_FILE_MODE,\n} from \"./session-temp-dir.ts\";\nimport { TOOL_RESULTS_SUBDIR } from \"./tool-limits.js\";\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n/** How long a tool-output tree survives without being touched. */\nexport const SESSION_TEMP_RETENTION_DAYS = 30;\nexport const SESSION_TEMP_RETENTION_MS = SESSION_TEMP_RETENTION_DAYS * MS_PER_DAY;\n\n/** Minimum interval between two sweeps of the same root. */\nexport const SESSION_TEMP_CLEANUP_INTERVAL_MS = MS_PER_DAY;\n\n/** A lock older than this belonged to a process that died holding it. */\nexport const SESSION_TEMP_CLEANUP_LOCK_STALE_MS = 60 * 60 * 1000;\n\n/** How long after startup the sweep runs, so it never sits on the startup path. */\nexport const SESSION_TEMP_CLEANUP_DELAY_MS = 10_000;\n\n/** Deepest directory nesting the mtime walk will descend. */\nconst MAX_SCAN_DEPTH = 32;\n\nexport const CLEANUP_MARKER_FILE = \".last-cleanup\";\nexport const CLEANUP_LOCK_FILE = \".cleanup.lock\";\n\n/**\n * Control root for session-storage scans, inside the owner-scoped temp root.\n * A session id can never sanitize to this name (leading dots are stripped), so\n * it cannot collide with a session temp tree.\n */\nexport const CLEANUP_CONTROL_SUBDIR = \".cleanup\";\n\nexport type SweepOutcome = \"swept\" | \"throttled\" | \"locked\" | \"missing\";\n\nexport interface SweepOptions {\n\t/** Clock override for tests. */\n\tnow?: number;\n\t/** Age past which an untouched entry is reaped. */\n\tretentionMs?: number;\n\t/** Minimum interval between sweeps of this root. */\n\tthrottleMs?: number;\n\t/** Directories that must survive regardless of age. */\n\tprotectedPaths?: Iterable<string>;\n\t/** Parent of the per-target control directories. Defaults to `<tempRoot>/.cleanup`. */\n\tcontrolRoot?: string;\n}\n\n/** Default parent for the marker/lock pair of a session-storage scan. */\nexport function getCleanupControlRoot(): string {\n\treturn join(getTempRootDir(), CLEANUP_CONTROL_SUBDIR);\n}\n\n/**\n * Control directory for one scan target: `<controlRoot>/<digest-of-target>`.\n * Keyed by the target path so two roots never share throttle state.\n */\nexport function getCleanupControlDir(target: string, controlRoot?: string): string {\n\tconst key = createHash(\"sha256\").update(target).digest(\"hex\").slice(0, 16);\n\treturn join(controlRoot ?? getCleanupControlRoot(), key);\n}\n\ninterface FileIdentity {\n\tdev: bigint;\n\tino: bigint;\n}\n\nfunction sameFileIdentity(left: FileIdentity, right: FileIdentity): boolean {\n\treturn left.dev === right.dev && left.ino === right.ino;\n}\n\nfunction realDirectoryIdentity(path: string): FileIdentity | undefined {\n\ttry {\n\t\tconst stat = lstatSync(path, { bigint: true });\n\t\tif (stat.isDirectory() && !stat.isSymbolicLink()) {\n\t\t\treturn { dev: stat.dev, ino: stat.ino };\n\t\t}\n\t} catch {\n\t\t// Missing, unreadable, and changing paths are not cleanup candidates.\n\t}\n\treturn undefined;\n}\n\n/** An existing real directory — not a symlink, not a file, not missing. */\nfunction isRealDirectory(path: string): boolean {\n\treturn realDirectoryIdentity(path) !== undefined;\n}\n\nfunction markerIsFresh(markerPath: string, now: number, throttleMs: number): boolean {\n\ttry {\n\t\tconst stat = lstatSync(markerPath);\n\t\treturn stat.isFile() && !stat.isSymbolicLink() && now - stat.mtimeMs < throttleMs;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\ninterface CleanupLock extends FileIdentity {\n\ttoken: string;\n}\n\nfunction pathIdentifiesFile(path: string, identity: FileIdentity): boolean {\n\ttry {\n\t\tconst stat = lstatSync(path, { bigint: true });\n\t\treturn stat.isFile() && !stat.isSymbolicLink() && sameFileIdentity(stat, identity);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction removeCreatedFile(path: string, identity: FileIdentity): void {\n\ttry {\n\t\tif (pathIdentifiesFile(path, identity)) {\n\t\t\tunlinkSync(path);\n\t\t}\n\t} catch {\n\t\t// Best effort. An uncertain path is left untouched.\n\t}\n}\n/**\n * Take an exclusive lock so two sessions never scan the same target at once.\n *\n * `wx` creation is the exclusivity primitive. Returns an ownership token; a lock\n * left behind by a crashed process is broken once stale, and release only\n * removes a lock that still carries the caller's token.\n */\nfunction acquireCleanupLock(lockPath: string, now: number, staleMs: number): CleanupLock | null {\n\tconst token = `${process.pid}.${now}.${Math.random().toString(36).slice(2)}`;\n\tfor (let attempt = 0; attempt < 2; attempt++) {\n\t\tlet fd: number;\n\t\ttry {\n\t\t\tfd = openSync(lockPath, \"wx+\", SESSION_TEMP_FILE_MODE);\n\t\t} catch (error) {\n\t\t\tif (getErrnoCode(error) !== \"EEXIST\") {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tlet lockMtimeMs: number;\n\t\t\ttry {\n\t\t\t\tlockMtimeMs = statSync(lockPath).mtimeMs;\n\t\t\t} catch {\n\t\t\t\t// The holder released between the failed create and the stat; retry.\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (now - lockMtimeMs < staleMs) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (!breakStaleLock(lockPath, lockMtimeMs)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet lock: CleanupLock | undefined;\n\t\tlet failed = false;\n\t\ttry {\n\t\t\tconst createdStat = fstatSync(fd, { bigint: true });\n\t\t\tlock = { token, dev: createdStat.dev, ino: createdStat.ino };\n\t\t\tif (!createdStat.isFile()) {\n\t\t\t\tfailed = true;\n\t\t\t} else {\n\t\t\t\tif (process.platform !== \"win32\") {\n\t\t\t\t\tfchmodSync(fd, SESSION_TEMP_FILE_MODE);\n\t\t\t\t\tconst modeStat = fstatSync(fd, { bigint: true });\n\t\t\t\t\tif (!modeStat.isFile() || Number(modeStat.mode & 0o777n) !== SESSION_TEMP_FILE_MODE) {\n\t\t\t\t\t\tfailed = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!failed && writeSync(fd, token) !== token.length) {\n\t\t\t\t\tfailed = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\tfailed = true;\n\t\t}\n\t\ttry {\n\t\t\tcloseSync(fd);\n\t\t} catch {\n\t\t\tfailed = true;\n\t\t}\n\t\tif (failed || lock === undefined || !pathIdentifiesFile(lockPath, lock) || !ownsCleanupLock(lockPath, lock)) {\n\t\t\tif (lock !== undefined) {\n\t\t\t\tremoveCreatedFile(lockPath, lock);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\treturn lock;\n\t}\n\treturn null;\n}\n\n/**\n * Claim a stale lock via rename, then verify it is still the lock observed\n * during stale detection. A lock that changed identity in between belongs to a\n * new holder: hand it back and treat the takeover as contention.\n */\nfunction breakStaleLock(lockPath: string, observedMtimeMs: number): boolean {\n\tconst breakPath = `${lockPath}.break.${process.pid}.${Math.random().toString(36).slice(2)}`;\n\ttry {\n\t\trenameSync(lockPath, breakPath);\n\t} catch {\n\t\t// Another sweep released or broke it first; contend again on create.\n\t\treturn false;\n\t}\n\tlet displacedFreshLock = false;\n\ttry {\n\t\tdisplacedFreshLock = statSync(breakPath).mtimeMs !== observedMtimeMs;\n\t} catch {\n\t\tdisplacedFreshLock = false;\n\t}\n\tif (displacedFreshLock) {\n\t\ttry {\n\t\t\trenameSync(breakPath, lockPath);\n\t\t} catch {\n\t\t\t// Best-effort hand-back; the displaced holder aborts at its next\n\t\t\t// ownership recheck.\n\t\t}\n\t\treturn false;\n\t}\n\ttry {\n\t\tunlinkSync(breakPath);\n\t} catch {\n\t\t// A leftover break file is harmless.\n\t}\n\treturn true;\n}\n\nfunction ownsCleanupLock(lockPath: string, lock: CleanupLock): boolean {\n\ttry {\n\t\treturn (\n\t\t\tpathIdentifiesFile(lockPath, lock) &&\n\t\t\treadFileSync(lockPath, \"utf-8\") === lock.token &&\n\t\t\tpathIdentifiesFile(lockPath, lock)\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction releaseCleanupLock(lockPath: string, lock: CleanupLock): void {\n\ttry {\n\t\tif (ownsCleanupLock(lockPath, lock) && pathIdentifiesFile(lockPath, lock)) {\n\t\t\tunlinkSync(lockPath);\n\t\t}\n\t} catch {\n\t\t// Release is best-effort: an unreleased lock only goes stale and is\n\t\t// broken by a later sweep.\n\t}\n}\n\n/** Publish the throttle marker without ever opening or unlinking its destination. */\nfunction publishCleanupMarker(markerPath: string, now: number): boolean {\n\tconst tempPath = `${markerPath}.tmp.${process.pid}.${Math.random().toString(36).slice(2)}`;\n\tconst timestamp = String(now);\n\tlet fd: number;\n\ttry {\n\t\tfd = openSync(tempPath, \"wx+\", SESSION_TEMP_FILE_MODE);\n\t} catch {\n\t\treturn false;\n\t}\n\n\tlet identity: FileIdentity | undefined;\n\tlet failed = false;\n\ttry {\n\t\tconst createdStat = fstatSync(fd, { bigint: true });\n\t\tidentity = { dev: createdStat.dev, ino: createdStat.ino };\n\t\tif (!createdStat.isFile()) {\n\t\t\tfailed = true;\n\t\t} else {\n\t\t\tif (process.platform !== \"win32\") {\n\t\t\t\tfchmodSync(fd, SESSION_TEMP_FILE_MODE);\n\t\t\t\tconst modeStat = fstatSync(fd, { bigint: true });\n\t\t\t\tif (!modeStat.isFile() || Number(modeStat.mode & 0o777n) !== SESSION_TEMP_FILE_MODE) {\n\t\t\t\t\tfailed = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!failed && writeSync(fd, timestamp) !== timestamp.length) {\n\t\t\t\tfailed = true;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\tfailed = true;\n\t}\n\ttry {\n\t\tcloseSync(fd);\n\t} catch {\n\t\tfailed = true;\n\t}\n\tif (failed || identity === undefined || !pathIdentifiesFile(tempPath, identity)) {\n\t\tif (identity !== undefined) {\n\t\t\tremoveCreatedFile(tempPath, identity);\n\t\t}\n\t\treturn false;\n\t}\n\n\ttry {\n\t\trenameSync(tempPath, markerPath);\n\t} catch {\n\t\tremoveCreatedFile(tempPath, identity);\n\t\treturn false;\n\t}\n\treturn pathIdentifiesFile(markerPath, identity);\n}\n\ntype ScanFreshness = \"fresh\" | \"stale\" | \"unknown\";\n\n/**\n * Classify whether `entryPath` has a fresh descendant, is fully stale, or could\n * not be scanned completely.\n *\n * Only `stale` authorizes deletion. Symlinks, unreadable entries, and the depth\n * bound fail closed as `unknown`; `ENOENT` is stale because the entry vanished.\n * The walk still exits on its first fresh descendant.\n */\nfunction scanFreshness(entryPath: string, cutoff: number, depth = 0): ScanFreshness {\n\tlet stat: ReturnType<typeof lstatSync>;\n\ttry {\n\t\tstat = lstatSync(entryPath);\n\t} catch (error) {\n\t\treturn getErrnoCode(error) === \"ENOENT\" ? \"stale\" : \"unknown\";\n\t}\n\tif (stat.isSymbolicLink()) {\n\t\treturn \"unknown\";\n\t}\n\tif (stat.mtimeMs >= cutoff) {\n\t\treturn \"fresh\";\n\t}\n\tif (!stat.isDirectory()) {\n\t\treturn \"stale\";\n\t}\n\tif (depth >= MAX_SCAN_DEPTH) {\n\t\treturn \"unknown\";\n\t}\n\tlet children: string[];\n\ttry {\n\t\tchildren = readdirSync(entryPath);\n\t} catch (error) {\n\t\treturn getErrnoCode(error) === \"ENOENT\" ? \"stale\" : \"unknown\";\n\t}\n\tlet foundUnknown = false;\n\tfor (const child of children) {\n\t\tconst freshness = scanFreshness(join(entryPath, child), cutoff, depth + 1);\n\t\tif (freshness === \"fresh\") {\n\t\t\treturn \"fresh\";\n\t\t}\n\t\tif (freshness === \"unknown\") {\n\t\t\tfoundUnknown = true;\n\t\t}\n\t}\n\treturn foundUnknown ? \"unknown\" : \"stale\";\n}\n\ninterface CleanupGate {\n\t/** Whether this sweep still owns the lock; false means another holder took over. */\n\townsLock(): boolean;\n\tcutoff: number;\n\tprotectedPaths: ReadonlySet<string>;\n}\n\n/**\n * Run `scan` under the marker/lock protocol for one target.\n *\n * `controlDir` holds the `.last-cleanup`/`.cleanup.lock` pair; it may be the\n * scanned directory itself (temp root) or a coding-agent-owned directory outside\n * it (session storage).\n */\nfunction withCleanupGate(controlDir: string, options: SweepOptions, scan: (gate: CleanupGate) => void): SweepOutcome {\n\tconst now = options.now ?? Date.now();\n\tconst throttleMs = options.throttleMs ?? SESSION_TEMP_CLEANUP_INTERVAL_MS;\n\ttry {\n\t\t// The control root lives under the owner temp root, so create it through the\n\t\t// same validated, non-recursive path the spill directories use.\n\t\tensureTempDir(controlDir);\n\t} catch {\n\t\t// Without a control directory there is nowhere to record the throttle;\n\t\t// skip rather than sweep unthrottled and unlocked.\n\t\treturn \"locked\";\n\t}\n\tconst markerPath = join(controlDir, CLEANUP_MARKER_FILE);\n\tif (markerIsFresh(markerPath, now, throttleMs)) {\n\t\treturn \"throttled\";\n\t}\n\tconst lockPath = join(controlDir, CLEANUP_LOCK_FILE);\n\tconst token = acquireCleanupLock(lockPath, now, SESSION_TEMP_CLEANUP_LOCK_STALE_MS);\n\tif (token === null) {\n\t\treturn \"locked\";\n\t}\n\tlet aborted = false;\n\ttry {\n\t\tscan({\n\t\t\townsLock: () => {\n\t\t\t\tif (aborted) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (ownsCleanupLock(lockPath, token)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\taborted = true;\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tcutoff: now - (options.retentionMs ?? SESSION_TEMP_RETENTION_MS),\n\t\t\tprotectedPaths: new Set(options.protectedPaths ?? []),\n\t\t});\n\t\tif (!aborted && ownsCleanupLock(lockPath, token)) {\n\t\t\t// Failing to publish the marker only means the sweep repeats sooner.\n\t\t\tpublishCleanupMarker(markerPath, now);\n\t\t}\n\t} finally {\n\t\treleaseCleanupLock(lockPath, token);\n\t}\n\treturn aborted ? \"locked\" : \"swept\";\n}\n\nfunction isCleanupArtifact(name: string): boolean {\n\treturn (\n\t\tname === CLEANUP_MARKER_FILE ||\n\t\tname.startsWith(`${CLEANUP_MARKER_FILE}.tmp.`) ||\n\t\tname === CLEANUP_LOCK_FILE ||\n\t\tname.startsWith(`${CLEANUP_LOCK_FILE}.`) ||\n\t\tname === CLEANUP_CONTROL_SUBDIR\n\t);\n}\n\n/**\n * Reap per-session temp trees under `<tmpdir>/<APP_NAME>-<owner>/`.\n *\n * A tree is removed only when nothing at any depth inside it is newer than the\n * retention cutoff, and never when it belongs to a session this process\n * registered as live. A symlinked root is refused outright.\n */\nexport function sweepSessionTempRoot(root: string = getTempRootDir(), options: SweepOptions = {}): SweepOutcome {\n\tif (!isRealDirectory(root)) {\n\t\treturn \"missing\";\n\t}\n\tconst gateOptions: SweepOptions = {\n\t\t...options,\n\t\tprotectedPaths: options.protectedPaths ?? getProtectedSessionTempDirs(),\n\t};\n\treturn withCleanupGate(root, gateOptions, (gate) => {\n\t\tlet entries: string[];\n\t\ttry {\n\t\t\tentries = readdirSync(root);\n\t\t} catch {\n\t\t\t// Cleanup is best-effort housekeeping; an unreadable root is skipped.\n\t\t\treturn;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tif (isCleanupArtifact(entry)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst entryPath = join(root, entry);\n\t\t\tif (gate.protectedPaths.has(entryPath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// A holder displaced by a stale-lock takeover must stop deleting\n\t\t\t// alongside the new owner.\n\t\t\tif (!gate.ownsLock()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst initialIdentity = realDirectoryIdentity(entryPath);\n\t\t\t\tif (initialIdentity === undefined || scanFreshness(entryPath, gate.cutoff) !== \"stale\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!gate.ownsLock()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst finalIdentity = realDirectoryIdentity(entryPath);\n\t\t\t\tif (finalIdentity === undefined || !sameFileIdentity(initialIdentity, finalIdentity)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\trmSync(entryPath, { recursive: true, force: true });\n\t\t\t} catch {\n\t\t\t\t// One bad entry must not block the rest of the sweep.\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Reap one `<parent>/tool-results` directory.\n *\n * A symlinked (or otherwise non-directory) `tool-results` is skipped entirely —\n * neither descended into nor deleted — because `readdirSync`/`rmSync` resolve\n * links and would reach the outside directory the link points at.\n *\n * A directory a live session registered is skipped whatever its age. Age alone\n * is not enough here: replaying a persisted result reuses the existing file\n * without touching its mtime, so a month-old file can be advertised to the model\n * this very turn.\n *\n * Otherwise the directory's newest entry decides its fate, exactly as it does for\n * a session temp tree: one fresh descendant keeps the entire tree, stale siblings\n * included.\n */\nfunction reapToolResultsDir(parent: string, cutoff: number, protectedPaths: ReadonlySet<string>): void {\n\tconst toolResultsDir = join(parent, TOOL_RESULTS_SUBDIR);\n\tif (protectedPaths.has(toolResultsDir) || !isRealDirectory(toolResultsDir)) {\n\t\treturn;\n\t}\n\tif (scanFreshness(toolResultsDir, cutoff) !== \"stale\") {\n\t\treturn;\n\t}\n\trmSync(toolResultsDir, { recursive: true, force: true });\n}\n\n/**\n * Reap stale `tool-results` directories under one project-nested sessions root.\n * Only `<sessionsRoot>/<project>/tool-results` is touched — never the sibling\n * `.jsonl` transcripts.\n */\nexport function sweepToolResultsRoot(sessionsRoot: string, options: SweepOptions = {}): SweepOutcome {\n\tif (!isRealDirectory(sessionsRoot)) {\n\t\treturn \"missing\";\n\t}\n\tconst gateOptions: SweepOptions = {\n\t\t...options,\n\t\tprotectedPaths: options.protectedPaths ?? getProtectedSessionTempDirs(),\n\t};\n\treturn withCleanupGate(getCleanupControlDir(sessionsRoot, options.controlRoot), gateOptions, (gate) => {\n\t\tlet entries: string[];\n\t\ttry {\n\t\t\tentries = readdirSync(sessionsRoot);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tconst projectDir = join(sessionsRoot, entry);\n\t\t\tif (!isRealDirectory(projectDir) || gate.protectedPaths.has(projectDir)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!gate.ownsLock()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treapToolResultsDir(projectDir, gate.cutoff, gate.protectedPaths);\n\t\t\t} catch {\n\t\t\t\t// Keep going so one unreadable project directory does not block the rest.\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Reap `<sessionDir>/tool-results` for a directly chosen session directory.\n *\n * A custom `--session-dir` has no project nesting: session files live in the\n * directory itself, so only its own `tool-results` child is in scope and its\n * siblings — including transcripts — are never touched.\n */\nexport function sweepSessionDirToolResults(sessionDir: string, options: SweepOptions = {}): SweepOutcome {\n\tif (!isRealDirectory(sessionDir)) {\n\t\treturn \"missing\";\n\t}\n\tconst gateOptions: SweepOptions = {\n\t\t...options,\n\t\tprotectedPaths: options.protectedPaths ?? getProtectedSessionTempDirs(),\n\t};\n\treturn withCleanupGate(getCleanupControlDir(sessionDir, options.controlRoot), gateOptions, (gate) => {\n\t\tif (!gate.ownsLock()) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\treapToolResultsDir(sessionDir, gate.cutoff, gate.protectedPaths);\n\t\t} catch {\n\t\t\t// Best effort.\n\t\t}\n\t});\n}\n\nexport interface SessionTempCleanupOptions extends SweepOptions {\n\t/** Temp root override; defaults to the owner-scoped root. */\n\ttempRoot?: string;\n\t/** Project-nested sessions roots; defaults to the configured agent session roots. */\n\tsessionsRoots?: readonly string[];\n\t/** Directly chosen session directories (custom `--session-dir` and friends). */\n\tsessionDirs?: readonly string[];\n}\n\nfunction safeSessionsRoots(): readonly string[] {\n\ttry {\n\t\treturn getAgentConfigPaths(\"sessions\");\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n/** Run every sweep once. Each failure is swallowed: cleanup is housekeeping. */\nexport function runSessionTempCleanup(options: SessionTempCleanupOptions = {}): void {\n\tconst { tempRoot, sessionsRoots, sessionDirs, ...sweepOptions } = options;\n\ttry {\n\t\tsweepSessionTempRoot(tempRoot ?? getTempRootDir(), sweepOptions);\n\t} catch {\n\t\t// Best effort.\n\t}\n\t// Session storage carries the same protection as the temp trees: a live\n\t// session registers its own `tool-results` directory, and a replayed result\n\t// reuses an old file without refreshing its mtime, so age alone cannot keep\n\t// an advertised path alive.\n\tfor (const root of sessionsRoots ?? safeSessionsRoots()) {\n\t\ttry {\n\t\t\tsweepToolResultsRoot(root, sweepOptions);\n\t\t} catch {\n\t\t\t// Best effort.\n\t\t}\n\t}\n\tfor (const dir of sessionDirs ?? []) {\n\t\ttry {\n\t\t\tsweepSessionDirToolResults(dir, sweepOptions);\n\t\t} catch {\n\t\t\t// Best effort.\n\t\t}\n\t}\n}\n\nlet cleanupScheduled = false;\nlet cleanupTimer: ReturnType<typeof setTimeout> | undefined;\nconst scheduledSessionsRoots = new Set<string>();\nconst scheduledSessionDirs = new Set<string>();\n\n/** Arm one deferred sweep for the roots currently pending. */\nfunction armSessionTempCleanup(options: SessionTempCleanupOptions): void {\n\tcleanupScheduled = true;\n\tcleanupTimer = setTimeout(() => {\n\t\t// Drain before the sweep. A session discovered while cleanup is running adds\n\t\t// to the now-empty sets and is rearmed in `finally`, rather than being lost\n\t\t// or starting a second callback alongside this one.\n\t\tconst sessionsRoots = [...scheduledSessionsRoots];\n\t\tconst sessionDirs = [...scheduledSessionDirs];\n\t\tscheduledSessionsRoots.clear();\n\t\tscheduledSessionDirs.clear();\n\t\ttry {\n\t\t\trunSessionTempCleanup({\n\t\t\t\t...options,\n\t\t\t\tsessionsRoots: sessionsRoots.length > 0 ? sessionsRoots : options.sessionsRoots,\n\t\t\t\tsessionDirs,\n\t\t\t});\n\t\t} finally {\n\t\t\tcleanupTimer = undefined;\n\t\t\tcleanupScheduled = false;\n\t\t\tif (scheduledSessionsRoots.size > 0 || scheduledSessionDirs.size > 0) {\n\t\t\t\tarmSessionTempCleanup(options);\n\t\t\t}\n\t\t}\n\t}, SESSION_TEMP_CLEANUP_DELAY_MS);\n\tcleanupTimer.unref?.();\n}\n\n/**\n * Schedule one deferred sweep for the current pending batch.\n *\n * Calls made before or during a sweep merge their targets into sets. The active\n * callback drains one snapshot, remains marked active while it runs, then rearms\n * one new unref'd timer only when later roots arrived.\n */\nexport function scheduleSessionTempCleanup(options: SessionTempCleanupOptions = {}): void {\n\tfor (const root of options.sessionsRoots ?? []) {\n\t\tscheduledSessionsRoots.add(root);\n\t}\n\tfor (const dir of options.sessionDirs ?? []) {\n\t\tscheduledSessionDirs.add(dir);\n\t}\n\tif (cleanupScheduled) {\n\t\treturn;\n\t}\n\tarmSessionTempCleanup(options);\n}\n\n/** Test seam: cancel pending work and forget scheduler state. */\nexport function resetSessionTempCleanupScheduleForTesting(): void {\n\tif (cleanupTimer !== undefined) {\n\t\tclearTimeout(cleanupTimer);\n\t}\n\tcleanupTimer = undefined;\n\tcleanupScheduled = false;\n\tscheduledSessionsRoots.clear();\n\tscheduledSessionDirs.clear();\n}\n\n/** Narrow lock seam for descriptor-mode and release tests. */\nexport const sessionTempCleanupTestHooks = {\n\tacquireCleanupLock,\n\treleaseCleanupLock,\n};\n"]}